Skip to content

v0.4.0 release#62

Merged
kryptodrex merged 120 commits intodevelopfrom
v.0.4.0
Mar 22, 2026
Merged

v0.4.0 release#62
kryptodrex merged 120 commits intodevelopfrom
v.0.4.0

Conversation

@kryptodrex
Copy link
Copy Markdown
Owner

This pull request introduces several new features, improvements, and documentation updates focused on user experience, configuration, and workflow enhancements. Major highlights include expanded theme and accessibility controls, undo/redo and audit history, improved cross-mode value handling, and a more robust feedback system. The documentation and release notes have been updated to reflect these changes, and new environment variables and workflow steps have been added to support the feedback form integration.

Feature Additions and Enhancements:

  • Added new theme preset options, manual dark-mode overrides, high-contrast mode, and visual refresh with Lucide iconography and an expanded account icon picker. [1] [2] [3]
  • Introduced undo/redo support, audit history overlay, and plan-wide search, with corresponding keyboard shortcuts and workflow documentation. [1] [2] [3]
  • Implemented automated reallocation for spending categories with safe-source rules and clear change summaries. [1] [2]
  • Expanded view mode flexibility with more cadence options, paycheck-cadence defaults, and improved selector guidance. [1] [2]
  • Enhanced tax modeling to allow configuration of tax lines as percentages or fixed dollar amounts. [1] [2]

Improvements to Value Handling and Persistence:

  • Improved gross-to-net clarity and cross-mode rounding/persistence, ensuring value stability after editing and saving. [1] [2]

Configuration and Workflow Updates:

  • Replaced the encryption key environment variable with detailed feedback form configuration in .env.example and updated GitHub Actions workflow to inject these variables during builds. [1] [2]
  • Added a new app_updates/PLAN_TEMPLATE.md for structured release planning and tracking.

Documentation and Release Notes:

  • Updated README.md to reflect new features, keyboard shortcuts, theme options, and improved macOS release guidance. [1] [2] [3] [4] [5] [6] [7] [8]
  • Revised RELEASE_NOTES.md to summarize new features, improvements, and bug fixes for the release.

Introduce a reusable AmountBreakdown UI (TSX + CSS + index) and export it from shared components. Replace the inline loan breakdown in LoansManager with the new component (items + formatAmount + className). Add deductionLineItems utility with getRetirementLabel, buildPreTaxLineItems and buildPostTaxLineItems to compute per-paycheck deduction/benefit line items, plus unit tests covering common cases and edge conditions. These changes centralize amount-breakdown rendering and standardize deduction line item calculations for Gross-to-Net displays.
Introduce a reusable CheckboxGroup control (TSX + CSS + index export) and wire it into new reallocation UIs. Add ReallocationReviewModal and ReallocationSummaryModal components and styles for reviewing/applying/undoing automated reallocation proposals. Integrate reallocation planner service usage into PayBreakdown: build plan, show review modal when balance goes negative, apply selected proposals (with snapshot for undo), display summary and toast feedback, and add related UI/UX pieces (amount breakdowns, notes, category fields). Update BillsManager to support discretionary flag and toggles/badges for bills and benefits. Export CheckboxGroup from shared index and include test and service stubs for the reallocation planner. Misc CSS cleanups and layout adjustments for PayBreakdown.
Improve the reallocation summary UX and remove per-category notes across the codebase.

Key changes:
- ReallocationSummaryModal: add onDone prop and a "Done" button; wire onClose to a new handler that shows contextual toasts and cleans up state.
- PayBreakdown: introduce reallocationSummaryMeta, toast type/key, lastUndoCount, and suppressNextNegativeBalancePromptRef to better track reallocation state and suppress negative-balance prompts while review/summary is active or after undo.
- Add handlers to dismiss/complete the reallocation summary, compute toast messages based on applied/undone counts and resolution state, and make undo behavior collapse the reallocation flow when all changes are reverted.
- Remove category notes everywhere: delete notes property from AccountAllocationCategory type, strip notes usage from PayBreakdown, normalizeAccounts, calculateAllocationPlan, UI inputs/displays, and CSS styles.
- Minor UI updates: remove the notes input/display stack and add a Toast key to force updates.

These updates centralize reallocation flow handling, provide clearer user feedback, and remove the notes feature to simplify category data.
Introduce a new TaxLinesEditor component and styles, and integrate it into TaxBreakdown and SetupWizard. Add a taxLines util with helpers for converting, validating, syncing, and calculating tax line amounts (supports percentage and fixed calculation modes). Update budget calculations, PDF export, file storage, and currency conversion to handle per-line amount, taxableIncome, and calculationType. Extend TaxLine type and update tests to cover fixed amounts, per-line taxable income, storage migration, and PDF labeling.
Remove complex employer-match aware calculation and streamline yearly-limit logic. Deleted calculateYearlyRetirementContribution and removed employer-match parameters from checkYearlyLimitExceeded; check now computes total as employeePerPaycheck * paychecksPerYear. Simplified filling of employeeAmount from a yearly limit by directly deriving employeePerPaycheck = yearlyLimit / paychecksPerYear, removed the iterative solver and employer-match branch, and consolidated setRetirementFormMessage(null). Updated call sites to match the simplified signature.
Replace the explicit payFrequencyLabel prop with a computed display mode label from getDisplayModeLabel. ReallocationReviewModal now imports getDisplayModeLabel, removes the payFrequencyLabel prop, and uses displayModeLabel.toLowerCase() in its descriptive strings. PayBreakdown constructs its before/after labels with getDisplayModeLabel(displayMode).toLowerCase() and no longer forwards payFrequencyLabel to the modal. This centralizes pay-period label generation and reduces prop drilling.
Introduce utils/allocationEditor.ts to normalize stored allocation precision and provide from/to conversion helpers between stored values and display-mode amounts. Wire these helpers into PayBreakdown to sanitize category.amount values and to convert input/display values using toAllocationDisplayAmount/fromAllocationDisplayAmount. Add rounding in payPeriod.convertFromDisplayMode to ensure stored values use the same high-precision rounding. Add tests for allocationEditor, update displayAmounts and payPeriod tests, and add a fileStorage test to verify allocation edit values survive save/load round trips. These changes prevent precision loss and keep user-entered display amounts stable across conversions and persistence.
Add support for quarterly and yearly frequencies and view modes across utilities and tests. Updated frequency occurrences (quarterly, yearly, annual/annually) and extended tests to cover these cases. Refactored payPeriod logic: introduced getPayFrequencyViewMode and getDisplayModeOccurrencesPerYear, rewrote convertToDisplayMode/convertFromDisplayMode to use occurrences, and expanded display labels/formatting. Added new viewModePreferences module (sanitizeFavoriteViewModes, buildViewModeSelectorOptions, SELECTABLE_VIEW_MODES) with tests to handle user-preferred display modes. Minor test updates for displayAmounts and payPeriod to validate new modes and conversions.
Extend view/frequency types to include 'quarterly', introduce SelectableViewMode, and wire view mode into settings. CoreFrequency and ViewMode now include 'quarterly'; PayFrequency was changed to equal CoreFrequency. Added displayMode to BudgetSettings and viewModeFavorites to AppSettings to allow storing selected/ favorite view modes.
Use getDisplayModeOccurrencesPerYear in budget calculations to centralize divisor logic for display modes. Add quarterly and yearly labels to PDF export pay period display strings. Sanitize stored viewModeFavorites when loading app settings (and add tests): ensure favorites are normalized and de-duplicated; update fileStorage to call sanitizeFavoriteViewModes and adjust tests accordingly.
Add support for user-selectable view-mode favorites and pay-cadence UI, persist display mode, and handle pay-frequency impacts on allocations.

Changes include:
- PlanDashboard: initialize and persist displayMode from settings or pay frequency, react to favorites change events, and use a dedicated handler for display mode updates.
- ViewModeSelector: drive options from sanitized favorites, listen for favorites changes, and render a small cadence badge for the current pay frequency; CSS/layout adjustments for inline rendering and badge styling.
- SettingsModal: new UI to configure "View Mode Favorites", sanitize/persist favorites, dispatch events when changed or restored, and add layout styles for the grid.
- PaySettingsModal: add extra pay frequencies (quarterly, yearly), track previous frequency to scale custom allocation amounts proportionally on frequency change, update leftover suggestions when frequency changes, and minor label/placeholder updates.
- Tab views (Bills, Loans, PayBreakdown, Savings, Tax): replace frequency hint approach with cadence badge by using getPayFrequencyViewMode and remove redundant hint rows.
- Various utility imports and small CSS tweaks.

These changes improve how view modes and pay cadence are presented and ensure allocation amounts and settings remain consistent when pay frequency changes.
Add CSS files for ReallocationReviewModal and ReallocationSummaryModal and import them into their components. Update ReallocationSummaryModal to compute an undo delta label (getUndoDeltaLabel), derive selection state per item, and render the adjusted delta with an is-undo class when selected so the UI shows rollbacks (styled in CSS). Also rename the alert paragraph class to reallocation-summary-note and perform a small refactor of the options mapping to include description and computed label.
Switch pay settings UI from "hours per pay period" to "hours per week" and convert to/from hours-per-paycheck based on pay frequency. Update validation and field error keys accordingly in PaySettingsModal, and display hours-per-week in PDF export. Remove rounding-to-cent in paycheck gross calculations (budgetCalculations and BudgetContext) so annual gross stays aligned with annual salary for uneven paycheck splits; add a test to assert annual gross alignment.
Remove legacy reallocation modal CSS and adjust PayBreakdown logic to use rounded leftover values for comparisons and UI state. Introduces roundedLeftoverPerPaycheck and roundedTargetLeftoverPerPaycheck, computes isBelowTarget and belowTargetGap to avoid false warnings from tiny fractional differences, and updates the warning classes/alert text to use these rounded values. Also stop auto-selecting all reallocation summary items (setSelectedReallocationSummaryIds([])) when opening the modal, and change the hourly pay display to show hours/week (calculated from hours per pay period and pay frequency). These changes fix rounding-related UI flicker and refine reallocation UX.
Introduce an application history engine and wire undo/redo into the UI and data layer. Added HistoryEngine and tests, plus vitest typings. BudgetContext now owns a HistoryEngine, exposes undo/redo/canUndo/canRedo, and centralizes state mutations via applyBudgetMutation to track history; history is cleared on load/new/close. PlanDashboard listens for menu events and global shortcuts, defers to native input undo/redo when typing, and registers undo/redo handlers from the main menu. Electron menu emits undo/redo events, keyboard shortcuts hook gains a shouldHandle guard, the Keyboard Shortcuts modal is updated, types and tsconfig adjusted, and related tests updated/added.
Introduce batching to the history engine so multiple mutations can be coalesced into a single undo step: beginBatch(), commitBatch(), and discardBatch() with push() suppressed during a batch. Add unit tests covering batch behavior and normal interactions. Wire a transient undo/redo UI in App.tsx (state, timeout cleanup, handleUndoRedoSuccess handler passed to PlanDashboard) and corresponding CSS (.undo-redo-indicator with animations) to show brief status messages. Also add an APP_CUSTOM_EVENTS.undoRedoStatus constant for eventing.
Introduce an object-level audit history UI: a PlanHistoryOverlay component, HistorySnapshotCard read-only card renderers, and CSS styles. Wire history viewing into PlanDashboard and multiple managers (Bills, Loans, Savings, Tax, PayBreakdown, PaySettings) via an AuditHistoryTarget callback, add a history button to SectionItemCard (with hideActions for snapshots), and a confirm dialog for deleting history entries. Add audit types and history/diff utilities with tests, and minor related updates (undo/redo callback, batch commit in SetupWizard). This enables viewing, filtering, and deleting audit timeline entries for plan entities.
Add restore/rewind functionality for audit history entries and improve history/loan diff handling.

- PlanDashboard: add handleRestoreHistoryEntries to apply snapshots (many entity types) with confirmation and create audit entries for restores; pass onRestoreEntries to PlanHistoryOverlay.
- PlanHistoryOverlay: compute views for entries, group allocation-item batches, show restore/rewind buttons (hide for current state), display summaries and refined diff rendering; import ALLOCATION_NOISE_FIELDS and getSummaryFields.
- HistorySnapshotCard: render loan payment breakdown using AmountBreakdown and parse payment lines from snapshots.
- historyDiff: add summarizePaymentBreakdownDiff helper, PaymentBreakdownDelta type, ALLOCATION_NOISE_FIELDS, and extend DiffResult/type to include 'restore'.
- types/audit: include 'restore' in AuditChangeType.
- tests: add unit tests for summarizePaymentBreakdownDiff.
- UI tweaks: CSS additions for history visuals, adjust SectionItemCard button ordering, and layout/size adjustments in PayBreakdown (styling and button sizes).

These changes enable restoring previous or deleted plan items from the audit timeline and improve display of loan payment breakdown diffs.
Add unit tests covering legacy plan migration in FileStorageService: initialize missing metadata.auditHistory, reset corrupted auditHistory, preserve existing entries, migrate old taxSettings to taxLines, and ensure optional arrays (benefits, retirement, savingsContributions) are initialized. Also add a new auditHistoryBenchmark.test.ts that benchmarks JSON file sizes and throughput for varied audit-history depths, prints human-readable size summaries, and includes sanity assertions to track realistic plan file size and snapshot serialization performance.
Update v0.4.0 undo/redo and audit plan document: most parent items (1–5, 8) marked Done, item 7 deferred with benchmark rationale, and item 6 commented out. Add concrete implementation notes (history stacks, shared mutation helper, non-tracked updates, undo/redo API, batching API in HistoryEngine, menu/shortcut wiring, audit schema and storage in plan metadata, viewer UX), test coverage and benchmarks, migration strategy for legacy plans, and final checklist updates including successful lint/typecheck/test/build results.
Replace emoji category/icon strings with Lucide icon components across the codebase. Added src/utils/iconNameToComponent.ts to map icon names to Lucide components and exported getIconComponent from accountDefaults. Updated accountDefaults to return icon names that map to Lucide components, switched SearchResult.categoryIcon type to LucideIcon, and replaced emoji literals with Lucide imports in search modules and tab management. Updated tests to expect/import Lucide icons accordingly. These changes standardize icon usage as component references for consistent rendering.
Refactors appearance and theming for the "spreadsheet-core" preset and introduces shared icon styling. Changes include:

- Update preset metadata description and preview colors for spreadsheet-core.
- Add CSS icon variables and utility classes (.ui-icon, .ui-icon-sm, .ui-icon-lg) plus --icon-* and --icon-stroke-width tokens to standardize icon appearance.
- Add --button-primary-text and expand many theme tokens (bg, text, border, surface/header tints, header gradients, etc.) for both light and dark spreadsheet-core presets to provide more granular styling.
- Change TabConfig.icon type from string to LucideIcon and import the type from 'lucide-react' so tabs can use typed icon components.

These changes centralize visual tokens, improve icon consistency, and enable component-level icon typing.
Replace inline emoji/ASCII UI bits with lucide-react SVG icons across the dashboard for better accessibility and consistency (header buttons, modals, toasts, alerts, view-mode, search, tabs, tab handle, etc.).

Add a new AccountIconPicker component (with CSS) and wire it into AccountsEditor, refactoring the accounts editor layout and inputs to support a visual icon picker and improved responsive styling. Update AccountsEditor logic to only auto-switch icons when appropriate.

Update many styles to use CSS variables (e.g. --text-inverse) instead of hardcoded white and tweak tab/label/icon layout, toast/alert visuals, and view-mode header alignment. Adjust PlanHistoryOverlay restore-button rendering to be adjacent to entries/batches and hide a disabled filter row. Minor test string update and various small UX/accessibility fixes (aria attributes, icons hidden from assistive tech).
Clean up PlanHistoryOverlay by removing an unused FormGroup import and removing unused setters for dateFrom/dateTo (silences unused variable warnings). Update tests: change the accessibility button content from an emoji to 'X' for more stable querying, and replace emoji account icons in planSearch.test with named identifiers ('CreditCard', 'PiggyBank') to match expected icon values. No functional changes intended.
Enable signed and notarized macOS builds in CI and the build pipeline. Adds a scripts/notarize.mjs post-sign hook and wires it into electron-builder via build.afterSign, enables entitlements in the mac build config, and updates the GitHub Actions workflow to run a mac-specific signed+notarized build step. Also adds a release-checks npm script and declares @electron/notarize as a devDependency. Updates README with required CI secrets and notes about notarization behavior when env vars are missing.
Copilot AI review requested due to automatic review settings March 22, 2026 22:31
@github-actions
Copy link
Copy Markdown

Version Update Detected

Version has been correctly bumped from 0.3.3 to 0.4.0

@kryptodrex kryptodrex linked an issue Mar 22, 2026 that may be closed by this pull request
@kryptodrex kryptodrex merged commit aaa671d into develop Mar 22, 2026
3 checks passed
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR bumps the app to v0.4.0 and ships a broad UX-focused release: expanded appearance/accessibility controls, undo/redo + history/search workflows, Lucide iconography, and supporting docs/workflows (including macOS notarization and feedback-form env wiring).

Changes:

  • Introduces shared UI primitives (Dropdown, CheckboxGroup, AmountBreakdown) and updates many screens to use Lucide icons + refreshed styling.
  • Adds/updates multiple workflows (view mode favorites/cadence cues, automated reallocation modals, tax line editing) and expands keyboard shortcut documentation/testing.
  • Updates build/release tooling (notarization hook, CI workflow env injection) and release documentation.

Reviewed changes

Copilot reviewed 135 out of 232 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
src/contexts/ThemeContext.test.tsx Adds ThemeProvider test coverage for persisted appearance/accessibility settings.
src/constants/events.ts Expands menu/custom event constants (undo/redo, search, zoom, appearance updates).
src/constants/appearancePresets.ts Adds appearance preset metadata/options and lookup map.
src/constants/accountPalette.ts Adds default account type color palette constants.
src/components/views/WelcomeScreen/WelcomeScreen.tsx Replaces emoji UI with Lucide icons; tweaks demo launch delay.
src/components/views/WelcomeScreen/WelcomeScreen.css Styles for Lucide-based icons and banner tweaks.
src/components/views/SetupWizard/SetupWizard.css Adds a title-with-icon layout style.
src/components/views/EncryptionSetup/EncryptionSetup.tsx Replaces emoji with Lucide icons; updates header/button content.
src/components/views/EncryptionSetup/EncryptionSetup.css Styles encryption setup header-with-icon layout.
src/components/tabViews/tabViews.shared.css Uses theme token for inverse text instead of hard-coded white.
src/components/tabViews/TaxBreakdown/TaxBreakdown.css Refines tax breakdown layout (grid columns, header row, alignment).
src/components/tabViews/SavingsManager/SavingsManager.css Prevents grid overflow via minmax columns.
src/components/tabViews/PayBreakdown/PayBreakdown.test.tsx Adds PayBreakdown validation & search-driven modal open tests.
src/components/tabViews/PayBreakdown/PayBreakdown.css Updates PayBreakdown styling and state cue behaviors.
src/components/tabViews/LoansManager/LoansManager.css Uses theme tokens for inverse/error colors; header layout tweaks.
src/components/tabViews/KeyMetrics/KeyMetrics.tsx Adds semantic badges, Lucide icons, and DOM ids for search/targeting.
src/components/tabViews/KeyMetrics/KeyMetrics.test.tsx Adds KeyMetrics tests for semantic badge rendering/behavior.
src/components/tabViews/BillsManager/BillsManager.css Scopes BillsManager styles and adds responsive header actions layout.
src/components/modals/ReallocationSummaryModal/ReallocationSummaryModal.tsx Adds summary modal for reallocation changes + undo actions.
src/components/modals/ReallocationSummaryModal/ReallocationSummaryModal.css Styles reallocation summary modal and checkbox list.
src/components/modals/ReallocationReviewModal/ReallocationReviewModal.tsx Adds review modal for selecting/applying reallocation proposals.
src/components/modals/ReallocationReviewModal/ReallocationReviewModal.css Styles reallocation review modal, summary cards, and list.
src/components/modals/PaySettingsModal/PaySettingsModal.css Adds visual highlight class for search-targeted fields.
src/components/modals/KeyboardShortcutsModal/KeyboardShortcutsModal.tsx Documents new undo/redo/search/zoom shortcuts and explanations.
src/components/modals/KeyboardShortcutsModal/KeyboardShortcutsModal.test.tsx Adds tests asserting zoom shortcuts/explanation text.
src/components/modals/GlossaryModal/GlossaryTerm.tsx Temporarily comments out glossary icon rendering.
src/components/modals/GlossaryModal/GlossaryTerm.css Refines hover/focus styles and adds glossary term icon styles.
src/components/modals/FeedbackModal/FeedbackModal.tsx Switches category select to shared Dropdown component.
src/components/modals/ExportModal/ExportModal.css Converts px font sizes to rem-based sizing.
src/components/modals/AccountsModal/AccountsModal.tsx Uses Dropdown component; tweaks modal header/info copy.
src/components/modals/AccountsModal/AccountsDeleteModal.css Uses theme color-mix for danger border.
src/components/modals/AboutModal/AboutModal.tsx Replaces emoji icons with Lucide icons.
src/components/modals/AboutModal/AboutModal.css Styles about feature icon box and sizes.
src/components/_shared/workflows/TaxLinesEditor/index.ts Exports new TaxLinesEditor workflow component.
src/components/_shared/workflows/TaxLinesEditor/TaxLinesEditor.tsx Adds tax line editor supporting rate vs fixed amount modes.
src/components/_shared/workflows/TaxLinesEditor/TaxLinesEditor.css Styles new TaxLinesEditor card/grid layout.
src/components/_shared/workflows/EncryptionConfigPanel/EncryptionConfigPanel.tsx Adds manage mode flows; replaces emoji with Lucide icons.
src/components/_shared/workflows/EncryptionConfigPanel/EncryptionConfigPanel.css Adds danger hover style, single-option layout, icon sizing.
src/components/_shared/workflows/AccountsEditor/AccountsEditor.tsx Adds AccountIconPicker + Dropdown; renders icon components.
src/components/_shared/workflows/AccountsEditor/AccountsEditor.css Refactors/isolates editor styles; adds picker field sizing.
src/components/_shared/payEditorShared.css Removes old shared tax line editor CSS (migrated to TaxLinesEditor).
src/components/_shared/layout/ViewModeSelector/ViewModeSelector.tsx Adds favorites-driven options, cadence marker, settings button.
src/components/_shared/layout/ViewModeSelector/ViewModeSelector.test.tsx Adds tests for cadence injection and settings callback.
src/components/_shared/layout/ViewModeSelector/ViewModeSelector.css Updates layout, adds cadence badge + settings button styling.
src/components/_shared/layout/SectionItemCard/SectionItemCard.tsx Adds history action support, elementId, and hideActions mode.
src/components/_shared/layout/SectionItemCard/SectionItemCard.css Positions history button (margin-right auto).
src/components/_shared/layout/PageHeader/PageHeader.test.tsx Adds basic tests for PageHeader semantics/structure.
src/components/_shared/layout/PageHeader/PageHeader.css Adds header drop shadow; comments out flex-wrap.
src/components/_shared/layout/Modal/Modal.tsx Replaces emoji close with Lucide X icon.
src/components/_shared/layout/Modal/Modal.test.tsx Adds comprehensive modal interaction tests.
src/components/_shared/layout/Banner/Banner.test.tsx Adds Banner component tests for structure/accessibility.
src/components/_shared/layout/Banner/Banner.css Uses inherited font family for banner value.
src/components/_shared/layout/AmountBreakdown/index.ts Exports new AmountBreakdown layout component.
src/components/_shared/layout/AmountBreakdown/AmountBreakdown.tsx Adds reusable breakdown list UI with sorting/negative styling.
src/components/_shared/layout/AmountBreakdown/AmountBreakdown.css Styles AmountBreakdown rows/amounts/borders.
src/components/_shared/index.ts Exposes new shared components (Dropdown, CheckboxGroup, etc.).
src/components/_shared/feedback/Toast/Toast.tsx Adds icons to toast variants.
src/components/_shared/feedback/Toast/Toast.test.tsx Adds tests for toast timing, types, and behavior.
src/components/_shared/feedback/Toast/Toast.css Adds icon layout; updates border token usage.
src/components/_shared/feedback/ProgressBar/ProgressBar.test.tsx Adds ProgressBar unit tests.
src/components/_shared/feedback/InfoBox/InfoBox.test.tsx Adds InfoBox unit tests.
src/components/_shared/feedback/InfoBox/InfoBox.css Uses accent text token for header color.
src/components/_shared/feedback/ErrorDialog/ErrorDialog.test.tsx Adds ErrorDialog unit tests.
src/components/_shared/feedback/ConfirmDialog/ConfirmDialog.tsx Adds context cue (destructive vs confirm) metadata row.
src/components/_shared/feedback/ConfirmDialog/ConfirmDialog.test.tsx Adds tests for ConfirmDialog rendering and context cues.
src/components/_shared/feedback/ConfirmDialog/ConfirmDialog.css Styles context cue pill and respects minimal state cues.
src/components/_shared/feedback/Alert/Alert.tsx Adds icon + severity label header; wraps content.
src/components/_shared/feedback/Alert/Alert.test.tsx Adds tests for alert variants and label/icon rendering.
src/components/_shared/feedback/Alert/Alert.css Styles alert header/content and minimal state cues mode.
src/components/_shared/controls/Toggle/Toggle.test.tsx Adds Toggle unit tests.
src/components/_shared/controls/Toggle/Toggle.css Converts toggle dimensions to rem units.
src/components/_shared/controls/RadioGroup/RadioGroup.test.tsx Adds RadioGroup unit tests.
src/components/_shared/controls/PillToggle/PillToggle.test.tsx Adds PillToggle unit tests.
src/components/_shared/controls/PillToggle/PillToggle.css Uses tokenized shadow; removes theme-specific override.
src/components/_shared/controls/PillBadge/PillBadge.test.tsx Adds PillBadge unit tests.
src/components/_shared/controls/PillBadge/PillBadge.css Aligns badge colors with alert/text tokens; dark override.
src/components/_shared/controls/FormattedNumberInput/FormattedNumberInput.test.tsx Adds FormattedNumberInput unit tests.
src/components/_shared/controls/FormGroup/FormGroup.test.tsx Adds FormGroup unit tests.
src/components/_shared/controls/Dropdown/index.ts Exports new shared Dropdown control.
src/components/_shared/controls/Dropdown/Dropdown.tsx Implements styled select wrapper with caret + ref forwarding.
src/components/_shared/controls/Dropdown/Dropdown.css Adds shared dropdown styling and focus/disabled states.
src/components/_shared/controls/DateInput/DateInput.tsx Migrates day/month selects to Dropdown component.
src/components/_shared/controls/DateInput/DateInput.css Adapts DateInput styling for Dropdown wrapper.
src/components/_shared/controls/CheckboxGroup/index.ts Exports new CheckboxGroup control.
src/components/_shared/controls/CheckboxGroup/CheckboxGroup.tsx Adds CheckboxGroup control for column/row option lists.
src/components/_shared/controls/CheckboxGroup/CheckboxGroup.css Styles checkbox options with selected/focus states.
src/components/_shared/controls/Button/Button.tsx Adds disabled/loading state class + data-ui-state marker.
src/components/_shared/controls/Button/Button.test.tsx Adds Button unit tests covering disabled/loading/successText.
src/components/_shared/controls/Button/Button.css Tokenizes shadows/colors; adds enhanced disabled styling.
src/components/_shared/controls/AccountIconPicker/AccountIconPicker.tsx Adds portal-based icon grid picker with positioning logic.
src/components/_shared/controls/AccountIconPicker/AccountIconPicker.css Styles trigger/popover grid and responsive sizing.
src/components/PlanDashboard/PlanTabs/TabPositionHandle.tsx Replaces grip text with Lucide icons; updates drag image styling.
src/components/PlanDashboard/PlanTabs/TabManagementModal.tsx Adds Lucide header icon and uses Lucide tab icons.
src/components/PlanDashboard/PlanTabs/TabManagementModal.css Tokenizes accent/danger border colors.
src/components/PlanDashboard/PlanTabs/PlanTabs.tsx Replaces emoji icons; adds sidebar display toggle icons.
src/components/PlanDashboard/PlanTabs/PlanTabs.css Updates sizing and inverse/accent tokens for tabs.
src/components/PlanDashboard/PlanSearchOverlay/index.ts Exposes PlanSearchOverlay and search result/action types.
src/components/PlanDashboard/PlanHistoryOverlay/index.ts Exports PlanHistoryOverlay entry point.
src/components/PlanDashboard/PlanHistoryOverlay/HistorySnapshotCard.tsx Adds read-only snapshot card rendering for audit history.
src/components/PlanDashboard/PlanDashboard.css Updates header styling, layout grouping, and view mode header layout.
src/README.md Documents cross-mode storage strategy and release automation requirements.
src/App.tsx Initializes search modules; adds zoom + undo/redo status indicators.
src/App.css Tokenizes base colors; adds zoom/undo indicator styling.
scripts/notarize.mjs Adds macOS notarization step via @electron/notarize.
package.json Bumps version to 0.4.0; adds notarization hook and new deps/scripts.
app_updates/v0.4.0-list.md Adds v0.4.0 work plan checklist.
app_updates/PLAN_TEMPLATE.md Adds reusable planning template for future releases.
app_updates/Implementations.md Documents cross-mode rounding/persistence strategy details.
RELEASE_NOTES.md Updates release notes with v0.4.0 features/improvements/bug fixes.
README.md Updates user-facing README for new features/shortcuts/themes/release notes.
.github/workflows/beta-release.yml Adds signed/notarized mac build and injects feedback form env vars.
.env.example Replaces encryption key example with feedback-form config placeholders.

Comment on lines +39 to +49
{items
.sort((a, b) => sortOrder === 'asc' ? a.amount - b.amount : b.amount - a.amount)
.map((item) => (
<div key={item.id} className={`breakdown-item ${rowLineLocation}`}>
<span className="breakdown-label">{item.label}</span>
<span className={`breakdown-amount ${negative ? 'breakdown-amount-negative' : ''}`}>
{negative && <span className="amount-prefix">-</span>}
{formatAmount(item.amount)}
</span>
</div>
))}
Copy link

Copilot AI Mar 22, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Calling .sort() directly on items mutates the prop array in-place. This can cause subtle UI bugs if the caller reuses items elsewhere (or relies on stable ordering across renders). Copy before sorting (e.g., sort a shallow clone) to keep the component side-effect free.

Copilot uses AI. Check for mistakes.
Comment on lines +82 to 94
{optionsWithCadence.map((option) => (
<button
key={option.value}
className={mode === option.value ? 'active' : ''}
onClick={() => onChange(option.value)}
disabled={disabled}
>
{option.label}
<span>{option.label}</span>
{payCadenceMode === option.value && (
<span className="view-mode-selector-cadence">{payCadenceLabel}</span>
)}
</button>
))}
Copy link

Copilot AI Mar 22, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The cadence hint is rendered inside the button without a separating space, which collapses the accessible name into a single token (e.g., "WeeklyYour Pay Frequency"). Consider adding an explicit whitespace text node between the spans, or mark the cadence hint aria-hidden=\"true\" and incorporate the cue into the button’s aria-label (with proper spacing) so screen readers announce it cleanly.

Copilot uses AI. Check for mistakes.
Comment on lines +313 to +326
{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>
)}
Copy link

Copilot AI Mar 22, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The undo/redo indicator is rendered with className=\"zoom-indicator\", but src/App.css introduces a dedicated .undo-redo-indicator style (including animations). As-is, the new undo/redo styling will never apply. Either render this div with className=\"undo-redo-indicator\" (and keep zoom separate), or remove the unused .undo-redo-indicator rules.

Copilot uses AI. Check for mistakes.
Comment on lines +53 to +78
- name: Build Electron app for macOS (signed + notarized)
if: matrix.os == 'macos-latest'
run: npm run build:${{ matrix.target }}
env:
CSC_IDENTITY_AUTO_DISCOVERY: true
CSC_LINK: ${{ secrets.CSC_LINK }}
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
FEEDBACK_FORM_URL: ${{ vars.FEEDBACK_FORM_URL }}
FEEDBACK_FORM_ENTRY_EMAIL: ${{ vars.FEEDBACK_FORM_ENTRY_EMAIL }}
FEEDBACK_FORM_ENTRY_CATEGORY: ${{ vars.FEEDBACK_FORM_ENTRY_CATEGORY }}
FEEDBACK_FORM_ENTRY_SUBJECT: ${{ vars.FEEDBACK_FORM_ENTRY_SUBJECT }}
FEEDBACK_FORM_ENTRY_DETAILS: ${{ vars.FEEDBACK_FORM_ENTRY_DETAILS }}

- name: Build Electron app for ${{ matrix.target }}
if: matrix.os != 'macos-latest'
run: npm run build:${{ matrix.target }}
env:
CSC_IDENTITY_AUTO_DISCOVERY: false
FEEDBACK_FORM_URL: ${{ secrets.FEEDBACK_FORM_URL }}
FEEDBACK_FORM_ENTRY_EMAIL: ${{ secrets.FEEDBACK_FORM_ENTRY_EMAIL }}
FEEDBACK_FORM_ENTRY_CATEGORY: ${{ secrets.FEEDBACK_FORM_ENTRY_CATEGORY }}
FEEDBACK_FORM_ENTRY_SUBJECT: ${{ secrets.FEEDBACK_FORM_ENTRY_SUBJECT }}
FEEDBACK_FORM_ENTRY_DETAILS: ${{ secrets.FEEDBACK_FORM_ENTRY_DETAILS }}
Copy link

Copilot AI Mar 22, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Feedback form env injection uses vars.* on macOS but secrets.* on non-macOS. This is an operational footgun: depending on how the repo is configured, builds may silently lose feedback configuration on either platform. Prefer a single source of truth (all vars or all secrets) across matrix targets, or explicitly document the platform split and ensure both are always set.

Copilot uses AI. Check for mistakes.
Comment on lines +26 to +28
const contextMeta = confirmVariant === 'danger'
? { icon: '!', label: 'Destructive action' }
: { icon: 'i', label: 'Confirmation required' };
Copy link

Copilot AI Mar 22, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using aria-label on the <p> overrides its text content for assistive tech, which is redundant here and can lead to unexpected announcements (and it hides the actual on-screen text from the accessibility tree). Prefer removing aria-label and letting the visible label be announced naturally; keep only the icon aria-hidden as you already do.

Copilot uses AI. Check for mistakes.
</>
}
>
<p className="confirm-dialog-context" aria-label={contextMeta.label}>
Copy link

Copilot AI Mar 22, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using aria-label on the <p> overrides its text content for assistive tech, which is redundant here and can lead to unexpected announcements (and it hides the actual on-screen text from the accessibility tree). Prefer removing aria-label and letting the visible label be announced naturally; keep only the icon aria-hidden as you already do.

Suggested change
<p className="confirm-dialog-context" aria-label={contextMeta.label}>
<p className="confirm-dialog-context">

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

v0.4.0 Items

3 participants