summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Hill <[email protected]>2026-02-26 23:18:35 +0000
committerDavid Hill <[email protected]>2026-02-26 23:18:35 +0000
commit7a74be3b478bf32aa844d823561c71799aa2b8d3 (patch)
treeec528055fb99ebb3dc274d40244b733e52aba5f9
parentc95febb1d5c0a4533810ae94e61bd84c4ac345bc (diff)
downloadopencode-7a74be3b478bf32aa844d823561c71799aa2b8d3.tar.gz
opencode-7a74be3b478bf32aa844d823561c71799aa2b8d3.zip
tweak(ui): add border to filetree on scroll
-rw-r--r--packages/app/src/pages/session/session-side-panel.tsx36
-rw-r--r--packages/ui/src/components/tabs.css6
2 files changed, 39 insertions, 3 deletions
diff --git a/packages/app/src/pages/session/session-side-panel.tsx b/packages/app/src/pages/session/session-side-panel.tsx
index 5c8efff38..a86e8b365 100644
--- a/packages/app/src/pages/session/session-side-panel.tsx
+++ b/packages/app/src/pages/session/session-side-panel.tsx
@@ -145,8 +145,12 @@ export function SessionSidePanel(props: {
const [store, setStore] = createStore({
activeDraggable: undefined as string | undefined,
+ fileTreeScrolled: false,
})
+ let changesEl: HTMLDivElement | undefined
+ let allEl: HTMLDivElement | undefined
+
const handleDragStart = (event: unknown) => {
const id = getDraggableId(event)
if (!id) return
@@ -168,6 +172,14 @@ export function SessionSidePanel(props: {
}
createEffect(() => {
+ if (!layout.fileTree.opened()) return
+ const tab = fileTreeTab()
+ const el = tab === "changes" ? changesEl : allEl
+ const next = (el?.scrollTop ?? 0) > 0
+ setStore("fileTreeScrolled", (current) => (current === next ? current : next))
+ })
+
+ createEffect(() => {
if (!file.ready()) return
setSessionHandoff(sessionKey(), {
@@ -335,7 +347,7 @@ export function SessionSidePanel(props: {
class="h-full"
data-scope="filetree"
>
- <Tabs.List>
+ <Tabs.List data-scrolled={store.fileTreeScrolled ? "" : undefined}>
<Tabs.Trigger value="changes" class="flex-1" classes={{ button: "w-full" }}>
{reviewCount()}{" "}
{language.t(reviewCount() === 1 ? "session.review.change.one" : "session.review.change.other")}
@@ -344,7 +356,16 @@ export function SessionSidePanel(props: {
{language.t("session.files.all")}
</Tabs.Trigger>
</Tabs.List>
- <Tabs.Content value="changes" class="bg-background-stronger px-3 py-0">
+ <Tabs.Content
+ value="changes"
+ ref={(el: HTMLDivElement) => (changesEl = el)}
+ onScroll={(e: UIEvent & { currentTarget: HTMLDivElement }) => {
+ if (fileTreeTab() !== "changes") return
+ const next = e.currentTarget.scrollTop > 0
+ setStore("fileTreeScrolled", (current) => (current === next ? current : next))
+ }}
+ class="bg-background-stronger px-3 py-0"
+ >
<Switch>
<Match when={hasReview()}>
<Show
@@ -373,7 +394,16 @@ export function SessionSidePanel(props: {
</Match>
</Switch>
</Tabs.Content>
- <Tabs.Content value="all" class="bg-background-stronger px-3 py-0">
+ <Tabs.Content
+ value="all"
+ ref={(el: HTMLDivElement) => (allEl = el)}
+ onScroll={(e: UIEvent & { currentTarget: HTMLDivElement }) => {
+ if (fileTreeTab() !== "all") return
+ const next = e.currentTarget.scrollTop > 0
+ setStore("fileTreeScrolled", (current) => (current === next ? current : next))
+ }}
+ class="bg-background-stronger px-3 py-0"
+ >
<FileTree
path=""
modified={diffFiles()}
diff --git a/packages/ui/src/components/tabs.css b/packages/ui/src/components/tabs.css
index 23de4ee05..8b54824e7 100644
--- a/packages/ui/src/components/tabs.css
+++ b/packages/ui/src/components/tabs.css
@@ -386,6 +386,12 @@
gap: 8px;
align-items: center;
background-color: var(--background-stronger);
+ box-sizing: border-box;
+ border-bottom: 1px solid transparent;
+
+ &[data-scrolled] {
+ border-bottom-color: var(--border-weak-base);
+ }
}
[data-slot="tabs-trigger-wrapper"] {