Add feature batch 2, subscription/recurring sync, smooth charts, and app icon

- Implement subscriptions view with bidirectional recurring transaction sync
- Add cascade delete/pause/resume between subscriptions and recurring
- Fix foreign key constraints when deleting recurring transactions
- Add cross-view instant refresh via callback pattern
- Replace Bezier chart smoothing with Fritsch-Carlson monotone Hermite interpolation
- Smooth budget sparklines using shared monotone_subdivide function
- Add vertical spacing to budget rows
- Add app icon (receipt on GNOME blue) in all sizes for desktop, web, and AppImage
- Add calendar, credit cards, forecast, goals, insights, and wishlist views
- Add date picker, numpad, quick-add, category combo, and edit dialog components
- Add import/export for CSV, JSON, OFX, QIF formats
- Add NLP transaction parsing, OCR receipt scanning, expression evaluator
- Add notification support, Sankey chart, tray icon
- Add demo data seeder with full DB wipe
- Expand database schema with subscriptions, goals, credit cards, and more
This commit is contained in:
2026-03-03 21:18:37 +02:00
parent 773dae4684
commit 10a76e3003
10102 changed files with 108019 additions and 1335 deletions

View File

@@ -0,0 +1,69 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
html, body { background: transparent; width: 100%; height: 100%; }
body {
background-image:
linear-gradient(45deg, #ccc 25%, transparent 25%),
linear-gradient(-45deg, #ccc 25%, transparent 25%),
linear-gradient(45deg, transparent 75%, #ccc 75%),
linear-gradient(-45deg, transparent 75%, #ccc 75%);
background-size: 20px 20px;
background-position: 0 0, 0 10px, 10px -10px, -10px 0;
display: flex;
align-items: center;
justify-content: center;
min-height: 100vh;
}
.icon-wrapper {
padding: 50px;
filter: drop-shadow(0 8px 14px rgba(26, 95, 180, 0.45));
}
.icon-container {
width: 512px;
height: 512px;
display: flex;
align-items: center;
justify-content: center;
position: relative;
overflow: hidden;
/* GNOME-style rounded square - ~22% radius */
border-radius: 22%;
/* GNOME blue gradient - wider range for visible depth */
background: linear-gradient(180deg, #62a0ea 0%, #1a5fb4 55%, #144a8a 100%);
}
/* Sharp top highlight + bottom shadow edges */
.icon-container::before {
content: '';
position: absolute;
inset: 0;
border-radius: 22%;
border-top: 4px solid rgba(255,255,255,0.2);
border-bottom: 40px solid rgba(0,0,0,0.12);
border-left: none;
border-right: none;
pointer-events: none;
z-index: 2;
}
.icon {
font-size: 286px;
line-height: 1;
color: #ffffff;
position: relative;
z-index: 1;
filter: drop-shadow(0 4px 8px rgba(0,0,0,0.2));
}
</style>
</head>
<body>
<div class="icon-wrapper">
<div class="icon-container" id="icon-target">
<i class="icon fa-solid fa-receipt"></i>
</div>
</div>
</body>
</html>