/* Projects View - Game-like Minimalistic Design */ /* :root variables moved to common.css or are view-specific if necessary */ .projects-view-container { /* Extends .view-container from common.css */ height: calc(100vh - 120px); /* Specific height */ margin: 100px 40px 60px 40px; /* Specific margins */ /* font-family will be inherited from common.css body */ /* Other .view-container properties are inherited or set by common.css */ } /* Header */ .projects-header { /* Extends .view-header from common.css */ /* .view-header provides: display, justify-content, align-items, padding-bottom, border-bottom, margin-bottom */ /* Original margin-bottom: 24px (var(--spacing-lg)); padding: 0 8px (var(--spacing-sm) on sides) */ /* common.css .view-header has margin-bottom: var(--spacing-md) (16px). Override if 24px is needed. */ margin-bottom: var(--spacing-lg); /* Explicitly use 24px equivalent */ padding: 0 var(--spacing-sm); /* Explicitly use 8px equivalent for side padding */ } .projects-tabs { display: flex; gap: var(--spacing-sm); /* Was 8px */ background: var(--surface-dark); /* Common.css variable */ border: 1px solid var(--border-color); /* Common.css variable */ border-radius: var(--border-radius-large); /* Was 12px */ padding: 6px; /* Specific padding */ } .tab-btn { display: flex; align-items: center; gap: var(--spacing-sm); /* Was 8px */ background: transparent; color: var(--text-secondary); /* Common.css variable */ border: none; padding: 12px 16px; /* Specific padding */ border-radius: var(--border-radius-medium); /* Common.css variable */ cursor: pointer; font-size: 14px; font-weight: 500; transition: all 0.2s ease; position: relative; overflow: hidden; } .tab-btn::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255,255,255,0.1), transparent); transition: left 0.5s ease; } .tab-btn:hover::before { left: 100%; } .tab-btn:hover { color: var(--text-primary); /* Common.css variable */ background: var(--surface-medium); /* Common.css variable for hover */ transform: translateY(-1px); } .tab-btn.active { background: var(--primary-accent); /* Common.css variable */ color: var(--bg-dark); /* Text color on primary accent */ box-shadow: 0 0 20px color-mix(in srgb, var(--primary-accent) 30%, transparent); /* Glow with common primary */ } .tab-btn i { font-size: 16px; } .projects-actions { display: flex; gap: 12px; } .action-btn { display: flex; align-items: center; gap: var(--spacing-sm); /* Was 8px */ background: var(--surface-dark); /* Common.css variable */ color: var(--text-primary); /* Common.css variable */ border: 1px solid var(--border-color); /* Common.css variable */ padding: 12px 20px; /* Specific padding */ border-radius: var(--border-radius-medium); /* Common.css variable */ cursor: pointer; font-size: 14px; font-weight: 500; transition: all 0.2s ease; position: relative; overflow: hidden; } .action-btn.primary { background: var(--primary-accent); /* Common.css variable */ border-color: var(--primary-accent); /* Common.css variable */ color: var(--bg-dark); /* Text color for primary button */ box-shadow: 0 0 15px color-mix(in srgb, var(--primary-accent) 20%, transparent); /* Glow with common primary */ } .action-btn:hover { transform: translateY(-2px); box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3); /* Specific shadow */ background: var(--surface-medium); /* Example: align hover bg with common */ border-color: var(--primary-accent); /* Example: align hover border with common */ } .action-btn.primary:hover { box-shadow: 0 4px 25px color-mix(in srgb, var(--primary-accent) 40%, transparent); /* Glow with common primary */ background: color-mix(in srgb, var(--primary-accent) 85%, white); /* Common primary button hover */ } /* Content Area */ .projects-content { flex: 1; overflow: hidden; border-radius: 12px; } /* Kanban Board */ .kanban-board { display: flex; gap: 20px; height: 100%; overflow-x: auto; padding: 8px; } .kanban-column { min-width: 300px; background: var(--surface-dark); /* Common.css variable */ border: 1px solid var(--border-color); /* Common.css variable */ border-radius: var(--border-radius-large); /* Common.css variable */ display: flex; flex-direction: column; overflow: hidden; } .column-header { padding: 16px 20px; border-bottom: 1px solid var(--border-color); /* Common.css variable */ display: flex; justify-content: space-between; align-items: center; background: var(--surface-light); /* Common.css variable */ } .column-header h3 { margin: 0; font-size: 16px; font-weight: 600; color: var(--text-primary); } .task-count { background: var(--surface-medium); /* Common.css variable */ color: var(--text-secondary); /* Common.css variable */ padding: 4px 8px; border-radius: var(--border-radius-large); /* Common.css variable */ font-size: 12px; font-weight: 600; } .column-content { flex: 1; padding: 16px; overflow-y: auto; display: flex; flex-direction: column; gap: 12px; } /* Task Cards */ .task-card { background: var(--surface-light); /* Common.css variable */ border: 1px solid var(--border-color); /* Common.css variable */ border-radius: var(--border-radius-medium); /* Common.css variable */ padding: var(--spacing-md); /* Was 16px */ cursor: pointer; transition: all 0.2s ease; position: relative; overflow: hidden; } .task-card::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(135deg, rgba(255,255,255,0.05), transparent); opacity: 0; transition: opacity 0.2s ease; } .task-card:hover::before { opacity: 1; } .task-card:hover { transform: translateY(-2px); border-color: var(--primary-accent); /* Common.css variable */ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2); /* Specific shadow */ } .task-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px; } .task-priority { width: 8px; height: 8px; border-radius: 50%; } .task-id { font-size: 11px; color: var(--text-muted); font-weight: 600; text-transform: uppercase; } .task-title { margin: 0 0 8px 0; font-size: 14px; font-weight: 600; color: var(--text-primary); line-height: 1.3; } .task-description { margin: 0 0 12px 0; font-size: 12px; color: var(--text-secondary); line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; } .task-footer { display: flex; justify-content: space-between; align-items: center; gap: 8px; } .task-assignee { width: 24px; height: 24px; border-radius: 50%; overflow: hidden; border: 2px solid var(--border-color); /* Common.css variable */ } .task-assignee img { width: 100%; height: 100%; object-fit: cover; } .task-assignee.unassigned { background: var(--surface-medium); /* Common.css variable */ display: flex; align-items: center; justify-content: center; color: var(--text-muted); font-size: 10px; } .story-points { background: #06b6d4; /* Literal info color */ color: var(--bg-dark); /* Text on cyan */ padding: 2px 6px; border-radius: 4px; font-size: 11px; font-weight: 600; } .task-tags { display: flex; gap: 4px; } .tag { background: var(--surface-medium); /* Common.css variable */ color: var(--text-muted); /* Common.css variable */ padding: 2px 6px; border-radius: 4px; font-size: 10px; font-weight: 500; } .add-task-placeholder { display: flex; align-items: center; justify-content: center; gap: var(--spacing-sm); /* Was 8px */ padding: var(--spacing-md); /* Was 16px */ border: 2px dashed var(--border-color); /* Common.css variable */ border-radius: var(--border-radius-medium); /* Common.css variable */ color: var(--text-muted); /* Common.css variable */ cursor: pointer; transition: all 0.2s ease; margin-top: auto; } .add-task-placeholder:hover { border-color: var(--primary-accent); /* Common.css variable */ color: var(--primary-accent); /* Common.css variable */ background: color-mix(in srgb, var(--primary-accent) 5%, transparent); /* Use common primary with alpha */ } /* Epics View */ .epics-view { height: 100%; overflow-y: auto; padding: 8px; } .epics-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(350px, 1fr)); gap: 20px; } .epic-card { background: var(--surface-dark); /* Common.css variable */ border: 1px solid var(--border-color); /* Common.css variable */ border-radius: var(--border-radius-large); /* Common.css variable */ overflow: hidden; transition: all 0.2s ease; cursor: pointer; } .epic-card:hover { transform: translateY(-4px); box-shadow: 0 8px 30px rgba(0, 0, 0, 0.3); } .epic-header { padding: 20px; color: white; position: relative; overflow: hidden; } .epic-header::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(135deg, rgba(255,255,255,0.1), transparent); } .epic-header h3 { margin: 0 0 8px 0; font-size: 18px; font-weight: 700; position: relative; z-index: 1; } .epic-status { font-size: 12px; font-weight: 600; text-transform: uppercase; opacity: 0.9; position: relative; z-index: 1; } .epic-content { padding: 20px; } .epic-description { margin: 0 0 16px 0; font-size: 14px; color: var(--text-secondary); line-height: 1.5; } .epic-progress { margin-bottom: 16px; } .progress-bar { width: 100%; height: 6px; background: var(--surface-medium); /* Common.css variable */ border-radius: var(--border-radius-small); /* Common.css variable */ overflow: hidden; margin-bottom: 8px; } .progress-fill { height: 100%; border-radius: 3px; transition: width 0.3s ease; } .progress-text { font-size: 12px; color: var(--text-muted); font-weight: 500; } .epic-footer { display: flex; justify-content: space-between; align-items: center; } .epic-owner { display: flex; align-items: center; gap: 8px; } .epic-owner img, .avatar-placeholder { width: 24px; height: 24px; border-radius: 50%; border: 2px solid var(--border-color); /* Common.css variable */ } .avatar-placeholder { background: var(--surface-medium); /* Common.css variable */ display: flex; align-items: center; justify-content: center; color: var(--text-muted); font-size: 10px; } .epic-owner span { font-size: 12px; color: var(--text-secondary); font-weight: 500; } .epic-date { font-size: 12px; color: var(--text-muted); font-weight: 500; } /* Sprints View */ .sprints-view { height: 100%; overflow-y: auto; padding: 8px; display: flex; flex-direction: column; gap: 16px; } .sprint-card { background: var(--surface-dark); /* Common.css variable */ border: 1px solid var(--border-color); /* Common.css variable */ border-radius: var(--border-radius-large); /* Common.css variable */ padding: var(--spacing-lg); /* Was 20px */ transition: all 0.2s ease; cursor: pointer; } .sprint-card:hover { transform: translateY(-2px); border-color: var(--primary-accent); /* Common.css variable */ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2); /* Specific shadow */ } .sprint-header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 16px; } .sprint-info h3 { margin: 0 0 4px 0; font-size: 18px; font-weight: 600; color: var(--text-primary); } .sprint-goal { margin: 0; font-size: 14px; color: var(--text-secondary); line-height: 1.4; } .sprint-badge { background: var(--surface-medium); /* Common.css variable */ color: var(--text-secondary); /* Common.css variable */ padding: 6px 12px; border-radius: 16px; font-size: 12px; font-weight: 600; text-transform: uppercase; } .sprint-badge.active { background: #10b981; /* Literal success color */ color: white; box-shadow: 0 0 15px color-mix(in srgb, #10b981 30%, transparent); /* Glow with literal success */ } .sprint-metrics { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-bottom: 16px; } .metric { text-align: center; } .metric-value { display: block; font-size: 24px; font-weight: 700; color: var(--text-primary); margin-bottom: 4px; } .metric-label { font-size: 12px; color: var(--text-muted); text-transform: uppercase; font-weight: 500; } .sprint-progress { margin-bottom: 16px; } .sprint-dates { display: flex; justify-content: center; align-items: center; gap: 12px; font-size: 12px; color: var(--text-muted); font-weight: 500; } /* Roadmap View */ .roadmap-view { height: 100%; overflow-y: auto; padding: 8px 40px; } .roadmap-timeline { position: relative; padding-left: 40px; } .roadmap-timeline::before { content: ''; position: absolute; left: 20px; top: 0; bottom: 0; width: 2px; background: var(--border-color); /* Common.css variable */ } .roadmap-item { position: relative; margin-bottom: 32px; padding-left: 40px; } .roadmap-marker { position: absolute; left: -28px; top: 8px; width: 16px; height: 16px; border-radius: 50%; border: 4px solid var(--surface-dark); /* Common.css variable */ box-shadow: 0 0 0 2px var(--border-color); /* Common.css variable */ } .roadmap-content { background: var(--surface-dark); /* Common.css variable */ border: 1px solid var(--border-color); /* Common.css variable */ border-radius: var(--border-radius-large); /* Common.css variable */ padding: var(--spacing-lg); /* Was 20px */ transition: all 0.2s ease; } .roadmap-content:hover { transform: translateX(8px); border-color: var(--primary-accent); /* Common.css variable */ } .roadmap-content h4 { margin: 0 0 8px 0; font-size: 16px; font-weight: 600; color: var(--text-primary); } .roadmap-content p { margin: 0 0 16px 0; font-size: 14px; color: var(--text-secondary); line-height: 1.5; } .roadmap-progress { display: flex; align-items: center; gap: 12px; } .roadmap-progress .progress-bar { flex: 1; } .roadmap-progress span { font-size: 12px; color: var(--text-muted); font-weight: 600; } /* Analytics View */ .analytics-view { height: 100%; overflow-y: auto; padding: 8px; } .analytics-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 20px; } .analytics-card { background: var(--surface-dark); /* Common.css variable */ border: 1px solid var(--border-color); /* Common.css variable */ border-radius: var(--border-radius-large); /* Common.css variable */ padding: var(--spacing-lg); /* Was 24px */ display: flex; align-items: center; gap: 16px; transition: all 0.2s ease; cursor: pointer; position: relative; overflow: hidden; } .analytics-card::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(135deg, rgba(255,255,255,0.05), transparent); opacity: 0; transition: opacity 0.2s ease; } .analytics-card:hover::before { opacity: 1; } .analytics-card:hover { transform: translateY(-4px); box-shadow: 0 8px 30px rgba(0, 0, 0, 0.3); } .card-icon { width: 48px; height: 48px; border-radius: 12px; display: flex; align-items: center; justify-content: center; font-size: 20px; color: white; position: relative; z-index: 1; } .card-icon.tasks { background: var(--primary-accent); } /* Common.css variable */ .card-icon.completed { background: #10b981; } /* Literal success color */ .card-icon.progress { background: #f59e0b; } /* Literal warning color */ .card-icon.epics { background: #8b5cf6; } /* Literal accent color */ .card-icon.sprints { background: #06b6d4; } /* Literal info color */ /* Text color for .card-icon.progress should be var(--bg-dark) for contrast */ .card-icon.progress { color: var(--bg-dark); } .card-icon.sprints { color: var(--bg-dark); } /* Text on cyan */ .card-content h3 { margin: 0 0 4px 0; font-size: 28px; font-weight: 700; color: var(--text-primary); } .card-content p { margin: 0; font-size: 14px; color: var(--text-secondary); font-weight: 500; } /* Gantt View */ .gantt-view { height: 100%; display: flex; flex-direction: column; overflow: hidden; /* Allow internal scrolling for chart */ padding: 8px; } .gantt-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px; padding: 0 8px; } .gantt-header h3 { margin: 0; font-size: 18px; font-weight: 600; color: var(--text-primary); } .gantt-controls { display: flex; gap: 8px; } .gantt-zoom-btn { background: var(--surface-dark); /* Common.css variable */ color: var(--text-secondary); /* Common.css variable */ border: 1px solid var(--border-color); /* Common.css variable */ padding: 8px 12px; border-radius: var(--border-radius-medium); /* Was 6px */ cursor: pointer; font-size: 13px; font-weight: 500; transition: all 0.2s ease; } .gantt-zoom-btn:hover { color: var(--text-primary); /* Common.css variable */ background: var(--surface-medium); /* Common.css variable */ border-color: var(--primary-accent); /* Common.css variable */ } .gantt-zoom-btn.active { background: var(--primary-accent); /* Common.css variable */ color: var(--bg-dark); /* Text on primary accent */ border-color: var(--primary-accent); /* Common.css variable */ box-shadow: 0 0 10px color-mix(in srgb, var(--primary-accent) 30%, transparent); /* Glow with common primary */ } .gantt-chart { flex: 1; overflow-x: auto; /* Horizontal scroll for timeline */ overflow-y: auto; /* Vertical scroll for rows */ background: var(--surface-dark); /* Common.css variable */ border: 1px solid var(--border-color); /* Common.css variable */ border-radius: var(--border-radius-large); /* Common.css variable */ padding: var(--spacing-md); /* Was 16px */ } .gantt-timeline { position: relative; min-width: 1200px; /* Ensure there's enough space for a year view, adjust as needed */ } .timeline-header { position: sticky; top: 0; background: var(--surface-light); /* Common.css variable */ z-index: 10; border-bottom: 1px solid var(--border-color); /* Common.css variable */ padding-bottom: var(--spacing-sm); /* Was 8px */ margin-bottom: 8px; } .timeline-months { display: flex; white-space: nowrap; } .timeline-month { flex: 1 0 auto; /* Allow shrinking but prefer base size */ min-width: 80px; /* Approximate width for a month, adjust as needed */ text-align: center; padding: 8px 0; color: var(--text-secondary); /* Common.css variable */ font-size: 12px; font-weight: 500; border-right: 1px solid var(--border-color); /* Common.css variable */ } .timeline-month:last-child { border-right: none; } .gantt-rows { position: relative; } .gantt-row { display: flex; align-items: stretch; /* Make label and timeline same height */ border-bottom: 1px solid var(--border-color); /* Common.css variable */ transition: background-color var(--transition-speed) ease; } .gantt-row:last-child { border-bottom: none; } .gantt-row:hover { background-color: var(--surface-medium); /* Common.css variable */ } .gantt-row-label { width: 250px; /* Fixed width for labels */ padding: 12px 16px; border-right: 1px solid var(--border-color); /* Common.css variable */ background-color: var(--surface-light); /* Common.css variable */ flex-shrink: 0; /* Prevent label from shrinking */ display: flex; flex-direction: column; justify-content: center; } .epic-info h4 { margin: 0 0 4px 0; font-size: 14px; font-weight: 600; color: var(--text-primary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .epic-progress-text { font-size: 11px; color: var(--text-muted); font-weight: 500; } .gantt-row-timeline { flex: 1; position: relative; padding: 12px 0; /* Vertical padding for bars */ min-height: 40px; /* Ensure row has some height for the bar */ } .gantt-bar { position: absolute; height: 24px; /* Height of the bar */ top: 50%; transform: translateY(-50%); border-radius: var(--border-radius-small); /* Common.css variable */ background-color: var(--primary-accent); /* Default bar color, Common.css variable */ box-shadow: 0 2px 5px rgba(0,0,0,0.2); /* Specific shadow */ display: flex; align-items: center; overflow: hidden; transition: all 0.2s ease; } .gantt-bar:hover { opacity: 1 !important; /* Ensure hover is visible */ transform: translateY(-50%) scale(1.02); } .gantt-progress { height: 100%; background-color: #10b981; /* Literal success color */ border-radius: var(--border-radius-small) 0 0 var(--border-radius-small); /* Common.css variable */ opacity: 0.7; transition: width 0.3s ease; } .gantt-bar .gantt-progress[style*="width: 100%"] { border-radius: var(--border-radius-small); /* Common.css variable */ } /* Scrollbar styling is now handled globally by common.css */ /* Responsive design */ @media (max-width: 768px) { .projects-view-container { margin: 20px; height: calc(100vh - 80px); } .projects-header { flex-direction: column; gap: 16px; align-items: stretch; } .projects-tabs { justify-content: center; } .kanban-board { flex-direction: column; gap: 16px; } .kanban-column { min-width: auto; max-height: 400px; } .epics-grid { grid-template-columns: 1fr; } .sprint-metrics { grid-template-columns: repeat(2, 1fr); } .analytics-grid { grid-template-columns: repeat(2, 1fr); } } @media (max-width: 480px) { .projects-tabs { flex-wrap: wrap; } .tab-btn { flex: 1; min-width: 0; justify-content: center; } .tab-btn span { display: none; } .sprint-metrics, .analytics-grid { grid-template-columns: 1fr; } }