Uh oh!
There was an error while loading. Please reload this page.
Fix fan clubs explore CTA banner fixed-position behavior - #14147
Conversation
Co-authored-by: Ray Jacobson <raymondjacobson@users.noreply.github.com>
|
julianbaker
commented
Apr 20, 2026
fixed the web lint issue |
🌐 Web preview readyPreview URL:https://audius-web-preview-pr-14147.audius.workers.dev Unique preview for this PR (deployed from this branch). |
Uh oh!
There was an error while loading. Please reload this page.
Matches the pattern used in #14147 for the same category of fix. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
## Summary - Fix `AnchoredSubmitRow` / `AnchoredSubmitRowEdit` falling into document flow mid-page on the upload and edit-track forms so the Complete Upload / Save Changes footer is viewport-anchored again. - Same category of fix as #14147. ## Root cause `.mainContentWrapper` got `transform: translateX(var(--nav-shift))` in #14134 (Shrinking sidebar). A transform on an ancestor creates a containing block for `position: fixed` descendants, so the submit row was positioning relative to the scrolling content instead of the viewport. The mobile variant of `.mainContentWrapper` already sets `transform: none` with a comment calling out this exact hazard for the fixed mobile header — the desktop row case was missed. A second, smaller regression: the Frosted swap in #13157 replaced `<Flex>` with `<Frosted>` and dropped the solid `background: var(--harmony-bg-surface-1)`, letting form content bleed through the translucent gradient. ## Changes - `AnchoredSubmitRow.tsx` / `AnchoredSubmitRowEdit.tsx`: - Portal into `mainContentRef.current?.parentElement` (the `.app` shell) via `usePortal` + `useMainContentRef` — matches the pattern in #14147. - Button is now `type='button'` calling `submitForm()` from `useFormikContext` since it no longer lives inside `<Form>` in the DOM. - `AnchoredSubmitRow.module.css` / `AnchoredSubmitRowEdit.module.css`: - Re-added `background: var(--harmony-bg-surface-1)` on `.buttonRow`. - Dropped `display: flex` / `flex-direction` / `align-items` / `padding` shorthand — the inner `<Frosted>` is already a Flex column and handles alignment via the `alignItems` prop. ## Validation - Mechanical check in a dev preview confirmed a fixed-positioned element inside `.mainContentWrapper` anchors to the wrapper bottom (1218px), while the same element inside `#webPlayer` lands at viewport bottom minus play-bar height, flush with the play-bar top — matching the expected behavior. - Couldn't exercise the live form interactively (preview session was logged out). ## Test plan - [ ] Open `/upload`, pick a track, reach the Complete Your Track step — Complete Upload footer sits at the bottom of the viewport, above the play bar. - [ ] Scroll the form — footer stays pinned. - [ ] Click Complete Upload with invalid fields — error pill appears; with valid fields — upload confirmation modal opens. - [ ] Resize the sidebar — footer slides with the nav shift and stays anchored. - [ ] Open an existing track's edit page — Save Changes / Cancel row behaves the same way. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Summary
usePortal.Root Cause
transform: translateX(var(--nav-shift)), which creates a containing block forposition: fixeddescendants.Changes
packages/web/src/pages/fan-clubs-explore-page/FanClubsExplorePage.tsx:usePortalanduseMainContentRef.mainContentRef.current?.parentElement(app shell).Validation
eslintbinary in this workspace context.