* Add new theme 'Theme from 1970' to customThemeCatalog
* Add release notes for 1970-inspired light theme
Added release notes for a new custom light theme inspired by 1970 colors.
* Replace theme screenshots with color palette preview
- Replace screenshot images in theme installer with 3x2 color palette grid
- Add colors array to catalog themes in customThemeCatalog.json
- Update CatalogTheme type to include optional colors property
- Remove getThemeScreenshotUrl function
- Extract ColorPalette component to separate file
- Update documentation to reflect color palette instead of screenshots
- Update tests to verify color palettes instead of images
- Extract actual theme colors from GitHub repositories
* Update ColorPalette component to use data-swatch attribute for color swatches in ThemeInstaller tests
* Update packages/desktop-client/src/data/customThemeCatalog.json
Co-authored-by: Michael Clark <5285928+MikesGlitch@users.noreply.github.com>
* Update color palettes for Simple Dark and Okabe Ito themes
Co-authored-by: matiss <matiss@mja.lv>
---------
Co-authored-by: Michael Clark <5285928+MikesGlitch@users.noreply.github.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
* Fix AuthSettings - hide if no server configured and show warning if offline
* Add release notes for auth settings fix
* Refactor AuthSettings component to always display OpenID label hint and remove offline condition check in tests
* Upgrade oxfmt/oxlint and migrate import sorting to oxfmt
Upgrade oxfmt from 0.22.0 to 0.26.0 and oxlint from 1.38.0 to 1.41.0.
Move import sorting configuration from oxlint (perfectionist/sort-imports)
to oxfmt's new experimentalSortImports feature, which provides native
import sorting support in the formatter.
* Add release notes for maintenance updates including oxlint and oxfmt upgrades
* Fix accessibility issues: use semantic HTML and correct tab indices
- Replace View with semantic h1 in ModalHeader
- Fix tabIndex from 1 to 0 in Menu component
- Remove disabled oxlint accessibility rules
- Update components to use proper semantic HTML elements
* Refactor button elements to semantic HTML in Autocomplete and CategoryAutocomplete components
- Replace button elements with div/View while maintaining role="button" for accessibility.
- Update styles and props accordingly to ensure consistent behavior.
- Adjust onClick types in Item and SecondaryItem components for better type safety.
* Add release notes for upcoming maintenance updates addressing various accessibility issues
* Refactor autocomplete components to improve text alignment and button semantics
- Added textAlign: 'left' style to AccountItem and PayeeItem for consistent text alignment.
- Removed type="button" from CategoryItem to streamline button semantics.
- Updated ItemContent to use the Button component instead of a button element, enhancing accessibility and consistency.
* Refactor budget and report components to improve text alignment
- Removed font: 'inherit' style from EnvelopeBudgetComponents and TrackingBudgetComponents for cleaner styling.
- Updated ActionableGridListItem and ReportCard components to replace font: 'inherit' with textAlign: 'left' for consistent text alignment.
* Update ActionableGridListItem to include font inheritance for improved styling consistency
* Refactor button elements to use the Button component for consistency and improved semantics
- Updated various components (EnvelopeBudgetComponents, IncomeCategoryMonth, CategoryMonth, ActionableGridListItem, ReportCard, DesktopLinkedNotes) to replace native button elements with the custom Button component.
- Adjusted styles and event handlers to align with the new Button implementation, ensuring consistent behavior and accessibility across the application.
* Update Button and ActionableGridListItem styles for consistency
- Set a fixed borderRadius of 4 for the Button component, ensuring uniformity across variants.
- Adjusted ActionableGridListItem to have a borderRadius of 0 for a cleaner design.
* Update CategoryAutocomplete to include button type attribute for improved semantics
* Update VRT screenshots
Auto-generated by VRT workflow
PR: #6679
* Update VRT screenshot for Payees search functionality
---------
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
* Initial plan
* Fix mobile Calendar fatal error by correcting height constraint
The Virtualizer component in TransactionList requires its parent to have a defined height. Changed the View wrapper from height: '100%' to flex: 1 to properly distribute space within the flex container, accounting for the chevron button.
Co-authored-by: MatissJanis <886567+MatissJanis@users.noreply.github.com>
* Add DisplayPayeeProvider to fix mobile Calendar error
The TransactionListItem component uses useDisplayPayee hook which requires DisplayPayeeProvider context. Wrapped TransactionListMobile with DisplayPayeeProvider to fix "useDisplayPayee must be used within a DisplayPayeeContextProvider" error on mobile.
Co-authored-by: MatissJanis <886567+MatissJanis@users.noreply.github.com>
* Change flex to height for View component
* Add release notes for PR #6698
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: MatissJanis <886567+MatissJanis@users.noreply.github.com>
Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
* Update customThemeCatalog.json
Add Simple Dark and Okabe Ito themes
* Add Simple Dark and Okabe Ito themes to theme catalog
* Update customThemeCatalog.json
* Fix flaky mobile payees VRT test by waiting for navbar animation to complete
Add wait timeout after dragNavbarDown() to ensure react-spring animation finishes before screenshots are taken.
* Add release notes for reducing payees e2e test flakiness
* Fix release note formatting: use sentence case and add period
Co-authored-by: matiss <matiss@mja.lv>
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
* Refactor theme catalog fetching to use custom hook
- Move catalog fetching logic from ThemeInstaller to useThemeCatalog hook
- Fetch catalog asynchronously from GitHub instead of direct import
- Update tests to mock useThemeCatalog hook for faster test execution
- Remove catalog validation and translation dependencies from hook
* Remove redundant visibility checks for 'Demo Theme' button in ThemeInstaller tests and add assertion to verify presence of images.
* Refactor ThemeInstaller component to improve error handling and loading state display
- Change conditional rendering for catalog error to use ternary operator for clarity
- Simplify loading state display logic within the theme catalog view
- Ensure consistent styling and structure for theme items in the catalog
* Initialize loading state in useThemeCatalog hook to true
* [autofix.ci] apply automated fixes
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* Apply import sorting with perfectionist/sort-named-imports rule
- Add perfectionist/sort-named-imports oxlint rule
- Sort named imports: value imports before type imports
- Update component-library and desktop-client files to match new rule
* Add release notes for linting updates on named imports
* Add custom themes feature with GitHub installation support
- Add ThemeInstaller component for installing themes from GitHub
- Implement custom theme validation and CSS parsing
- Add support for installed custom themes in preferences
- Add CustomThemeStyle component with CSS validation
- Update theme system to support custom overlay backgrounds
- Add comprehensive tests for theme installation and validation
- Add documentation and release notes for custom themes feature
* Update custom theme catalog: remove several themes and add 'Miami Beach' from a new repository.
* Enhance CSS validation in custom themes
- Refactor `validatePropertyValue` to implement an allowlist approach for CSS property values, rejecting complex constructs and functions except for rgb/rgba/hsl/hsla.
- Add comprehensive tests for various invalid CSS scenarios, including function calls and at-rules.
- Improve error messages for better clarity on validation failures.
- Ensure property name validation checks for format and allowed characters.
* Update custom theme catalog: rename theme from 'Miami Beach' to 'Shades of Coffee'.
* Remove 'forceReload' feature flag and related code from the application settings and feature flag definitions.
* Enhance ThemeInstaller component to support installed themes
- Add `installedTheme` prop to `ThemeInstaller` for managing custom themes.
- Implement logic to populate the text box with installed custom theme CSS when reopening.
- Update tests to verify behavior for installed themes with and without repositories.
- Improve CSS validation to allow additional CSS keywords and ensure proper structure.
* Update color palette with old color values
* Update color palette with new values
* Replace old color imports with old color definitions
* Update color exports to use consistent casing
Done in bulk in MS-Word
* Fix export statements for color constants
* Clean up palette.ts by removing old import comment
Removed commented-out import statement for old colors.
* Add oldColor hex color definitions to palette.ts
Copy hex color definitions from colors.ts into palette.ts.
* Delete packages/desktop-client/src/style/colors.ts
no longer needed
* Disable colors export due to file deletion
* [autofix.ci] apply automated fixes
* Remove restricted import comment from index.ts
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* Update inter-ui to latest npm package: ^4.1.1
* chore: migrate from inter-ui to @fontsource-variable/inter
- Replace inter-ui v3.19.3 with @fontsource-variable/inter v5.2.8
- Import variable font CSS directly via @import statements
- Update font-family declarations to use 'Inter Variable' to match Fontsource naming
- Simplifies path resolution and removes custom SCSS overrides
* Add release notes
* Enable Inter font features
Add ss04 to styles.tnum
Remove font feature settings and always apply in tnum style
Always enable alternate digits (ss01) and slashed zero (zero) font features
instead of making them user-configurable preferences.
* Add font feature settings to mobile financial amounts
Apply styles.tnum to mobile components displaying financial amounts
to enable OpenType features (tnum, ss01, ss04) for proper number styling:
- TransactionListItem: transaction amounts and running balance
- BudgetTable: header totals, ToBudget, and Saved amounts
- ExpenseGroupListItem: expense group totals
- BudgetCell, SpentCell, BalanceCell: category amounts
- IncomeGroup: income group amounts
- SchedulesListItem: schedule amounts
This ensures consistent digit rendering with serifs on "1" and open
digit forms across all mobile transaction, budget, and schedule views.
* Update VRT screenshots
Auto-generated by VRT workflow
PR: #6436
* Update VRT screenshots
Auto-generated by VRT workflow
PR: #6436
* revert VRT changes
* remove lint line
* Update VRT screenshots
Auto-generated by VRT workflow
PR: #6436
* Update VRT screenshots
Auto-generated by VRT workflow
PR: #6436
---------
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
* fix(privacy): hide currency symbols in redacted overlay
Add RedactedContent component that uses useLayoutEffect to walk the DOM
and replace non-alphanumeric characters (like currency symbols) with spaces.
This ensures characters not rendered by Redacted Script font are hidden,
regardless of how deeply nested they are in the component tree.
* refactor: simplify RedactedContent text node processing loop
* lint: patch some no-empty-function violations
* docs: update ESLint rules and remove unused loadOwner function in UserAccess component
* refactor: remove getRemoteFile function and associated method from budget file handlers
* chore: disable docstring checks in coderabbit configuration
* Update linting rules and replace @ts-ignore with @ts-expect-error
* Add release notes for PR #6636
* Fix TypeScript linting issue by adding @ts-ignore for electron types in server start message
* Change category to Maintenance and update linting rules
---------
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
* Fix transactions table payee schedule icon not showing if linked schedule has a different account configured
* [autofix.ci] apply automated fixes
* Move SchedulesProvider higher in component tree
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* fix: skip schedule prompt for transactions already linked to schedule
When editing a future-dated transaction on mobile that is already linked
to a schedule, the app was incorrectly showing the "convert to schedule"
prompt. This was confusing since the transaction was already associated
with a schedule.
This change adds a check for `unserializedTransaction.schedule` to skip
showing the schedule prompt if the transaction is already linked to a
schedule.
Fixes#6357
Signed-off-by: majiayu000 <1835304752@qq.com>
* fix: resolve build and lint issues in TransactionEdit.tsx
* docs: add release notes for PR #6569
* chore: remove duplicate release note file
Signed-off-by: majiayu000 <1835304752@qq.com>
* chore: rename release note file to match PR number
Signed-off-by: majiayu000 <1835304752@qq.com>
* fix: apply schedule prompt fix to desktop version
Signed-off-by: majiayu000 <1835304752@qq.com>
---------
Signed-off-by: majiayu000 <1835304752@qq.com>
* Add unfiltered median projection type to crossover report
Signed-off-by: Jonathon Jongsma <jonathon@quotidian.org>
* Add a new 'mean' projection type to crossover report
Some people may want to use the average monthly expenses rather than
median expenses.
Signed-off-by: Jonathon Jongsma <jonathon@quotidian.org>
* Remove 'linear trend' from crossover report
The linear projection type almost never provides any useful information
for projecting future expenses. For example, if my expenses have been
declining for the past several months, that doesn't mean that they will
continue to decline until they reach 0 in retirement. It's way too easy
to receive a nonsense projection with the linear projection type. Just
remove it.
Signed-off-by: Jonathon Jongsma <jonathon@quotidian.org>
* Add release notes for crossover point projections
Signed-off-by: Jonathon Jongsma <jonathon@quotidian.org>
* [autofix.ci] apply automated fixes
---------
Signed-off-by: Jonathon Jongsma <jonathon@quotidian.org>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* Added Global Synced Prefs
* [autofix.ci] apply automated fixes
* Add release notes for PR #6234
* typecheck
* lint fix
* Refactor global synced preferences to server preferences
- Removed global synced preferences implementation and related files.
- Introduced server preferences with a new slice and hooks for managing user settings.
- Updated components and hooks to utilize server preferences instead of global synced preferences.
- Adjusted Redux store and mock configurations to reflect the changes.
- Enhanced user settings consistency across devices with the new server preferences structure.
* Implement server preferences for feature flags and enhance admin permissions
- Updated the Experimental component to conditionally display based on user permissions and login method.
- Refactored feature flag handling to use 'flags.plugins' instead of 'plugins'.
- Introduced server-side checks to restrict access to server preferences for admin users only.
- Added comprehensive tests for server preferences management, ensuring proper handling of user roles and preferences.
* Enhance error handling in saveServerPrefs thunk
- Updated the saveServerPrefs async thunk to handle potential errors from the server response.
- Added a check for the presence of an error in the result and return it accordingly.
- Ensured that preferences are still dispatched to the store upon successful save.
* Feedback: strict "flags.plugins" typing
* Feedback: move state slice
* Feedback: localstorage pref
* Feedback: move serverPrefsSlide into prefsSlice
* Refactor: Remove duplicate import of PostError in app.ts
* Rename serverPrefs state slice property to server (#6596)
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
* Add matching light tints to color picker
* Update ColorPicker light colors
* Update light colors to color wheel
* Update P.10
* Update light theme tag colors
* Create 6396.md Add light tints to tag color picker.
* Update development.ts to match light.ts
Because the Code bunny wanted them to match.
* Update palette.ts
* Update development.ts
* Update light.ts
* Update ColorPicker.tsx
Moved light colors under original dark colors.
* [autofix.ci] apply automated fixes
* Update ColorPicker.tsx
Remove comment.
* Update colors.ts
* Update useTagCSS.ts
* [autofix.ci] apply automated fixes
* Update useTagCSS.ts
* Adjust color mix percentages and add !important to text
* [autofix.ci] apply automated fixes
* Refactor color mix logic in useTagCSS hook
* Change noteTagBackgroundHover color back to purple150
* Remove purple75 from palette
Remove unused purple75 color definition. No longer needed.
* Change noteTagBackgroundHover back to color to purple150
* [autofix.ci] apply automated fixes
* Modify color mixing logic in useTagCSS hook
updated the percentage for the color-mix function - light theme. Added text comment for later reference.
* [autofix.ci] apply automated fixes
* Add release notes for tag color picker enhancements
* [autofix.ci] apply automated fixes
* Add purple125 color to palette
* Update color value for purple tint in ColorPicker
* Change noteTagDefault color to purple125
* Change noteTagDefault color to purple125
* Fix syntax for purple125 color definition
* Update noteTagBackground color to purple125
* Update noteTagBackground color to purple125
* Delete upcoming-release-notes/6396.md
#6396 was closed in favor of #6448
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: youngcw <calebyoung94@gmail.com>
* fix: remove responsive prop from StackedBarGraph to prevent infinite loop
Fixes#6406
The 'responsive' prop on BarChart was conflicting with explicit width/height
props provided by AutoSizer, causing recharts' useElementOffset hook to
trigger an infinite re-render loop. This manifested as React Error #185
(Maximum update depth exceeded) when displaying stacked bar graphs with
many months of data.
Removing the redundant 'responsive' prop resolves the issue since explicit
dimensions are already provided by the Container component.
* docs: add release notes for #6406
* [autofix.ci] apply automated fixes
---------
Co-authored-by: Salva <spenamedina@Salvas-MacBook-Pro.local>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* fix: move saved filters to end of dropdown with separator
- Reorganized filter menu items to place 'saved filters' at the end
- Added separator before 'saved filters' to distinguish from regular filters
- Maintained alphabetical sorting for regular filter options
Fixes#6535
* docs: add release notes
* [autofix.ci] apply automated fixes
* fixing typos
* fix: use Menu.line for proper separator rendering
* refactor: remove duplication by extracting saved filter from array
* [autofix.ci] apply automated fixes
---------
Co-authored-by: Salva <spenamedina@Salvas-MacBook-Pro.local>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* Refactor keyboard shortcuts in KeyboardShortcutModal
Updated keyboard shortcuts for various actions in the KeyboardShortcutModal component. Changed shortcut names and IDs for better clarity and organization.
* Update keyboard shortcuts modal text from 'General' to 'Global'
* Update VRT screenshots
Auto-generated by VRT workflow
PR: #6573
* Add release notes for bugfix in KeybordShortcutModal
Update KeybordShortcutModal.tsx to set date for selected transactions and reorganize the list to match documentation.
---------
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
* fix(web): Close popover on second Escape press when autocomplete options are closed
* [autofix.ci] apply automated fixes
* fix(web): use more accurate approach with isOpen
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* Add target income adjustment factor to crossover report
Allow the user to specify an adjustment factor to apply to their target
retirement income. This allows them to be a little more conservative
or aggressive on their retirement goals rather than relying only on the
calculated expense projection.
For example, if you want to spend more in retirement (or are simply more
risk-averse), you could set the target income adjustment to 120%. Or if
you expect some retirement income from a defined-benefit pension and
don't need to rely only on the income sources in your budget, you could
set this to 80% to account for that external income.
Originally discussed at https://github.com/actualbudget/actual/issues/6134#issuecomment-3608247467
Co-authored-by: Claude <noreply@anthropic.com>
* [autofix.ci] apply automated fixes
* Add null check in crossover report
Review finding from PR
Signed-off-by: Jonathon Jongsma <jonathon@quotidian.org>
---------
Signed-off-by: Jonathon Jongsma <jonathon@quotidian.org>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>