fix(ui): UX/QA batch (26 items) across web + mobile + create-habit submit gate - #175
Conversation
…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>
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
There was a problem hiding this comment.
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>
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
|
…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>


Cross-platform UX/QA pass (26 reported items) plus shared error localization and the create-habit submit-gate regression fix.
Paired PR
Highlights
Chat
Calendar
Errors & auth
ERROR_CODE_TO_KEY(pt-BR when locale is pt-BR)Retrospective
Upgrade
Habits
setValuewithoutshouldValidatere-broadcasts the cachedonSubmit-modeisValid, leaving the button disabled with a title filled. Now gates onuseWatch('title')on both modals.Misc
i18n
Verification
Device-bound (please verify on your phone)
🤖 Generated with Claude Code