Complete personal finance management application with: - Dashboard with financial metrics and alerts - Credit card management and payments - Fixed and variable debt tracking - Monthly budget planning - Intelligent alert system - Responsive design with Tailwind CSS Tech stack: Next.js 14, TypeScript, Zustand, Recharts 🤖 Generated with [Claude Code](https://claude.com/claude-code)
333 lines
6.3 KiB
CSS
333 lines
6.3 KiB
CSS
@tailwind base;
|
|
@tailwind components;
|
|
@tailwind utilities;
|
|
|
|
:root {
|
|
/* Base Colors - Dark Theme (slate/emerald) */
|
|
--background: 222 47% 11%;
|
|
--foreground: 210 40% 98%;
|
|
|
|
/* Card Colors */
|
|
--card: 217 33% 17%;
|
|
--card-foreground: 210 40% 98%;
|
|
|
|
/* Popover Colors */
|
|
--popover: 217 33% 17%;
|
|
--popover-foreground: 210 40% 98%;
|
|
|
|
/* Primary - Emerald */
|
|
--primary: 160 84% 39%;
|
|
--primary-foreground: 210 40% 98%;
|
|
|
|
/* Secondary */
|
|
--secondary: 217 33% 17%;
|
|
--secondary-foreground: 210 40% 98%;
|
|
|
|
/* Muted */
|
|
--muted: 217 33% 17%;
|
|
--muted-foreground: 215 20% 65%;
|
|
|
|
/* Accent */
|
|
--accent: 217 33% 17%;
|
|
--accent-foreground: 210 40% 98%;
|
|
|
|
/* Destructive */
|
|
--destructive: 0 84% 60%;
|
|
--destructive-foreground: 210 40% 98%;
|
|
|
|
/* Border & Input */
|
|
--border: 215 28% 25%;
|
|
--input: 215 28% 25%;
|
|
|
|
/* Ring - Emerald */
|
|
--ring: 160 84% 39%;
|
|
|
|
/* Radius */
|
|
--radius: 0.5rem;
|
|
}
|
|
|
|
@theme inline {
|
|
--color-background: hsl(var(--background));
|
|
--color-foreground: hsl(var(--foreground));
|
|
--color-card: hsl(var(--card));
|
|
--color-card-foreground: hsl(var(--card-foreground));
|
|
--color-popover: hsl(var(--popover));
|
|
--color-popover-foreground: hsl(var(--popover-foreground));
|
|
--color-primary: hsl(var(--primary));
|
|
--color-primary-foreground: hsl(var(--primary-foreground));
|
|
--color-secondary: hsl(var(--secondary));
|
|
--color-secondary-foreground: hsl(var(--secondary-foreground));
|
|
--color-muted: hsl(var(--muted));
|
|
--color-muted-foreground: hsl(var(--muted-foreground));
|
|
--color-accent: hsl(var(--accent));
|
|
--color-accent-foreground: hsl(var(--accent-foreground));
|
|
--color-destructive: hsl(var(--destructive));
|
|
--color-destructive-foreground: hsl(var(--destructive-foreground));
|
|
--color-border: hsl(var(--border));
|
|
--color-input: hsl(var(--input));
|
|
--color-ring: hsl(var(--ring));
|
|
--radius-sm: calc(var(--radius) - 4px);
|
|
--radius-md: calc(var(--radius) - 2px);
|
|
--radius-lg: var(--radius);
|
|
--radius-xl: calc(var(--radius) + 4px);
|
|
}
|
|
|
|
/* Base Styles */
|
|
html {
|
|
scroll-behavior: smooth;
|
|
}
|
|
|
|
body {
|
|
background-color: hsl(var(--background));
|
|
color: hsl(var(--foreground));
|
|
font-feature-settings: "rlig" 1, "calt" 1;
|
|
-webkit-font-smoothing: antialiased;
|
|
-moz-osx-font-smoothing: grayscale;
|
|
}
|
|
|
|
/* Input Styles */
|
|
input,
|
|
textarea,
|
|
select {
|
|
background-color: hsl(var(--card));
|
|
border-color: hsl(var(--border));
|
|
color: hsl(var(--foreground));
|
|
}
|
|
|
|
input::placeholder,
|
|
textarea::placeholder {
|
|
color: hsl(var(--muted-foreground));
|
|
}
|
|
|
|
/* Selection */
|
|
::selection {
|
|
background-color: hsl(160 84% 39% / 0.3);
|
|
color: hsl(var(--foreground));
|
|
}
|
|
|
|
/* Focus Ring */
|
|
:focus-visible {
|
|
outline: none;
|
|
ring: 2px;
|
|
ring-color: hsl(var(--ring));
|
|
ring-offset: 2px;
|
|
ring-offset-color: hsl(var(--background));
|
|
}
|
|
|
|
/* Custom Scrollbar */
|
|
::-webkit-scrollbar {
|
|
width: 8px;
|
|
height: 8px;
|
|
}
|
|
|
|
::-webkit-scrollbar-track {
|
|
background: hsl(var(--background));
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb {
|
|
background: hsl(var(--border));
|
|
border-radius: 4px;
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb:hover {
|
|
background: hsl(var(--muted-foreground) / 0.5);
|
|
}
|
|
|
|
/* Firefox Scrollbar */
|
|
* {
|
|
scrollbar-width: thin;
|
|
scrollbar-color: hsl(var(--border)) hsl(var(--background));
|
|
}
|
|
|
|
/* Utility Classes */
|
|
.gradient-text {
|
|
background: linear-gradient(135deg, hsl(160 84% 39%) 0%, hsl(168 76% 42%) 100%);
|
|
-webkit-background-clip: text;
|
|
-webkit-text-fill-color: transparent;
|
|
background-clip: text;
|
|
}
|
|
|
|
.glass-card {
|
|
background: hsl(var(--card) / 0.8);
|
|
backdrop-filter: blur(12px);
|
|
-webkit-backdrop-filter: blur(12px);
|
|
border: 1px solid hsl(var(--border) / 0.5);
|
|
}
|
|
|
|
.text-balance {
|
|
text-wrap: balance;
|
|
}
|
|
|
|
/* Loading States */
|
|
.skeleton {
|
|
background: linear-gradient(
|
|
90deg,
|
|
hsl(var(--muted)) 25%,
|
|
hsl(var(--muted-foreground) / 0.3) 50%,
|
|
hsl(var(--muted)) 75%
|
|
);
|
|
background-size: 200% 100%;
|
|
animation: skeleton-pulse 1.5s ease-in-out infinite;
|
|
border-radius: var(--radius);
|
|
}
|
|
|
|
@keyframes skeleton-pulse {
|
|
0% {
|
|
background-position: 200% 0;
|
|
}
|
|
100% {
|
|
background-position: -200% 0;
|
|
}
|
|
}
|
|
|
|
.spinner {
|
|
width: 24px;
|
|
height: 24px;
|
|
border: 2px solid hsl(var(--border));
|
|
border-top-color: hsl(var(--primary));
|
|
border-radius: 50%;
|
|
animation: spin 0.8s linear infinite;
|
|
}
|
|
|
|
.spinner-sm {
|
|
width: 16px;
|
|
height: 16px;
|
|
border-width: 2px;
|
|
}
|
|
|
|
.spinner-lg {
|
|
width: 32px;
|
|
height: 32px;
|
|
border-width: 3px;
|
|
}
|
|
|
|
@keyframes spin {
|
|
to {
|
|
transform: rotate(360deg);
|
|
}
|
|
}
|
|
|
|
/* Animations */
|
|
@keyframes fadeIn {
|
|
from {
|
|
opacity: 0;
|
|
}
|
|
to {
|
|
opacity: 1;
|
|
}
|
|
}
|
|
|
|
@keyframes fadeInUp {
|
|
from {
|
|
opacity: 0;
|
|
transform: translateY(10px);
|
|
}
|
|
to {
|
|
opacity: 1;
|
|
transform: translateY(0);
|
|
}
|
|
}
|
|
|
|
@keyframes fadeInDown {
|
|
from {
|
|
opacity: 0;
|
|
transform: translateY(-10px);
|
|
}
|
|
to {
|
|
opacity: 1;
|
|
transform: translateY(0);
|
|
}
|
|
}
|
|
|
|
@keyframes slideInLeft {
|
|
from {
|
|
opacity: 0;
|
|
transform: translateX(-20px);
|
|
}
|
|
to {
|
|
opacity: 1;
|
|
transform: translateX(0);
|
|
}
|
|
}
|
|
|
|
@keyframes slideInRight {
|
|
from {
|
|
opacity: 0;
|
|
transform: translateX(20px);
|
|
}
|
|
to {
|
|
opacity: 1;
|
|
transform: translateX(0);
|
|
}
|
|
}
|
|
|
|
@keyframes pulse-slow {
|
|
0%,
|
|
100% {
|
|
opacity: 1;
|
|
}
|
|
50% {
|
|
opacity: 0.5;
|
|
}
|
|
}
|
|
|
|
@keyframes bounce-slight {
|
|
0%,
|
|
100% {
|
|
transform: translateY(0);
|
|
}
|
|
50% {
|
|
transform: translateY(-3px);
|
|
}
|
|
}
|
|
|
|
/* Animation Utility Classes */
|
|
.animate-fade-in {
|
|
animation: fadeIn 0.3s ease-out forwards;
|
|
}
|
|
|
|
.animate-fade-in-up {
|
|
animation: fadeInUp 0.3s ease-out forwards;
|
|
}
|
|
|
|
.animate-fade-in-down {
|
|
animation: fadeInDown 0.3s ease-out forwards;
|
|
}
|
|
|
|
.animate-slide-in-left {
|
|
animation: slideInLeft 0.3s ease-out forwards;
|
|
}
|
|
|
|
.animate-slide-in-right {
|
|
animation: slideInRight 0.3s ease-out forwards;
|
|
}
|
|
|
|
.animate-pulse-slow {
|
|
animation: pulse-slow 2s ease-in-out infinite;
|
|
}
|
|
|
|
.animate-bounce-slight {
|
|
animation: bounce-slight 1s ease-in-out infinite;
|
|
}
|
|
|
|
/* Stagger Animation Delays */
|
|
.stagger-1 { animation-delay: 0.05s; }
|
|
.stagger-2 { animation-delay: 0.1s; }
|
|
.stagger-3 { animation-delay: 0.15s; }
|
|
.stagger-4 { animation-delay: 0.2s; }
|
|
.stagger-5 { animation-delay: 0.25s; }
|
|
.stagger-6 { animation-delay: 0.3s; }
|
|
.stagger-7 { animation-delay: 0.35s; }
|
|
.stagger-8 { animation-delay: 0.4s; }
|
|
|
|
/* Reduced Motion */
|
|
@media (prefers-reduced-motion: reduce) {
|
|
*,
|
|
*::before,
|
|
*::after {
|
|
animation-duration: 0.01ms !important;
|
|
animation-iteration-count: 1 !important;
|
|
transition-duration: 0.01ms !important;
|
|
}
|
|
}
|