diff --git a/client/kb-frontend/src/components/AdminPanel.css b/client/kb-frontend/src/components/AdminPanel.css index 5721226..4a3d20f 100644 --- a/client/kb-frontend/src/components/AdminPanel.css +++ b/client/kb-frontend/src/components/AdminPanel.css @@ -1,158 +1,95 @@ .admin-panel { - padding: 2rem; - max-width: 1400px; + padding: var(--spacing-2xl); + max-width: var(--max-width-3xl); margin: 0 auto; } -.admin-header { - display: flex; - align-items: center; - gap: 2rem; - margin-bottom: 2rem; - border-bottom: 2px solid #333; - padding-bottom: 1rem; -} - -.admin-header h1 { - margin: 0; -} - -.admin-section { - margin-bottom: 3rem; -} - -.admin-section h2 { - margin-bottom: 1rem; - color: #2c3e50; -} - .users-table { width: 100%; border-collapse: collapse; - background: #242424; - box-shadow: 0 2px 4px rgba(0,0,0,0.1); + background: var(--color-background-alt); + box-shadow: var(--shadow-sm); } .users-table th, .users-table td { - padding: 12px; + padding: var(--spacing-md); text-align: left; - border-bottom: 1px solid #ddd; + border-bottom: 1px solid var(--color-border); } .users-table th { - background-color: #2c3e50; - color: white; - font-weight: bold; + background-color: var(--color-dark); + color: var(--color-text-inverse); + font-weight: var(--font-weight-bold); } .users-table tr:hover { - background-color: #7f8c8d; + background-color: var(--color-dark-light); } .auth-badge { - padding: 4px 8px; - border-radius: 4px; - font-size: 0.85rem; - font-weight: bold; + padding: var(--spacing-xs) var(--spacing-sm); + border-radius: var(--radius-sm); + font-size: var(--font-size-sm); + font-weight: var(--font-weight-bold); } .auth-badge.local { - background-color: #95a5a6; - color: white; + background-color: var(--color-dark-light); + color: var(--color-text-inverse); } .auth-badge.entra { background-color: #0078d4; - color: white; + color: var(--color-text-inverse); } .role-badge { - padding: 4px 12px; - border-radius: 12px; - font-size: 0.85rem; - font-weight: bold; + padding: var(--spacing-xs) var(--spacing-md); + border-radius: var(--radius-xl); + font-size: var(--font-size-sm); + font-weight: var(--font-weight-bold); } .role-badge.admin { - background-color: #e74c3c; - color: white; + background-color: var(--color-danger); + color: var(--color-text-inverse); } .role-badge.editor { - background-color: #3498db; - color: white; + background-color: var(--color-primary); + color: var(--color-text-inverse); } .role-badge.user { - background-color: #95a5a6; - color: white; + background-color: var(--color-dark-light); + color: var(--color-text-inverse); } .role-select { - padding: 4px 8px; - border-radius: 4px; - border: 1px solid #ddd; -} - -.action-buttons { - display: flex; - gap: 8px; -} - -.action-buttons button { - padding: 6px 12px; - border: none; - border-radius: 4px; - cursor: pointer; - font-size: 0.85rem; -} - -.edit-btn { - background-color: #3498db; - color: white; -} - -.edit-btn:hover { - background-color: #2980b9; -} - -.save-btn { - background-color: #27ae60; - color: white; -} - -.save-btn:hover { - background-color: #229954; -} - -.cancel-btn { - background-color: #95a5a6; - color: white; -} - -.cancel-btn:hover { - background-color: #7f8c8d; -} - -.delete-btn { - background-color: #e74c3c; - color: white; -} - -.delete-btn:hover { - background-color: #c0392b; + padding: var(--spacing-xs) var(--spacing-sm); + border-radius: var(--radius-sm); + border: 1px solid var(--color-border); } .coming-soon { - color: #7f8c8d; + color: var(--color-text-muted); font-style: italic; } -.error-message { - background-color: #ffebee; - color: #c62828; - padding: 12px; - border-radius: 4px; - margin-bottom: 1rem; +/* Responsive */ +@media (max-width: 768px) { + .admin-panel { + padding: var(--spacing-lg); + } + + .users-table { + font-size: var(--font-size-sm); + } + + .users-table th, + .users-table td { + padding: var(--spacing-sm); + } } \ No newline at end of file diff --git a/client/kb-frontend/src/components/AdminPanel.jsx b/client/kb-frontend/src/components/AdminPanel.jsx index f71d849..f10916b 100644 --- a/client/kb-frontend/src/components/AdminPanel.jsx +++ b/client/kb-frontend/src/components/AdminPanel.jsx @@ -96,19 +96,27 @@ function AdminPanel({ token, onBack }) { }; if (loading) { - return
Loading...
+ return ( +
+
+
+
Loading users...
+
+
+ ); } return (
-
- +
+

Admin Panel

+
{error &&
{error}
} -
-

User Management

+
+

User Management

@@ -123,7 +131,7 @@ function AdminPanel({ token, onBack }) { {users.map(user => ( - + @@ -152,24 +160,24 @@ function AdminPanel({ token, onBack }) {
{user.username} {user.email} {user.display_name}{new Date(user.created_at).toLocaleDateString()} {editingUserId === user.id ? ( -
+
) : ( -
+
@@ -180,8 +188,9 @@ function AdminPanel({ token, onBack }) {
-
-

Audit Logs

+ +
+

Audit Logs

Coming Soon...

diff --git a/client/kb-frontend/src/components/ArticleDetail.css b/client/kb-frontend/src/components/ArticleDetail.css index c0198fa..14999fb 100644 --- a/client/kb-frontend/src/components/ArticleDetail.css +++ b/client/kb-frontend/src/components/ArticleDetail.css @@ -1,105 +1,43 @@ .article-detail { - padding: 2rem; - max-width: 800px; + padding: var(--spacing-2xl); + max-width: var(--max-width-lg); margin: 0 auto; } -.back-button { - background: none; - border: 1px solid #333; - padding: 0.5rem 1rem; - cursor: pointer; - margin-bottom: 1rem; -} - -.back-button:hover { - background-color: #f0f0f0; -} - -.edit-button { - background: none; - border: 1px solid #333; - padding: 0.5rem 1rem; - cursor: pointer; - margin-bottom: 1rem; -} - -.edit-button:hover { - background-color: #f0f0f0; -} - -.delete-button { - background: none; - border: 1px solid #333; - padding: 0.5rem 1rem; - cursor: pointer; - margin-bottom: 1rem; -} - -.delete-button:hover { - background-color: #f0f0f0; -} - -.ka-number { - background-color: #3498db; - color: white; - padding: 0.25rem 0.5rem; - border-radius: 4px; - font-size: 0.9rem; -} - .article-meta { - color: #666; - font-size: 0.9rem; + color: var(--color-text-secondary); + font-size: var(--font-size-md); } .article-content { - margin-top: 2rem; - line-height: 1.6; + margin-top: var(--spacing-2xl); + line-height: var(--line-height-relaxed); } .article-metadata { display: flex; align-items: center; - gap: 1rem; - margin-top: 1rem; + gap: var(--spacing-lg); + margin-top: var(--spacing-lg); flex-wrap: wrap; } .metadata-label { - font-weight: bold; - color: #2c3e50; - font-size: 0.95rem; -} - -.metadata-badges { - display: flex; - flex-wrap: wrap; - gap: 0.5rem; -} - -.badge { - display: inline-flex; - align-items: center; - padding: 0.4rem 0.75rem; - border-radius: 16px; - font-size: 0.85rem; - font-weight: 500; -} - -.category-badge { - background-color: #3498db; - color: white; -} - -.tag-badge { - background-color: #27ae60; - color: white; + font-weight: var(--font-weight-bold); + color: var(--color-text-primary); + font-size: var(--font-size-md); } .article-content video { max-width: 100%; height: auto; display: block; - margin: 1rem 0; + margin: var(--spacing-lg) 0; +} + +/* Responsive */ +@media (max-width: 768px) { + .article-detail { + padding: var(--spacing-lg); + } } \ No newline at end of file diff --git a/client/kb-frontend/src/components/ArticleDetail.jsx b/client/kb-frontend/src/components/ArticleDetail.jsx index 7b67101..bf11534 100644 --- a/client/kb-frontend/src/components/ArticleDetail.jsx +++ b/client/kb-frontend/src/components/ArticleDetail.jsx @@ -9,16 +9,16 @@ function ArticleDetail({ article, onBack, onEdit, onDelete, currentUser }) { return (
-
- {canEdit && ( <> - - @@ -26,7 +26,7 @@ function ArticleDetail({ article, onBack, onEdit, onDelete, currentUser }) {
- {article.ka_number} + {article.ka_number}

{article.title}

Created: {new Date(article.created_at).toLocaleDateString()} @@ -36,7 +36,7 @@ function ArticleDetail({ article, onBack, onEdit, onDelete, currentUser }) { {article.categories && article.categories.length > 0 && (

Categories:
-
+
{article.categories.map(category => ( {category} @@ -49,7 +49,7 @@ function ArticleDetail({ article, onBack, onEdit, onDelete, currentUser }) { {article.tags && article.tags.length > 0 && (
Tags:
-
+
{article.tags.map(tag => ( #{tag} diff --git a/client/kb-frontend/src/components/ArticleEdit.css b/client/kb-frontend/src/components/ArticleEdit.css index dbcf88f..e77e16e 100644 --- a/client/kb-frontend/src/components/ArticleEdit.css +++ b/client/kb-frontend/src/components/ArticleEdit.css @@ -1,13 +1,17 @@ .article-editor { - padding: 2rem; - max-width: 900px; + padding: var(--spacing-2xl); + max-width: var(--max-width-lg); margin: 0 auto; + transition: padding-bottom var(--transition-slow); } .editor-header { - margin-bottom: 2rem; - border-bottom: 2px solid #333; - padding-bottom: 1rem; + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: var(--spacing-2xl); + padding-bottom: var(--spacing-lg); + border-bottom: 2px solid var(--color-border-dark); } .editor-header h2 { @@ -17,166 +21,25 @@ .editor-form { display: flex; flex-direction: column; - gap: 1.5rem; -} - -.editor-form label { - font-weight: bold; - margin-bottom: 0.5rem; - display: block; -} - -.editor-form input[type="text"] { - width: 100%; - padding: 0.75rem; - font-size: 1rem; - border: 1px solid #ddd; - border-radius: 4px; -} - -.editor-form input[type="text"]:focus { - outline: none; - border-color: #3498db; + gap: var(--spacing-xl); } /* React Quill editor styling */ .quill { - background-color: white; + background-color: var(--color-background); } .ql-container { min-height: 300px; - font-size: 1rem; + font-size: var(--font-size-base); } .ql-editor { min-height: 300px; } -.editor-buttons { - display: flex; - gap: 1rem; - margin-top: 1rem; -} - -.editor-buttons button { - padding: 0.75rem 2rem; - font-size: 1rem; - border: none; - border-radius: 4px; - cursor: pointer; -} - -.editor-buttons button:first-child { - background-color: #27ae60; - color: white; -} - -.editor-buttons button:first-child:hover { - background-color: #229954; -} - -.editor-buttons button:last-child { - background-color: #95a5a6; - color: white; -} - -.editor-buttons button:last-child:hover { - background-color: #7f8c8d; -} - -/* Form field styling */ -.form-field { - margin-bottom: 1.5rem; -} - -.form-field label { - display: block; - font-weight: bold; - margin-bottom: 0.5rem; - color: #2c3e50; -} - -.form-field input[type="text"] { - width: 100%; - padding: 0.75rem; - font-size: 1rem; - border: 1px solid #ddd; - border-radius: 4px; -} - -.form-field input[type="text"]:focus { - outline: none; - border-color: #3498db; -} - -/* Category selector */ -.category-selector { - position: relative; -} - -.category-dropdown-btn { - width: 100%; - padding: 0.75rem; - background-color: white; - border: 1px solid #ddd; - border-radius: 4px; - cursor: pointer; - display: flex; - justify-content: space-between; - align-items: center; - text-align: left; - font-size: 1rem; -} - -.category-dropdown-btn:hover { - border-color: #3498db; -} - -.dropdown-arrow { - color: #666; - font-size: 0.8rem; -} - -.category-dropdown { - position: absolute; - top: 100%; - left: 0; - right: 0; - background: white; - border: 1px solid #ddd; - border-radius: 4px; - max-height: 200px; - overflow-y: auto; - z-index: 100; - margin-top: 4px; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); -} - -.category-option { - display: flex; - align-items: center; - padding: 0.75rem; - cursor: pointer; - transition: background-color 0.2s; -} - -.category-option:hover { - background-color: #f5f5f5; -} - -.category-option input[type="checkbox"] { - margin-right: 0.75rem; - cursor: pointer; -} - -.no-options { - padding: 1rem; - text-align: center; - color: #999; -} - -/* Tag selector */ +/* Category/Tag selector specific styles */ +.category-selector, .tag-selector { position: relative; } @@ -185,142 +48,29 @@ position: relative; } -.tag-input { - width: 100%; - padding: 0.75rem; - border: 1px solid #ddd; - border-radius: 4px; - font-size: 1rem; -} - -.tag-input:focus { - outline: none; - border-color: #3498db; -} - -.tag-suggestions { - position: absolute; - top: 100%; - left: 0; - right: 0; - background: white; - border: 1px solid #ddd; - border-radius: 4px; - margin-top: 4px; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - z-index: 100; -} - -.tag-suggestion { - padding: 0.75rem; - cursor: pointer; - transition: background-color 0.2s; -} - -.tag-suggestion:hover { - background-color: #f5f5f5; -} - -/* Badges */ -.selected-badges { - display: flex; - flex-wrap: wrap; - gap: 0.5rem; - margin-top: 0.75rem; -} - -.badge { - display: inline-flex; - align-items: center; - gap: 0.5rem; - padding: 0.5rem 0.75rem; - border-radius: 16px; - font-size: 0.9rem; - font-weight: 500; -} - -.category-badge { - background-color: #3498db; - color: white; -} - -.tag-badge { - background-color: #27ae60; - color: white; -} - -.badge-remove { - background: none; - border: none; - color: white; - font-size: 1.2rem; - cursor: pointer; - padding: 0; - line-height: 1; - opacity: 0.8; -} - -.badge-remove:hover { - opacity: 1; -} - .create-new-section { - padding: 0.75rem; - border-bottom: 1px solid #ddd; - background-color: #f9f9f9; + padding: var(--spacing-md); + border-bottom: 1px solid var(--color-border); + background-color: var(--color-gray-100); } .create-new-section input { width: 100%; - padding: 0.5rem; - border: 1px solid #ddd; - border-radius: 4px; - margin-bottom: 0.5rem; + padding: var(--spacing-sm); + border: 1px solid var(--color-border); + border-radius: var(--radius-sm); + margin-bottom: var(--spacing-sm); } -.create-new-buttons { - display: flex; - gap: 0.5rem; -} - -.create-new-buttons button { - padding: 0.4rem 0.8rem; - border: none; - border-radius: 4px; - cursor: pointer; - font-size: 0.85rem; -} - -.create-new-buttons .create-btn { - background-color: #27ae60; - color: white; -} - -.create-new-buttons .create-btn:hover { - background-color: #229954; -} - -.create-new-buttons .cancel-btn { - background-color: #95a5a6; - color: white; -} - -.create-new-buttons .cancel-btn:hover { - background-color: #7f8c8d; -} - -.create-new-button-dropdown { - width: 100%; - padding: 0.75rem; - background-color: #27ae60; - color: white; - border: none; - border-bottom: 1px solid #ddd; - text-align: left; - cursor: pointer; - font-weight: bold; -} - -.create-new-button-dropdown:hover { - background-color: #229954; +/* Responsive */ +@media (max-width: 768px) { + .article-editor { + padding: var(--spacing-lg); + } + + .editor-header { + flex-direction: column; + align-items: flex-start; + gap: var(--spacing-md); + } } \ No newline at end of file diff --git a/client/kb-frontend/src/components/ArticleEdit.jsx b/client/kb-frontend/src/components/ArticleEdit.jsx index 044886a..a852a54 100644 --- a/client/kb-frontend/src/components/ArticleEdit.jsx +++ b/client/kb-frontend/src/components/ArticleEdit.jsx @@ -84,6 +84,34 @@ function ArticleEditor({ article, onSave, onCancel, token }) { } }, [article]); + // Add padding and scroll when gallery opens + useEffect(() => { + const editorElement = document.querySelector('.article-editor'); + + if (isGalleryOpen) { + // Add padding equal to drawer height (40vh + some extra space) + editorElement.style.paddingBottom = 'calc(40vh + 2rem)'; + + // Scroll down smoothly so editor is visible above drawer + setTimeout(() => { + window.scrollTo({ + top: document.body.scrollHeight, + behavior: 'smooth' + }); + }, 100); // Small delay to let padding apply first + } else { + // Remove padding when closed + editorElement.style.paddingBottom = ''; + } + + // Cleanup on unmount + return () => { + if (editorElement) { + editorElement.style.paddingBottom = ''; + } + }; + }, [isGalleryOpen]); + const fetchCategories = async () => { try { const response = await fetch('http://localhost:9000/api/categories', { @@ -209,7 +237,7 @@ function ArticleEditor({ article, onSave, onCancel, token }) { setShowCreateCategory(false); } else { const data = await response.json(); - alert(data.error || 'Failed to create cateogry'); + alert(data.error || 'Failed to create category'); } } catch (err) { console.error('Failed to create new category:', err); @@ -295,7 +323,7 @@ function ArticleEditor({ article, onSave, onCancel, token }) { {article.ka_number} {article.status === 'draft' && ( - DRAFT + DRAFT )}
@@ -304,6 +332,7 @@ function ArticleEditor({ article, onSave, onCancel, token }) { setTitle(e.target.value)} /> @@ -314,17 +343,19 @@ function ArticleEditor({ article, onSave, onCancel, token }) {
{showCategoryDropdown && ( -
+
{showCreateCategory ? (
-
+
-
- - -
diff --git a/client/kb-frontend/src/components/ArticleList.css b/client/kb-frontend/src/components/ArticleList.css index 55e86b6..6958f71 100644 --- a/client/kb-frontend/src/components/ArticleList.css +++ b/client/kb-frontend/src/components/ArticleList.css @@ -1,56 +1,37 @@ .article-item { - border: 1px solid #ddd; - padding: 1rem; - margin-bottom: 1rem; - border-radius: 4px; + border: 1px solid var(--color-border); + padding: var(--spacing-lg); + margin-bottom: var(--spacing-lg); + border-radius: var(--radius-sm); cursor: pointer; - transition: all 0.2s; + transition: all var(--transition-base); } .article-item:hover { - background-color: #f5f5f5; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + background-color: var(--color-gray-100); + box-shadow: var(--shadow-md); } .article-item-header h3 { - margin: 0 0 0.5rem 0; + margin: 0 0 var(--spacing-sm) 0; } .article-date { - color: #666; - font-size: 0.9rem; + color: var(--color-text-secondary); + font-size: var(--font-size-md); margin: 0; } .article-item-metadata { display: flex; - gap: 0.5rem; - margin-top: 0.75rem; + gap: var(--spacing-sm); + margin-top: var(--spacing-md); flex-wrap: wrap; } -.metadata-badges { - display: flex; - flex-wrap: wrap; - gap: 0.5rem; -} - -/* Badges */ -.badge { - display: inline-flex; - align-items: center; - padding: 0.3rem 0.6rem; - border-radius: 12px; - font-size: 0.8rem; - font-weight: 500; -} - -.category-badge { - background-color: #3498db; - color: white; -} - -.tag-badge { - background-color: #27ae60; - color: white; +/* Responsive */ +@media (max-width: 768px) { + .article-item { + padding: var(--spacing-md); + } } \ No newline at end of file diff --git a/client/kb-frontend/src/components/DraftsList.css b/client/kb-frontend/src/components/DraftsList.css index e4870ce..bc5f625 100644 --- a/client/kb-frontend/src/components/DraftsList.css +++ b/client/kb-frontend/src/components/DraftsList.css @@ -1,51 +1,27 @@ .drafts-list { - padding: 2rem; - max-width: 1200px; + padding: var(--spacing-2xl); + max-width: var(--max-width-2xl); margin: 0 auto; } -.drafts-header { - display: flex; - align-items: center; - gap: 2rem; - margin-bottom: 2rem; - border-bottom: 2px solid #333; - padding-bottom: 1rem; -} - -.drafts-header h1 { - margin: 0; -} - -.no-drafts { - text-align: center; - padding: 4rem 2rem; - color: #666; -} - -.no-drafts p { - margin: 0.5rem 0; - font-size: 1.1rem; -} - .drafts-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); - gap: 1.5rem; + gap: var(--spacing-xl); } .draft-card { - background: white; - border: 2px solid #e0e0e0; - border-radius: 8px; - padding: 1.5rem; + background: var(--color-background); + border: 2px solid var(--color-border-light); + border-radius: var(--radius-lg); + padding: var(--spacing-xl); cursor: pointer; - transition: all 0.2s; + transition: all var(--transition-base); } .draft-card:hover { - border-color: #3498db; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + border-color: var(--color-primary); + box-shadow: var(--shadow-lg); transform: translateY(-2px); } @@ -53,43 +29,26 @@ display: flex; justify-content: space-between; align-items: center; - margin-bottom: 1rem; -} - -.draft-badge { - background-color: #f39c12; - color: white; - padding: 0.25rem 0.75rem; - border-radius: 4px; - font-size: 0.75rem; - font-weight: bold; -} - -.ka-number { - background-color: #3498db; - color: white; - padding: 0.25rem 0.5rem; - border-radius: 4px; - font-size: 0.85rem; + margin-bottom: var(--spacing-lg); } .draft-title { - margin: 0 0 1rem 0; - font-size: 1.25rem; - color: #2c3e50; + margin: 0 0 var(--spacing-lg) 0; + font-size: var(--font-size-xl); + color: var(--color-text-primary); } .draft-title:empty::before { content: '(Untitled)'; - color: #999; + color: var(--color-text-muted); font-style: italic; } .draft-preview { - color: #666; - font-size: 0.9rem; - line-height: 1.4; - margin-bottom: 1rem; + color: var(--color-text-secondary); + font-size: var(--font-size-md); + line-height: var(--line-height-snug); + margin-bottom: var(--spacing-lg); min-height: 3rem; } @@ -97,33 +56,22 @@ display: flex; justify-content: space-between; align-items: center; - padding-top: 1rem; - border-top: 1px solid #eee; + padding-top: var(--spacing-lg); + border-top: 1px solid var(--color-border-light); } .draft-date { - font-size: 0.85rem; - color: #999; + font-size: var(--font-size-sm); + color: var(--color-text-muted); } -.delete-draft-btn { - background-color: #e74c3c; - color: white; - border: none; - padding: 0.5rem 1rem; - border-radius: 4px; - cursor: pointer; - font-size: 0.85rem; -} - -.delete-draft-btn:hover { - background-color: #c0392b; -} - -.error-message { - background-color: #ffebee; - color: #c62828; - padding: 1rem; - border-radius: 4px; - margin-bottom: 1rem; +/* Responsive */ +@media (max-width: 768px) { + .drafts-list { + padding: var(--spacing-lg); + } + + .drafts-grid { + grid-template-columns: 1fr; + } } \ No newline at end of file diff --git a/client/kb-frontend/src/components/DraftsList.jsx b/client/kb-frontend/src/components/DraftsList.jsx index 26ea2b7..9ac8768 100644 --- a/client/kb-frontend/src/components/DraftsList.jsx +++ b/client/kb-frontend/src/components/DraftsList.jsx @@ -57,32 +57,44 @@ function DraftsList({ token, onBack, onSelectDraft }) { }; if (loading) { - return
Loading...
; + return ( +
+
+
+
Loading drafts...
+
+
+ ); } return (
-
-

My Drafts

+
+

My Drafts

+
{error && (
{error}
)} {drafts.length === 0 ? ( -
-

You do not have any drafts yet.

+
+
📝
+

No Drafts Yet

+

You don't have any drafts. Click "Create New Article" to start writing.

) : (
{drafts.map(draft => (
onSelectDraft(draft)} >
- DRAFT - {draft.ka_number} + DRAFT + {draft.ka_number}

{draft.title || '(Untitled)'}

@@ -94,15 +106,14 @@ function DraftsList({ token, onBack, onSelectDraft }) {
Created: {new Date(draft.created_at).toLocaleDateString()}
))}
- ) - } + )}
); } diff --git a/client/kb-frontend/src/components/FilterBar.css b/client/kb-frontend/src/components/FilterBar.css index 62ccdf9..2a86bc7 100644 --- a/client/kb-frontend/src/components/FilterBar.css +++ b/client/kb-frontend/src/components/FilterBar.css @@ -1,12 +1,12 @@ .filter-bar { - padding: 1rem 2rem; - background-color: #f9f9f9; - border-bottom: 1px solid #ddd; + padding: var(--spacing-lg) var(--spacing-2xl); + background-color: var(--color-background); + border-bottom: 1px solid var(--color-border); } .filter-controls { display: flex; - gap: 1rem; + gap: var(--spacing-lg); align-items: flex-end; flex-wrap: wrap; } @@ -14,142 +14,48 @@ .filter-group { display: flex; flex-direction: column; - gap: 0.5rem; + gap: var(--spacing-sm); } .filter-group label { - font-weight: bold; - font-size: 0.9rem; - color: #2c3e50; + font-weight: var(--font-weight-bold); + font-size: var(--font-size-md); + color: var(--color-text-primary); } .filter-dropdown-container { position: relative; -} - -.filter-dropdown-btn { min-width: 180px; - padding: 0.5rem 1rem; - background-color: white; - border: 1px solid #ddd; - border-radius: 4px; - cursor: pointer; - display: flex; - justify-content: space-between; - align-items: center; - font-size: 0.9rem; -} - -.filter-dropdown-btn:hover { - border-color: #3498db; -} - -.dropdown-arrow { - color: #666; - font-size: 0.7rem; - margin-left: 0.5rem; -} - -.filter-dropdown { - position: absolute; - top: 100%; - left: 0; - right: 0; - background: white; - border: 1px solid #ddd; - border-radius: 4px; - max-height: 250px; - overflow-y: auto; - z-index: 100; - margin-top: 4px; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); -} - -.filter-option { - display: flex; - align-items: center; - padding: 0.75rem; - cursor: pointer; - transition: background-color 0.2s; -} - -.filter-option:hover { - background-color: #f5f5f5; -} - -.filter-option input[type="checkbox"] { - margin-right: 0.75rem; - cursor: pointer; -} - -.no-options { - padding: 1rem; - text-align: center; - color: #999; -} - -.clear-filters-btn { - padding: 0.5rem 1rem; - background-color: #e74c3c; - color: white; - border: none; - border-radius: 4px; - cursor: pointer; - font-size: 0.9rem; - align-self: flex-end; -} - -.clear-filters-btn:hover { - background-color: #c0392b; } .active-filters { display: flex; flex-wrap: wrap; - gap: 0.5rem; + gap: var(--spacing-sm); align-items: center; - margin-top: 1rem; - padding-top: 1rem; - border-top: 1px solid #ddd; + margin-top: var(--spacing-lg); + padding-top: var(--spacing-lg); + border-top: 1px solid var(--color-border); } .active-filters-label { - font-weight: bold; - color: #2c3e50; - font-size: 0.9rem; + font-weight: var(--font-weight-bold); + color: var(--color-text-primary); + font-size: var(--font-size-md); } -.filter-badge { - display: inline-flex; - align-items: center; - gap: 0.5rem; - padding: 0.4rem 0.75rem; - border-radius: 16px; - font-size: 0.85rem; - font-weight: 500; -} - -.filter-badge.category-badge { - background-color: #3498db; - color: white; -} - -.filter-badge.tag-badge { - background-color: #27ae60; - color: white; -} - -.filter-badge button { - background: none; - border: none; - color: white; - font-size: 1.2rem; - cursor: pointer; - padding: 0; - line-height: 1; - opacity: 0.8; -} - -.filter-badge button:hover { - opacity: 1; +/* Responsive */ +@media (max-width: 768px) { + .filter-bar { + padding: var(--spacing-md) var(--spacing-lg); + } + + .filter-controls { + flex-direction: column; + align-items: stretch; + } + + .filter-dropdown-container { + min-width: auto; + } } \ No newline at end of file diff --git a/client/kb-frontend/src/components/FilterBar.jsx b/client/kb-frontend/src/components/FilterBar.jsx index 4312f2f..4819267 100644 --- a/client/kb-frontend/src/components/FilterBar.jsx +++ b/client/kb-frontend/src/components/FilterBar.jsx @@ -1,7 +1,7 @@ import { useState, useEffect } from 'react'; import './FilterBar.css'; -function FilterBar ({ token, onFilterChange }) { +function FilterBar({ token, onFilterChange }) { const [availableCategories, setAvailableCategories] = useState([]); const [availableTags, setAvailableTags] = useState([]); const [selectedCategories, setSelectedCategories] = useState([]); @@ -34,7 +34,7 @@ function FilterBar ({ token, onFilterChange }) { setAvailableCategories(data.map(category => category.name)); } } catch(err) { - console.error('Error fetchign categories:', err); + console.error('Error fetching categories:', err); } }; @@ -85,22 +85,24 @@ function FilterBar ({ token, onFilterChange }) {
{showCategoryDropdown && ( -
+
{availableCategories.length === 0 ? ( -
No categories available
+
No categories available
) : ( availableCategories.map(category => ( -