fix(app): auto-scroll
This commit is contained in:
@@ -381,6 +381,22 @@ export default function Page() {
|
|||||||
let promptDock: HTMLDivElement | undefined
|
let promptDock: HTMLDivElement | undefined
|
||||||
let scroller: HTMLDivElement | undefined
|
let scroller: HTMLDivElement | undefined
|
||||||
|
|
||||||
|
const [scrollGesture, setScrollGesture] = createSignal(0)
|
||||||
|
const scrollGestureWindowMs = 250
|
||||||
|
|
||||||
|
const markScrollGesture = (target?: EventTarget | null) => {
|
||||||
|
const root = scroller
|
||||||
|
if (!root) return
|
||||||
|
|
||||||
|
const el = target instanceof Element ? target : undefined
|
||||||
|
const nested = el?.closest("[data-scrollable]")
|
||||||
|
if (nested && nested !== root) return
|
||||||
|
|
||||||
|
setScrollGesture(Date.now())
|
||||||
|
}
|
||||||
|
|
||||||
|
const hasScrollGesture = () => Date.now() - scrollGesture() < scrollGestureWindowMs
|
||||||
|
|
||||||
createEffect(() => {
|
createEffect(() => {
|
||||||
if (!params.id) return
|
if (!params.id) return
|
||||||
sync.session.sync(params.id)
|
sync.session.sync(params.id)
|
||||||
@@ -795,6 +811,12 @@ export default function Page() {
|
|||||||
// Don't autofocus chat if terminal panel is open
|
// Don't autofocus chat if terminal panel is open
|
||||||
if (view().terminal.opened()) return
|
if (view().terminal.opened()) return
|
||||||
|
|
||||||
|
// Only treat explicit scroll keys as potential "user scroll" gestures.
|
||||||
|
if (event.key === "PageUp" || event.key === "PageDown" || event.key === "Home" || event.key === "End") {
|
||||||
|
markScrollGesture()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if (event.key.length === 1 && event.key !== "Unidentified" && !(event.ctrlKey || event.metaKey)) {
|
if (event.key.length === 1 && event.key !== "Unidentified" && !(event.ctrlKey || event.metaKey)) {
|
||||||
inputRef?.focus()
|
inputRef?.focus()
|
||||||
}
|
}
|
||||||
@@ -1385,7 +1407,15 @@ export default function Page() {
|
|||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
ref={setScrollRef}
|
ref={setScrollRef}
|
||||||
|
onWheel={(e) => markScrollGesture(e.target)}
|
||||||
|
onTouchMove={(e) => markScrollGesture(e.target)}
|
||||||
|
onPointerDown={(e) => {
|
||||||
|
if (e.target !== e.currentTarget) return
|
||||||
|
markScrollGesture(e.target)
|
||||||
|
}}
|
||||||
onScroll={(e) => {
|
onScroll={(e) => {
|
||||||
|
if (!hasScrollGesture()) return
|
||||||
|
setScrollGesture(Date.now())
|
||||||
autoScroll.handleScroll()
|
autoScroll.handleScroll()
|
||||||
if (isDesktop() && autoScroll.userScrolled()) scheduleScrollSpy(e.currentTarget)
|
if (isDesktop() && autoScroll.userScrolled()) scheduleScrollSpy(e.currentTarget)
|
||||||
}}
|
}}
|
||||||
|
|||||||
Reference in New Issue
Block a user