finance-planning / src /style.css
HsiehMinChieh
Major update: UI refactor, Real Price features, Import/Export, SPV removal (Clean Commit)
74728c6
/* Finance Planning - Custom CSS */
/* Dark Mode + Glassmorphism Theme */
/* Google Fonts */
@import url("https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Noto+Sans+TC:wght@300;400;500;700&display=swap");
/* Root Variables */
:root {
--primary: #f59e0b;
--secondary: #fbbf24;
--cta: #8b5cf6;
--bg-dark: #0f172a;
--bg-card: #1e293b;
--text-primary: #f8fafc;
--text-muted: #94a3b8;
--border: #334155;
--income: #10b981;
--expense: #ef4444;
--glass-bg: rgba(30, 41, 59, 0.7);
--glass-border: rgba(255, 255, 255, 0.1);
}
/* Global Styles */
html,
body,
[class*="stApp"] {
font-family: "Inter", "Noto Sans TC", sans-serif !important;
}
/* Main container */
.stApp {
background: linear-gradient(135deg, #0f172a 0%, #1e293b 100%) !important;
}
/* Headers */
h1,
h2,
h3 {
font-family: "Noto Sans TC", "Inter", sans-serif !important;
color: var(--text-primary) !important;
font-weight: 600 !important;
}
h1 {
background: linear-gradient(
90deg,
var(--primary),
var(--secondary)
) !important;
-webkit-background-clip: text !important;
-webkit-text-fill-color: transparent !important;
background-clip: text !important;
}
/* Sidebar */
[data-testid="stSidebar"] {
background: var(--glass-bg) !important;
backdrop-filter: blur(20px) !important;
-webkit-backdrop-filter: blur(20px) !important;
border-right: 1px solid var(--glass-border) !important;
}
[data-testid="stSidebar"] h1,
[data-testid="stSidebar"] h2,
[data-testid="stSidebar"] h3 {
color: var(--primary) !important;
-webkit-text-fill-color: var(--primary) !important;
}
/* Cards / Metric containers */
[data-testid="stMetric"] {
background: var(--glass-bg) !important;
backdrop-filter: blur(10px) !important;
-webkit-backdrop-filter: blur(10px) !important;
border: 1px solid var(--glass-border) !important;
border-radius: 12px !important;
padding: 1rem !important;
transition:
transform 0.2s ease-out,
box-shadow 0.2s ease-out !important;
}
[data-testid="stMetric"]:hover {
transform: translateY(-2px) !important;
box-shadow: 0 8px 32px rgba(245, 158, 11, 0.15) !important;
}
[data-testid="stMetricLabel"] {
color: var(--text-muted) !important;
font-size: 0.875rem !important;
}
[data-testid="stMetricValue"] {
color: var(--text-primary) !important;
font-weight: 600 !important;
font-size: 1.5rem !important;
}
/* Tabs */
.stTabs [data-baseweb="tab-list"] {
gap: 8px !important;
background: var(--glass-bg) !important;
padding: 0.5rem !important;
border-radius: 12px !important;
border: 1px solid var(--glass-border) !important;
}
.stTabs [data-baseweb="tab"] {
background: transparent !important;
color: var(--text-muted) !important;
border-radius: 8px !important;
padding: 0.5rem 1rem !important;
transition: all 0.2s ease-out !important;
}
.stTabs [aria-selected="true"] {
background: var(--primary) !important;
color: var(--bg-dark) !important;
font-weight: 600 !important;
}
/* DataFrames */
[data-testid="stDataFrame"] {
background: var(--glass-bg) !important;
border: 1px solid var(--glass-border) !important;
border-radius: 12px !important;
overflow: hidden !important;
}
[data-testid="stDataFrame"] th {
background: var(--bg-card) !important;
color: var(--primary) !important;
font-weight: 600 !important;
}
[data-testid="stDataFrame"] td {
color: var(--text-primary) !important;
}
/* Buttons */
.stButton > button {
background: linear-gradient(
135deg,
var(--primary),
var(--secondary)
) !important;
color: var(--bg-dark) !important;
border: none !important;
border-radius: 8px !important;
font-weight: 600 !important;
padding: 0.5rem 1.5rem !important;
transition:
transform 0.2s ease-out,
box-shadow 0.2s ease-out !important;
}
.stButton > button:hover {
transform: translateY(-2px) !important;
box-shadow: 0 4px 16px rgba(245, 158, 11, 0.3) !important;
}
.stButton > button[kind="primary"] {
background: linear-gradient(135deg, var(--cta), #a78bfa) !important;
color: white !important;
}
/* Form inputs */
.stTextInput > div > div > input,
.stNumberInput > div > div > input,
.stSelectbox > div > div > div {
background: var(--bg-card) !important;
border: 1px solid var(--border) !important;
border-radius: 8px !important;
color: var(--text-primary) !important;
}
.stTextInput > div > div > input:focus,
.stNumberInput > div > div > input:focus {
border-color: var(--primary) !important;
box-shadow: 0 0 0 2px rgba(245, 158, 11, 0.2) !important;
}
/* Dividers */
hr {
border-color: var(--border) !important;
opacity: 0.5 !important;
}
/* Plotly charts - transparent background */
.js-plotly-plot .plotly .main-svg {
background: transparent !important;
}
/* Info/Warning boxes */
.stAlert {
background: var(--glass-bg) !important;
border: 1px solid var(--glass-border) !important;
border-radius: 12px !important;
backdrop-filter: blur(10px) !important;
}
/* Scrollbar */
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-track {
background: var(--bg-dark);
}
::-webkit-scrollbar-thumb {
background: var(--border);
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: var(--primary);
}
/* Reduced motion */
@media (prefers-reduced-motion: reduce) {
* {
transition: none !important;
animation: none !important;
}
}