diff options
| author | Jay V <[email protected]> | 2025-06-27 19:16:33 -0400 |
|---|---|---|
| committer | Jay V <[email protected]> | 2025-06-27 19:16:33 -0400 |
| commit | 145df084440470bb53655f62b5f5588e2615f1ba (patch) | |
| tree | c7c78c87b0ea6f86a47b977461cbfffe25e2372d | |
| parent | 8b400515ea5ab4637866cd14a30423b7c7dc9b77 (diff) | |
| download | opencode-145df084440470bb53655f62b5f5588e2615f1ba.tar.gz opencode-145df084440470bb53655f62b5f5588e2615f1ba.zip | |
docs: share page format
| -rw-r--r-- | packages/web/src/components/Share.tsx | 67 | ||||
| -rw-r--r-- | packages/web/src/components/share.module.css | 9 |
2 files changed, 30 insertions, 46 deletions
diff --git a/packages/web/src/components/Share.tsx b/packages/web/src/components/Share.tsx index b48d04662..008f863c9 100644 --- a/packages/web/src/components/Share.tsx +++ b/packages/web/src/components/Share.tsx @@ -595,12 +595,17 @@ export default function Share(props: { info: Session.Info messages: Record<string, Message.Info> }) { + let lastScrollY = 0 let hasScrolled = false + let scrollTimeout: number | undefined const id = props.id const params = new URLSearchParams(window.location.search) const debug = params.get("debug") === "true" + const [showScrollButton, setShowScrollButton] = createSignal(false) + const [isButtonHovered, setIsButtonHovered] = createSignal(false) + const anchorId = createMemo<string | null>(() => { const raw = window.location.hash.slice(1) const [id] = raw.split("-") @@ -716,23 +721,18 @@ export default function Share(props: { }) }) - const [showScrollButton, setShowScrollButton] = createSignal(false) - const [isButtonHovered, setIsButtonHovered] = createSignal(false) - let scrollTimeout: number | undefined - let lastScrollY = 0 - - const checkScrollNeed = () => { + function checkScrollNeed() { const currentScrollY = window.scrollY const isScrollingDown = currentScrollY > lastScrollY const scrolled = currentScrollY > 200 // Show after scrolling 200px const isNearBottom = window.innerHeight + currentScrollY >= document.body.scrollHeight - 100 - + // Only show when scrolling down, scrolled enough, and not near bottom const shouldShow = isScrollingDown && scrolled && !isNearBottom - + // Update last scroll position lastScrollY = currentScrollY - + if (shouldShow) { setShowScrollButton(true) // Clear existing timeout @@ -754,30 +754,6 @@ export default function Share(props: { } } - const handleButtonMouseEnter = () => { - setIsButtonHovered(true) - // Clear timeout when hovering - if (scrollTimeout) { - clearTimeout(scrollTimeout) - } - } - - const handleButtonMouseLeave = () => { - setIsButtonHovered(false) - // Restart timeout when leaving hover - if (showScrollButton()) { - scrollTimeout = window.setTimeout(() => { - if (!isButtonHovered()) { - setShowScrollButton(false) - } - }, 3000) - } - } - - const scrollToBottom = () => { - document.body.scrollIntoView({ behavior: "smooth", block: "end" }) - } - onMount(() => { lastScrollY = window.scrollY // Initialize scroll position checkScrollNeed() @@ -1982,14 +1958,29 @@ export default function Share(props: { </div> </Show> - {/* Floating scroll to bottom button */} <Show when={showScrollButton()}> <button type="button" - class={styles.scrollButton} - onClick={scrollToBottom} - onMouseEnter={handleButtonMouseEnter} - onMouseLeave={handleButtonMouseLeave} + class={styles["scroll-button"]} + onClick={() => + document.body.scrollIntoView({ behavior: "smooth", block: "end" }) + } + onMouseEnter={() => { + setIsButtonHovered(true) + if (scrollTimeout) { + clearTimeout(scrollTimeout) + } + }} + onMouseLeave={() => { + setIsButtonHovered(false) + if (showScrollButton()) { + scrollTimeout = window.setTimeout(() => { + if (!isButtonHovered()) { + setShowScrollButton(false) + } + }, 3000) + } + }} title="Scroll to bottom" aria-label="Scroll to bottom" > diff --git a/packages/web/src/components/share.module.css b/packages/web/src/components/share.module.css index 41b257dad..dafbdd8a2 100644 --- a/packages/web/src/components/share.module.css +++ b/packages/web/src/components/share.module.css @@ -785,7 +785,7 @@ } } -.scrollButton { +.scroll-button { position: fixed; bottom: 2rem; right: 2rem; @@ -799,18 +799,11 @@ display: flex; align-items: center; justify-content: center; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); transition: all 0.15s ease, opacity 0.5s ease; z-index: 100; appearance: none; opacity: 1; - &:hover { - color: var(--sl-color-text); - border-color: var(--sl-color-hairline); - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); - } - &:active { transform: translateY(1px); } |
