summaryrefslogtreecommitdiffhomepage
path: root/packages/ui/src
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-02-19 11:10:47 -0600
committerAdam <[email protected]>2026-02-19 11:12:56 -0600
commit56dda4c98c209a96967f045988e17486d616269f (patch)
tree4ac8d0adfe4a9c74b9398b084624c6f3da9a834d /packages/ui/src
parent6b8902e8b91a7561d57f80249feada949c4d0665 (diff)
downloadopencode-56dda4c98c209a96967f045988e17486d616269f.tar.gz
opencode-56dda4c98c209a96967f045988e17486d616269f.zip
chore: cleanup
Diffstat (limited to 'packages/ui/src')
-rw-r--r--packages/ui/src/components/message-part.css15
-rw-r--r--packages/ui/src/components/message-part.tsx175
-rw-r--r--packages/ui/src/components/session-turn.css13
-rw-r--r--packages/ui/src/components/session-turn.tsx1
-rw-r--r--packages/ui/src/components/sticky-accordion-header.css12
5 files changed, 119 insertions, 97 deletions
diff --git a/packages/ui/src/components/message-part.css b/packages/ui/src/components/message-part.css
index 443b1a42e..f83eae097 100644
--- a/packages/ui/src/components/message-part.css
+++ b/packages/ui/src/components/message-part.css
@@ -1219,6 +1219,21 @@
}
}
+[data-component="apply-patch-tool"] {
+ > [data-component="collapsible"].tool-collapsible {
+ gap: 0px;
+ }
+
+ > [data-component="collapsible"] > [data-slot="collapsible-trigger"][aria-expanded="true"] {
+ position: sticky;
+ top: var(--sticky-accordion-top, 0px);
+ z-index: 20;
+ height: 40px;
+ padding-bottom: 8px;
+ background-color: var(--background-stronger);
+ }
+}
+
[data-component="accordion"][data-scope="apply-patch"] {
[data-slot="accordion-trigger"] {
background-color: var(--background-stronger) !important;
diff --git a/packages/ui/src/components/message-part.tsx b/packages/ui/src/components/message-part.tsx
index 3a8eafce2..4b223bf35 100644
--- a/packages/ui/src/components/message-part.tsx
+++ b/packages/ui/src/components/message-part.tsx
@@ -1611,97 +1611,100 @@ ToolRegistry.register({
})
return (
- <BasicTool
- {...props}
- icon="code-lines"
- defer
- trigger={{
- title: i18n.t("ui.tool.patch"),
- subtitle: subtitle(),
- }}
- >
- <Show when={files().length > 0}>
- <Accordion
- multiple
- data-scope="apply-patch"
- value={expanded()}
- onChange={(value) => setExpanded(Array.isArray(value) ? value : value ? [value] : [])}
- >
- <For each={files()}>
- {(file) => {
- const active = createMemo(() => expanded().includes(file.filePath))
- const [visible, setVisible] = createSignal(false)
-
- createEffect(() => {
- if (!active()) {
- setVisible(false)
- return
- }
-
- requestAnimationFrame(() => {
- if (!active()) return
- setVisible(true)
+ <div data-component="apply-patch-tool">
+ <BasicTool
+ {...props}
+ icon="code-lines"
+ defer
+ trigger={{
+ title: i18n.t("ui.tool.patch"),
+ subtitle: subtitle(),
+ }}
+ >
+ <Show when={files().length > 0}>
+ <Accordion
+ multiple
+ data-scope="apply-patch"
+ style={{ "--sticky-accordion-offset": "40px" }}
+ value={expanded()}
+ onChange={(value) => setExpanded(Array.isArray(value) ? value : value ? [value] : [])}
+ >
+ <For each={files()}>
+ {(file) => {
+ const active = createMemo(() => expanded().includes(file.filePath))
+ const [visible, setVisible] = createSignal(false)
+
+ createEffect(() => {
+ if (!active()) {
+ setVisible(false)
+ return
+ }
+
+ requestAnimationFrame(() => {
+ if (!active()) return
+ setVisible(true)
+ })
})
- })
- return (
- <Accordion.Item value={file.filePath} data-type={file.type}>
- <StickyAccordionHeader>
- <Accordion.Trigger>
- <div data-slot="apply-patch-trigger-content">
- <div data-slot="apply-patch-file-info">
- <FileIcon node={{ path: file.relativePath, type: "file" }} />
- <div data-slot="apply-patch-file-name-container">
- <Show when={file.relativePath.includes("/")}>
- <span data-slot="apply-patch-directory">{`\u202A${getDirectory(file.relativePath)}\u202C`}</span>
- </Show>
- <span data-slot="apply-patch-filename">{getFilename(file.relativePath)}</span>
+ return (
+ <Accordion.Item value={file.filePath} data-type={file.type}>
+ <StickyAccordionHeader>
+ <Accordion.Trigger>
+ <div data-slot="apply-patch-trigger-content">
+ <div data-slot="apply-patch-file-info">
+ <FileIcon node={{ path: file.relativePath, type: "file" }} />
+ <div data-slot="apply-patch-file-name-container">
+ <Show when={file.relativePath.includes("/")}>
+ <span data-slot="apply-patch-directory">{`\u202A${getDirectory(file.relativePath)}\u202C`}</span>
+ </Show>
+ <span data-slot="apply-patch-filename">{getFilename(file.relativePath)}</span>
+ </div>
+ </div>
+ <div data-slot="apply-patch-trigger-actions">
+ <Switch>
+ <Match when={file.type === "add"}>
+ <span data-slot="apply-patch-change" data-type="added">
+ {i18n.t("ui.patch.action.created")}
+ </span>
+ </Match>
+ <Match when={file.type === "delete"}>
+ <span data-slot="apply-patch-change" data-type="removed">
+ {i18n.t("ui.patch.action.deleted")}
+ </span>
+ </Match>
+ <Match when={file.type === "move"}>
+ <span data-slot="apply-patch-change" data-type="modified">
+ {i18n.t("ui.patch.action.moved")}
+ </span>
+ </Match>
+ <Match when={true}>
+ <DiffChanges changes={{ additions: file.additions, deletions: file.deletions }} />
+ </Match>
+ </Switch>
+ <Icon name="chevron-grabber-vertical" size="small" />
</div>
</div>
- <div data-slot="apply-patch-trigger-actions">
- <Switch>
- <Match when={file.type === "add"}>
- <span data-slot="apply-patch-change" data-type="added">
- {i18n.t("ui.patch.action.created")}
- </span>
- </Match>
- <Match when={file.type === "delete"}>
- <span data-slot="apply-patch-change" data-type="removed">
- {i18n.t("ui.patch.action.deleted")}
- </span>
- </Match>
- <Match when={file.type === "move"}>
- <span data-slot="apply-patch-change" data-type="modified">
- {i18n.t("ui.patch.action.moved")}
- </span>
- </Match>
- <Match when={true}>
- <DiffChanges changes={{ additions: file.additions, deletions: file.deletions }} />
- </Match>
- </Switch>
- <Icon name="chevron-grabber-vertical" size="small" />
+ </Accordion.Trigger>
+ </StickyAccordionHeader>
+ <Accordion.Content>
+ <Show when={visible()}>
+ <div data-component="apply-patch-file-diff">
+ <Dynamic
+ component={diffComponent}
+ before={{ name: file.filePath, contents: file.before }}
+ after={{ name: file.movePath ?? file.filePath, contents: file.after }}
+ />
</div>
- </div>
- </Accordion.Trigger>
- </StickyAccordionHeader>
- <Accordion.Content>
- <Show when={visible()}>
- <div data-component="apply-patch-file-diff">
- <Dynamic
- component={diffComponent}
- before={{ name: file.filePath, contents: file.before }}
- after={{ name: file.movePath ?? file.filePath, contents: file.after }}
- />
- </div>
- </Show>
- </Accordion.Content>
- </Accordion.Item>
- )
- }}
- </For>
- </Accordion>
- </Show>
- </BasicTool>
+ </Show>
+ </Accordion.Content>
+ </Accordion.Item>
+ )
+ }}
+ </For>
+ </Accordion>
+ </Show>
+ </BasicTool>
+ </div>
)
},
})
diff --git a/packages/ui/src/components/session-turn.css b/packages/ui/src/components/session-turn.css
index 8f311e91f..d70c679f2 100644
--- a/packages/ui/src/components/session-turn.css
+++ b/packages/ui/src/components/session-turn.css
@@ -81,6 +81,17 @@
min-width: 0;
}
+ [data-slot="session-turn-diffs"]
+ > [data-component="collapsible"]
+ > [data-slot="collapsible-trigger"][aria-expanded="true"] {
+ position: sticky;
+ top: var(--sticky-accordion-top, 0px);
+ z-index: 20;
+ height: 40px;
+ padding-bottom: 8px;
+ background-color: var(--background-stronger);
+ }
+
[data-component="session-turn-diffs-trigger"] {
width: 100%;
display: flex;
@@ -124,7 +135,7 @@
}
[data-component="session-turn-diffs-content"] {
- padding-top: 8px;
+ padding-top: 0px;
display: flex;
flex-direction: column;
}
diff --git a/packages/ui/src/components/session-turn.tsx b/packages/ui/src/components/session-turn.tsx
index 17eb7f388..2aed8279e 100644
--- a/packages/ui/src/components/session-turn.tsx
+++ b/packages/ui/src/components/session-turn.tsx
@@ -318,6 +318,7 @@ export function SessionTurn(
<div data-component="session-turn-diffs-content">
<Accordion
multiple
+ style={{ "--sticky-accordion-offset": "40px" }}
value={expanded()}
onChange={(value) => setExpanded(Array.isArray(value) ? value : value ? [value] : [])}
>
diff --git a/packages/ui/src/components/sticky-accordion-header.css b/packages/ui/src/components/sticky-accordion-header.css
index c8af9f872..68195241b 100644
--- a/packages/ui/src/components/sticky-accordion-header.css
+++ b/packages/ui/src/components/sticky-accordion-header.css
@@ -1,14 +1,6 @@
[data-component="sticky-accordion-header"] {
- --sticky-accordion-top: 0px;
position: sticky;
- top: var(--sticky-accordion-top);
-}
-
-[data-slot="accordion-item"]:first-child [data-component="sticky-accordion-header"] {
- background-color: var(--background-stronger);
-}
-
-[data-component="sticky-accordion-header"][data-expanded],
-[data-slot="accordion-item"][data-expanded] [data-component="sticky-accordion-header"] {
+ top: calc(var(--sticky-accordion-top, 0px) + var(--sticky-accordion-offset, 0px));
z-index: 10;
+ background-color: var(--background-stronger);
}