Skip to content

Improve the mobile experience (post editor + app-wide polish) - #187

Merged
paulocastellano merged 30 commits into
mainfrom
feat/mobile-experience
Jul 18, 2026
Merged

Improve the mobile experience (post editor + app-wide polish)#187
paulocastellano merged 30 commits into
mainfrom
feat/mobile-experience

Conversation

@paulocastellano

@paulocastellano paulocastellano commented Jul 17, 2026

Copy link
Copy Markdown
Contributor

Closes #184

Makes TryPost comfortable on a phone, with the post editor as the priority. Desktop (lg+) is unchanged.

Highlights

Post editor (the priority)

  • A top switcher (Compose · Channels · Preview · Comments) surfaces the right-hand panel that was previously hidden lg:block — on a phone you can now pick platforms, preview each network, and read/leave comments. On mobile it's one aligned bar (hamburger + tabs); the autosave status stays on the desktop header.
  • A sticky bottom action bar puts schedule / publish / delete within thumb's reach, with a full-width Post now.
  • Composer media actions (delete, alt-text, AI-regenerate, reorder) and the comment toolbar (react/reply/edit/delete + emoji) now work on touch instead of hover-only; media grid is 3-up. The preview mockup is centered and scaled to fit.

App-wide

  • Post view, calendar, posts list, analytics, workspace dashboard, settings, labels, signatures headers/toolbars are re-laid-out for a phone (stacked / full-width rows) instead of overflowing.
  • Gallery (Uploads / Unsplash / Giphy) card actions are touch-visible.
  • Automations builder is gated to lg+ (fixed side panels no longer overflow a phone) with a "works best on a larger screen" notice; automation tabs scroll; the detail header clears the mobile hamburger.
  • Shared primitives: scrollable tabs (without clipping borders), dialog height/width clamps, sidebar trigger sized + aligned to the header buttons; responsive PageHeader, in-viewport workspace & notifications panels, floating-hamburger clearance, truncation polish, and an AuthLayout that no longer overflows with wide content.

Out of scope (deliberate)

  • Full touch editing of the automations node builder — replaced by the desktop-recommended notice (editing a node graph by dragging on a phone is a separate effort).
  • Rewriting list tables into stacked mobile cards — they already scroll horizontally inside their container without breaking the page.

Automated testing

  • Feature + Unit: 2606 passed, 2 skipped, 0 failures (php artisan test --parallel).
  • Browser (Pest, 375px): 12 passed — editor action bar / switcher / composer & comment touch actions, gallery, automations notice, a horizontal-overflow guard across layout variants, plus existing AltText/ImageCropper (no regression).
  • Runtime overflow: every app page + guest auth pages verified for no horizontal overflow at 375px and 320px.
  • LocalizationParity: green — new i18n keys added to all 15 locales.
  • pint and eslint clean.

✅ Manual QA checklist — test on a real phone before merge

Automated checks cover no-overflow + the touch interactions in headless Chromium. Please eyeball the below on an actual phone, ideally both a standard width (~390px) and a narrow one (~360px), and on iOS Safari (automated runs were Chromium).

Post editor (the priority)

  • Top bar: hamburger + switcher tabs (Compose · Channels · Preview · Comments) are the same height and aligned; tabs scroll if needed; no autosave status crowding them
  • Compose: type a caption — the keyboard doesn't cover the field; emoji / signature / AI buttons work
  • Media: add media; the delete / alt-text / AI-regenerate / drag-reorder buttons on a tile are tappable (no hover); grid is 3-up
  • Channels: enable/disable platforms; per-platform settings (Instagram, TikTok, Facebook, Pinterest, LinkedIn, Discord); labels
  • Preview: mockup is centered with side padding; switch account avatars; each platform preview renders; the platform logo badge is visible
  • Comments: react / reply / edit / delete on a comment are tappable (no hover); emoji picker opens on tap
  • Sticky bottom bar: delete / Pick time / Post now (full-width) reachable with the thumb; schedule, post now, and delete all work
  • Scheduled-post state shows the banner + Unschedule
  • Media picker dialog + Emoji picker fit the screen (no cut-off)

Post view (a published / scheduled post)

  • Header: Back on its own row (clears the hamburger); date + status badge on the next row (date left, badge right — no wrapping mess or floating badge)
  • Platform cards + metrics read fine; long account names truncate

Media gallery (Assets)

  • Uploads: tap create-post / delete on a card (visible without hover)
  • Unsplash & Giphy tabs: tap add/save / create-post on a card

Lists, calendar & navigation

  • Posts list: search, label filter, and New post each on their own full-width row; the table scrolls sideways without breaking the page
  • Calendar: row 1 = [<] Today [>] + a compact date picker; row 2 = full-width New post; day view is usable; the hamburger lines up with the nav buttons
  • Analytics: the account selector is full-width (matches the date-range picker below it)
  • Labels & Signatures: toolbar stacks; rows read fine
  • Workspaces list: a long workspace name truncates and doesn't push the page wide
  • Notifications (sidebar bell): panel is full-width with margins (not off-screen); its buttons are tappable

Settings

  • Settings tabs (Workspace / Brand / Members / API keys) scroll horizontally to reach them all
  • Members & API keys tables; the row action (⋯) menus open on-screen
  • Profile / Account / Notifications / Usage / Billing pages

Automations

  • Automations list
  • Open the builder on a phone → "works best on a larger screen" notice; nothing overflows
  • Automation tabs (Workflow / Invocations / Metrics / Settings) scroll; back button not under the hamburger
  • Metrics / Invocations / Settings pages read fine

Accounts & OAuth

  • Accounts grid + a connect flow
  • OAuth page-select screens (Facebook / Instagram / LinkedIn): the "View" button is icon-only, names truncate, actions fit

Auth (guest, logged out)

  • Login / Register / Forgot-password on a phone

Sanity (every page)

  • No page has horizontal scroll or cut-off content
  • The sidebar hamburger is the same size as the icon buttons and aligned with the page header; page titles are not hidden behind it
  • Workspace switcher menu opens within the viewport
  • Desktop (wide screen) looks unchanged vs. main

- TabsList scrolls horizontally instead of overflowing the page
- DialogContent caps height with internal scroll; DialogScrollContent gets the mobile width gutter
- SidebarTrigger tap target bumped to 36px
- Top switcher (Compose / Channels / Preview / Comments) reveals the panel that was hidden below lg
- Sticky bottom action bar puts schedule/publish/delete within thumb reach
- Composer media actions and comment toolbar are visible on touch (no hover needed); media grid is 3-up
- Clamp media picker and emoji picker widths to the viewport
Uploads/Unsplash/Giphy card actions are visible on touch instead of hover-only, without the dark scrim on small screens.
Non-wrapping justify-between headers now stack below sm; fixed-width searches go full-width. Calendar header wraps and seeds isMobile at setup to avoid the month-grid flash.
The node builder is gated to lg+ (its fixed side panels no longer overflow a phone); below lg it shows a 'works best on a larger screen' notice. Automation tabs scroll instead of cutting off.
PageHeader downscales on phones; workspace switcher opens within the viewport; OAuth page-selects go icon-only + truncate; invite info rows truncate.
- NotificationBell panel was fixed at left-[17rem] w-[22rem] and ran off-screen on a phone; now full-width-with-margins below sm
- Reserve top space for the floating sidebar trigger so page headings no longer sit under the hamburger on mobile
- automations/Index header stacks on mobile (was the one index page the first pass missed)
- Contain the preview phone mockup horizontally so it never breaks the page on narrow screens
- Comment bodies wrap long unbroken tokens (break-words)
- Restore desktop tab spacing (lg:gap-6) on the automation tabs
- break-words / viewport width caps on the AI review chips, lightbox alt overlay, and pick-time popover
- Remove the now-unused hoveredCommentId state after the comment toolbar became touch-visible
…dding

The 380px mockup frame is wider than a phone viewport, so it sat edge-to-edge. Scale it to 90% below lg (origin top-center keeps it centered) so there's clean symmetric padding to the screen edges. Reverts the now-redundant px-2 container tweak back to px-4.
- AutomationHeader reserves space for the floating hamburger on mobile (its full-width pages had the back button under the trigger)
- AlertDialogContent caps height + scrolls like DialogContent
- AiGenerateDialog preview wraps long tokens (break-words)
- Enlarge notification panel action buttons on the full-width mobile panel (max-sm:size-9)
- min-w-0 so the billing processing title-bar label can truncate
The mobile grid column was implicit (auto), so it sized to content — a long
workspace name (truncate = nowrap, wide intrinsic size) stretched the form
column to its max-w-lg (512px) and overflowed a 375px viewport by ~31px on the
workspaces list. Make the column an explicit minmax(0,1fr) track and give the
grid item min-w-0 so it stays within the viewport and the name truncates.

Found by a runtime horizontal-overflow check; adds MobileOverflowTest guarding
it across the layout variants (AuthLayout, default, full-width editor, detail).
overflow-x-auto forces overflow-y to auto too, so the tab triggers' border and
shadow were clipped at the list edges (visible on the editor Preview/Channels/
Comments tabs). Drop the fixed h-10 and pad the list (p-1) so the scroll
container has room around the buttons on all sides.
The scheduled and editable states each rendered their own copy; the actions
component already decides internally what to show, so it only needs one instance
pushed right with ml-auto.
- Show/hide the date picker and view switcher with Tailwind (lg:hidden /
  hidden lg:block) instead of the isMobile ref; isMobile now only drives
  effectiveView (which changes navigation behavior, not just visibility)
- Full-width buttons on mobile: prev / Today (fills) / next, and the date
  picker fills the row next to New post
Matches the date-range picker below it instead of sitting content-width.
Search, label filter, and New post each take their own full-width row below sm
(inline on desktop). The label filter trigger goes full-width to match.
Split the header into a dedicated mobile layout (< lg) and the desktop grid.
Mobile is two clean rows: prev / date picker (fills) / next, then Today +
full-width New post. Fixes the stretched, styleless Today button. Each header
owns its own controls, so the date picker and view switcher no longer need
lg:hidden / hidden lg:block toggles.
…l-width New post below

Move Today up with prev/next, keep the date picker compact on the right instead
of full-width, and give New post its own full-width row.
The floating hamburger was size-9 (36px) next to size-10 (40px) icon buttons, so
it read as too small. Bump it to size-10 to match.
Move the floating hamburger from left-2/top-2 to left-4/top-3 so it lines up
with the header's content padding (and the calendar's nav buttons); bump the
non-header page top reserve to pt-14 to clear the taller trigger.
Stack it into a clean back-button row and a date + status row (date left, badge
right) instead of cramming everything into one line where the date wrapped and
the badge floated.
On mobile the header was a whole bar showing only the Draft/Saving/Saved status.
Move that status into the switcher bar (right side) and hide the header on mobile
(the scheduled banner still shows), reclaiming a row. The switcher clears the
floating hamburger when it's the top bar.
… button

Match the switcher tab height to the sidebar trigger (h-10), and let the primary
publish button fill the footer (flex-1) on mobile while staying auto-width on desktop.
Use py-3 so the tabs sit at the same vertical position as the top-3 hamburger,
and rounded-md so the tab corners match the trigger.
It's only the autosave indicator (Draft/Saving/Saved) and it crowded the tabs.
Drop it from the mobile switcher (the desktop header still shows it) so the tabs
get the full bar.
- automations: minimal back-only header on mobile for the workflow builder
  and detail tabs (extracted AutomationMobileBackHeader); open live
  automations on the metrics tab (drafts still open on workflow); full-width
  status filter + refresh on the invocations toolbar; use IconMenu2 for the
  mobile sidebar trigger
- dialogs: stack DialogFooter primary-on-top / cancel-at-bottom on mobile
- workspaces: bring the workspace picker cards into the neo-brutalist design
- posts: left-align the label filter content; wrap the post-view date/status
  header so a long status badge no longer squeezes the date; add hamburger
  clearance to the editor's mobile tab bar
…editor banner

The scheduled-post banner in the editor now clears the floating sidebar
trigger on mobile (pl-12 md:pl-0), aligns its calendar icon to the top of
the text, and matches the hamburger's size (size-10 md:size-9). Desktop is
unchanged.
…atching icon

The workspace switcher now opens to the right on desktop (like the user menu)
and stays below the trigger on mobile, via useSidebar()'s isMobile. The trigger
icon follows the direction: chevron-right on desktop, an up/down selector on
mobile — for both the workspace switcher and the user menu.
@paulocastellano
paulocastellano merged commit 132f84f into main Jul 18, 2026
5 checks passed
@paulocastellano
paulocastellano deleted the feat/mobile-experience branch July 18, 2026 17:37
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.

Improve the mobile experience (especially the post editor)

1 participant