claude-web-chat/static/style.css
djuka 3122c5cba9
Some checks failed
Tests / unit-tests (push) Failing after 22s
Pojednostavljen chat na jedan terminal, dodata notifikacija kad Claude završi
Uklonjen multi-tab sistem — sada jedna PTY sesija po stranici.
Dodat idle detection: status "Završeno", flash animacija, browser
notifikacija i treptanje naslova kad je tab u pozadini.
CSS premešten iz inline stilova u style.css.
Dodat /api/projects endpoint i testovi za PTY sesije.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 07:20:55 +00:00

788 lines
15 KiB
CSS
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

:root {
--bg-primary: #1a1a2e;
--bg-secondary: #16213e;
--bg-tertiary: #0f3460;
--bg-input: #1e2a4a;
--text-primary: #e0e0e0;
--text-secondary: #a0a0b0;
--text-muted: #6c6c80;
--accent: #e94560;
--accent-hover: #ff6b81;
--border: #2a2a4a;
--success: #4caf50;
--warning: #ff9800;
--error: #f44336;
--code-bg: #0d1117;
--shadow: rgba(0, 0, 0, 0.3);
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background: var(--bg-primary);
color: var(--text-primary);
min-height: 100vh;
}
a {
color: var(--accent);
text-decoration: none;
}
a:hover {
color: var(--accent-hover);
}
/* Login */
.login-container {
display: flex;
align-items: center;
justify-content: center;
min-height: 100vh;
}
.login-box {
background: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: 12px;
padding: 2.5rem;
width: 100%;
max-width: 400px;
box-shadow: 0 8px 32px var(--shadow);
}
.login-box h1 {
text-align: center;
margin-bottom: 1.5rem;
font-size: 1.5rem;
color: var(--accent);
}
.form-group {
margin-bottom: 1rem;
}
.form-group label {
display: block;
margin-bottom: 0.4rem;
color: var(--text-secondary);
font-size: 0.9rem;
}
.form-group input {
width: 100%;
padding: 0.7rem 1rem;
background: var(--bg-input);
border: 1px solid var(--border);
border-radius: 8px;
color: var(--text-primary);
font-size: 1rem;
outline: none;
transition: border-color 0.2s;
}
.form-group input:focus {
border-color: var(--accent);
}
.btn {
display: inline-block;
padding: 0.7rem 1.5rem;
background: var(--accent);
color: #fff;
border: none;
border-radius: 8px;
font-size: 1rem;
cursor: pointer;
transition: background 0.2s;
text-align: center;
}
.btn:hover {
background: var(--accent-hover);
color: #fff;
}
.btn-secondary {
background: var(--bg-tertiary);
margin-right: 0.5rem;
}
.btn-secondary:hover {
background: var(--border);
color: #fff;
}
.btn-full {
width: 100%;
}
.error-msg {
background: rgba(244, 67, 54, 0.15);
color: var(--error);
padding: 0.6rem 1rem;
border-radius: 8px;
margin-bottom: 1rem;
font-size: 0.9rem;
text-align: center;
}
.success-msg {
background: rgba(76, 175, 80, 0.15);
color: var(--success);
padding: 0.6rem 1rem;
border-radius: 8px;
margin-bottom: 1rem;
font-size: 0.9rem;
text-align: center;
}
.form-footer {
margin-top: 1rem;
text-align: center;
font-size: 0.85rem;
}
/* Projects grid */
.projects-container {
max-width: 1000px;
margin: 0 auto;
padding: 2rem;
}
.projects-container h1 {
margin-bottom: 1.5rem;
color: var(--accent);
}
.projects-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 1.5rem;
}
.projects-header .btn {
padding: 0.5rem 1rem;
font-size: 0.85rem;
}
.projects-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 1rem;
}
.project-card {
background: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: 12px;
padding: 1.5rem;
cursor: pointer;
transition: border-color 0.2s, transform 0.1s;
text-decoration: none;
color: var(--text-primary);
display: block;
}
.project-card:hover {
border-color: var(--accent);
transform: translateY(-2px);
color: var(--text-primary);
}
.project-card h3 {
margin-bottom: 0.4rem;
}
.project-card p {
color: var(--text-secondary);
font-size: 0.85rem;
}
/* Chat layout — terminal style */
.chat-container {
display: flex;
height: 100vh;
}
.sidebar {
width: 280px;
background: var(--bg-secondary);
border-right: 1px solid var(--border);
display: flex;
flex-direction: column;
flex-shrink: 0;
}
.sidebar-header {
padding: 0.75rem 1rem;
border-bottom: 1px solid var(--border);
display: flex;
justify-content: space-between;
align-items: center;
}
.sidebar-header h3 {
font-size: 0.9rem;
color: var(--text-secondary);
}
.sidebar-content {
flex: 1;
overflow-y: auto;
padding: 0.5rem;
}
.file-item {
padding: 0.4rem 0.75rem;
border-radius: 4px;
cursor: pointer;
font-size: 0.8rem;
font-family: 'JetBrains Mono', 'Fira Code', monospace;
color: var(--text-secondary);
display: block;
text-decoration: none;
transition: background 0.15s;
}
.file-item:hover {
background: var(--bg-tertiary);
color: var(--text-primary);
}
.chat-main {
flex: 1;
display: flex;
flex-direction: column;
min-width: 0;
background: #0d1117;
}
.chat-header {
padding: 0.5rem 1rem;
border-bottom: 1px solid var(--border);
display: flex;
justify-content: space-between;
align-items: center;
background: var(--bg-secondary);
font-family: 'JetBrains Mono', 'Fira Code', monospace;
font-size: 0.85rem;
}
.chat-header h2 {
font-size: 0.9rem;
font-weight: normal;
color: var(--accent);
}
.chat-header .status {
font-size: 0.75rem;
color: var(--text-muted);
}
.chat-header .status.connected {
color: var(--success);
}
/* Terminal output area */
.chat-messages {
flex: 1;
overflow-y: auto;
padding: 0.75rem 1rem;
font-family: 'JetBrains Mono', 'Fira Code', monospace;
font-size: 0.85rem;
line-height: 1.6;
}
/* User input — prompt style */
.message {
padding: 0.3rem 0;
word-wrap: break-word;
max-width: 100%;
}
.message-user {
color: var(--success);
white-space: pre-wrap;
}
.message-user::before {
content: " ";
color: var(--accent);
font-weight: bold;
}
/* Claude response */
.message-assistant {
color: var(--text-primary);
padding: 0.4rem 0;
border-left: 2px solid var(--border);
padding-left: 0.75rem;
margin: 0.3rem 0;
}
.message-assistant .content {
/* rendered markdown, no pre-wrap */
}
/* System messages */
.message-system {
color: var(--text-muted);
font-size: 0.75rem;
padding: 0.15rem 0;
}
/* Tool calls — command style */
.message-tool {
color: var(--text-secondary);
font-size: 0.8rem;
padding: 0.2rem 0;
opacity: 0.7;
}
.message-tool .tool-name {
color: var(--warning);
font-weight: 600;
display: inline;
}
.message-tool .tool-name::before {
content: "⚙ ";
}
.message-tool div {
display: inline;
}
/* Typing indicator */
.typing-indicator {
color: var(--text-muted);
font-size: 0.8rem;
padding: 0.2rem 0;
font-family: 'JetBrains Mono', 'Fira Code', monospace;
}
.typing-indicator .dots {
display: inline-block;
animation: blink 1.4s infinite;
}
@keyframes blink {
0%, 20% { opacity: 1; }
50% { opacity: 0.3; }
80%, 100% { opacity: 1; }
}
/* Mode bar */
.mode-bar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.3rem 0;
margin-bottom: 0.3rem;
}
.mode-indicator {
display: flex;
gap: 0;
border: 1px solid var(--border);
border-radius: 4px;
overflow: hidden;
}
.mode-label {
padding: 0.2rem 0.6rem;
font-size: 0.75rem;
font-family: 'JetBrains Mono', 'Fira Code', monospace;
color: var(--text-muted);
cursor: pointer;
transition: all 0.15s;
user-select: none;
}
.mode-label:hover {
color: var(--text-secondary);
background: rgba(255, 255, 255, 0.05);
}
.mode-label.mode-active {
background: var(--accent);
color: #fff;
}
.mode-hint {
font-size: 0.65rem;
color: var(--text-muted);
font-family: 'JetBrains Mono', 'Fira Code', monospace;
}
/* Plan mode user messages */
.message-user-plan {
color: #64b5f6 !important;
}
.message-user-plan::before {
content: "⊞ " !important;
color: #64b5f6 !important;
}
/* Input area — terminal prompt */
.chat-input-area {
padding: 0.5rem 1rem;
border-top: 1px solid var(--border);
background: #0d1117;
}
.chat-input-form {
display: flex;
gap: 0.5rem;
align-items: flex-end;
}
.chat-input {
flex: 1;
padding: 0.5rem 0.75rem;
background: transparent;
border: 1px solid var(--border);
border-radius: 4px;
color: var(--text-primary);
font-size: 0.85rem;
font-family: 'JetBrains Mono', 'Fira Code', monospace;
outline: none;
resize: none;
min-height: 36px;
max-height: 200px;
}
.chat-input:focus {
border-color: var(--accent);
}
.chat-input-form .btn {
padding: 0.5rem 1rem;
font-size: 0.8rem;
font-family: 'JetBrains Mono', 'Fira Code', monospace;
}
/* Markdown rendered content */
.message-assistant pre {
background: #161b22;
border: 1px solid var(--border);
border-radius: 4px;
padding: 0.6rem;
overflow-x: auto;
margin: 0.4rem 0;
font-size: 0.8rem;
}
.message-assistant code {
font-family: 'JetBrains Mono', 'Fira Code', monospace;
font-size: 0.85em;
}
.message-assistant p code {
background: #161b22;
padding: 0.1rem 0.3rem;
border-radius: 3px;
font-size: 0.85em;
}
.message-assistant h1,
.message-assistant h2,
.message-assistant h3 {
color: var(--accent);
margin: 0.6rem 0 0.3rem;
font-size: 1em;
}
.message-assistant h1 { font-size: 1.1em; }
.message-assistant h2 { font-size: 1em; }
.message-assistant ul,
.message-assistant ol {
padding-left: 1.5rem;
margin: 0.3rem 0;
}
.message-assistant p {
margin: 0.3rem 0;
}
.message-assistant strong {
color: #fff;
}
/* Tables */
.message-assistant table,
.file-viewer-content table {
border-collapse: collapse;
margin: 0.5rem 0;
font-size: 0.8rem;
width: auto;
}
.message-assistant th,
.message-assistant td,
.file-viewer-content th,
.file-viewer-content td {
border: 1px solid var(--border);
padding: 0.3rem 0.6rem;
text-align: left;
}
.message-assistant th,
.file-viewer-content th {
background: #161b22;
color: var(--accent);
font-weight: 600;
}
.message-assistant tr:nth-child(even),
.file-viewer-content tr:nth-child(even) {
background: rgba(22, 27, 34, 0.5);
}
/* File viewer overlay */
.file-viewer {
position: fixed;
top: 0;
right: 0;
width: 50%;
height: 100vh;
background: #0d1117;
border-left: 1px solid var(--border);
z-index: 100;
display: flex;
flex-direction: column;
box-shadow: -4px 0 16px var(--shadow);
}
.file-viewer-header {
padding: 0.75rem 1rem;
border-bottom: 1px solid var(--border);
display: flex;
justify-content: space-between;
align-items: center;
font-family: 'JetBrains Mono', 'Fira Code', monospace;
font-size: 0.85rem;
}
.file-viewer-content {
flex: 1;
overflow-y: auto;
padding: 1rem 1.5rem;
line-height: 1.6;
font-size: 0.9rem;
}
.file-viewer-content h1,
.file-viewer-content h2,
.file-viewer-content h3 {
margin: 0.8rem 0 0.4rem;
color: var(--accent);
}
.file-viewer-content pre {
background: #161b22;
border: 1px solid var(--border);
border-radius: 4px;
padding: 0.8rem;
overflow-x: auto;
}
.file-viewer-content code {
font-family: 'JetBrains Mono', 'Fira Code', monospace;
}
.file-viewer-content p {
margin: 0.4rem 0;
}
/* Scrollbar */
::-webkit-scrollbar {
width: 6px;
}
::-webkit-scrollbar-track {
background: #0d1117;
}
::-webkit-scrollbar-thumb {
background: var(--border);
border-radius: 3px;
}
::-webkit-scrollbar-thumb:hover {
background: var(--text-muted);
}
/* Modal */
.modal-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.6);
display: flex;
align-items: center;
justify-content: center;
z-index: 200;
}
.modal-box {
background: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: 12px;
padding: 2rem;
width: 100%;
max-width: 420px;
box-shadow: 0 8px 32px var(--shadow);
}
.modal-box h2 {
color: var(--accent);
margin-bottom: 1.2rem;
font-size: 1.2rem;
}
.modal-hint {
color: var(--text-muted);
font-size: 0.8rem;
margin-top: 0.3rem;
margin-bottom: 1rem;
}
.modal-actions {
display: flex;
justify-content: flex-end;
gap: 0.5rem;
}
/* Tab bar */
.tab-bar {
display: flex;
align-items: center;
background: var(--bg-secondary);
border-bottom: 1px solid var(--border);
padding: 0 0.25rem;
flex-shrink: 0;
overflow-x: auto;
gap: 2px;
min-height: 32px;
}
.tab-bar::-webkit-scrollbar { height: 0; }
.tab {
display: flex;
align-items: center;
gap: 0.4rem;
padding: 0.25rem 0.5rem;
font-size: 0.7rem;
font-family: 'JetBrains Mono', 'Fira Code', monospace;
color: var(--text-muted);
cursor: pointer;
border: 1px solid transparent;
border-bottom: none;
border-radius: 4px 4px 0 0;
white-space: nowrap;
user-select: none;
transition: color 0.15s, background 0.15s;
}
.tab:hover {
color: var(--text-secondary);
background: rgba(255, 255, 255, 0.03);
}
.tab.active {
color: var(--text-primary);
background: var(--bg-primary);
border-color: var(--border);
}
.tab-close {
display: inline-flex;
align-items: center;
justify-content: center;
width: 16px;
height: 16px;
font-size: 0.65rem;
border-radius: 3px;
color: var(--text-muted);
transition: background 0.1s, color 0.1s;
}
.tab-close:hover {
background: rgba(244, 67, 54, 0.3);
color: var(--error);
}
.tab-add {
display: flex;
align-items: center;
justify-content: center;
width: 24px;
height: 24px;
font-size: 0.85rem;
color: var(--text-muted);
cursor: pointer;
border-radius: 4px;
border: none;
background: none;
font-family: inherit;
transition: color 0.15s, background 0.15s;
flex-shrink: 0;
}
.tab-add:hover {
color: var(--text-primary);
background: rgba(255, 255, 255, 0.05);
}
/* Tab dropdown for project selection */
.tab-dropdown {
position: absolute;
top: 100%;
right: 0;
background: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: 6px;
min-width: 180px;
max-height: 300px;
overflow-y: auto;
z-index: 100;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
}
.tab-dropdown-item {
display: block;
width: 100%;
padding: 0.4rem 0.75rem;
font-size: 0.75rem;
font-family: 'JetBrains Mono', 'Fira Code', monospace;
color: var(--text-secondary);
background: none;
border: none;
text-align: left;
cursor: pointer;
transition: background 0.1s, color 0.1s;
}
.tab-dropdown-item:hover {
background: rgba(233, 69, 96, 0.15);
color: var(--text-primary);
}
/* Hidden */
.hidden {
display: none !important;
}