diff --git a/static/css/style.css b/static/css/style.css index 68d62cd..7c5683a 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -1739,4 +1739,622 @@ input[type="time"]::-webkit-datetime-edit { .urgent-badge { align-self: flex-end; } +} + +/* Common Management Interface Styles */ +.management-container { + padding: 1rem; + max-width: 100%; + margin: 0 auto; +} + +.management-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 1.5rem; + flex-wrap: wrap; + gap: 1rem; +} + +.management-header h1 { + margin: 0; + color: #333; +} + +.management-controls { + display: flex; + gap: 1rem; + flex-wrap: wrap; + align-items: center; +} + +/* View Switcher Component */ +.view-switcher { + display: flex; + background: #f8f9fa; + border-radius: 6px; + padding: 2px; +} + +.view-btn { + padding: 0.5rem 1rem; + border: none; + background: white; + cursor: pointer; + border-radius: 4px; + transition: background-color 0.2s; + color: #333; + border: 1px solid #ddd; +} + +.view-btn.active { + background: #007bff; + color: white; + border-color: #007bff; +} + +.view-btn:hover:not(.active) { + background: #e9ecef; +} + +/* Statistics Cards */ +.management-stats { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); + gap: 1rem; + margin-bottom: 1.5rem; +} + +.stat-card { + background: white; + border: 1px solid #ddd; + border-radius: 8px; + padding: 1rem; + text-align: center; +} + +.stat-number { + font-size: 2rem; + font-weight: bold; + color: #007bff; +} + +.stat-label { + font-size: 0.9rem; + color: #666; + margin-top: 0.25rem; +} + +/* Loading and Error States */ +.loading-spinner { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 2rem; +} + +.error-alert { + background: #f8d7da; + color: #721c24; + padding: 1rem; + border-radius: 6px; + text-align: center; + margin: 1rem 0; +} + +/* Modal Enhancements */ +.modal.large .modal-content { + max-width: 800px; +} + +.modal-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 1rem; + padding-bottom: 1rem; + border-bottom: 1px solid #dee2e6; +} + +.modal-footer { + display: flex; + justify-content: flex-end; + gap: 0.5rem; + margin-top: 1.5rem; + padding-top: 1rem; + border-top: 1px solid #dee2e6; +} + +/* Form Components */ +.form-row { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 1rem; +} + +.form-group { + margin-bottom: 1rem; +} + +.form-group label { + display: block; + margin-bottom: 0.25rem; + font-weight: 500; + color: #333; +} + +.form-group input, +.form-group select, +.form-group textarea { + width: 100%; + padding: 0.5rem; + border: 1px solid #ddd; + border-radius: 4px; + font-size: 14px; +} + +/* Priority and Status Badges */ +.priority-badge, .status-badge { + padding: 0.125rem 0.375rem; + border-radius: 12px; + font-size: 0.75rem; + font-weight: 500; + text-transform: uppercase; +} + +.priority-badge.LOW { background: #d4edda; color: #155724; } +.priority-badge.MEDIUM { background: #fff3cd; color: #856404; } +.priority-badge.HIGH { background: #f8d7da; color: #721c24; } +.priority-badge.URGENT { background: #f5c6cb; color: #721c24; } + +.status-badge.PLANNING { background: #fff3cd; color: #856404; } +.status-badge.ACTIVE { background: #d1ecf1; color: #0c5460; } +.status-badge.COMPLETED { background: #d4edda; color: #155724; } +.status-badge.CANCELLED { background: #f8d7da; color: #721c24; } +.status-badge.NOT_STARTED { background: #e2e3e5; color: #495057; } +.status-badge.IN_PROGRESS { background: #d1ecf1; color: #0c5460; } +.status-badge.ON_HOLD { background: #ffeaa7; color: #856404; } + +/* Card Components */ +.management-card { + background: white; + border: 1px solid #ddd; + border-radius: 8px; + padding: 1.5rem; + cursor: pointer; + transition: box-shadow 0.2s, transform 0.1s; + position: relative; +} + +.management-card:hover { + box-shadow: 0 4px 12px rgba(0,0,0,0.1); + transform: translateY(-2px); +} + +.card-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: 1rem; +} + +.card-title { + font-size: 1.25rem; + font-weight: bold; + margin: 0; + color: #333; +} + +.card-meta { + display: flex; + justify-content: space-between; + align-items: center; + font-size: 0.8rem; + color: #666; +} + +/* Progress Components */ +.progress-bar { + width: 100%; + height: 8px; + background: #e9ecef; + border-radius: 4px; + overflow: hidden; +} + +.progress-fill { + height: 100%; + background: linear-gradient(90deg, #007bff, #0056b3); + transition: width 0.3s ease; +} + +.progress-text { + font-size: 0.8rem; + color: #666; + margin-top: 0.25rem; +} + +/* Actions */ +.management-actions { + display: flex; + gap: 0.5rem; +} + +/* Grid Layouts */ +.management-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); + gap: 1.5rem; + margin-bottom: 2rem; +} + +/* Responsive Design for Management Interfaces */ +@media (max-width: 768px) { + .management-header { + flex-direction: column; + align-items: stretch; + } + + .management-controls { + flex-direction: column; + align-items: stretch; + } + + .view-switcher { + justify-content: center; + } + + .management-grid { + grid-template-columns: 1fr; + } + + .form-row { + grid-template-columns: 1fr; + } +} + +/* Common Container Patterns */ +.page-container { + padding: 1rem; + max-width: 1400px; + margin: 0 auto; +} + +.page-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 2rem; + padding-bottom: 1rem; + border-bottom: 2px solid #e9ecef; +} + +.page-header h2 { + margin: 0; + color: #333; +} + +.page-actions { + display: flex; + gap: 0.5rem; +} + +/* Kanban Common Styles */ +.kanban-container { + padding: 1rem; +} + +.kanban-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: 2rem; + padding-bottom: 1rem; + border-bottom: 2px solid #dee2e6; +} + +.kanban-board { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: 1rem; + margin-bottom: 2rem; +} + +.kanban-column { + background: #f8f9fa; + border-radius: 8px; + padding: 1rem; + min-height: 500px; +} + +.column-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 1rem; + padding-bottom: 0.5rem; + border-bottom: 2px solid #ddd; +} + +.column-header h3 { + margin: 0; + font-size: 1.1rem; + color: #333; +} + +.column-content { + min-height: 400px; + padding: 0.5rem 0; +} + +.task-count { + background: #007bff; + color: white; + padding: 0.25rem 0.5rem; + border-radius: 12px; + font-size: 0.8rem; +} + +/* Card Components - Enhanced */ +.card { + background: white; + border: 1px solid #dee2e6; + border-radius: 8px; + overflow: hidden; + box-shadow: 0 2px 4px rgba(0,0,0,0.1); + transition: box-shadow 0.2s ease; +} + +.card:hover { + box-shadow: 0 4px 12px rgba(0,0,0,0.15); +} + +.card-header { + padding: 1.5rem; + background: #f8f9fa; + border-bottom: 1px solid #dee2e6; + display: flex; + justify-content: space-between; + align-items: flex-start; +} + +.card-body { + padding: 1.5rem; +} + +.card-footer { + padding: 1rem 1.5rem; + background: #f8f9fa; + border-top: 1px solid #dee2e6; +} + +.card-title { + margin: 0 0 0.5rem 0; + color: #333; + font-size: 1.25rem; + font-weight: 600; +} + +.card-subtitle { + color: #666; + margin: 0; + font-size: 0.9rem; +} + +/* Grid Systems */ +.grid-2 { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 1rem; +} + +.grid-3 { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 1rem; +} + +.grid-4 { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 1rem; +} + +.grid-auto { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 1rem; +} + +/* Dashboard Widget Common Styles */ +.widget { + background: white; + border: 1px solid #dee2e6; + border-radius: 8px; + padding: 1rem; + box-shadow: 0 2px 4px rgba(0,0,0,0.1); + transition: all 0.2s ease; + position: relative; + overflow: hidden; +} + +.widget:hover { + box-shadow: 0 4px 8px rgba(0,0,0,0.15); +} + +.widget-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 1rem; + padding-bottom: 0.5rem; + border-bottom: 1px solid #eee; +} + +.widget-title { + margin: 0; + font-size: 1rem; + font-weight: 600; + color: #333; +} + +.widget-content { + min-height: 100px; +} + +/* Filter Components */ +.filter-bar { + background: #f8f9fa; + padding: 1rem; + border-radius: 8px; + margin-bottom: 1.5rem; + border: 1px solid #dee2e6; +} + +.filter-row { + display: flex; + gap: 1rem; + align-items: end; + flex-wrap: wrap; +} + +.filter-group { + display: flex; + flex-direction: column; + min-width: 150px; +} + +.filter-group label { + font-weight: 500; + color: #495057; + margin-bottom: 0.5rem; + font-size: 0.9rem; +} + +.filter-group input, +.filter-group select { + padding: 0.5rem; + border: 1px solid #ced4da; + border-radius: 6px; + font-size: 0.9rem; + transition: border-color 0.2s ease; +} + +.filter-group input:focus, +.filter-group select:focus { + outline: none; + border-color: #007bff; + box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.1); +} + +/* Tag/Badge System Enhancement */ +.tag { + display: inline-block; + padding: 0.25rem 0.5rem; + border-radius: 12px; + font-size: 0.75rem; + font-weight: 500; + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.tag-blue { background: #d1ecf1; color: #0c5460; } +.tag-green { background: #d4edda; color: #155724; } +.tag-yellow { background: #fff3cd; color: #856404; } +.tag-red { background: #f8d7da; color: #721c24; } +.tag-gray { background: #e2e3e5; color: #495057; } +.tag-purple { background: #e1d3ed; color: #6f42c1; } + +/* Project/Context Information */ +.project-info { + display: flex; + align-items: center; + gap: 0.5rem; + margin-bottom: 1rem; +} + +.project-code { + background: #007bff; + color: white; + padding: 0.25rem 0.5rem; + border-radius: 4px; + font-size: 0.8rem; + font-weight: 600; +} + +.project-name { + font-weight: 500; + color: #333; +} + +.context-info { + padding: 0.75rem; + background: #f8f9fa; + border-radius: 6px; + border-left: 4px solid #007bff; + margin: 1rem 0; +} + +.context-label { + font-weight: 600; + color: #333; + margin-right: 0.5rem; +} + +/* Enhanced Responsive Design */ +@media (max-width: 1200px) { + .grid-4 { + grid-template-columns: repeat(3, 1fr); + } +} + +@media (max-width: 992px) { + .grid-3, .grid-4 { + grid-template-columns: repeat(2, 1fr); + } + + .kanban-board { + grid-template-columns: repeat(2, 1fr); + } +} + +@media (max-width: 768px) { + .page-container { + padding: 0.5rem; + } + + .page-header { + flex-direction: column; + gap: 1rem; + align-items: stretch; + } + + .page-actions { + justify-content: center; + } + + .grid-2, .grid-3, .grid-4 { + grid-template-columns: 1fr; + } + + .kanban-board { + grid-template-columns: 1fr; + } + + .filter-row { + flex-direction: column; + align-items: stretch; + } + + .filter-group { + min-width: auto; + } + + .card-header { + flex-direction: column; + gap: 1rem; + align-items: stretch; + } } \ No newline at end of file diff --git a/templates/analytics.html b/templates/analytics.html index 7c1e55d..3389c26 100644 --- a/templates/analytics.html +++ b/templates/analytics.html @@ -1,8 +1,8 @@ {% extends "layout.html" %} {% block content %} -
-
+
+