| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The new theme CSS files introduced several patterns that cause
scroll jank and memory pressure, especially on mobile:
- terminal.css: Full-viewport fixed pseudo-element with repeating
gradient scanlines forced GPU compositing on every scroll frame.
Now limited to desktop only with will-change layer promotion.
- codex.css/sakura.css: text-rendering: optimizeLegibility on body
triggered expensive kerning/ligature computation on all text.
- codex.css: font-feature-settings forced text shaper on every glyph.
- codex.css: hyphens: auto required dictionary lookups during layout.
- style.css: transition: all on buttons and sidebar links caused
unnecessary animation work during scroll hover state changes.
- main.ts: checkReadItems did O(n) individual querySelector calls
per scroll tick; switched to single querySelectorAll batch query.
- Polling interval reduced from 1s to 3s (scroll handler already
covers the normal case, polling is just a robustness fallback).
https://claude.ai/code/session_0187FXrbScDSWfbNEk9SfJaj
|
| |
|
|
| |
headers and body, update monospace stack, and soft-deprecate tags
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The IntersectionObserver approach for infinite scroll was unreliable —
items would not load when scrolling to the bottom in v3, while v1's
polling approach worked fine. The issue was that IntersectionObserver
with a custom root element (main-content, whose height comes from flex
align-items:stretch rather than an explicit height) didn't fire
reliably, and renderItems() being called 3 times per fetch cycle
(from both items-updated and loading-state-changed events) kept
destroying and recreating the observer.
Replace with a simple scroll-position check in the existing onscroll
handler, matching v1's proven approach: when the user scrolls within
200px of the bottom of #main-content, trigger loadMore(). This runs
on every scroll event (cheap arithmetic comparison) and only fires
when content actually overflows the container.
Remove the unused itemObserver module-level variable.
Update regression tests to simulate scroll position instead of
IntersectionObserver callbacks, with 4 cases: scroll near bottom
triggers load, scroll far from bottom doesn't, loading=true blocks,
and hasMore=false hides sentinel.
https://claude.ai/code/session_01DpWhB9uGGMBnzqS28HxnuV
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The load-more sentinel observer was assigned to a local `const observer`
that fell out of scope after renderItems() returned. Without a persistent
JS reference, engines can garbage-collect the observer, silently breaking
infinite scroll (no more items loaded on scroll).
Fix: assign to the existing module-level `itemObserver` variable, which is
already disconnected/replaced at the top of each renderItems() call.
Add three regression tests in regression.test.ts that use a class-based
IntersectionObserver mock to capture the callback and verify:
- sentinel visible → loadMore fires
- sentinel visible while loading → loadMore suppressed
- hasMore=false → no sentinel rendered, no loadMore
https://claude.ai/code/session_01DpWhB9uGGMBnzqS28HxnuV
|
| |
|
|
|
|
|
|
|
|
| |
- NK-t8qnrh: test that item-description renders links in feed items
- NK-mcl01m: test sidebar section order (filters → search → feeds → tags),
and presence of "+ new" link
- NK-z1czaq: test that sidebar and main-content are siblings (overlay layout)
- Import renderLayout and createFeedItem into regression test suite
https://claude.ai/code/session_01DpWhB9uGGMBnzqS28HxnuV
|
| |
|
|
| |
viewport, while keeping V1 unchanged
|
| | |
|
| |
|