summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJay V <[email protected]>2025-06-27 19:16:33 -0400
committerJay V <[email protected]>2025-06-27 19:16:33 -0400
commit145df084440470bb53655f62b5f5588e2615f1ba (patch)
treec7c78c87b0ea6f86a47b977461cbfffe25e2372d
parent8b400515ea5ab4637866cd14a30423b7c7dc9b77 (diff)
downloadopencode-145df084440470bb53655f62b5f5588e2615f1ba.tar.gz
opencode-145df084440470bb53655f62b5f5588e2615f1ba.zip
docs: share page format
-rw-r--r--packages/web/src/components/Share.tsx67
-rw-r--r--packages/web/src/components/share.module.css9
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);
}