Share sheet on phone shows its title twice #1012

Open
opened 2026-10-03 14:28:32 +00:00 by kayg · 5 comments
Owner

The 390 px production Share sheet shows its title twice: the OverlaySurface phone header and ShareDialog’s own share-head/UIHeading. The desktop dialog has one visible title. This is visible in both light and dark in the final #981 macOS-emulated captures.

view-only-folder-dialog-390-paper.png

ShareDialog passes title to OverlaySurface and also renders its own heading/close row. These parts are present on origin/dev; #981 only removes the public Edit option. Preserve one accessible title and close action on each layout. No visual redesign or extra navigation bar is needed. This is a cosmetic follow-up, not an authorization defect.

The 390 px production Share sheet shows its title twice: the OverlaySurface phone header and ShareDialog’s own share-head/UIHeading. The desktop dialog has one visible title. This is visible in both light and dark in the final #981 macOS-emulated captures. [view-only-folder-dialog-390-paper.png](https://git.kayg.org/attachments/88e03555-bddd-4403-a7b5-4511ac0b2d2f) ShareDialog passes title to OverlaySurface and also renders its own heading/close row. These parts are present on origin/dev; #981 only removes the public Edit option. Preserve one accessible title and close action on each layout. No visual redesign or extra navigation bar is needed. This is a cosmetic follow-up, not an authorization defect.
Author
Owner

Starting work on job/sharetitle-1012, based on origin/dev at f2f8491ff5c76ab28f140c964542c97362e6b119.

Starting work on `job/sharetitle-1012`, based on `origin/dev` at `f2f8491ff5c76ab28f140c964542c97362e6b119`.
Author
Owner

Finding: OverlaySurface derives the phone sheet title from its label, and ShareDialog also rendered a UIHeading in .share-head; both were present in the production source. The phone layout now uses the shared title row and trailing close control, while the desktop retains its existing row. Regression assertions cover both layouts, title count, close action and phone touch size. The first bun run check could not start because the worktree has no installed typescript package; I am installing the locked web dependencies before rerunning it.

Finding: `OverlaySurface` derives the phone sheet title from its `label`, and ShareDialog also rendered a `UIHeading` in `.share-head`; both were present in the production source. The phone layout now uses the shared title row and trailing close control, while the desktop retains its existing row. Regression assertions cover both layouts, title count, close action and phone touch size. The first `bun run check` could not start because the worktree has no installed `typescript` package; I am installing the locked web dependencies before rerunning it.
Author
Owner

The first production Share run exposed a test locator issue before the dialog opened: Files intentionally ellipsizes the long visible filename (…AAAA…), while the row keeps the full filename in aria-label; the API also returned the full fixture name (200). I updated the browser helper to locate the exact accessible option name, so it can exercise the existing long-name scenario without changing its expected behavior.

The first production Share run exposed a test locator issue before the dialog opened: Files intentionally ellipsizes the long visible filename (`…AAAA…`), while the row keeps the full filename in `aria-label`; the API also returned the full fixture name (200). I updated the browser helper to locate the exact accessible option name, so it can exercise the existing long-name scenario without changing its expected behavior.
Author
Owner

Focused CALTERNAL_E2E_SHARE_TITLE_ONLY=1 passes. It checks one visible title, one accessible close action at 390/820/1440, the 44 px phone target, and saves the six macOS-emulated light/dark captures. The longer existing Share audit continues beyond those checks but later fails at its Gallery assertion that the rendered tile text equals the full 120-character filename. A screenshot-enabled full audit also reaches an anonymous-page capture that assumes window.__userStorageTest exists. I did not change either expectation; the focused issue regression passes independently.

Focused `CALTERNAL_E2E_SHARE_TITLE_ONLY=1` passes. It checks one visible title, one accessible close action at 390/820/1440, the 44 px phone target, and saves the six macOS-emulated light/dark captures. The longer existing Share audit continues beyond those checks but later fails at its Gallery assertion that the rendered tile text equals the full 120-character filename. A screenshot-enabled full audit also reaches an anonymous-page capture that assumes `window.__userStorageTest` exists. I did not change either expectation; the focused issue regression passes independently.
Author
Owner

Finished — READY FOR MERGE: yes

Implemented #1012. The phone Share sheet now uses the title and close action in OverlaySurface's fixed sheet chrome. The desktop dialog keeps its existing title and close row. The phone close target is 44 px, and the browser regression checks one visible title and one accessible close action at all review widths.

Files changed:

  • apps/web/src/lib/files/ShareDialog.svelte
  • apps/web/e2e/share.mjs
  • apps/web/e2e/harness.mjs

Head SHA: b198f5e7775e0fffd455ddd28984504facb2874e. git fetch origin && git merge origin/dev returned Already up to date.

Gate output

bun run check:

$ node scripts/check-user-storage.mjs && node scripts/check-type-tokens.mjs && node scripts/check-motion-tokens.mjs && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json
User browser caches use userStorage; only documented device/public-link exceptions remain.
Text sizes and UI shape values use shared role tokens.
UI transitions and animation options use shared motion tokens or documented exceptions.
Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/sharetitle-1012/apps/web
Getting Svelte diagnostics...

svelte-check found 0 errors and 0 warnings

Focused production browser regression (CALTERNAL_E2E_SHARE_TITLE_ONLY=1):

SCREENSHOT dialog-long-name-1440-paper.png
SCREENSHOT dialog-long-name-820-paper.png
SCREENSHOT dialog-long-name-390-paper.png
SCREENSHOT dialog-long-name-1440-tokyo-night.png
SCREENSHOT dialog-long-name-820-tokyo-night.png
SCREENSHOT dialog-long-name-390-tokyo-night.png
PASS Share has one title and close action at phone, tablet and desktop widths; phone close meets the 44 px target
SHARE TITLE E2E PASSED
CSP REPORTS share: 0 across 1 pages

The full bun e2e/share.mjs audit continues past the issue checks, then fails at its Gallery assertion: AssertionError: a gallery tile shows the non-image file name (share.mjs:524). In screenshot mode it also hits an anonymous-page capture helper error because window.__userStorageTest is not installed there. I left those existing expectations unchanged. No Rust source changed; I built calternal-server after the production web build for the browser run, then ran cargo clean (Removed 7238 files, 4.6GiB total). Web build output was removed.

Six macOS-emulated captures remain in artifacts/sharetitle-1012/ at 390, 820 and 1440 px in light and dark. I could not attach them: scripts/fj issue has no attachment command, and the direct Forgejo asset upload returned {"message":"token is required","url":"https://git.kayg.org/api/swagger"} with HTTP 401. The PNGs are not committed.

Decision: use OverlaySurface's existing sheetTitle and sheetTrailing on phone, and keep the existing ShareDialog row on desktop. This follows DESIGN §34 and the issue's one-title requirement; no open design decision was needed.

## Finished — READY FOR MERGE: yes Implemented #1012. The phone Share sheet now uses the title and close action in OverlaySurface's fixed sheet chrome. The desktop dialog keeps its existing title and close row. The phone close target is 44 px, and the browser regression checks one visible title and one accessible close action at all review widths. Files changed: - `apps/web/src/lib/files/ShareDialog.svelte` - `apps/web/e2e/share.mjs` - `apps/web/e2e/harness.mjs` Head SHA: `b198f5e7775e0fffd455ddd28984504facb2874e`. `git fetch origin && git merge origin/dev` returned `Already up to date.` ### Gate output `bun run check`: ``` $ node scripts/check-user-storage.mjs && node scripts/check-type-tokens.mjs && node scripts/check-motion-tokens.mjs && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json User browser caches use userStorage; only documented device/public-link exceptions remain. Text sizes and UI shape values use shared role tokens. UI transitions and animation options use shared motion tokens or documented exceptions. Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/sharetitle-1012/apps/web Getting Svelte diagnostics... svelte-check found 0 errors and 0 warnings ``` Focused production browser regression (`CALTERNAL_E2E_SHARE_TITLE_ONLY=1`): ``` SCREENSHOT dialog-long-name-1440-paper.png SCREENSHOT dialog-long-name-820-paper.png SCREENSHOT dialog-long-name-390-paper.png SCREENSHOT dialog-long-name-1440-tokyo-night.png SCREENSHOT dialog-long-name-820-tokyo-night.png SCREENSHOT dialog-long-name-390-tokyo-night.png PASS Share has one title and close action at phone, tablet and desktop widths; phone close meets the 44 px target SHARE TITLE E2E PASSED CSP REPORTS share: 0 across 1 pages ``` The full `bun e2e/share.mjs` audit continues past the issue checks, then fails at its Gallery assertion: `AssertionError: a gallery tile shows the non-image file name` (`share.mjs:524`). In screenshot mode it also hits an anonymous-page capture helper error because `window.__userStorageTest` is not installed there. I left those existing expectations unchanged. No Rust source changed; I built `calternal-server` after the production web build for the browser run, then ran `cargo clean` (`Removed 7238 files, 4.6GiB total`). Web build output was removed. Six macOS-emulated captures remain in `artifacts/sharetitle-1012/` at 390, 820 and 1440 px in light and dark. I could not attach them: `scripts/fj issue` has no attachment command, and the direct Forgejo asset upload returned `{"message":"token is required","url":"https://git.kayg.org/api/swagger"}` with HTTP 401. The PNGs are not committed. Decision: use OverlaySurface's existing `sheetTitle` and `sheetTrailing` on phone, and keep the existing ShareDialog row on desktop. This follows DESIGN §34 and the issue's one-title requirement; no open design decision was needed.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/calternal#1012
No description provided.