Skip to content

fix(ui): UX/QA batch (26 items) across web + mobile + create-habit submit gate - #175

Merged
thomasluizon merged 2 commits into
mainfrom
feature/ui-ux-qa-batch
Jun 15, 2026
Merged

fix(ui): UX/QA batch (26 items) across web + mobile + create-habit submit gate#175
thomasluizon merged 2 commits into
mainfrom
feature/ui-ux-qa-batch

Conversation

@thomasluizon

Copy link
Copy Markdown
Owner

Cross-platform UX/QA pass (26 reported items) plus shared error localization and the create-habit submit-gate regression fix.

Paired PR

Highlights

Chat

  • Voice-recording race fix (web + mobile)
  • Language picker moved from the input to the chat header
  • Free-plan Pro-feature error shows only the localized "Recurso Pro"

Calendar

  • Tappable, centered month navigation (arrows on the sides, like Today)
  • Day detail opens a modal with "Ver este dia"
  • Centered, muted legend; removed the "x/30 dias" summary

Errors & auth

  • Backend errors render localized via ERROR_CODE_TO_KEY (pt-BR when locale is pt-BR)
  • Login surfaces errors via toast only (removed reference code + inline yellow text)

Retrospective

  • Stats dashboard + narrative; empty-period state when there are no completions (paired API guard)

Upgrade

  • Exact hero copy: "Desbloqueie todo seu potencial com o Pro"
  • Free vs Pro two-column comparison

Habits

Misc

  • Preferences option legends relocated into the picker modal
  • AI-facts paginator inline with an icon select
  • Support: removed name/email fields
  • Advanced devs: deduped the MCP config tab, un-overlapped the copy button
  • Widget: fallback drawables + first-add render fix
  • FAB nudged down; "Constante" tier label + stat tiles no longer wrap

i18n

  • Full pt-BR naturalization; en / pt-BR parity preserved at 1665/1665

Verification

  • type-check: shared, web, mobile — clean
  • lint: web, mobile — clean
  • tests: shared 982, web 1595, mobile 573 — all green (fixed 9 stale tests left red by the localization/UI changes)

Device-bound (please verify on your phone)

  • Voice recording (depends on the ColorOS system speech service)
  • Android widget render on the launcher

🤖 Generated with Claude Code

…bmit gate

Cross-platform UX/QA pass plus shared error localization. Highlights:
- Chat: voice-recording race fix; language picker moved to the chat header
- Calendar: tappable centered month nav, day-detail modal, centered muted
  legend, removed the "x/30 dias" summary
- Errors: backend errors render localized via ERROR_CODE_TO_KEY; login surfaces
  errors through a toast only (no reference code / inline yellow text)
- Retrospective: stats-dashboard + narrative UI with an empty-period state
- Upgrade: exact hero copy + Free/Pro two-column comparison
- Frequency: swipe carousel; streak-freeze celebration auto-dismisses;
  bad = red / overdue = yellow log dots on both platforms
- Preferences option legends relocated into the picker modal; AI-facts paginator
  inline with an icon select
- Support: removed name/email fields; advanced devs: deduped MCP tab
- Widget: fallback drawables + first-add render fix
- pt-BR naturalization across the locale (parity preserved at 1665/1665)
- fix(mobile): restore the title-presence submit gate on the create/edit habit
  modals. #172 reverted #145: with a buffered title input, setValue without
  shouldValidate re-broadcasts the cached onSubmit-mode isValid, so the button
  stayed disabled with a title filled. Gate on useWatch('title') instead.

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

vercel Bot commented Jun 14, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
orbit-ui-mobile-web Ignored Ignored Jun 15, 2026 12:08am

Comment thread packages/shared/src/i18n/pt-BR.json Outdated

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

One dead i18n key slipped through: orbitMcp.claudeDesktop is still present in both packages/shared/src/i18n/en.json and pt-BR.json (line 1898 each), but this PR removed every production caller of t('orbitMcp.claudeDesktop') from both apps/web/app/(app)/advanced/page.tsx and apps/mobile/app/advanced.tsx when the desktop tab was dropped. Delete the key from both locale files and this is good to go — everything else in this large batch is solid.

The desktop MCP tab was dropped (MCP_CONFIG_TABS no longer includes 'desktop'),
so this key has no remaining callers. Flagged by the PR review bot. Removed from
both locales; en/pt-BR parity preserved at 1664/1664.

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

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Prior finding (dead orbitMcp.claudeDesktop key) resolved in 02c2cc9 — both locales cleaned, parity preserved at 1664/1664. The rest of the batch is solid: submit-gate fix correctly targets only mobile (web uses standard register() binding so isValid tracking was never broken there); both chat-language-picker components are wired in their respective page/screen; ERROR_CODE_TO_KEY integration is ordered correctly (contextual rules win before stable-code fallback); retrospective empty-period guard is consistent across web and mobile hooks; Android widget fallback drawables follow the existing XML conventions. No new console.log, no production any, no dead exports, no swallowed errors introduced by this PR.

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Prior finding (dead orbitMcp.claudeDesktop key) resolved in 02c2cc9 — both locales cleaned, parity preserved at 1664/1664. The rest of the batch is solid: submit-gate fix correctly targets only mobile (web uses standard register() binding so isValid tracking was never broken there); both chat-language-picker components are wired in their respective page/screen; ERROR_CODE_TO_KEY integration is ordered correctly (contextual rules win before stable-code fallback); retrospective empty-period guard is consistent across web and mobile hooks; Android widget fallback drawables follow the existing XML conventions. No new console.log, no production any, no dead exports, no swallowed errors introduced by this PR.

@sonarqubecloud

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
62.9% Coverage on New Code (required ≥ 80%)

See analysis details on SonarQube Cloud

@thomasluizon
thomasluizon merged commit bf36d44 into main Jun 15, 2026
7 of 8 checks passed
@thomasluizon
thomasluizon deleted the feature/ui-ux-qa-batch branch June 15, 2026 00:32
thomasluizon added a commit that referenced this pull request Jun 16, 2026
…it-frequency carousel desync (#180)

Widget (Android):
- Add a loading skeleton for the cold/never-synced window (gated on
  habits_updated_at) so a freshly added widget never renders as a blank card.
- Cap rasterized RemoteViews bitmaps at 512px in createRoundedBitmap (consumer
  ImageViews are fitXY, so they upscale). The card + every habit-row background
  were rendered at full device resolution; Android inlines the collection on
  update and rejects views whose summed bitmap memory exceeds ~6x screen
  ("RemoteViews for widget update exceeds maximum bitmap memory usage"), which
  surfaced as the launcher's white "Problem loading widget" on first add
  (~31MB used vs ~20MB cap). Now ~5MB.

Edit habit frequency (web + mobile):
- The frequency carousel scrolled to the active card before its slides laid out
  at full width, so it stayed on "one-time" while the form state (dots + detail
  fields) was correctly Recurrent. Mobile re-positions on onContentSizeChange;
  web retries via requestAnimationFrame until the track width is measured.
- Mobile card tap now selects the tapped card instead of re-applying the active
  index (+ regression test); per-card accessibility state corrected.

Both bugs were pre-existing (carousel rework in #175/#177; full-resolution
widget bitmaps predate this branch).

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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.

1 participant