LifeLog / theme.py
arunsa's picture
LifeLog v1.0 - A Debugger for Your Life Decisions
8f74b6b
Raw
History Blame Contribute Delete
9.57 kB
import gradio as gr
def create_theme():
return gr.themes.Base(
primary_hue=gr.themes.colors.green,
secondary_hue=gr.themes.colors.amber,
neutral_hue=gr.themes.colors.zinc,
font=[
gr.themes.GoogleFont("JetBrains Mono"),
gr.themes.GoogleFont("Inter"),
"ui-monospace",
"monospace",
],
font_mono=[
gr.themes.GoogleFont("JetBrains Mono"),
"ui-monospace",
"monospace",
],
)
CUSTOM_CSS = """
/* ===== LIFELOG DEBUGGER THEME ===== */
.gradio-container {
background: #0d1117 !important;
max-width: 1200px !important;
}
/* --- App header --- */
.app-header {
background: linear-gradient(135deg, #0d1117 0%, #161b22 100%);
border: 1px solid #30363d;
border-radius: 12px;
padding: 28px 32px;
margin-bottom: 20px;
position: relative;
overflow: hidden;
}
.app-header::before {
content: '';
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
background: repeating-linear-gradient(
0deg,
transparent,
transparent 2px,
rgba(34, 197, 94, 0.03) 2px,
rgba(34, 197, 94, 0.03) 4px
);
pointer-events: none;
animation: scanline 10s linear infinite;
}
@keyframes scanline {
0% { transform: translateY(0); }
100% { transform: translateY(120px); }
}
.app-title {
font-family: 'JetBrains Mono', monospace;
color: #22c55e;
font-size: 32px;
font-weight: 700;
margin: 0;
text-shadow: 0 0 24px rgba(34, 197, 94, 0.3);
}
.app-subtitle {
color: #8b949e;
font-family: 'JetBrains Mono', monospace;
font-size: 14px;
margin-top: 6px;
}
.app-meta {
color: #484f58;
font-family: 'JetBrains Mono', monospace;
font-size: 11px;
margin-top: 4px;
}
/* --- Dark overrides --- */
.block, .form, .wrap, .panel {
background: #161b22 !important;
border-color: #30363d !important;
}
.label-wrap, .block > label {
color: #8b949e !important;
}
textarea, input[type="text"] {
background: #0d1117 !important;
border-color: #30363d !important;
color: #e6edf3 !important;
font-family: 'JetBrains Mono', monospace !important;
}
textarea:focus, input[type="text"]:focus {
border-color: #22c55e !important;
box-shadow: 0 0 0 2px rgba(34, 197, 94, 0.15) !important;
}
textarea::placeholder, input::placeholder {
color: #484f58 !important;
}
/* --- Tab styling --- */
.tab-nav {
background: #161b22 !important;
border-bottom: 1px solid #30363d !important;
}
.tab-nav button {
font-family: 'JetBrains Mono', monospace !important;
color: #8b949e !important;
background: transparent !important;
border: none !important;
border-bottom: 2px solid transparent !important;
padding: 12px 20px !important;
font-size: 13px !important;
transition: all 0.2s !important;
}
.tab-nav button:hover {
color: #e6edf3 !important;
background: rgba(34, 197, 94, 0.05) !important;
}
.tab-nav button.selected {
color: #22c55e !important;
border-bottom-color: #22c55e !important;
background: rgba(34, 197, 94, 0.08) !important;
}
/* --- Section headers --- */
.section-header {
font-family: 'JetBrains Mono', monospace;
color: #22c55e;
font-size: 15px;
margin: 0 0 12px 0;
padding: 8px 12px;
background: rgba(34, 197, 94, 0.05);
border-left: 3px solid #22c55e;
border-radius: 0 6px 6px 0;
}
/* --- Chatbot --- */
.chatbot {
background: #0d1117 !important;
border: 1px solid #30363d !important;
border-radius: 8px !important;
}
.message {
font-family: 'JetBrains Mono', monospace !important;
font-size: 13px !important;
}
/* --- Git Log Timeline --- */
.git-log-container {
font-family: 'JetBrains Mono', monospace;
color: #e6edf3;
padding: 8px 0;
}
.commit-entry {
position: relative;
padding: 16px 16px 16px 44px;
border-left: 2px solid #30363d;
margin-left: 20px;
margin-bottom: 0;
transition: background 0.2s;
}
.commit-entry:hover {
background: rgba(34, 197, 94, 0.03);
}
.commit-entry::before {
content: '';
position: absolute;
left: -7px;
top: 22px;
width: 12px;
height: 12px;
border-radius: 50%;
background: #22c55e;
border: 2px solid #0d1117;
box-shadow: 0 0 8px rgba(34, 197, 94, 0.4);
}
.commit-entry.resolved::before {
background: #8b949e;
box-shadow: none;
}
.commit-header {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 8px;
}
.commit-hash {
color: #f0883e;
font-weight: 600;
font-size: 13px;
}
.commit-branch {
display: inline-block;
padding: 2px 10px;
border-radius: 12px;
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.branch-career { background: rgba(56, 139, 253, 0.15); color: #58a6ff; }
.branch-financial { background: rgba(240, 136, 62, 0.15); color: #f0883e; }
.branch-health { background: rgba(63, 185, 80, 0.15); color: #3fb950; }
.branch-relationship{ background: rgba(219, 97, 162, 0.15); color: #db61a2; }
.branch-education { background: rgba(160, 110, 246, 0.15); color: #a06ef6; }
.branch-housing { background: rgba(121, 192, 255, 0.15); color: #79c0ff; }
.branch-lifestyle { background: rgba(210, 153, 34, 0.15); color: #d29922; }
.branch-creative { background: rgba(255, 123, 114, 0.15); color: #ff7b72; }
.branch-unknown { background: rgba(139, 148, 158, 0.15); color: #8b949e; }
.commit-message {
color: #e6edf3;
font-size: 13px;
flex: 1;
}
.commit-date {
color: #484f58;
font-size: 11px;
margin-left: auto;
}
.commit-body {
margin-top: 10px;
padding-left: 4px;
}
.prediction-item {
color: #8b949e;
font-size: 12px;
margin: 3px 0;
padding-left: 12px;
border-left: 1px solid #21262d;
}
.prediction-bug { color: #f85149; }
.prediction-feature { color: #3fb950; }
.prediction-neutral { color: #d29922; }
.commit-card-thumb {
width: 100px;
height: 100px;
border-radius: 8px;
border: 1px solid #30363d;
margin-top: 8px;
object-fit: cover;
}
.outcome-badge {
display: inline-block;
padding: 3px 10px;
border-radius: 4px;
font-size: 11px;
font-weight: 600;
margin-top: 8px;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.outcome-pending { background: rgba(210, 153, 34, 0.15); color: #d29922; }
.outcome-positive { background: rgba(63, 185, 80, 0.15); color: #3fb950; }
.outcome-negative { background: rgba(248, 81, 73, 0.15); color: #f85149; }
.outcome-mixed { background: rgba(240, 136, 62, 0.15); color: #f0883e; }
/* --- Results panel --- */
.results-panel {
background: #161b22;
border: 1px solid #30363d;
border-radius: 10px;
padding: 24px;
}
.results-panel h3 {
color: #e6edf3;
margin: 0 0 16px 0;
font-size: 16px;
}
.category-badge {
display: inline-block;
padding: 4px 14px;
border-radius: 16px;
font-family: 'JetBrains Mono', monospace;
font-size: 13px;
font-weight: 600;
}
.severity-bar {
height: 8px;
border-radius: 4px;
background: #21262d;
overflow: hidden;
margin: 8px 0;
width: 100%;
}
.severity-fill {
height: 100%;
border-radius: 4px;
transition: width 0.6s ease;
}
.severity-low { background: linear-gradient(90deg, #238636, #3fb950); }
.severity-medium { background: linear-gradient(90deg, #9e6a03, #d29922); }
.severity-high { background: linear-gradient(90deg, #da3633, #f85149); }
/* --- Stats cards --- */
.stat-card {
background: #161b22;
border: 1px solid #30363d;
border-radius: 10px;
padding: 20px;
text-align: center;
}
.stat-value {
font-size: 36px;
font-weight: 700;
color: #22c55e;
font-family: 'JetBrains Mono', monospace;
line-height: 1;
}
.stat-label {
font-size: 11px;
color: #8b949e;
text-transform: uppercase;
letter-spacing: 1.5px;
margin-top: 8px;
}
/* --- Empty state --- */
.empty-state {
text-align: center;
padding: 60px 20px;
color: #484f58;
font-family: 'JetBrains Mono', monospace;
}
.empty-state .icon {
font-size: 48px;
margin-bottom: 16px;
opacity: 0.5;
}
.empty-state p {
font-size: 14px;
max-width: 400px;
margin: 0 auto;
line-height: 1.6;
}
/* --- Custom scrollbar --- */
::-webkit-scrollbar { width: 6px; }
::-webkit-scrollbar-track { background: #0d1117; }
::-webkit-scrollbar-thumb { background: #30363d; border-radius: 3px; }
::-webkit-scrollbar-thumb:hover { background: #484f58; }
/* --- Button glow --- */
button.primary {
box-shadow: 0 0 16px rgba(34, 197, 94, 0.15) !important;
transition: box-shadow 0.3s !important;
}
button.primary:hover {
box-shadow: 0 0 24px rgba(34, 197, 94, 0.3) !important;
}
/* --- Markdown in dark theme --- */
.prose, .markdown-text {
color: #e6edf3 !important;
}
.prose h2, .prose h3, .prose h4 {
color: #22c55e !important;
font-family: 'JetBrains Mono', monospace !important;
}
.prose strong { color: #e6edf3 !important; }
.prose code {
background: #21262d !important;
color: #f0883e !important;
padding: 2px 6px !important;
border-radius: 4px !important;
}
/* --- Loading animation --- */
@keyframes pulse-green {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
.loading-pulse {
animation: pulse-green 1.5s ease-in-out infinite;
color: #22c55e;
font-family: 'JetBrains Mono', monospace;
}
"""