1379 lines
49 KiB
HTML
1379 lines
49 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>UI Hybrid 22 - Neon Circuit Project Manager</title>
|
|
<style>
|
|
* {
|
|
margin: 0;
|
|
padding: 0;
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
body {
|
|
font-family: 'Courier New', monospace;
|
|
background: #000;
|
|
color: #fff;
|
|
overflow: hidden;
|
|
position: relative;
|
|
}
|
|
|
|
/* Circuit Board Background */
|
|
.circuit-bg {
|
|
position: fixed;
|
|
inset: 0;
|
|
background: #0a0a0a;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.circuit-grid {
|
|
position: absolute;
|
|
inset: 0;
|
|
background-image:
|
|
repeating-linear-gradient(0deg, #0f0f0f 0, transparent 1px, transparent 40px, #0f0f0f 41px),
|
|
repeating-linear-gradient(90deg, #0f0f0f 0, transparent 1px, transparent 40px, #0f0f0f 41px);
|
|
opacity: 0.5;
|
|
}
|
|
|
|
.circuit-trace {
|
|
position: absolute;
|
|
background: linear-gradient(90deg, transparent, #00ffff, transparent);
|
|
height: 2px;
|
|
animation: trace-flow 3s linear infinite;
|
|
}
|
|
|
|
@keyframes trace-flow {
|
|
0% { transform: translateX(-100%); }
|
|
100% { transform: translateX(100%); }
|
|
}
|
|
|
|
/* Main Container */
|
|
.project-manager {
|
|
position: relative;
|
|
width: 100vw;
|
|
height: 100vh;
|
|
display: grid;
|
|
grid-template-columns: 60px 1fr;
|
|
grid-template-rows: 60px 1fr;
|
|
gap: 2px;
|
|
background: #000;
|
|
padding: 10px;
|
|
}
|
|
|
|
/* Header Bar */
|
|
.header-bar {
|
|
grid-column: 1 / -1;
|
|
background: linear-gradient(135deg, #1a1a1a, #0a0a0a);
|
|
border: 2px solid #00ffff;
|
|
border-radius: 10px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
padding: 0 20px;
|
|
position: relative;
|
|
overflow: hidden;
|
|
box-shadow: 0 0 20px rgba(0, 255, 255, 0.5);
|
|
}
|
|
|
|
.header-bar::before {
|
|
content: '';
|
|
position: absolute;
|
|
inset: 0;
|
|
background: linear-gradient(90deg, transparent, rgba(0, 255, 255, 0.1), transparent);
|
|
animation: scan 3s linear infinite;
|
|
}
|
|
|
|
@keyframes scan {
|
|
0% { transform: translateX(-100%); }
|
|
100% { transform: translateX(100%); }
|
|
}
|
|
|
|
.project-title {
|
|
font-size: 24px;
|
|
font-weight: bold;
|
|
color: #00ffff;
|
|
text-shadow: 0 0 10px rgba(0, 255, 255, 0.8);
|
|
}
|
|
|
|
.header-stats {
|
|
display: flex;
|
|
gap: 30px;
|
|
}
|
|
|
|
.stat-item {
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
}
|
|
|
|
.stat-value {
|
|
font-size: 20px;
|
|
color: #ff00ff;
|
|
text-shadow: 0 0 10px rgba(255, 0, 255, 0.8);
|
|
}
|
|
|
|
.stat-label {
|
|
font-size: 12px;
|
|
color: #888;
|
|
}
|
|
|
|
/* Sidebar */
|
|
.sidebar {
|
|
background: linear-gradient(135deg, #1a1a1a, #0a0a0a);
|
|
border: 2px solid #00ffff;
|
|
border-radius: 10px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
padding: 10px 0;
|
|
gap: 20px;
|
|
box-shadow: 0 0 20px rgba(0, 255, 255, 0.3);
|
|
}
|
|
|
|
.mode-btn {
|
|
width: 40px;
|
|
height: 40px;
|
|
background: #000;
|
|
border: 2px solid #333;
|
|
border-radius: 8px;
|
|
color: #666;
|
|
cursor: pointer;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
transition: all 0.3s;
|
|
position: relative;
|
|
}
|
|
|
|
.mode-btn:hover {
|
|
border-color: #00ffff;
|
|
color: #00ffff;
|
|
box-shadow: 0 0 10px rgba(0, 255, 255, 0.5);
|
|
}
|
|
|
|
.mode-btn.active {
|
|
background: #00ffff;
|
|
color: #000;
|
|
border-color: #00ffff;
|
|
box-shadow: 0 0 20px rgba(0, 255, 255, 0.8);
|
|
}
|
|
|
|
.mode-btn.active::after {
|
|
content: '';
|
|
position: absolute;
|
|
inset: -10px;
|
|
border: 2px solid #00ffff;
|
|
border-radius: 12px;
|
|
opacity: 0.3;
|
|
animation: pulse 2s infinite;
|
|
}
|
|
|
|
@keyframes pulse {
|
|
0%, 100% { transform: scale(1); opacity: 0.3; }
|
|
50% { transform: scale(1.1); opacity: 0; }
|
|
}
|
|
|
|
/* Main Content Area */
|
|
.main-content {
|
|
background: linear-gradient(135deg, #0a0a0a, #000);
|
|
border: 2px solid #00ffff;
|
|
border-radius: 10px;
|
|
position: relative;
|
|
overflow: hidden;
|
|
box-shadow: inset 0 0 50px rgba(0, 255, 255, 0.1);
|
|
}
|
|
|
|
/* View Containers */
|
|
.view-container {
|
|
position: absolute;
|
|
inset: 0;
|
|
padding: 20px;
|
|
opacity: 0;
|
|
visibility: hidden;
|
|
transition: all 0.5s;
|
|
}
|
|
|
|
.view-container.active {
|
|
opacity: 1;
|
|
visibility: visible;
|
|
}
|
|
|
|
/* Kanban View */
|
|
.kanban-board {
|
|
display: grid;
|
|
grid-template-columns: repeat(4, 1fr);
|
|
gap: 20px;
|
|
height: 100%;
|
|
}
|
|
|
|
.kanban-column {
|
|
background: rgba(0, 255, 255, 0.05);
|
|
border: 1px solid #00ffff;
|
|
border-radius: 10px;
|
|
padding: 15px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
position: relative;
|
|
}
|
|
|
|
.kanban-column::before {
|
|
content: '';
|
|
position: absolute;
|
|
top: -5px;
|
|
left: 50%;
|
|
transform: translateX(-50%);
|
|
width: 10px;
|
|
height: 10px;
|
|
background: #00ffff;
|
|
border-radius: 50%;
|
|
box-shadow: 0 0 20px rgba(0, 255, 255, 0.8);
|
|
}
|
|
|
|
.column-header {
|
|
font-size: 16px;
|
|
font-weight: bold;
|
|
color: #00ffff;
|
|
text-align: center;
|
|
margin-bottom: 15px;
|
|
text-transform: uppercase;
|
|
text-shadow: 0 0 10px rgba(0, 255, 255, 0.8);
|
|
}
|
|
|
|
.task-card {
|
|
background: rgba(0, 0, 0, 0.8);
|
|
border: 1px solid #333;
|
|
border-radius: 8px;
|
|
padding: 12px;
|
|
margin-bottom: 10px;
|
|
cursor: move;
|
|
transition: all 0.3s;
|
|
position: relative;
|
|
}
|
|
|
|
.task-card:hover {
|
|
border-color: #00ffff;
|
|
box-shadow: 0 0 15px rgba(0, 255, 255, 0.5);
|
|
transform: translateY(-2px);
|
|
}
|
|
|
|
.task-priority {
|
|
position: absolute;
|
|
top: 5px;
|
|
right: 5px;
|
|
width: 8px;
|
|
height: 8px;
|
|
border-radius: 50%;
|
|
animation: blink 2s infinite;
|
|
}
|
|
|
|
.priority-high { background: #ff0080; box-shadow: 0 0 10px #ff0080; }
|
|
.priority-medium { background: #ffff00; box-shadow: 0 0 10px #ffff00; }
|
|
.priority-low { background: #00ff80; box-shadow: 0 0 10px #00ff80; }
|
|
|
|
@keyframes blink {
|
|
0%, 100% { opacity: 1; }
|
|
50% { opacity: 0.3; }
|
|
}
|
|
|
|
.task-title {
|
|
font-size: 14px;
|
|
color: #fff;
|
|
margin-bottom: 5px;
|
|
}
|
|
|
|
.task-meta {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
margin-top: 10px;
|
|
}
|
|
|
|
.task-assignee {
|
|
width: 24px;
|
|
height: 24px;
|
|
background: linear-gradient(135deg, #00ffff, #ff00ff);
|
|
border-radius: 50%;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-size: 10px;
|
|
font-weight: bold;
|
|
color: #000;
|
|
}
|
|
|
|
.task-due {
|
|
font-size: 11px;
|
|
color: #888;
|
|
}
|
|
|
|
/* Timeline View */
|
|
.timeline-view {
|
|
height: 100%;
|
|
overflow: auto;
|
|
}
|
|
|
|
.timeline-header {
|
|
display: grid;
|
|
grid-template-columns: 200px repeat(30, 40px);
|
|
background: rgba(0, 255, 255, 0.1);
|
|
border-bottom: 2px solid #00ffff;
|
|
position: sticky;
|
|
top: 0;
|
|
z-index: 10;
|
|
}
|
|
|
|
.timeline-label {
|
|
padding: 10px;
|
|
font-weight: bold;
|
|
color: #00ffff;
|
|
border-right: 1px solid #333;
|
|
}
|
|
|
|
.timeline-day {
|
|
padding: 10px 5px;
|
|
text-align: center;
|
|
font-size: 12px;
|
|
color: #888;
|
|
border-right: 1px solid #222;
|
|
}
|
|
|
|
.timeline-row {
|
|
display: grid;
|
|
grid-template-columns: 200px repeat(30, 40px);
|
|
border-bottom: 1px solid #222;
|
|
position: relative;
|
|
}
|
|
|
|
.timeline-task-name {
|
|
padding: 15px 10px;
|
|
background: rgba(0, 0, 0, 0.5);
|
|
border-right: 1px solid #333;
|
|
color: #fff;
|
|
font-size: 13px;
|
|
}
|
|
|
|
.timeline-bar {
|
|
position: absolute;
|
|
height: 30px;
|
|
background: linear-gradient(90deg, #00ffff, #ff00ff);
|
|
border-radius: 15px;
|
|
top: 50%;
|
|
transform: translateY(-50%);
|
|
display: flex;
|
|
align-items: center;
|
|
padding: 0 10px;
|
|
font-size: 11px;
|
|
color: #000;
|
|
font-weight: bold;
|
|
box-shadow: 0 0 20px rgba(0, 255, 255, 0.5);
|
|
cursor: pointer;
|
|
transition: all 0.3s;
|
|
}
|
|
|
|
.timeline-bar:hover {
|
|
transform: translateY(-50%) scale(1.05);
|
|
box-shadow: 0 0 30px rgba(0, 255, 255, 0.8);
|
|
}
|
|
|
|
/* Resource View */
|
|
.resource-grid {
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
|
|
gap: 20px;
|
|
height: 100%;
|
|
overflow: auto;
|
|
}
|
|
|
|
.resource-card {
|
|
background: rgba(0, 255, 255, 0.05);
|
|
border: 1px solid #00ffff;
|
|
border-radius: 10px;
|
|
padding: 20px;
|
|
position: relative;
|
|
height: fit-content;
|
|
}
|
|
|
|
.resource-avatar {
|
|
width: 60px;
|
|
height: 60px;
|
|
background: linear-gradient(135deg, #00ffff, #ff00ff);
|
|
border-radius: 50%;
|
|
margin: 0 auto 15px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-size: 24px;
|
|
font-weight: bold;
|
|
color: #000;
|
|
box-shadow: 0 0 30px rgba(0, 255, 255, 0.5);
|
|
}
|
|
|
|
.resource-name {
|
|
text-align: center;
|
|
font-size: 16px;
|
|
color: #fff;
|
|
margin-bottom: 10px;
|
|
}
|
|
|
|
.resource-role {
|
|
text-align: center;
|
|
font-size: 12px;
|
|
color: #888;
|
|
margin-bottom: 20px;
|
|
}
|
|
|
|
.workload-meter {
|
|
height: 8px;
|
|
background: #222;
|
|
border-radius: 4px;
|
|
overflow: hidden;
|
|
margin-bottom: 5px;
|
|
}
|
|
|
|
.workload-fill {
|
|
height: 100%;
|
|
background: linear-gradient(90deg, #00ff80, #ffff00, #ff0080);
|
|
transition: width 0.5s;
|
|
box-shadow: 0 0 10px currentColor;
|
|
}
|
|
|
|
.workload-text {
|
|
text-align: center;
|
|
font-size: 11px;
|
|
color: #666;
|
|
}
|
|
|
|
/* Chat View */
|
|
.chat-container {
|
|
display: grid;
|
|
grid-template-columns: 250px 1fr;
|
|
gap: 20px;
|
|
height: 100%;
|
|
}
|
|
|
|
.chat-sidebar {
|
|
background: rgba(0, 255, 255, 0.05);
|
|
border: 1px solid #00ffff;
|
|
border-radius: 10px;
|
|
padding: 15px;
|
|
overflow-y: auto;
|
|
}
|
|
|
|
.channel-item {
|
|
padding: 10px;
|
|
margin-bottom: 5px;
|
|
border-radius: 5px;
|
|
cursor: pointer;
|
|
transition: all 0.3s;
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 10px;
|
|
}
|
|
|
|
.channel-item:hover {
|
|
background: rgba(0, 255, 255, 0.1);
|
|
}
|
|
|
|
.channel-item.active {
|
|
background: rgba(0, 255, 255, 0.2);
|
|
border: 1px solid #00ffff;
|
|
}
|
|
|
|
.channel-indicator {
|
|
width: 8px;
|
|
height: 8px;
|
|
background: #00ff80;
|
|
border-radius: 50%;
|
|
animation: pulse-indicator 2s infinite;
|
|
}
|
|
|
|
@keyframes pulse-indicator {
|
|
0%, 100% { opacity: 1; transform: scale(1); }
|
|
50% { opacity: 0.5; transform: scale(0.8); }
|
|
}
|
|
|
|
.chat-main {
|
|
background: rgba(0, 0, 0, 0.5);
|
|
border: 1px solid #333;
|
|
border-radius: 10px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
|
|
.chat-header {
|
|
padding: 15px;
|
|
border-bottom: 1px solid #333;
|
|
font-weight: bold;
|
|
color: #00ffff;
|
|
text-shadow: 0 0 10px rgba(0, 255, 255, 0.5);
|
|
}
|
|
|
|
.chat-messages {
|
|
flex: 1;
|
|
padding: 20px;
|
|
overflow-y: auto;
|
|
}
|
|
|
|
.message {
|
|
margin-bottom: 15px;
|
|
display: flex;
|
|
gap: 10px;
|
|
}
|
|
|
|
.message-avatar {
|
|
width: 32px;
|
|
height: 32px;
|
|
background: linear-gradient(135deg, #00ffff, #ff00ff);
|
|
border-radius: 50%;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-size: 12px;
|
|
font-weight: bold;
|
|
color: #000;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.message-content {
|
|
flex: 1;
|
|
}
|
|
|
|
.message-author {
|
|
font-size: 12px;
|
|
color: #00ffff;
|
|
margin-bottom: 5px;
|
|
}
|
|
|
|
.message-text {
|
|
font-size: 14px;
|
|
color: #ccc;
|
|
line-height: 1.4;
|
|
}
|
|
|
|
.message-time {
|
|
font-size: 11px;
|
|
color: #666;
|
|
margin-top: 5px;
|
|
}
|
|
|
|
.chat-input {
|
|
padding: 15px;
|
|
border-top: 1px solid #333;
|
|
display: flex;
|
|
gap: 10px;
|
|
}
|
|
|
|
.chat-input input {
|
|
flex: 1;
|
|
background: rgba(0, 0, 0, 0.5);
|
|
border: 1px solid #333;
|
|
border-radius: 5px;
|
|
padding: 10px;
|
|
color: #fff;
|
|
font-family: inherit;
|
|
}
|
|
|
|
.chat-input input:focus {
|
|
outline: none;
|
|
border-color: #00ffff;
|
|
box-shadow: 0 0 10px rgba(0, 255, 255, 0.3);
|
|
}
|
|
|
|
.send-btn {
|
|
background: #00ffff;
|
|
border: none;
|
|
border-radius: 5px;
|
|
padding: 10px 20px;
|
|
color: #000;
|
|
font-weight: bold;
|
|
cursor: pointer;
|
|
transition: all 0.3s;
|
|
}
|
|
|
|
.send-btn:hover {
|
|
background: #ff00ff;
|
|
box-shadow: 0 0 20px rgba(255, 0, 255, 0.5);
|
|
}
|
|
|
|
/* Files View */
|
|
.files-container {
|
|
display: grid;
|
|
grid-template-columns: 250px 1fr;
|
|
gap: 20px;
|
|
height: 100%;
|
|
}
|
|
|
|
.files-tree {
|
|
background: rgba(0, 255, 255, 0.05);
|
|
border: 1px solid #00ffff;
|
|
border-radius: 10px;
|
|
padding: 15px;
|
|
overflow-y: auto;
|
|
}
|
|
|
|
.folder-item {
|
|
margin-bottom: 5px;
|
|
}
|
|
|
|
.folder-header {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 10px;
|
|
padding: 8px;
|
|
cursor: pointer;
|
|
border-radius: 5px;
|
|
transition: all 0.3s;
|
|
}
|
|
|
|
.folder-header:hover {
|
|
background: rgba(0, 255, 255, 0.1);
|
|
}
|
|
|
|
.folder-icon {
|
|
color: #00ffff;
|
|
transition: transform 0.3s;
|
|
}
|
|
|
|
.folder-item.open .folder-icon {
|
|
transform: rotate(90deg);
|
|
}
|
|
|
|
.folder-contents {
|
|
padding-left: 20px;
|
|
display: none;
|
|
}
|
|
|
|
.folder-item.open .folder-contents {
|
|
display: block;
|
|
}
|
|
|
|
.file-item {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 10px;
|
|
padding: 8px;
|
|
cursor: pointer;
|
|
border-radius: 5px;
|
|
transition: all 0.3s;
|
|
}
|
|
|
|
.file-item:hover {
|
|
background: rgba(0, 255, 255, 0.1);
|
|
}
|
|
|
|
.file-icon {
|
|
color: #ff00ff;
|
|
}
|
|
|
|
.files-main {
|
|
background: rgba(0, 0, 0, 0.5);
|
|
border: 1px solid #333;
|
|
border-radius: 10px;
|
|
padding: 20px;
|
|
overflow-y: auto;
|
|
}
|
|
|
|
.files-grid {
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
|
|
gap: 20px;
|
|
}
|
|
|
|
.file-card {
|
|
background: rgba(0, 255, 255, 0.05);
|
|
border: 1px solid #333;
|
|
border-radius: 10px;
|
|
padding: 20px;
|
|
text-align: center;
|
|
cursor: pointer;
|
|
transition: all 0.3s;
|
|
position: relative;
|
|
}
|
|
|
|
.file-card:hover {
|
|
border-color: #00ffff;
|
|
transform: translateY(-5px);
|
|
box-shadow: 0 10px 30px rgba(0, 255, 255, 0.3);
|
|
}
|
|
|
|
.file-card-icon {
|
|
font-size: 48px;
|
|
color: #00ffff;
|
|
margin-bottom: 10px;
|
|
}
|
|
|
|
.file-card-name {
|
|
font-size: 12px;
|
|
color: #ccc;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
.file-card-size {
|
|
font-size: 10px;
|
|
color: #666;
|
|
margin-top: 5px;
|
|
}
|
|
|
|
/* Circuit Connections */
|
|
.circuit-connection {
|
|
position: absolute;
|
|
pointer-events: none;
|
|
opacity: 0.3;
|
|
}
|
|
|
|
.circuit-path {
|
|
stroke: #00ffff;
|
|
stroke-width: 2;
|
|
fill: none;
|
|
filter: drop-shadow(0 0 5px rgba(0, 255, 255, 0.8));
|
|
stroke-dasharray: 5, 5;
|
|
animation: dash 20s linear infinite;
|
|
}
|
|
|
|
@keyframes dash {
|
|
to { stroke-dashoffset: -1000; }
|
|
}
|
|
|
|
/* Floating Particles */
|
|
.particle {
|
|
position: absolute;
|
|
width: 4px;
|
|
height: 4px;
|
|
background: #00ffff;
|
|
border-radius: 50%;
|
|
pointer-events: none;
|
|
animation: float 10s infinite;
|
|
}
|
|
|
|
@keyframes float {
|
|
0% { transform: translateY(100vh) scale(0); }
|
|
10% { transform: translateY(90vh) scale(1); }
|
|
90% { transform: translateY(10vh) scale(1); }
|
|
100% { transform: translateY(0) scale(0); }
|
|
}
|
|
|
|
/* Icons */
|
|
.icon {
|
|
font-family: Arial, sans-serif;
|
|
font-style: normal;
|
|
}
|
|
|
|
/* Scrollbar Styling */
|
|
::-webkit-scrollbar {
|
|
width: 10px;
|
|
height: 10px;
|
|
}
|
|
|
|
::-webkit-scrollbar-track {
|
|
background: #111;
|
|
border-radius: 5px;
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb {
|
|
background: #00ffff;
|
|
border-radius: 5px;
|
|
box-shadow: 0 0 10px rgba(0, 255, 255, 0.5);
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb:hover {
|
|
background: #ff00ff;
|
|
box-shadow: 0 0 10px rgba(255, 0, 255, 0.5);
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="circuit-bg">
|
|
<div class="circuit-grid"></div>
|
|
<div class="circuit-trace" style="top: 10%; width: 300px;"></div>
|
|
<div class="circuit-trace" style="top: 30%; left: 20%; width: 400px;"></div>
|
|
<div class="circuit-trace" style="top: 50%; right: 10%; width: 250px;"></div>
|
|
<div class="circuit-trace" style="top: 70%; left: 30%; width: 350px;"></div>
|
|
<div class="circuit-trace" style="top: 90%; width: 500px;"></div>
|
|
</div>
|
|
|
|
<div class="project-manager">
|
|
<div class="header-bar">
|
|
<div class="project-title">NEXUS PROJECT ALPHA</div>
|
|
<div class="header-stats">
|
|
<div class="stat-item">
|
|
<div class="stat-value">42</div>
|
|
<div class="stat-label">TASKS</div>
|
|
</div>
|
|
<div class="stat-item">
|
|
<div class="stat-value">8</div>
|
|
<div class="stat-label">MEMBERS</div>
|
|
</div>
|
|
<div class="stat-item">
|
|
<div class="stat-value">85%</div>
|
|
<div class="stat-label">PROGRESS</div>
|
|
</div>
|
|
<div class="stat-item">
|
|
<div class="stat-value">5d</div>
|
|
<div class="stat-label">REMAINING</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="sidebar">
|
|
<button class="mode-btn active" data-view="kanban" title="Kanban Board">
|
|
<span class="icon">📋</span>
|
|
</button>
|
|
<button class="mode-btn" data-view="timeline" title="Timeline">
|
|
<span class="icon">📊</span>
|
|
</button>
|
|
<button class="mode-btn" data-view="resources" title="Resources">
|
|
<span class="icon">👥</span>
|
|
</button>
|
|
<button class="mode-btn" data-view="chat" title="Team Chat">
|
|
<span class="icon">💬</span>
|
|
</button>
|
|
<button class="mode-btn" data-view="files" title="Files">
|
|
<span class="icon">📁</span>
|
|
</button>
|
|
</div>
|
|
|
|
<div class="main-content">
|
|
<!-- Kanban View -->
|
|
<div class="view-container active" data-view="kanban">
|
|
<div class="kanban-board">
|
|
<div class="kanban-column">
|
|
<div class="column-header">BACKLOG</div>
|
|
<div class="task-card">
|
|
<div class="task-priority priority-low"></div>
|
|
<div class="task-title">Setup CI/CD Pipeline</div>
|
|
<div class="task-meta">
|
|
<div class="task-assignee">JD</div>
|
|
<div class="task-due">Mar 15</div>
|
|
</div>
|
|
</div>
|
|
<div class="task-card">
|
|
<div class="task-priority priority-medium"></div>
|
|
<div class="task-title">Database Schema Design</div>
|
|
<div class="task-meta">
|
|
<div class="task-assignee">AK</div>
|
|
<div class="task-due">Mar 18</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="kanban-column">
|
|
<div class="column-header">IN PROGRESS</div>
|
|
<div class="task-card">
|
|
<div class="task-priority priority-high"></div>
|
|
<div class="task-title">API Authentication</div>
|
|
<div class="task-meta">
|
|
<div class="task-assignee">SM</div>
|
|
<div class="task-due">Mar 12</div>
|
|
</div>
|
|
</div>
|
|
<div class="task-card">
|
|
<div class="task-priority priority-medium"></div>
|
|
<div class="task-title">Frontend Dashboard</div>
|
|
<div class="task-meta">
|
|
<div class="task-assignee">LM</div>
|
|
<div class="task-due">Mar 14</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="kanban-column">
|
|
<div class="column-header">TESTING</div>
|
|
<div class="task-card">
|
|
<div class="task-priority priority-high"></div>
|
|
<div class="task-title">User Registration Flow</div>
|
|
<div class="task-meta">
|
|
<div class="task-assignee">RK</div>
|
|
<div class="task-due">Mar 11</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="kanban-column">
|
|
<div class="column-header">COMPLETED</div>
|
|
<div class="task-card">
|
|
<div class="task-priority priority-low"></div>
|
|
<div class="task-title">Project Setup</div>
|
|
<div class="task-meta">
|
|
<div class="task-assignee">TW</div>
|
|
<div class="task-due">Mar 05</div>
|
|
</div>
|
|
</div>
|
|
<div class="task-card">
|
|
<div class="task-priority priority-medium"></div>
|
|
<div class="task-title">Requirements Analysis</div>
|
|
<div class="task-meta">
|
|
<div class="task-assignee">KP</div>
|
|
<div class="task-due">Mar 08</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Circuit connections -->
|
|
<svg class="circuit-connection" style="width: 100%; height: 100%;">
|
|
<path class="circuit-path" d="M 200 150 Q 400 100 600 150" />
|
|
<path class="circuit-path" d="M 600 250 Q 800 200 1000 250" />
|
|
</svg>
|
|
</div>
|
|
|
|
<!-- Timeline View -->
|
|
<div class="view-container" data-view="timeline">
|
|
<div class="timeline-view">
|
|
<div class="timeline-header">
|
|
<div class="timeline-label">TASKS</div>
|
|
<div class="timeline-day">1</div>
|
|
<div class="timeline-day">2</div>
|
|
<div class="timeline-day">3</div>
|
|
<div class="timeline-day">4</div>
|
|
<div class="timeline-day">5</div>
|
|
<div class="timeline-day">6</div>
|
|
<div class="timeline-day">7</div>
|
|
<div class="timeline-day">8</div>
|
|
<div class="timeline-day">9</div>
|
|
<div class="timeline-day">10</div>
|
|
<div class="timeline-day">11</div>
|
|
<div class="timeline-day">12</div>
|
|
<div class="timeline-day">13</div>
|
|
<div class="timeline-day">14</div>
|
|
<div class="timeline-day">15</div>
|
|
<div class="timeline-day">16</div>
|
|
<div class="timeline-day">17</div>
|
|
<div class="timeline-day">18</div>
|
|
<div class="timeline-day">19</div>
|
|
<div class="timeline-day">20</div>
|
|
<div class="timeline-day">21</div>
|
|
<div class="timeline-day">22</div>
|
|
<div class="timeline-day">23</div>
|
|
<div class="timeline-day">24</div>
|
|
<div class="timeline-day">25</div>
|
|
<div class="timeline-day">26</div>
|
|
<div class="timeline-day">27</div>
|
|
<div class="timeline-day">28</div>
|
|
<div class="timeline-day">29</div>
|
|
<div class="timeline-day">30</div>
|
|
</div>
|
|
<div class="timeline-row">
|
|
<div class="timeline-task-name">Project Setup</div>
|
|
<div class="timeline-bar" style="left: 240px; width: 200px;">100%</div>
|
|
</div>
|
|
<div class="timeline-row">
|
|
<div class="timeline-task-name">Requirements Analysis</div>
|
|
<div class="timeline-bar" style="left: 280px; width: 240px;">100%</div>
|
|
</div>
|
|
<div class="timeline-row">
|
|
<div class="timeline-task-name">API Authentication</div>
|
|
<div class="timeline-bar" style="left: 360px; width: 320px;">60%</div>
|
|
</div>
|
|
<div class="timeline-row">
|
|
<div class="timeline-task-name">Frontend Dashboard</div>
|
|
<div class="timeline-bar" style="left: 400px; width: 360px;">45%</div>
|
|
</div>
|
|
<div class="timeline-row">
|
|
<div class="timeline-task-name">Database Schema</div>
|
|
<div class="timeline-bar" style="left: 480px; width: 400px;">30%</div>
|
|
</div>
|
|
<div class="timeline-row">
|
|
<div class="timeline-task-name">CI/CD Pipeline</div>
|
|
<div class="timeline-bar" style="left: 560px; width: 280px;">15%</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Resources View -->
|
|
<div class="view-container" data-view="resources">
|
|
<div class="resource-grid">
|
|
<div class="resource-card">
|
|
<div class="resource-avatar">JD</div>
|
|
<div class="resource-name">John Doe</div>
|
|
<div class="resource-role">Full Stack Developer</div>
|
|
<div class="workload-meter">
|
|
<div class="workload-fill" style="width: 75%;"></div>
|
|
</div>
|
|
<div class="workload-text">75% Allocated</div>
|
|
</div>
|
|
<div class="resource-card">
|
|
<div class="resource-avatar">AK</div>
|
|
<div class="resource-name">Alice Kim</div>
|
|
<div class="resource-role">Backend Developer</div>
|
|
<div class="workload-meter">
|
|
<div class="workload-fill" style="width: 60%;"></div>
|
|
</div>
|
|
<div class="workload-text">60% Allocated</div>
|
|
</div>
|
|
<div class="resource-card">
|
|
<div class="resource-avatar">SM</div>
|
|
<div class="resource-name">Sam Miller</div>
|
|
<div class="resource-role">Security Engineer</div>
|
|
<div class="workload-meter">
|
|
<div class="workload-fill" style="width: 90%;"></div>
|
|
</div>
|
|
<div class="workload-text">90% Allocated</div>
|
|
</div>
|
|
<div class="resource-card">
|
|
<div class="resource-avatar">LM</div>
|
|
<div class="resource-name">Lisa Martin</div>
|
|
<div class="resource-role">Frontend Developer</div>
|
|
<div class="workload-meter">
|
|
<div class="workload-fill" style="width: 80%;"></div>
|
|
</div>
|
|
<div class="workload-text">80% Allocated</div>
|
|
</div>
|
|
<div class="resource-card">
|
|
<div class="resource-avatar">RK</div>
|
|
<div class="resource-name">Ryan Kumar</div>
|
|
<div class="resource-role">QA Engineer</div>
|
|
<div class="workload-meter">
|
|
<div class="workload-fill" style="width: 55%;"></div>
|
|
</div>
|
|
<div class="workload-text">55% Allocated</div>
|
|
</div>
|
|
<div class="resource-card">
|
|
<div class="resource-avatar">TW</div>
|
|
<div class="resource-name">Tom Wilson</div>
|
|
<div class="resource-role">DevOps Engineer</div>
|
|
<div class="workload-meter">
|
|
<div class="workload-fill" style="width: 70%;"></div>
|
|
</div>
|
|
<div class="workload-text">70% Allocated</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Chat View -->
|
|
<div class="view-container" data-view="chat">
|
|
<div class="chat-container">
|
|
<div class="chat-sidebar">
|
|
<div class="channel-item active">
|
|
<div class="channel-indicator"></div>
|
|
<span># general</span>
|
|
</div>
|
|
<div class="channel-item">
|
|
<div class="channel-indicator"></div>
|
|
<span># development</span>
|
|
</div>
|
|
<div class="channel-item">
|
|
<div class="channel-indicator"></div>
|
|
<span># design</span>
|
|
</div>
|
|
<div class="channel-item">
|
|
<div class="channel-indicator"></div>
|
|
<span># testing</span>
|
|
</div>
|
|
<div class="channel-item">
|
|
<div class="channel-indicator"></div>
|
|
<span># random</span>
|
|
</div>
|
|
</div>
|
|
<div class="chat-main">
|
|
<div class="chat-header"># general</div>
|
|
<div class="chat-messages">
|
|
<div class="message">
|
|
<div class="message-avatar">JD</div>
|
|
<div class="message-content">
|
|
<div class="message-author">John Doe</div>
|
|
<div class="message-text">Morning team! Quick reminder about today's standup at 10 AM.</div>
|
|
<div class="message-time">9:15 AM</div>
|
|
</div>
|
|
</div>
|
|
<div class="message">
|
|
<div class="message-avatar">AK</div>
|
|
<div class="message-content">
|
|
<div class="message-author">Alice Kim</div>
|
|
<div class="message-text">Thanks for the reminder! I'll share updates on the database migration.</div>
|
|
<div class="message-time">9:18 AM</div>
|
|
</div>
|
|
</div>
|
|
<div class="message">
|
|
<div class="message-avatar">SM</div>
|
|
<div class="message-content">
|
|
<div class="message-author">Sam Miller</div>
|
|
<div class="message-text">API authentication module is almost ready. Running final security tests.</div>
|
|
<div class="message-time">9:22 AM</div>
|
|
</div>
|
|
</div>
|
|
<div class="message">
|
|
<div class="message-avatar">LM</div>
|
|
<div class="message-content">
|
|
<div class="message-author">Lisa Martin</div>
|
|
<div class="message-text">Great! I'll need the API docs to integrate with the frontend dashboard.</div>
|
|
<div class="message-time">9:25 AM</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="chat-input">
|
|
<input type="text" placeholder="Type a message...">
|
|
<button class="send-btn">SEND</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Files View -->
|
|
<div class="view-container" data-view="files">
|
|
<div class="files-container">
|
|
<div class="files-tree">
|
|
<div class="folder-item open">
|
|
<div class="folder-header">
|
|
<span class="folder-icon icon">▶</span>
|
|
<span>Project Root</span>
|
|
</div>
|
|
<div class="folder-contents">
|
|
<div class="folder-item">
|
|
<div class="folder-header">
|
|
<span class="folder-icon icon">▶</span>
|
|
<span>src</span>
|
|
</div>
|
|
<div class="folder-contents">
|
|
<div class="file-item">
|
|
<span class="file-icon icon">📄</span>
|
|
<span>index.js</span>
|
|
</div>
|
|
<div class="file-item">
|
|
<span class="file-icon icon">📄</span>
|
|
<span>app.js</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="folder-item">
|
|
<div class="folder-header">
|
|
<span class="folder-icon icon">▶</span>
|
|
<span>docs</span>
|
|
</div>
|
|
</div>
|
|
<div class="file-item">
|
|
<span class="file-icon icon">📄</span>
|
|
<span>README.md</span>
|
|
</div>
|
|
<div class="file-item">
|
|
<span class="file-icon icon">📄</span>
|
|
<span>package.json</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="files-main">
|
|
<div class="files-grid">
|
|
<div class="file-card">
|
|
<div class="file-card-icon icon">📄</div>
|
|
<div class="file-card-name">API_Documentation.pdf</div>
|
|
<div class="file-card-size">2.4 MB</div>
|
|
</div>
|
|
<div class="file-card">
|
|
<div class="file-card-icon icon">🖼️</div>
|
|
<div class="file-card-name">UI_Mockups.fig</div>
|
|
<div class="file-card-size">15.2 MB</div>
|
|
</div>
|
|
<div class="file-card">
|
|
<div class="file-card-icon icon">📊</div>
|
|
<div class="file-card-name">Project_Timeline.xlsx</div>
|
|
<div class="file-card-size">145 KB</div>
|
|
</div>
|
|
<div class="file-card">
|
|
<div class="file-card-icon icon">🎥</div>
|
|
<div class="file-card-name">Demo_Video.mp4</div>
|
|
<div class="file-card-size">52.8 MB</div>
|
|
</div>
|
|
<div class="file-card">
|
|
<div class="file-card-icon icon">📝</div>
|
|
<div class="file-card-name">Meeting_Notes.docx</div>
|
|
<div class="file-card-size">89 KB</div>
|
|
</div>
|
|
<div class="file-card">
|
|
<div class="file-card-icon icon">🔐</div>
|
|
<div class="file-card-name">Security_Audit.pdf</div>
|
|
<div class="file-card-size">3.1 MB</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Floating Particles -->
|
|
<div class="particle" style="left: 10%; animation-delay: 0s;"></div>
|
|
<div class="particle" style="left: 30%; animation-delay: 2s;"></div>
|
|
<div class="particle" style="left: 50%; animation-delay: 4s;"></div>
|
|
<div class="particle" style="left: 70%; animation-delay: 6s;"></div>
|
|
<div class="particle" style="left: 90%; animation-delay: 8s;"></div>
|
|
|
|
<script>
|
|
// View switching
|
|
const modeButtons = document.querySelectorAll('.mode-btn');
|
|
const viewContainers = document.querySelectorAll('.view-container');
|
|
|
|
modeButtons.forEach(btn => {
|
|
btn.addEventListener('click', () => {
|
|
const targetView = btn.dataset.view;
|
|
|
|
// Update active states
|
|
modeButtons.forEach(b => b.classList.remove('active'));
|
|
btn.classList.add('active');
|
|
|
|
// Switch views
|
|
viewContainers.forEach(container => {
|
|
if (container.dataset.view === targetView) {
|
|
container.classList.add('active');
|
|
} else {
|
|
container.classList.remove('active');
|
|
}
|
|
});
|
|
});
|
|
});
|
|
|
|
// Kanban drag and drop
|
|
let draggedElement = null;
|
|
|
|
document.querySelectorAll('.task-card').forEach(card => {
|
|
card.draggable = true;
|
|
|
|
card.addEventListener('dragstart', (e) => {
|
|
draggedElement = e.target;
|
|
e.target.style.opacity = '0.5';
|
|
});
|
|
|
|
card.addEventListener('dragend', (e) => {
|
|
e.target.style.opacity = '';
|
|
});
|
|
});
|
|
|
|
document.querySelectorAll('.kanban-column').forEach(column => {
|
|
column.addEventListener('dragover', (e) => {
|
|
e.preventDefault();
|
|
const afterElement = getDragAfterElement(column, e.clientY);
|
|
if (afterElement == null) {
|
|
column.appendChild(draggedElement);
|
|
} else {
|
|
column.insertBefore(draggedElement, afterElement);
|
|
}
|
|
});
|
|
});
|
|
|
|
function getDragAfterElement(container, y) {
|
|
const draggableElements = [...container.querySelectorAll('.task-card:not(.dragging)')];
|
|
|
|
return draggableElements.reduce((closest, child) => {
|
|
const box = child.getBoundingClientRect();
|
|
const offset = y - box.top - box.height / 2;
|
|
|
|
if (offset < 0 && offset > closest.offset) {
|
|
return { offset: offset, element: child };
|
|
} else {
|
|
return closest;
|
|
}
|
|
}, { offset: Number.NEGATIVE_INFINITY }).element;
|
|
}
|
|
|
|
// Chat functionality
|
|
const chatInput = document.querySelector('.chat-input input');
|
|
const sendBtn = document.querySelector('.send-btn');
|
|
const chatMessages = document.querySelector('.chat-messages');
|
|
|
|
sendBtn.addEventListener('click', sendMessage);
|
|
chatInput.addEventListener('keypress', (e) => {
|
|
if (e.key === 'Enter') sendMessage();
|
|
});
|
|
|
|
function sendMessage() {
|
|
const text = chatInput.value.trim();
|
|
if (!text) return;
|
|
|
|
const message = document.createElement('div');
|
|
message.className = 'message';
|
|
message.innerHTML = `
|
|
<div class="message-avatar">US</div>
|
|
<div class="message-content">
|
|
<div class="message-author">You</div>
|
|
<div class="message-text">${text}</div>
|
|
<div class="message-time">${new Date().toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'})}</div>
|
|
</div>
|
|
`;
|
|
|
|
chatMessages.appendChild(message);
|
|
chatMessages.scrollTop = chatMessages.scrollHeight;
|
|
chatInput.value = '';
|
|
}
|
|
|
|
// File tree toggle
|
|
document.querySelectorAll('.folder-header').forEach(header => {
|
|
header.addEventListener('click', () => {
|
|
const folderItem = header.parentElement;
|
|
folderItem.classList.toggle('open');
|
|
});
|
|
});
|
|
|
|
// Timeline hover effects
|
|
document.querySelectorAll('.timeline-bar').forEach(bar => {
|
|
bar.addEventListener('click', () => {
|
|
const progress = prompt('Enter progress percentage (0-100):');
|
|
if (progress && !isNaN(progress) && progress >= 0 && progress <= 100) {
|
|
bar.textContent = progress + '%';
|
|
bar.style.opacity = progress == 100 ? '0.7' : '1';
|
|
}
|
|
});
|
|
});
|
|
|
|
// Resource card hover effects
|
|
document.querySelectorAll('.resource-card').forEach(card => {
|
|
card.addEventListener('mouseenter', () => {
|
|
const fill = card.querySelector('.workload-fill');
|
|
fill.style.filter = 'brightness(1.5)';
|
|
});
|
|
|
|
card.addEventListener('mouseleave', () => {
|
|
const fill = card.querySelector('.workload-fill');
|
|
fill.style.filter = 'brightness(1)';
|
|
});
|
|
});
|
|
|
|
// Channel switching
|
|
document.querySelectorAll('.channel-item').forEach(channel => {
|
|
channel.addEventListener('click', () => {
|
|
document.querySelectorAll('.channel-item').forEach(c => c.classList.remove('active'));
|
|
channel.classList.add('active');
|
|
document.querySelector('.chat-header').textContent = channel.textContent.trim();
|
|
|
|
// Simulate loading different channel messages
|
|
chatMessages.innerHTML = `
|
|
<div class="message">
|
|
<div class="message-avatar">SY</div>
|
|
<div class="message-content">
|
|
<div class="message-author">System</div>
|
|
<div class="message-text">Welcome to ${channel.textContent.trim()}</div>
|
|
<div class="message-time">${new Date().toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'})}</div>
|
|
</div>
|
|
</div>
|
|
`;
|
|
});
|
|
});
|
|
|
|
// Add more circuit traces dynamically
|
|
setInterval(() => {
|
|
const trace = document.createElement('div');
|
|
trace.className = 'circuit-trace';
|
|
trace.style.top = Math.random() * 100 + '%';
|
|
trace.style.left = Math.random() * 100 + '%';
|
|
trace.style.width = Math.random() * 300 + 200 + 'px';
|
|
trace.style.animationDuration = Math.random() * 3 + 2 + 's';
|
|
document.querySelector('.circuit-bg').appendChild(trace);
|
|
|
|
setTimeout(() => trace.remove(), 5000);
|
|
}, 3000);
|
|
|
|
// Add blinking effect to random task priorities
|
|
setInterval(() => {
|
|
const priorities = document.querySelectorAll('.task-priority');
|
|
const randomPriority = priorities[Math.floor(Math.random() * priorities.length)];
|
|
if (randomPriority) {
|
|
randomPriority.style.animationDuration = '0.5s';
|
|
setTimeout(() => {
|
|
randomPriority.style.animationDuration = '2s';
|
|
}, 1000);
|
|
}
|
|
}, 5000);
|
|
</script>
|
|
</body>
|
|
</html> |