summaryrefslogtreecommitdiffhomepage
path: root/packages/ui/src/components
diff options
context:
space:
mode:
authorAdam <[email protected]>2025-11-25 13:49:43 -0600
committerAdam <[email protected]>2025-11-25 13:49:46 -0600
commitcd678044129ef8a183773e3544f2265696645675 (patch)
tree23affcf248612e1e0599682d280a435dc0c9ac36 /packages/ui/src/components
parent4a95db60138f0c1ab6e384c5b2cba9141420b3a7 (diff)
downloadopencode-cd678044129ef8a183773e3544f2265696645675.tar.gz
opencode-cd678044129ef8a183773e3544f2265696645675.zip
fix: scroll gutter
Diffstat (limited to 'packages/ui/src/components')
-rw-r--r--packages/ui/src/components/session-review.css5
-rw-r--r--packages/ui/src/components/session-review.tsx102
2 files changed, 61 insertions, 46 deletions
diff --git a/packages/ui/src/components/session-review.css b/packages/ui/src/components/session-review.css
index 554de8022..ba195b9f2 100644
--- a/packages/ui/src/components/session-review.css
+++ b/packages/ui/src/components/session-review.css
@@ -5,11 +5,14 @@
height: 100%;
overflow-y: auto;
scrollbar-width: none;
-
&::-webkit-scrollbar {
display: none;
}
+ /* [data-slot="session-review-container"] { */
+ /* height: 100%; */
+ /* } */
+
[data-slot="session-review-header"] {
position: sticky;
top: 0;
diff --git a/packages/ui/src/components/session-review.tsx b/packages/ui/src/components/session-review.tsx
index 36dbf36a9..376317e1b 100644
--- a/packages/ui/src/components/session-review.tsx
+++ b/packages/ui/src/components/session-review.tsx
@@ -6,7 +6,7 @@ import { FileIcon } from "./file-icon"
import { Icon } from "./icon"
import { StickyAccordionHeader } from "./sticky-accordion-header"
import { getDirectory, getFilename } from "@opencode-ai/util/path"
-import { For, Match, Show, Switch, type JSX, splitProps } from "solid-js"
+import { For, Match, Show, Switch, type JSX } from "solid-js"
import { createStore } from "solid-js/store"
import { type FileDiff } from "@opencode-ai/sdk"
import { PreloadMultiFileDiffResult } from "@pierre/precision-diffs/ssr"
@@ -15,6 +15,7 @@ export interface SessionReviewProps {
split?: boolean
class?: string
classList?: Record<string, boolean | undefined>
+ classes?: { root?: string; header?: string; container?: string }
actions?: JSX.Element
diffs: (FileDiff & { preloaded?: PreloadMultiFileDiffResult<any> })[]
}
@@ -39,17 +40,21 @@ export const SessionReview = (props: SessionReviewProps) => {
}
}
- const [split] = splitProps(props, ["class", "classList"])
-
return (
<div
data-component="session-review"
classList={{
- ...(split.classList ?? {}),
- [split.class ?? ""]: !!split.class,
+ ...(props.classList ?? {}),
+ [props.classes?.root ?? ""]: !!props.classes?.root,
+ [props.class ?? ""]: !!props.class,
}}
>
- <div data-slot="session-review-header">
+ <div
+ data-slot="session-review-header"
+ classList={{
+ [props.classes?.header ?? ""]: !!props.classes?.header,
+ }}
+ >
<div data-slot="session-review-title">Session changes</div>
<div data-slot="session-review-actions">
<Button size="normal" icon="chevron-grabber-vertical" onClick={handleExpandOrCollapseAll}>
@@ -61,47 +66,54 @@ export const SessionReview = (props: SessionReviewProps) => {
{props.actions}
</div>
</div>
- <Accordion multiple value={store.open} onChange={handleChange}>
- <For each={props.diffs}>
- {(diff) => (
- <Accordion.Item forceMount value={diff.file} data-slot="session-review-accordion-item">
- <StickyAccordionHeader>
- <Accordion.Trigger>
- <div data-slot="session-review-trigger-content">
- <div data-slot="session-review-file-info">
- <FileIcon node={{ path: diff.file, type: "file" }} />
- <div data-slot="session-review-file-name-container">
- <Show when={diff.file.includes("/")}>
- <span data-slot="session-review-directory">{getDirectory(diff.file)}&lrm;</span>
- </Show>
- <span data-slot="session-review-filename">{getFilename(diff.file)}</span>
+ <div
+ data-slot="session-review-container"
+ classList={{
+ [props.classes?.container ?? ""]: !!props.classes?.container,
+ }}
+ >
+ <Accordion multiple value={store.open} onChange={handleChange}>
+ <For each={props.diffs}>
+ {(diff) => (
+ <Accordion.Item forceMount value={diff.file} data-slot="session-review-accordion-item">
+ <StickyAccordionHeader>
+ <Accordion.Trigger>
+ <div data-slot="session-review-trigger-content">
+ <div data-slot="session-review-file-info">
+ <FileIcon node={{ path: diff.file, type: "file" }} />
+ <div data-slot="session-review-file-name-container">
+ <Show when={diff.file.includes("/")}>
+ <span data-slot="session-review-directory">{getDirectory(diff.file)}&lrm;</span>
+ </Show>
+ <span data-slot="session-review-filename">{getFilename(diff.file)}</span>
+ </div>
+ </div>
+ <div data-slot="session-review-trigger-actions">
+ <DiffChanges changes={diff} />
+ <Icon name="chevron-grabber-vertical" size="small" />
</div>
</div>
- <div data-slot="session-review-trigger-actions">
- <DiffChanges changes={diff} />
- <Icon name="chevron-grabber-vertical" size="small" />
- </div>
- </div>
- </Accordion.Trigger>
- </StickyAccordionHeader>
- <Accordion.Content data-slot="session-review-accordion-content">
- <Diff
- preloadedDiff={diff.preloaded}
- diffStyle={props.split ? "split" : "unified"}
- before={{
- name: diff.file!,
- contents: diff.before!,
- }}
- after={{
- name: diff.file!,
- contents: diff.after!,
- }}
- />
- </Accordion.Content>
- </Accordion.Item>
- )}
- </For>
- </Accordion>
+ </Accordion.Trigger>
+ </StickyAccordionHeader>
+ <Accordion.Content data-slot="session-review-accordion-content">
+ <Diff
+ preloadedDiff={diff.preloaded}
+ diffStyle={props.split ? "split" : "unified"}
+ before={{
+ name: diff.file!,
+ contents: diff.before!,
+ }}
+ after={{
+ name: diff.file!,
+ contents: diff.after!,
+ }}
+ />
+ </Accordion.Content>
+ </Accordion.Item>
+ )}
+ </For>
+ </Accordion>
+ </div>
</div>
)
}