Skip to content

Refine mobile spacing and typography across Home, Spend, Workspaces, and Account - #100187

Draft
shawnborton wants to merge 28 commits into
mainfrom
shawn-labels
Draft

shawnborton wants to merge 28 commits into
mainfrom
shawn-labels

Conversation

@shawnborton

Copy link
Copy Markdown
Contributor

Explanation of Change

This is a design exploration of mobile spacing, typography, and layout across Home, Spend, Workspaces, and Account. It is UI only — no logic, data, or API changes.

Typography

  • Content card titles now use labelStrong (13px bold) instead of 17px. This covers the Home widget cards and every settings or workspace card that passes accountSettingsSectionTitle. Two Subscription cards that set their own bold style now share that style so they match.
  • Home widget rows use regular weight instead of bold.

Home

  • Page horizontal padding is 16px on mobile. Card inner padding is 24px on mobile.
  • Card header bottom margin is 12px, down from 20px. Every card gets 12px of bottom padding.
  • The date and greeting are centered on mobile, with an 8px gap, under the Account > About coin animation. The animation spans the card at its own aspect ratio and its container clips it to 172px.
  • "Time sensitive" and "For you" are one continuous group under a single "For you" title. The eyebrow text above each Time sensitive row is gone.
  • Row icons lost their background swatch and now use theme.icon.
  • When there is nothing to show, the section is hidden rather than showing an empty state.

Spend

  • The page edge inset is 16px on mobile, across the header, filter bar, list rows, footer, and selection bar.
  • The tabs gained 4px of top padding so switching to Workspaces does not shift the layout. The list's top offset grew by the same 4px.
  • The search input is 44px tall at 13px, matching the search input above every other table.

Workspaces

  • The page edge inset is 16px on mobile. This includes the shared Table component, so every table in the app picks it up on mobile.

Account

  • Card inner padding is 24px and card side margins are 16px on mobile. Full-bleed menu rows were updated to match, so their backgrounds still reach the card edge and their content still lines up with the title.
  • The header stacks vertically and centers on mobile: a 100px avatar, the name in h1, then the email.
  • The divider above "General" in the left nav is gone.
  • Profile and Workspace Overview center their large avatars on mobile.

One shared bug fixed

Image is memoized on source alone, so style changes never reached the DOM and a responsive avatar kept its mount-time size. AvatarImage now keys the image by size. Adding style to the comparator would have disabled memoization for every image in the app, since the style arrives as a fresh array each render.

Fixed Issues

$
PROPOSAL:

Tests

  1. Open Home on a narrow window. Verify the coin animation sits centered above the date and greeting, cropped at the bottom rather than scaled down.
  2. Verify the page sits 16px from each screen edge and card content sits 24px inside the card.
  3. Verify Time sensitive and For you rows form one list under a single "For you" title, with no eyebrow text above the rows and no background swatch behind the row icons.
  4. Verify every card title is 13px bold and every row title is regular weight.
  5. Drag the window across the mobile breakpoint. Verify the Home layout and the Account avatar both switch size, and that the avatar does not keep its previous size.
  6. Open Spend on a narrow window. Verify the header, filter chips, list rows, and footer all sit 16px from each edge, and that the first row is not clipped under the header.
  7. Switch between Spend and Workspaces. Verify the tabs do not shift vertically.
  8. Verify the Spend search input is the same height and text size as the search input above the Workspaces table.
  9. Open Account. Verify the avatar, name, and email are stacked and centered, and that there is no divider above "General".
  10. Open Account > Profile and Workspace Editor > Overview. Verify the large avatar is centered.
  11. Widen the window. Verify every screen returns to its previous desktop layout.
  • Verify that no errors appear in the JS console

Offline tests

  1. Go offline.
  2. Open Home, Spend, Workspaces, and Account.
  3. Verify spacing, typography, and layout match the online result. These are presentational changes with no network dependency.

QA Steps

Same as tests.

  • Verify that no errors appear in the JS console

PR Author Checklist

  • I linked the correct issue in the ### Fixed Issues section above
  • I wrote clear testing steps that cover the changes made in this PR
    • I added steps for local testing in the Tests section
    • I added steps for the expected offline behavior in the Offline steps section
    • I added steps for Staging and/or Production testing in the QA steps section
    • I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
    • I tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).
  • I included screenshots or videos for tests on all platforms
  • I ran the tests on all platforms & verified they passed on:
    • Android: Native
    • Android: mWeb Chrome
    • iOS: Native
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
  • I followed proper code patterns (see Reviewing the code)
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I followed the guidelines as stated in the Review Guidelines
  • I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
  • If a new CSS style is added I verified that:
    • A similar style doesn't already exist
    • The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))
  • If new assets were added or existing ones were modified, I verified that:
    • The assets are optimized and compressed (for SVG files, run npm run compress-svg)
    • The assets load correctly across all supported platforms.
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • I added unit tests for any new feature or bug fix in this PR to help automatically prevent regressions in this user flow.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.

Screenshots/Videos

Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari

# Conflicts:
#	src/libs/Navigation/helpers/calculateSuperWideRHPWidth/index.ts
#	src/styles/variables.ts
# Conflicts:
#	src/libs/Navigation/helpers/calculateSuperWideRHPWidth/index.ts
#	src/styles/index.ts
#	src/styles/variables.ts
@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

🚧 shawnborton has triggered a test Expensify/App build. You can view the workflow run here.

@github-actions

This comment has been minimized.

# Conflicts:
#	src/pages/settings/Wallet/WalletPage/index.tsx
@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

🚧 shawnborton has triggered a test Expensify/App build. You can view the workflow run here.

@github-actions

This comment has been minimized.

@OSBotify

This comment has been minimized.

@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

🚧 shawnborton has triggered a test Expensify/App build. You can view the workflow run here.

@github-actions

This comment has been minimized.

@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

🚧 shawnborton has triggered a test Expensify/App build. You can view the workflow run here.

@github-actions

This comment has been minimized.

@OSBotify

OSBotify commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

🦜 Polyglot Parrot! 🦜

Squawk! Looks like you added some shiny new English strings. Allow me to parrot them back to you in other tongues:

View the translation diff
diff --git a/src/languages/de.ts b/src/languages/de.ts
index 24018cc0..0b0b56b6 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -951,7 +951,7 @@ const translations: TranslationDeepObject<typeof en> = {
         tooltip: 'Starte hier!',
     },
     homePage: {
-        forYou: 'Für dich',
+        forYou: 'Aufgaben',
         timeSensitiveSection: {
             title: 'Zeitkritisch',
             addShippingAddress: {title: 'Wir benötigen deine Versandadresse', subtitle: 'Geben Sie eine Adresse an, um Ihre Expensify Karte zu erhalten.', cta: 'Adresse hinzufügen'},
diff --git a/src/languages/el.ts b/src/languages/el.ts
index 54f6f2cc..d0c3a87e 100644
--- a/src/languages/el.ts
+++ b/src/languages/el.ts
@@ -970,7 +970,7 @@ const translations: TranslationDeepObject<typeof en> = {
         tooltip: 'Ξεκινήστε εδώ!',
     },
     homePage: {
-        forYou: 'Για εσάς',
+        forYou: 'Εκκρεμότητες',
         timeSensitiveSection: {
             title: 'Χρονικά ευαίσθητο',
             ctaFix: 'Διόρθωση',
diff --git a/src/languages/es.ts b/src/languages/es.ts
index 7b195ae1..c1c2a445 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -930,7 +930,7 @@ const translations: TranslationDeepObject<typeof en> = {
         tooltip: '¡Comienza aquí!',
     },
     homePage: {
-        forYou: 'Para ti',
+        forYou: 'Tareas pendientes',
         timeSensitiveSection: {
             title: 'Requiere atención inmediata',
             ctaFix: 'Corrige',
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index e6c264b6..984a114b 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -954,7 +954,7 @@ const translations: TranslationDeepObject<typeof en> = {
         tooltip: 'Commencez ici !',
     },
     homePage: {
-        forYou: 'Pour vous',
+        forYou: 'Tâches à faire',
         timeSensitiveSection: {
             title: 'Urgent',
             addShippingAddress: {title: 'Nous avons besoin de votre adresse de livraison', subtitle: 'Indiquez une adresse pour recevoir votre Carte Expensify.', cta: 'Ajouter une adresse'},
diff --git a/src/languages/it.ts b/src/languages/it.ts
index af765f00..855a8a04 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -952,7 +952,7 @@ const translations: TranslationDeepObject<typeof en> = {
         tooltip: 'Inizia qui!',
     },
     homePage: {
-        forYou: 'Per te',
+        forYou: 'Attività da fare',
         timeSensitiveSection: {
             title: 'Sensibile al tempo',
             addShippingAddress: {title: 'Ci serve il tuo indirizzo di spedizione', subtitle: 'Fornisci un indirizzo per ricevere la tua Carta Expensify.', cta: 'Aggiungi indirizzo'},
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 9a2fdba5..a2494dcb 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -942,7 +942,7 @@ const translations: TranslationDeepObject<typeof en> = {
         tooltip: 'ここから始めましょう!',
     },
     homePage: {
-        forYou: 'あなた向け',
+        forYou: 'To-do リスト',
         timeSensitiveSection: {
             title: '時間に敏感',
             addShippingAddress: {title: '配送先住所が必要です', subtitle: 'Expensify カードを受け取る住所を入力してください。', cta: '住所を追加'},
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index e4e199c4..bfbe6173 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -950,7 +950,7 @@ const translations: TranslationDeepObject<typeof en> = {
         tooltip: 'Begin hier!',
     },
     homePage: {
-        forYou: 'Voor jou',
+        forYou: 'To-do’s',
         timeSensitiveSection: {
             title: 'Tijdgevoelig',
             addShippingAddress: {title: 'We hebben je verzendadres nodig', subtitle: 'Geef een adres op om je Expensify Kaart te ontvangen.', cta: 'Adres toevoegen'},
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 70099c10..1f601502 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -958,7 +958,7 @@ const translations: TranslationDeepObject<typeof en> = {
         tooltip: 'Zacznij tutaj!',
     },
     homePage: {
-        forYou: 'Dla ciebie',
+        forYou: 'Zadania',
         timeSensitiveSection: {
             title: 'Wymaga szybkiej reakcji',
             addShippingAddress: {title: 'Potrzebujemy Twojego adresu wysyłki', subtitle: 'Podaj adres, na który mamy wysłać twoją Kartę Expensify.', cta: 'Dodaj adres'},
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index e2287f3e..a445dc8f 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -950,7 +950,7 @@ const translations: TranslationDeepObject<typeof en> = {
         tooltip: 'Comece aqui!',
     },
     homePage: {
-        forYou: 'Para você',
+        forYou: 'Afazeres',
         timeSensitiveSection: {
             title: 'Urgente',
             addShippingAddress: {title: 'Precisamos do seu endereço de entrega', subtitle: 'Informe um endereço para receber seu Cartão Expensify.', cta: 'Adicionar endereço'},
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index 6c75d766..8bf008f4 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -917,7 +917,7 @@ const translations: TranslationDeepObject<typeof en> = {
         tooltip: '从这里开始!',
     },
     homePage: {
-        forYou: '为你',
+        forYou: '待办事项',
         timeSensitiveSection: {
             title: '时间敏感',
             addShippingAddress: {title: '我们需要您的收货地址', subtitle: '请提供一个地址以接收您的 Expensify 卡。', cta: '添加地址'},

Note

You can apply these changes to your branch by copying the patch to your clipboard, then running pbpaste | git apply 😉

View workflow run

@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

🚧 shawnborton has triggered a test Expensify/App build. You can view the workflow run here.

@github-actions

This comment has been minimized.

@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

🚧 shawnborton has triggered a test Expensify/App build. You can view the workflow run here.

@github-actions

This comment has been minimized.

@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

🚧 shawnborton has triggered a test Expensify/App build. You can view the workflow run here.

@github-actions

This comment has been minimized.

# Conflicts:
#	src/components/BaseWidgetItem.tsx
#	src/components/Search/SearchList/ListItem/TransactionGroupListItem.tsx
#	src/languages/en.ts
#	src/pages/home/ForYouSection/index.tsx
#	src/pages/home/TimeSensitiveSection/TimeSensitiveGroup.tsx
#	src/pages/home/TimeSensitiveSection/useTimeSensitiveItems.tsx
#	src/pages/home/UpcomingTravelSection/UpcomingTravelItem.tsx
#	src/pages/settings/Wallet/InternationalDepositAccount/subPages/AccountFlowEntryPoint.tsx
#	src/styles/index.ts
# Conflicts:
#	assets/images/concierge.svg
#	src/components/SidePanel/SidePanelButton/SidePanelButtonBase.tsx
#	src/libs/Navigation/AppNavigator/ModalStackNavigators/useModalStackScreenOptions.ts
@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

🚧 shawnborton has triggered a test Expensify/App build. You can view the workflow run here.

@github-actions

This comment has been minimized.

@github-actions

github-actions Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

🚧 shawnborton has triggered a test Expensify/App build. You can view the workflow run here.

@github-actions

This comment has been minimized.

@github-actions

Copy link
Copy Markdown
Contributor

🚧 shawnborton has triggered a test Expensify/App build. You can view the workflow run here.

@github-actions

This comment has been minimized.

@github-actions

Copy link
Copy Markdown
Contributor

🚧 shawnborton has triggered a test Expensify/App build. You can view the workflow run here.

@github-actions

This comment has been minimized.

@github-actions

Copy link
Copy Markdown
Contributor

🚧 shawnborton has triggered a test Expensify/App build. You can view the workflow run here.

This branch has not been deployed

No deployments
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.

2 participants