Files
kandev/docs/plans/webkit-transcript-auto-scroll/task-01-use-webkit-safe-bottom-offset.md
T
2026-08-29 07:28:10 +00:00

103 lines
3.7 KiB
Markdown

---
id: "01-use-webkit-safe-bottom-offset"
title: "Use a WebKit-safe bottom offset"
status: done
wave: 1
depends_on: []
plan: "plan.md"
requirements:
- REQ-UI-TRANSCRIPT-AUTO-SCROLL-001
acceptance_criteria:
- AC-UI-TRANSCRIPT-AUTO-SCROLL-001.5
- AC-UI-TRANSCRIPT-AUTO-SCROLL-001.7
system_design:
- ../../specs/ui/system-design/transcript-auto-scroll.md
---
# Task 01: Use a WebKit-safe Bottom Offset
## Summary
Use the largest signed 32-bit integer for write-only bottom placement. Add a
regression that protects WebKit behavior and the no-layout-read contract.
## Failing regression first
Add a test named `uses a WebKit-safe maximum offset for pinned appends`.
Require the setter to receive `2_147_483_647`. The current test receives
`Number.MAX_SAFE_INTEGER`, so the regression fails before the correction.
## In scope
- Change the native bottom offset constant.
- Keep `scrollNativeToBottom` write-only.
- Update the focused unit regression.
- Run the existing desktop and mobile live-message scenarios.
- Update the transcript auto-scroll design with the WebKit range constraint.
## Out of scope
- Other transcript scroll paths or controls.
- Pagination, prepend restoration, and explicit message navigation.
- New user-facing copy or responsive composition.
- Playwright configuration and CI browser installation.
## Acceptance
- Live append writes `2_147_483_647` without reading content size.
- Safari-compatible WebKit clamps the request to the transcript bottom.
- Existing desktop and mobile live-message scenarios remain green.
## Verification
```bash
cd apps && pnpm --filter @kandev/web test -- components/task/chat/message-list-native.test.tsx
cd apps && pnpm --filter @kandev/web run typecheck
cd apps/web && pnpm exec eslint components/task/chat/message-list-native-scroll.ts components/task/chat/message-list-native.test.tsx
python3 scripts/lint-spec-files.py --all
git diff --check -- docs/specs docs/plans apps/web/components/task/chat
cd apps/web && pnpm e2e:run --host --project chromium tests/chat/auto-scroll-toggle.spec.ts -- --grep "enabled auto-scroll stays at the bottom for live messages" --retries=0
cd apps/web && pnpm e2e:run --host --no-build --project mobile-chrome tests/chat/mobile-auto-scroll-toggle.spec.ts -- --grep "enabled auto-scroll stays at the bottom for live messages on mobile" --retries=0
```
## Files likely touched
- `apps/web/components/task/chat/message-list-native-scroll.ts`
- `apps/web/components/task/chat/message-list-native.test.tsx`
- `docs/specs/ui/system-design/transcript-auto-scroll.md`
- `docs/plans/webkit-transcript-auto-scroll/plan.md`
- `docs/plans/webkit-transcript-auto-scroll/task-01-use-webkit-safe-bottom-offset.md`
## Dependencies
None.
## Risks
- The sentinel must remain positive after WebKit converts the scroll offset.
- A regression that only checks Chromium cannot detect this browser difference.
## Parallelism
`sequential`
## Inputs
- `REQ-UI-TRANSCRIPT-AUTO-SCROLL-001` acceptance criteria 5 and 7.
- The bottom-placement section in the transcript auto-scroll design.
- The existing native-scroll unit harness and live-message browser scenarios.
## Results
- Changed the native bottom sentinel from `Number.MAX_SAFE_INTEGER` to
`2_147_483_647`.
- Added a regression that keeps the append path write-only and requires the
WebKit-safe offset.
- The regression failed on the old sentinel and passed after the correction.
- All 27 focused unit tests passed.
- Typecheck, targeted ESLint, specification lint, and diff checks passed.
- The desktop Chromium and mobile Chrome live-message scenarios passed with
retries disabled.
- Direct Chromium, Firefox, and WebKit probes accepted the new offset and
placed the 900 px test container at its bottom.