Compare commits

..

23 Commits

Author SHA1 Message Date
Cursor Agent
8b79079276 [AI] Clean up feedback-related comments from code
Removed explanatory comments referencing user feedback:
- Removed feedback comments from customFunctions.ts
- Removed feedback comments from formula-action.test.ts
- Removed feedback comments from formula-action-integration.test.ts
- Removed feedback comment from FormulaResult.tsx

Code functionality remains unchanged, only comments were cleaned up.

Co-authored-by: lelemm <lelemm@users.noreply.github.com>
2026-05-11 02:59:43 +00:00
Cursor Agent
05876367ba [AI] Fix 'process is not defined' by separating client and server code
Root cause: customFunctions.ts was imported by client-side code but
had server dependencies, causing db module (and transitive dependencies
like adm-zip) to be bundled into browser.

Solution: Split into two files to properly separate concerns:
1. customFunctions.ts - Plugin only (no server imports, safe for browser)
2. customFunctionsPreferences.ts - Server-only preferences loading (uses aqlQuery)

Changes:
- Created customFunctionsPreferences.ts with loadUserPreferencesForFormulas()
- Uses aqlQuery (Actual's custom SQL) instead of direct db imports
- Moved helper functions (getLocaleDefaults, getCurrencyFromLocale) to new file
- customFunctions.ts now only has setCachedUserPreferences() setter
- action.ts loads prefs and caches them at module init
- Client code can still import CustomFunctionsPlugin safely

Co-authored-by: lelemm <lelemm@users.noreply.github.com>
2026-05-11 02:32:20 +00:00
Cursor Agent
579aba3a80 [AI] Fix 'process is not defined' by making db import dynamic in customFunctions
Root cause: customFunctions.ts is imported by client-side code, but had
a static import of '#server/db', causing entire server db module (and
transitive dependencies like adm-zip) to be bundled into browser.

Solution: Changed to dynamic import inside loadUserPreferencesForFormulas()
so server code is only imported when actually called (server-side only).

- Removed static 'import * as db from "#server/db"' from top of file
- Added dynamic 'const db = await import("#server/db")' inside function
- Removed HTML polyfill hack that was masking the root cause
- Browser clients can still use CustomFunctionsPlugin (falls back to locale defaults)

Co-authored-by: lelemm <lelemm@users.noreply.github.com>
2026-05-11 02:23:38 +00:00
autofix-ci[bot]
15bb88c3d9 [autofix.ci] apply automated fixes 2026-05-11 02:20:05 +00:00
Cursor Agent
f189afafb6 [AI] HACK: Add global process polyfill in HTML to fix 'process is not defined' error
- Removed ineffective optimizeDeps.exclude for adm-zip
- Added inline script in index.html that runs before any module loads
- Ensures process global is available before CommonJS wrappers execute
- Polyfill includes process.env.NODE_ENV and mocked process.emit()
- Fixes ReferenceError in inflater.js/adm-zip when theme chunks load

Co-authored-by: lelemm <lelemm@users.noreply.github.com>
2026-05-11 02:19:01 +00:00
lelemm
ccb25f646f Merge branch 'master' into cursor/formula-feedback-improvements-4223 2026-05-10 23:10:17 -03:00
Cursor Agent
804f043049 [AI] Exclude adm-zip from browser bundle to fix 'process is not defined' error
BUG: Browser console shows 'Uncaught ReferenceError: process is not defined'
at adm-zip.js when loading the app. This is caused by adm-zip (a Node.js-only
package) being incorrectly bundled into browser code.

FIX: Add adm-zip to optimizeDeps.exclude in Vite config to prevent it from
being bundled for browser environments.

Co-authored-by: lelemm <lelemm@users.noreply.github.com>
2026-05-11 02:05:47 +00:00
Matiss Janis Aboltins
82673ecd50 [AI] Use bash for /update-vrt merge step (#7783)
The Merge VRT Patches job runs inside the Playwright container where
the default GitHub Actions shell is `sh -e {0}`, not bash. The merge
step uses bash-only constructs (`shopt -s nullglob`, array literals,
`${#patches[@]}`, `"${patches[@]}"`), so every /update-vrt run that
reaches the merge stage now exits 127 with `shopt: not found` (e.g.
run 25609625260).

Pin this step to `shell: bash` to match the explicit `shell: bash` we
already use elsewhere in the workflow. The sibling shard-patch creation
steps stay on the default sh because they only use POSIX features.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 18:56:50 +00:00
Matiss Janis Aboltins
18c704b3ba [AI] Sync server: harden CORS proxy method validation (#7788)
* [AI] Sync server: harden CORS proxy method validation

The CORS proxy validated `method` against a fallback-normalized value but
forwarded the raw client-supplied value to fetch(), letting a non-string
input (e.g. ["POST"]) bypass the GET/HEAD allowlist via undici's String()
coercion. Reject non-string method, pass the validated normalized method
to fetch(), and drop the unreachable body-forwarding branch.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* [AI] Polish release notes wording

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Rename 7787.md to 7788.md

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 16:11:40 +00:00
Michael Clark
b05c207123 :electron: Publish to Microsoft store after release is published (#7757)
* move desktop app microsoft store publish to after the release is published

* release notes
2026-05-09 21:16:13 +00:00
Matiss Janis Aboltins
b9ab3e7bc6 [AI] Fix /update-vrt build step after lage browser-build refactor (#7781)
The build-web job in vrt-update-generate.yml invoked
`yarn workspace @actual-app/core build:browser`, but #7602 removed that
script when it routed the browser pipeline through
`lage build:browser --to=@actual-app/web` (orchestrated by
bin/package-browser). The recent /update-vrt parallelization (#7641)
preserved the now-stale per-workspace invocations, so every comment
trigger fails with "Couldn't find a script named build:browser".

Match the working e2e-test.yml build-web step exactly:
`yarn build:browser --skip-translations`. lage's `^build` edge handles
the upstream graph (crdt, plugins-service, loot-core) automatically, and
`--skip-translations` keeps the captured snapshots aligned with regular
VRT runs (which also strip Weblate locale chunks for determinism).

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 18:16:42 +00:00
Matiss Janis Aboltins
4f40defe9e [AI] Mobile: live value tracking (#7774)
* [AI] Update mobile budget value color live as user types

The mobile FocusableAmountInput's color was computed from the saved
`value` prop, so it stayed in the gray "zero" state until blur. Track
the in-progress edited value via the existing `onChangeValue` callback
and feed it to `makeAmountFullStyle` so the color reflects what the
user is currently typing.

* Add release notes for PR #7774

* Change category from Features to Bugfix

* [AI] Reapply sign when computing live amount color

liveValue holds the absolute value (the input field has no sign — the
+/- toggle controls it separately), so passing it directly to
makeAmountFullStyle picked positiveColor for amounts the user intends
as negative. Pass maybeApplyNegative(liveValue, isNegative) so the
color matches the signed value.

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-05-09 18:08:58 +00:00
Cursor Agent
dc349efef5 [AI] Fix category group filter support in formula card queries
BUG: When adding a Category Group filter to a Query Definition in formula
cards, nothing happened. Only category filters worked.

FIX: Updated extractCategoryConditions to include both 'category' and
'category_group' fields, and updated getCategoriesFromConditions to properly
expand category group conditions to their member categories using cat.group.

The fix follows the same pattern used in budget-analysis-spreadsheet.ts.

Co-authored-by: lelemm <lelemm@users.noreply.github.com>
2026-04-30 12:09:35 +00:00
github-actions[bot]
d3dee95b6b Add release notes for PR #7451 2026-04-30 03:59:38 +01:00
autofix-ci[bot]
fe0f903e75 [autofix.ci] apply automated fixes 2026-04-30 02:58:20 +00:00
Cursor Agent
0a26108f47 [AI] Fix type errors after rebase with master
Co-authored-by: lelemm <lelemm@users.noreply.github.com>
2026-04-30 02:57:21 +00:00
github-actions[bot]
65f5a11cca Update VRT screenshots
Auto-generated by VRT workflow

PR: #7451
2026-04-30 02:44:51 +00:00
Cursor Agent
837300c4be [AI] Make formatting functions respect app settings with locale-based fallbacks
User feedback: FORMATCURRENCY and FORMATNUMBER should use app currency and number
format settings instead of hardcoded defaults.

Implementation approach:
- Added async loadUserPreferencesForFormulas() function that queries preferences DB
- Caches preferences globally to avoid repeated DB queries
- Called on module initialization to load preferences once
- Custom functions access cached preferences synchronously (no reactor needed)

Settings hierarchy (priority order):
1. Explicit function parameters (if provided)
2. User's app settings (currency code, number format)
3. Locale-based defaults (inferred from user's language setting)

Locale-based defaults:
- en-GB → GBP (£) with comma-dot format
- de/fr/es/it/nl → EUR (€) with dot-comma format
- ja → JPY (¥) with comma-dot format
- en-IN/hi → INR (₹) with comma-dot format
- en-CA → CAD ($) with comma-dot format
- en-AU → AUD ($) with comma-dot format
- Default → USD ($) with comma-dot format

Number format patterns:
- comma-dot: 1,000.00 (US/UK/Canada)
- dot-comma: 1.000,00 (Europe)
- space-comma: 1 000,00 (France)
- apostrophe-dot: 1'000.00 (Switzerland)
- comma-dot-in: 1,00,000.00 (India)

Usage examples:
- FORMATCURRENCY(1234.56) → Uses app currency symbol and format
- FORMATNUMBER(1234.56) → Uses app number format
- FORMATCURRENCY(1234.56, "€") → Override with Euro symbol
- FORMATNUMBER(1234.56, 2, ".", ",") → Override with custom separators

Updated documentation to reflect that parameters are optional and use app settings.

All tests pass 

Co-authored-by: lelemm <lelemm@users.noreply.github.com>
2026-04-30 02:44:51 +00:00
lelemm
2bb86c4ffb Potential fix for pull request finding 'Unused variable, import, function or class'
Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
2026-04-30 02:44:51 +00:00
Cursor Agent
00ee079696 [AI] Add comprehensive integration tests for formula rules and formula cards
User requested integration tests with real database queries and complex nested formulas.
These tests go beyond unit testing HyperFormula to validate the full integration with
Actual's transaction rules and query system.

Formula Rule Integration Tests (36 tests):
- Basic formula operations with FORMATCURRENCY and nested IFs
- Text manipulation: CONCATENATE, UPPER, LEFT, RIGHT, TRIM, PROPER
- Math functions: ROUND, ABS, MAX, MIN, CEILING, SQRT, SUM, PRODUCT
- Date functions: YEAR, MONTH, DAY, DAYS, EOMONTH, WEEKDAY
- Logical functions: AND, OR, NOT, IFERROR, SWITCH
- New formatting functions: FORMATNUMBER, FORMATCURRENCY with various options
- Multi-line output with CHAR(10) for line breaks
- Information functions: ISNUMBER, ISTEXT, ISEVEN, ISODD, ISBLANK
- Error handling and validation
- Complex nested formulas combining multiple function types

Formula Card Integration Tests (14 tests):
- Single and multiple query integration
- Query results with FORMATCURRENCY and FORMATNUMBER
- Percentage calculations across queries
- Date-based query filtering
- Complex nested calculations with multiple queries
- Multi-line output with query results
- Error handling with empty queries and division by zero
- Running totals across accounts
- MAX/MIN operations with query results

Test Coverage:
- Every formula function type is tested in at least one integration test
- Tests use real database operations (insertAccount, insertPayee, insertCategory, etc.)
- Tests validate complex nested formulas with 3-4 levels of nesting
- Tests cover edge cases (empty results, division by zero, type mismatches)
- All 50 integration tests pass 

Note: Tests demonstrate proper usage patterns for users:
- Transaction amounts are in cents, divide by 100 for dollar display
- Rules must have conditions on 'imported_payee' or 'payee' to be indexed
- Query results are automatically converted from cents to dollars
- FORMATCURRENCY places negative sign before currency symbol (standard format)

Co-authored-by: lelemm <lelemm@users.noreply.github.com>
2026-04-30 02:44:51 +00:00
Cursor Agent
efae23fd70 [AI] Remove unusable formula functions that require cell ranges
User requested cleanup of formula functions that don't make sense in Actual's context.
Actual uses named expressions (like QUERY results and transaction fields) rather than
spreadsheet-style cell ranges.

Removed from queryModeFunctions.ts:
- AVERAGEA, COUNT, COUNTA, COUNTBLANK, COUNTIF, COUNTIFS (use QUERY_COUNT instead)
- MAXA, MINA (kept MAX and MIN which work with individual values)
- SUMIF, SUMIFS, SUMPRODUCT, SUMSQ (use QUERY with filters instead)
- Statistical functions: MEDIAN, MODE, STDEV, STDEVP, VAR, VARP, PERCENTILE, QUARTILE, RANK
  (these require arrays of data which don't exist in our context)
- Lookup functions: VLOOKUP, HLOOKUP, INDEX, MATCH, LOOKUP
  (these require table arrays and cell references)
- ISREF (checks for cell references which don't exist)

Kept useful functions:
- CHOOSE (works with index and individual values)
- All math functions that work with individual numbers (SUM, AVERAGE, MAX, MIN, etc.)
- All text functions (CONCATENATE, UPPER, LEFT, etc.)
- All date functions (TODAY, YEAR, MONTH, etc.)
- All logical functions (IF, AND, OR, etc.)
- Query-specific functions (QUERY, QUERY_COUNT, BUDGET_QUERY, etc.)

Updated syntax highlighting in codeMirror-excelLanguage.tsx to match.

This cleanup makes the autocomplete suggestions more relevant and less confusing
for users working with Actual's formula system.

Co-authored-by: lelemm <lelemm@users.noreply.github.com>
2026-04-30 02:44:51 +00:00
Cursor Agent
4b56f31590 [AI] Add support for line breaks in formula card results
Feedback from GitHub issue #5949:
- User @Juulz reported that line breaks don't work in formula cards
- Requested ability to use CHAR(10) or CHAR(13) in CONCATENATE for multi-line displays
- Example: Displaying multiple totals on separate lines instead of one long line

Changes:
1. Added whiteSpace: 'pre-wrap' to FormulaResult span to preserve line breaks
2. Added textAlign: 'center' to keep multi-line text centered
3. Added wordBreak: 'break-word' to handle long words gracefully
4. Updated font size calculation to account for multi-line text:
   - Splits display value by line breaks
   - Calculates based on longest line length
   - Divides available height by number of lines to fit all lines

Usage:
Users can now use CHAR(10) in formulas to create line breaks:
=CONCATENATE("Total 1: ", value1, CHAR(10), "Total 2: ", value2, CHAR(10), "Total 3: ", value3)

This will display:
Total 1: 100
Total 2: 200
Total 3: 300

Instead of all on one line.

Co-authored-by: lelemm <lelemm@users.noreply.github.com>
2026-04-30 02:44:51 +00:00
Cursor Agent
517ac78f84 [AI] Add FORMATNUMBER and FORMATCURRENCY functions to address TEXT() formatting limitations
Feedback from GitHub issue #5949:
- Users reported TEXT(value, "$#,##0.00") doesn't properly format numbers with thousands separators
- Users requested proper currency formatting for formula cards
- Tooltip examples had inconsistent quote usage (backticks vs no backticks)

Changes:
1. Added FORMATNUMBER() function for number formatting with thousands separators
   - Supports custom decimal places, thousands separator, and decimal separator
   - Example: FORMATNUMBER(1234567.89, 2) returns "1,234,567.89"

2. Added FORMATCURRENCY() function for currency formatting
   - Supports custom currency symbol, decimals, and separators
   - Handles negative values correctly
   - Example: FORMATCURRENCY(1234567.89, "$") returns "$1,234,567.89"

3. Fixed tooltip quote inconsistency
   - Removed backticks from formula examples in tooltips for consistency
   - All examples now use plain text without backticks

4. Updated function documentation in both queryModeFunctions.ts and transactionModeFunctions.ts

5. Added comprehensive tests for new formatting functions

Note: BALANCEONDAY() and LASTSYNCEDBALANCE() functions were not implemented as they
would require database access not available in the formula execution context. These
would be better suited as future enhancements with proper architecture support.

Co-authored-by: lelemm <lelemm@users.noreply.github.com>
2026-04-30 02:44:51 +00:00
386 changed files with 2723 additions and 339 deletions

View File

@@ -117,49 +117,7 @@ jobs:
!packages/desktop-electron/dist/Actual-windows.exe
packages/desktop-electron/dist/*.AppImage
packages/desktop-electron/dist/*.flatpak
packages/desktop-electron/dist/*.appx
outputs:
version: ${{ steps.process_version.outputs.version }}
publish-microsoft-store:
needs: build
runs-on: windows-latest
environment: release
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') }}
steps:
- name: Install StoreBroker
shell: powershell
run: |
Install-Module -Name StoreBroker -AcceptLicense -Force -Scope CurrentUser -Verbose
- name: Download Microsoft Store artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: actual-electron-windows-latest-appx
- name: Submit to Microsoft Store
shell: powershell
run: |
# Disable telemetry
$global:SBDisableTelemetry = $true
# Authenticate against the store
$pass = ConvertTo-SecureString -String '${{ secrets.MICROSOFT_STORE_CLIENT_SECRET }}' -AsPlainText -Force
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ${{ secrets.MICROSOFT_STORE_CLIENT_ID }},$pass
Set-StoreBrokerAuthentication -TenantId '${{ secrets.MICROSOFT_STORE_TENANT_ID }}' -Credential $cred
# Zip and create metadata files
$artifacts = Get-ChildItem -Path . -Filter *.appx | Select-Object -ExpandProperty FullName
New-StoreBrokerConfigFile -Path "$PWD/config.json" -AppId ${{ secrets.MICROSOFT_STORE_PRODUCT_ID }}
New-SubmissionPackage -ConfigPath "$PWD/config.json" -DisableAutoPackageNameFormatting -AppxPath $artifacts -OutPath "$PWD" -OutName submission
# Submit the app
# See https://github.com/microsoft/StoreBroker/blob/master/Documentation/USAGE.md#the-easy-way
Update-ApplicationSubmission `
-AppId ${{ secrets.MICROSOFT_STORE_PRODUCT_ID }} `
-SubmissionDataPath "submission.json" `
-PackagePath "submission.zip" `
-ReplacePackages `
-NoStatus `
-AutoCommit `
-Force

View File

@@ -0,0 +1,113 @@
name: Publish Microsoft Store
defaults:
run:
shell: bash
on:
release:
types: [published]
workflow_dispatch:
inputs:
tag:
description: 'Release tag (e.g. v25.3.0)'
required: true
type: string
concurrency:
group: publish-microsoft-store
cancel-in-progress: false
jobs:
publish-microsoft-store:
runs-on: windows-latest
environment: release
steps:
- name: Resolve version
id: resolve_version
env:
EVENT_NAME: ${{ github.event_name }}
RELEASE_TAG: ${{ github.event.release.tag_name }}
INPUT_TAG: ${{ inputs.tag }}
run: |
if [[ "$EVENT_NAME" == "release" ]]; then
TAG="$RELEASE_TAG"
else
TAG="$INPUT_TAG"
fi
if [[ -z "$TAG" ]]; then
echo "::error::No tag provided"
exit 1
fi
# Validate tag format (v-prefixed semver, e.g. v25.3.0 or v1.2.3-beta.1)
if [[ ! "$TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.]+)?$ ]]; then
echo "::error::Invalid tag format: $TAG (expected v-prefixed semver, e.g. v25.3.0)"
exit 1
fi
VERSION="${TAG#v}"
echo "tag=$TAG" >> "$GITHUB_OUTPUT"
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
echo "Resolved tag=$TAG version=$VERSION"
- name: Verify release assets exist
env:
GH_TOKEN: ${{ github.token }}
STEPS_RESOLVE_VERSION_OUTPUTS_TAG: ${{ steps.resolve_version.outputs.tag }}
run: |
TAG="${STEPS_RESOLVE_VERSION_OUTPUTS_TAG}"
echo "Checking release assets for tag $TAG..."
ASSETS=$(gh api "repos/${{ github.repository }}/releases/tags/$TAG" --jq '.assets[].name')
echo "Found assets:"
echo "$ASSETS"
if ! echo "$ASSETS" | grep -q "\.appx$"; then
echo "::error::No .appx assets found in release $TAG"
exit 1
fi
echo "Required .appx assets found."
- name: Download Microsoft Store artifacts
env:
GH_TOKEN: ${{ github.token }}
STEPS_RESOLVE_VERSION_OUTPUTS_TAG: ${{ steps.resolve_version.outputs.tag }}
run: |
TAG="${STEPS_RESOLVE_VERSION_OUTPUTS_TAG}"
gh release download "$TAG" --repo "${{ github.repository }}" --pattern "*.appx"
- name: Install StoreBroker
shell: powershell
run: |
Install-Module -Name StoreBroker -AcceptLicense -Force -Scope CurrentUser -Verbose
- name: Submit to Microsoft Store
shell: powershell
run: |
# Disable telemetry
$global:SBDisableTelemetry = $true
# Authenticate against the store
$pass = ConvertTo-SecureString -String '${{ secrets.MICROSOFT_STORE_CLIENT_SECRET }}' -AsPlainText -Force
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ${{ secrets.MICROSOFT_STORE_CLIENT_ID }},$pass
Set-StoreBrokerAuthentication -TenantId '${{ secrets.MICROSOFT_STORE_TENANT_ID }}' -Credential $cred
# Zip and create metadata files
$artifacts = Get-ChildItem -Path . -Filter *.appx | Select-Object -ExpandProperty FullName
New-StoreBrokerConfigFile -Path "$PWD/config.json" -AppId ${{ secrets.MICROSOFT_STORE_PRODUCT_ID }}
New-SubmissionPackage -ConfigPath "$PWD/config.json" -DisableAutoPackageNameFormatting -AppxPath $artifacts -OutPath "$PWD" -OutName submission
# Submit the app
# See https://github.com/microsoft/StoreBroker/blob/master/Documentation/USAGE.md#the-easy-way
Update-ApplicationSubmission `
-AppId ${{ secrets.MICROSOFT_STORE_PRODUCT_ID }} `
-SubmissionDataPath "submission.json" `
-PackagePath "submission.zip" `
-ReplacePackages `
-NoStatus `
-AutoCommit `
-Force

View File

@@ -82,16 +82,17 @@ jobs:
with:
download-translations: 'false'
- name: Build browser bundle
# REACT_APP_NETLIFY=true keeps the "Create test file" button in the
# production bundle — every VRT test's beforeEach relies on it via
# ConfigurationPage.createTestFile().
# REACT_APP_NETLIFY=true flips isNonProductionEnvironment() on in the
# bundle so the "Create test file" button (used by every e2e beforeEach
# via ConfigurationPage.createTestFile()) is still rendered in a
# production build. Without it, e2e tests would time out waiting for
# a button that was tree-shaken out.
# --skip-translations keeps VRT screenshots deterministic by rendering
# source-code English instead of upstream Weblate en.json (which can
# drift between snapshot capture and test runs).
env:
REACT_APP_NETLIFY: 'true'
run: |
yarn workspace plugins-service build
yarn workspace @actual-app/crdt build
yarn workspace @actual-app/core build:browser
yarn workspace @actual-app/web build:browser
run: yarn build:browser --skip-translations
- name: Upload build artifact
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
@@ -257,6 +258,7 @@ jobs:
- name: Merge shard patches
id: create-patch
shell: bash
run: |
git config --global --add safe.directory "$GITHUB_WORKSPACE"
git config --global user.name "github-actions[bot]"

View File

@@ -12,14 +12,14 @@ import { View } from './View';
const backgroundColor: {
[key in ButtonVariant | `${ButtonVariant}Disabled`]?: string;
} = {
normal: theme.buttonPrimaryBackground,
normalDisabled: theme.buttonPrimaryBackground,
normal: theme.buttonNormalBackground,
normalDisabled: theme.buttonNormalDisabledBackground,
primary: theme.buttonPrimaryBackground,
primaryDisabled: theme.buttonPrimaryBackground,
bare: theme.buttonPrimaryBackground,
bareDisabled: theme.buttonPrimaryBackground,
menu: theme.buttonPrimaryBackground,
menuSelected: theme.buttonPrimaryBackground,
primaryDisabled: theme.buttonPrimaryDisabledBackground,
bare: theme.buttonBareBackground,
bareDisabled: theme.buttonBareDisabledBackground,
menu: theme.buttonMenuBackground,
menuSelected: theme.buttonMenuSelectedBackground,
};
const backgroundColorHover: Record<
@@ -54,14 +54,14 @@ const borderColor: {
const textColor: {
[key in ButtonVariant | `${ButtonVariant}Disabled`]?: CSSProperties['color'];
} = {
normal: theme.buttonPrimaryText,
normalDisabled: theme.buttonPrimaryText,
normal: theme.buttonNormalText,
normalDisabled: theme.buttonNormalDisabledText,
primary: theme.buttonPrimaryText,
primaryDisabled: theme.buttonPrimaryText,
bare: theme.buttonPrimaryText,
bareDisabled: theme.buttonPrimaryText,
menu: theme.buttonPrimaryText,
menuSelected: theme.buttonPrimaryText,
primaryDisabled: theme.buttonPrimaryDisabledText,
bare: theme.buttonBareText,
bareDisabled: theme.buttonBareDisabledText,
menu: theme.buttonMenuText,
menuSelected: theme.buttonMenuSelectedText,
};
const textColorHover: {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 168 KiB

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 163 KiB

After

Width:  |  Height:  |  Size: 161 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 164 KiB

After

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 KiB

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 194 KiB

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 188 KiB

After

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 187 KiB

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 KiB

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Some files were not shown because too many files have changed in this diff Show More