summaryrefslogtreecommitdiffhomepage
path: root/packages/ui/src/components
diff options
context:
space:
mode:
authoradamelmore <[email protected]>2026-01-25 21:57:30 -0600
committeradamelmore <[email protected]>2026-01-26 11:07:51 -0600
commitebeed03115b61f812c56c66785a09be61be35468 (patch)
tree8838b6a7a3533c9783e6f7bdd03e1b1795fa8a2a /packages/ui/src/components
parentd9eed4c6cacf59089e6b6d6101deff58c7bd5040 (diff)
downloadopencode-ebeed03115b61f812c56c66785a09be61be35468.tar.gz
opencode-ebeed03115b61f812c56c66785a09be61be35468.zip
wip(app): file tree mode
Diffstat (limited to 'packages/ui/src/components')
-rw-r--r--packages/ui/src/components/resize-handle.css12
-rw-r--r--packages/ui/src/components/resize-handle.tsx13
-rw-r--r--packages/ui/src/components/session-review.tsx14
3 files changed, 37 insertions, 2 deletions
diff --git a/packages/ui/src/components/resize-handle.css b/packages/ui/src/components/resize-handle.css
index 6aac4c2fd..c309ff838 100644
--- a/packages/ui/src/components/resize-handle.css
+++ b/packages/ui/src/components/resize-handle.css
@@ -21,6 +21,12 @@
transform: translateX(50%);
cursor: col-resize;
+ &[data-edge="start"] {
+ inset-inline-start: 0;
+ inset-inline-end: auto;
+ transform: translateX(-50%);
+ }
+
&::after {
width: 3px;
inset-block: 0;
@@ -36,6 +42,12 @@
transform: translateY(-50%);
cursor: row-resize;
+ &[data-edge="end"] {
+ inset-block-start: auto;
+ inset-block-end: 0;
+ transform: translateY(50%);
+ }
+
&::after {
height: 3px;
inset-inline: 0;
diff --git a/packages/ui/src/components/resize-handle.tsx b/packages/ui/src/components/resize-handle.tsx
index 3ad01e27f..e2eed1bb7 100644
--- a/packages/ui/src/components/resize-handle.tsx
+++ b/packages/ui/src/components/resize-handle.tsx
@@ -2,6 +2,7 @@ import { splitProps, type JSX } from "solid-js"
export interface ResizeHandleProps extends Omit<JSX.HTMLAttributes<HTMLDivElement>, "onResize"> {
direction: "horizontal" | "vertical"
+ edge?: "start" | "end"
size: number
min: number
max: number
@@ -13,6 +14,7 @@ export interface ResizeHandleProps extends Omit<JSX.HTMLAttributes<HTMLDivElemen
export function ResizeHandle(props: ResizeHandleProps) {
const [local, rest] = splitProps(props, [
"direction",
+ "edge",
"size",
"min",
"max",
@@ -25,6 +27,7 @@ export function ResizeHandle(props: ResizeHandleProps) {
const handleMouseDown = (e: MouseEvent) => {
e.preventDefault()
+ const edge = local.edge ?? (local.direction === "vertical" ? "start" : "end")
const start = local.direction === "horizontal" ? e.clientX : e.clientY
const startSize = local.size
let current = startSize
@@ -34,7 +37,14 @@ export function ResizeHandle(props: ResizeHandleProps) {
const onMouseMove = (moveEvent: MouseEvent) => {
const pos = local.direction === "horizontal" ? moveEvent.clientX : moveEvent.clientY
- const delta = local.direction === "vertical" ? start - pos : pos - start
+ const delta =
+ local.direction === "vertical"
+ ? edge === "end"
+ ? pos - start
+ : start - pos
+ : edge === "start"
+ ? start - pos
+ : pos - start
current = startSize + delta
const clamped = Math.min(local.max, Math.max(local.min, current))
local.onResize(clamped)
@@ -61,6 +71,7 @@ export function ResizeHandle(props: ResizeHandleProps) {
{...rest}
data-component="resize-handle"
data-direction={local.direction}
+ data-edge={local.edge ?? (local.direction === "vertical" ? "start" : "end")}
classList={{
...(local.classList ?? {}),
[local.class ?? ""]: !!local.class,
diff --git a/packages/ui/src/components/session-review.tsx b/packages/ui/src/components/session-review.tsx
index 60ac0d516..9a337c453 100644
--- a/packages/ui/src/components/session-review.tsx
+++ b/packages/ui/src/components/session-review.tsx
@@ -9,6 +9,7 @@ import { StickyAccordionHeader } from "./sticky-accordion-header"
import { useDiffComponent } from "../context/diff"
import { useI18n } from "../context/i18n"
import { getDirectory, getFilename } from "@opencode-ai/util/path"
+import { checksum } from "@opencode-ai/util/encode"
import { createEffect, createMemo, createSignal, For, Match, Show, Switch, type JSX } from "solid-js"
import { createStore } from "solid-js/store"
import { type FileContent, type FileDiff } from "@opencode-ai/sdk/v2"
@@ -118,6 +119,12 @@ function dataUrlFromValue(value: unknown): string | undefined {
return `data:${mime};base64,${content}`
}
+function diffId(file: string): string | undefined {
+ const sum = checksum(file)
+ if (!sum) return
+ return `session-review-diff-${sum}`
+}
+
type SessionReviewSelection = {
file: string
range: SelectedLineRange
@@ -489,7 +496,12 @@ export const SessionReview = (props: SessionReviewProps) => {
}
return (
- <Accordion.Item value={diff.file} data-slot="session-review-accordion-item">
+ <Accordion.Item
+ value={diff.file}
+ id={diffId(diff.file)}
+ data-file={diff.file}
+ data-slot="session-review-accordion-item"
+ >
<StickyAccordionHeader>
<Accordion.Trigger>
<div data-slot="session-review-trigger-content">