:root { /* Gruvbox Dark Palette */ --bg-main: #282828; /* bg0 */ --bg-card: #3c3836; /* bg1 */ --bg-card-hover: #504945; /* bg2 */ --border: #504945; /* bg2 */ --border-hover: #665c54; /* bg3 */ --border-focus: #fabd2f; /* Gruvbox Yellow */ --text-main: #ebdbb2; /* fg1 */ --text-heading: #fbf1c7; /* fg0 */ --text-muted: #a89984; /* fg4 */ --primary: #fabd2f; /* Gruvbox Yellow */ --primary-hover: #d79921; /* Gruvbox Dark Yellow */ --primary-text: #282828; /* Dark contrast text for yellow buttons */ --income: #b8bb26; /* Gruvbox Green */ --expense: #fb4934; /* Gruvbox Red */ --danger: #fb4934; /* Gruvbox Red */ --accent-blue: #83a598; /* Gruvbox Blue */ --radius-sm: 6px; --radius-md: 10px; --radius-lg: 16px; --shadow: 0 4px 20px rgba(0, 0, 0, 0.4); } * { box-sizing: border-box; } body { font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; max-width: 920px; margin: 0 auto; padding: 24px 20px 60px 20px; color: var(--text-main); background-color: var(--bg-main); line-height: 1.5; -webkit-font-smoothing: antialiased; } /* Headings & Links */ h1, h2, h3, h4 { margin-top: 0; color: var(--text-heading); font-weight: 700; letter-spacing: -0.02em; } a { color: var(--primary); text-decoration: none; transition: color 0.15s ease; } a:hover { color: var(--primary-hover); } /* Navbar */ .navbar { display: flex; justify-content: space-between; align-items: center; padding: 16px 0; border-bottom: 1px solid var(--border); margin-bottom: 32px; } .navbar-brand { font-size: 22px; font-weight: 800; letter-spacing: 0.05em; text-decoration: none; color: var(--primary); } .navbar-actions { display: flex; align-items: center; gap: 10px; } /* Header Section & Balance Card */ .header-section { margin-bottom: 32px; padding: 24px; background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-lg); box-shadow: var(--shadow); } .header-section h1 { margin: 0 0 8px 0; font-size: 28px; } .balance-text { margin: 0; font-size: 15px; color: var(--text-muted); } .balance-text strong { font-size: 24px; color: var(--primary); font-weight: 700; margin-left: 6px; } /* Cards & Auth Containers */ .card { background: var(--bg-card); border: 1px solid var(--border); padding: 24px; border-radius: var(--radius-md); margin-bottom: 32px; box-shadow: var(--shadow); } .auth-container { max-width: 420px; margin: 60px auto; } .auth-container h2 { text-align: center; margin-bottom: 24px; } .auth-container p { text-align: center; color: var(--text-muted); font-size: 14px; } /* Tables */ table { width: 100%; border-collapse: separate; border-spacing: 0; margin-top: 10px; background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-md); overflow: hidden; } th { background: var(--bg-card-hover); color: var(--text-muted); font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; padding: 14px 16px; border-bottom: 1px solid var(--border); text-align: left; } td { padding: 14px 16px; border-bottom: 1px solid var(--border); font-size: 14px; color: var(--text-main); } tr:last-child td { border-bottom: none; } tr:hover td { background-color: var(--bg-card-hover); } .income { color: var(--income); font-weight: 600; } .expense { color: var(--expense); font-weight: 500; } /* Filter Pills */ .filters { margin-bottom: 32px; display: flex; gap: 8px; flex-wrap: wrap; } .filters a { padding: 8px 16px; border-radius: var(--radius-sm); text-decoration: none; border: 1px solid var(--border); background: var(--bg-card); color: var(--text-muted); font-size: 14px; font-weight: 500; transition: all 0.15s ease; } .filters a:hover { border-color: var(--border-hover); color: var(--text-main); } .filters a.active { background: var(--primary); color: var(--primary-text); border-color: var(--primary); font-weight: 600; box-shadow: 0 0 12px rgba(250, 189, 47, 0.25); } /* Chart Container */ .chart-container { position: relative; height: 400px; width: 100%; margin-top: 24px; padding: 20px; background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-md); } /* Buttons */ button, .btn { background: var(--primary); color: var(--primary-text); padding: 9px 18px; border: none; border-radius: var(--radius-sm); cursor: pointer; text-decoration: none; font-size: 14px; font-weight: 700; display: inline-flex; align-items: center; justify-content: center; transition: all 0.15s ease; } button:hover, .btn:hover { background: var(--primary-hover); transform: translateY(-1px); } .btn-stats, .btn-nav { background: var(--bg-card-hover); color: var(--text-main); border: 1px solid var(--border-hover); font-weight: 600; } .btn-stats:hover, .btn-nav:hover { background: var(--border-hover); color: var(--text-heading); } .btn-logout, .btn-delete { background: rgba(251, 73, 52, 0.15); color: var(--danger); border: 1px solid rgba(251, 73, 52, 0.3); font-weight: 600; } .btn-logout:hover, .btn-delete:hover { background: var(--danger); color: var(--bg-main); } .btn-edit { background: rgba(131, 165, 152, 0.15); color: var(--accent-blue); border: 1px solid rgba(131, 165, 152, 0.3); text-decoration: none; padding: 6px 12px; border-radius: var(--radius-sm); font-size: 13px; font-weight: 600; margin-right: 6px; transition: all 0.15s ease; } .btn-edit:hover { background: var(--accent-blue); color: var(--bg-main); } .cancel { background: var(--bg-card-hover); color: var(--text-muted); text-decoration: none; padding: 9px 18px; border-radius: var(--radius-sm); display: inline-block; margin-left: 10px; font-size: 14px; font-weight: 600; border: 1px solid var(--border-hover); transition: all 0.15s ease; } .cancel:hover { background: var(--border-hover); color: var(--text-main); } /* Django Form Styling */ form p { margin-bottom: 18px; } form label { display: block; font-size: 12px; font-weight: 600; color: var(--text-muted); margin-bottom: 6px; text-transform: uppercase; letter-spacing: 0.04em; } form input[type="text"], form input[type="password"], form input[type="email"], form input[type="number"], form input[type="date"], form select { width: 100%; box-sizing: border-box; padding: 10px 14px; border: 1px solid var(--border); border-radius: var(--radius-sm); font-size: 14px; background-color: var(--bg-main); color: var(--text-main); transition: all 0.15s ease; } form input:focus, form select:focus { outline: none; border-color: var(--border-focus); box-shadow: 0 0 0 3px rgba(250, 189, 47, 0.2); } /* Django Form Password Requirements & Help Text */ .helptext, form span.helptext { display: block; font-size: 12px; color: var(--text-muted); margin-top: 6px; line-height: 1.5; } .helptext ul { margin: 6px 0 10px 0; padding-left: 18px; color: var(--text-muted); font-size: 12px; } .helptext li { margin-bottom: 4px; } /* Validation Errors */ .errorlist { color: var(--expense); font-size: 13px; list-style: none; padding: 10px 14px; margin: 6px 0 16px 0; background: rgba(251, 73, 52, 0.1); border: 1px solid rgba(251, 73, 52, 0.25); border-radius: var(--radius-sm); font-weight: 500; } .errorlist li { margin: 2px 0; }