Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
82 commits
Select commit Hold shift + click to select a range
c212493
Delete v0.4.1-fixes.md
kryptodrex Mar 24, 2026
009761c
Create v0.4.2-fixes.md
kryptodrex Mar 24, 2026
84b5b2f
update version
kryptodrex Mar 24, 2026
3aec2d4
Added more demo variety; fixed amounts going negative
kryptodrex Mar 24, 2026
682d311
Refactor view mode selector UI, raise favorites cap
kryptodrex Mar 24, 2026
e8aa274
Fix add loan button being off center when no items added yet
kryptodrex Mar 24, 2026
d96e19b
minor updates
kryptodrex Mar 24, 2026
f2cfd62
Tweak header styles and guard viewMode favorites
kryptodrex Mar 24, 2026
459113b
Update SavingsManager.tsx
kryptodrex Mar 24, 2026
368b29f
Update index.css
kryptodrex Mar 24, 2026
5d0f09d
adjust currency display
kryptodrex Mar 24, 2026
f224c8b
minor styling tweaks
kryptodrex Mar 24, 2026
65a7a71
Update RELEASE_NOTES.md
kryptodrex Mar 24, 2026
61caace
Update version
kryptodrex Mar 24, 2026
3719e31
Delete v0.4.2-fixes.md
kryptodrex Mar 24, 2026
6c499ed
Create v0.5.0-list.md
kryptodrex Mar 24, 2026
660b488
Added copy plan event and menu action
kryptodrex Mar 24, 2026
941b045
Refactor favorites sync; drop supplemental mode
kryptodrex Mar 24, 2026
0afe1cb
Update planSearch.ts
kryptodrex Mar 24, 2026
1bc3494
rename pay settings to Pay Details
kryptodrex Mar 24, 2026
ceb3418
moved pay details button out of pay breakdown view
kryptodrex Mar 24, 2026
ef8547e
Update PaySettingsModal.css
kryptodrex Mar 24, 2026
9db6fb6
updated z-index to place audit history over anything else
kryptodrex Mar 24, 2026
fdbdc97
Update PaySettingsModal.tsx
kryptodrex Mar 24, 2026
3993905
Use 'Pay Frequency' label; add button padding
kryptodrex Mar 24, 2026
9404bc1
Add Pay Settings modal; init cadence favorites
kryptodrex Mar 24, 2026
e34c2d1
Update package.json
kryptodrex Mar 24, 2026
6476416
Update RELEASE_NOTES.md
kryptodrex Mar 24, 2026
56f2dfb
Update v0.5.0-list.md
kryptodrex Mar 24, 2026
5ceaacd
Delete v0.5.0-list.md
kryptodrex Mar 25, 2026
c224e98
Create v0.4.2-list.md
kryptodrex Mar 25, 2026
a991fd8
change version
kryptodrex Mar 25, 2026
5fafcde
Update viewModePreferences.ts
kryptodrex Mar 25, 2026
89e7a8f
Added icon support for modal header
kryptodrex Mar 25, 2026
2a6339d
Update ViewModeSelector.css
kryptodrex Mar 25, 2026
f44c405
Added cog icon for settings modal header
kryptodrex Mar 25, 2026
1151bb3
Add Settings button to dashboard header
kryptodrex Mar 25, 2026
5cfae2d
Update LoansManager.tsx
kryptodrex Mar 25, 2026
5e1bb2f
Remove view mode settings modal and simplify selector
kryptodrex Mar 25, 2026
9faf49b
Remove view favorite sync on pay frequency change
kryptodrex Mar 25, 2026
24c6d71
Added header icons to modals
kryptodrex Mar 25, 2026
125d3dd
Add CompactViewModeSelector component
kryptodrex Mar 25, 2026
b651e8a
Update AboutModal.tsx
kryptodrex Mar 25, 2026
e7dbbb8
commented out checkbox
kryptodrex Mar 25, 2026
3fbda19
Update index.ts
kryptodrex Mar 25, 2026
e313c65
adjusted theme preset grid
kryptodrex Mar 25, 2026
c5d5aed
Update appearancePresets.ts
kryptodrex Mar 25, 2026
8fca62c
added meta constants
kryptodrex Mar 25, 2026
e50d6af
removed screenshot attachment
kryptodrex Mar 25, 2026
c5f8ec5
fixes for loading envs
kryptodrex Mar 25, 2026
d03a354
Refactor CompactViewModeSelector UI and behavior
kryptodrex Mar 25, 2026
6653588
Update PaySettingsModal.tsx
kryptodrex Mar 25, 2026
a248ba4
Replace view mode selector and simplify logic
kryptodrex Mar 25, 2026
47de8bf
Update CompactViewModeSelector.css
kryptodrex Mar 25, 2026
76f5c8b
Update searchRegistry.ts
kryptodrex Mar 25, 2026
f6b2509
Update RELEASE_NOTES.md
kryptodrex Mar 25, 2026
3e484c0
Update index.html
kryptodrex Mar 25, 2026
a53d969
wording changes
kryptodrex Mar 25, 2026
16783fe
Add TransientStatusIndicator component
kryptodrex Mar 25, 2026
a6683f3
Handle save-before-close and UI tweaks
kryptodrex Mar 25, 2026
6658efa
Update PaySettingsModal.tsx
kryptodrex Mar 25, 2026
f034ef4
minor styling tweaks
kryptodrex Mar 25, 2026
34faa1c
Update RELEASE_NOTES.md
kryptodrex Mar 25, 2026
d6ccfd2
Update RELEASE_NOTES.md
kryptodrex Mar 25, 2026
6f46280
adjusted size and stroke width
kryptodrex Mar 25, 2026
bc07bda
Added new view mode button component
kryptodrex Mar 26, 2026
78bfb2a
Add view-mode preview and header control
kryptodrex Mar 26, 2026
def7072
Update v0.4.2-list.md
kryptodrex Mar 26, 2026
0f2ce1c
Added new dropdown button
kryptodrex Mar 26, 2026
982275f
reworded discretionary expense definition
kryptodrex Mar 26, 2026
6a4fba2
Rebranded Key Metrics to yearly metrics
kryptodrex Mar 26, 2026
9a0546f
added the new dropdown action button
kryptodrex Mar 26, 2026
d97ae3b
added pay details button back to header
kryptodrex Mar 26, 2026
56b55d4
Update PlanDashboard.tsx
kryptodrex Mar 26, 2026
164187d
minor styling tweak
kryptodrex Mar 26, 2026
e50810d
minor styling fix
kryptodrex Mar 26, 2026
49a77a9
Update RELEASE_NOTES.md
kryptodrex Mar 26, 2026
47a4c35
few minor fixes before release
kryptodrex Mar 26, 2026
2da2f3d
Delete v0.4.2-list.md
kryptodrex Mar 26, 2026
2276a1a
Update RELEASE_NOTES.md
kryptodrex Mar 26, 2026
92a0cea
fix workflow triggers
kryptodrex Mar 26, 2026
cee396b
Merge pull request #91 from kryptodrex/v0.4.2
kryptodrex Mar 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name: Build
on:
pull_request:
branches:
- main
- develop
types:
- opened
- synchronize
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name: Test
on:
pull_request:
branches:
- main
- develop
types:
- opened
- synchronize
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/validate-version.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name: Validate Version File
on:
pull_request:
branches:
- main
- develop
types: [opened, synchronize, reopened]
paths-ignore:
- '.github/workflows/**'
Expand Down
25 changes: 11 additions & 14 deletions RELEASE_NOTES.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,18 @@

### Improvements

- Added the tab icon next to each view title so the active workspace has clearer visual context.
- Simplified retirement setup by removing employer match handling from retirement elections to reduce complexity, as it's not an amount taken out of your paycheck generally
- Improved Key Metrics view accuracy
- Remaining-for-spending totals now match between Key Metrics and Pay Breakdown in yearly mode.
- The Bills metric was reworked as Recurring Expenses and now reflects the total of custom allocations, bills, deductions, and loan payments.
- Improved account deletion behavior so linked items are handled more intelligently across all supported item types.
- Reduced icon width to look cleaner, and replaced a few icons to make more sense in context
- Reduced built application size by around 100MB
- Plans now save automatically when closed, but can still be saved via shortcut or menubar task
- Note: If it's a new plan or demo plan that hasn't been saved yet it will still prompt to save
- Reworked the view mode selector to take up less space, and no longer have an unnecessary favorites modal associated with it
- Added a Pay Details button to Key Metrics screen as well
- Increase icon line width for visibility
- Reorganized the plan header to make it less cluttered
- Header actions now switch between full buttons on wider windows and compact dropdowns on smaller screens


### Bug Fixes

- Fixed deduction amount rounding/display inconsistencies (for example 9.30 no longer drifting to 9.31).
- Fixed edit-form amount formatting so trailing zeros are preserved more consistently when editing existing bill and deduction values.
- Added tighter decimal precision handling in amount entry fields to match what the UI can reliably display.
- Fixed history overlay behavior for legacy entries so edits no longer appear as misleading empty-to-value changes.
- Fixed a history overlay deletion bug where deleting an Initial tracked state row could delete the wrong item in stacked history.
- Fixed tax settings history to actually break out the line item changes done
- Fixed demo generation immediately causing pay breakdown to go into the negative if random Gross Income is on the lower end
- Fixed off-center "Add Loan Payment" button when no loan items were added yet
- Fixed new plan creation starting with only two view modes visible after exiting Setup Wizard
- Fixed focused header action borders clipping near the sticky tab header edge
28 changes: 0 additions & 28 deletions app_updates/v0.4.1-fixes.md

This file was deleted.

41 changes: 27 additions & 14 deletions electron/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -931,6 +931,16 @@ function createApplicationMenu() {
}
},
},
{
label: 'Copy Plan',
accelerator: isMac ? 'Cmd+Shift+C' : 'Ctrl+Shift+C',
click: () => {
const focusedWindow = BrowserWindow.getFocusedWindow();
if (focusedWindow) {
sendMenuEvent(focusedWindow, MENU_EVENTS.copyPlan);
}
},
},
{ type: 'separator' },
{
label: 'Close Window',
Expand Down Expand Up @@ -998,7 +1008,7 @@ function createApplicationMenu() {
},
},
{
label: 'Pay Options',
label: 'Pay Details',
accelerator: isMac ? 'Cmd+Shift+P' : 'Ctrl+Shift+P',
click: () => {
const focusedWindow = BrowserWindow.getFocusedWindow();
Expand Down Expand Up @@ -1202,7 +1212,7 @@ function createApplicationMenu() {
}

/**
* Handle closing a window with unsaved changes check
* Handle closing a window by attempting save-first behavior when unsaved changes exist.
*/
async function handleCloseWindow(window: BrowserWindow) {
try {
Expand All @@ -1211,23 +1221,21 @@ async function handleCloseWindow(window: BrowserWindow) {
);

if (hasUnsaved) {
const result = await dialog.showMessageBox(window, {
type: 'warning',
// Show "Do you want to save?" dialog for unsaved plans
const response = dialog.showMessageBoxSync(window, {
type: 'question',
buttons: ['Save', "Don't Save", 'Cancel'],
defaultId: 0,
cancelId: 2,
title: 'Unsaved Changes',
message: 'You have unsaved changes',
detail: 'Do you want to save your plan before closing this window?',
title: 'Save Plan?',
message: 'This plan has unsaved changes. Do you want to save before closing?',
});

if (result.response === 2) {
// Cancel
if (response === 2) {
// User clicked Cancel, don't close
return;
}

if (result.response === 0) {
// Save
} else if (response === 0) {
// User clicked Save, attempt to save
const saveSuccess = await window.webContents.executeJavaScript(
`(async () => {
if (typeof window.__requestSaveBeforeClose === 'function') {
Expand All @@ -1242,10 +1250,14 @@ async function handleCloseWindow(window: BrowserWindow) {
);

if (!saveSuccess) {
// Save failed or user canceled save dialog
dialog.showErrorBox(
'Save Failed',
'Could not save this plan. Please use File > Save (or Cmd/Ctrl+S) and try again.'
);
return;
}
}
// If response === 1, user clicked "Don't Save" - proceed to close without saving
}

// Always save window state (size and active tab) even if content wasn't saved
Expand Down Expand Up @@ -1273,6 +1285,7 @@ async function handleCloseWindow(window: BrowserWindow) {
console.error('Error checking unsaved changes:', error);
dialog.showErrorBox('Close Error', 'Unable to verify save state. The window was not closed to prevent data loss.');
}

}

// Save all window states before quitting
Expand Down
4 changes: 4 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; font-src 'self' data:; connect-src 'self' http://localhost:* ws://localhost:* https://* wss://*; object-src 'none'; base-uri 'self'"
/>
<title>Paycheck Planner</title>
<script>
(function () {
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "paycheck-planner",
"private": true,
"version": "0.4.1",
"version": "0.4.2",
"description": "Desktop paycheck planning and budget management application.",
"author": {
"name": "Paycheck Planner",
Expand Down
38 changes: 10 additions & 28 deletions src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import EncryptionSetup from './components/views/EncryptionSetup'
import WelcomeScreen from './components/views/WelcomeScreen'
import PlanDashboard from './components/PlanDashboard'
import SettingsModal from './components/modals/SettingsModal'
import { TransientStatusIndicator } from './components/_shared'
import './App.css'

const AboutModal = lazy(() => import('./components/modals/AboutModal'))
Expand Down Expand Up @@ -303,34 +304,15 @@ function App() {
onClose={() => setShowKeyboardShortcuts(false)}
/>
</Suspense>
{zoomIndicatorMessage && (
<div
className={`zoom-indicator ${zoomIndicatorAtLimit ? 'limit' : ''}`}
role="status"
aria-live="polite"
style={{
top: `${2.35 / currentZoomFactor}rem`,
right: `${1 / currentZoomFactor}rem`,
transform: `scale(${1 / currentZoomFactor})`,
}}
>
{zoomIndicatorMessage}
</div>
)}
{undoRedoMessage && (
<div
className="zoom-indicator"
role="status"
aria-live="polite"
style={{
top: `${2.35 / currentZoomFactor}rem`,
right: `${1 / currentZoomFactor}rem`,
transform: `scale(${1 / currentZoomFactor})`,
}}
>
{undoRedoMessage}
</div>
)}
<TransientStatusIndicator
message={zoomIndicatorMessage}
variant={zoomIndicatorAtLimit ? 'warning' : 'default'}
zoomFactor={currentZoomFactor}
/>
<TransientStatusIndicator
message={undoRedoMessage}
zoomFactor={currentZoomFactor}
/>
</>
)
}
Expand Down
20 changes: 7 additions & 13 deletions src/components/PlanDashboard/PlanDashboard.css
Original file line number Diff line number Diff line change
Expand Up @@ -145,10 +145,10 @@
align-items: center;
gap: 0.75rem;
flex-wrap: wrap;
flex: 1 1 auto;
min-width: 220px;
}


.plan-title-block {
display: flex;
flex-direction: column;
Expand Down Expand Up @@ -288,28 +288,26 @@

.header-actions {
display: flex;
gap: 2rem;
gap: 0.9rem;
flex-wrap: wrap;
align-items: center;
justify-content: flex-end;
flex: 0 1 auto;
}

.header-btn-group {
display: flex;
align-items: center;
gap: 0.5rem;
}

.view-mode-selector-wrap {
padding-bottom: 0;
max-width: 100%;
}

/* Header button styles - these are on the gradient background */
.header-btn-secondary {
background: var(--surface-header-tint);
color: var(--text-inverse);
border: 2px solid var(--border-header-soft);
box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--text-inverse) 8%, transparent);
height: fit-content;
}

.header-btn-secondary:hover:not(:disabled) {
Expand Down Expand Up @@ -415,17 +413,13 @@
.header-actions {
width: 100%;
justify-content: stretch;
gap: 0.65rem;
}

.header-btn-group {
order: 1;
width: 100%;
justify-content: stretch;
}

.view-mode-selector-wrap {
order: 2;
width: 100%;
justify-content: stretch;
}

.header-btn-group > button {
Expand Down
Loading
Loading