summaryrefslogtreecommitdiffhomepage
path: root/packages/ui/src
diff options
context:
space:
mode:
authorAdam <[email protected]>2025-11-29 06:18:46 -0600
committerAdam <[email protected]>2025-11-29 06:18:51 -0600
commit2c4d1fb8b44b1a421aef59f5f6bdb446965d6b44 (patch)
tree2a5bfc9e6b5a63f08fcf793a6078b66c44f7153b /packages/ui/src
parentd8fa7cf65d64efaf36f9cc46ff2ade28ae820d00 (diff)
downloadopencode-2c4d1fb8b44b1a421aef59f5f6bdb446965d6b44.tar.gz
opencode-2c4d1fb8b44b1a421aef59f5f6bdb446965d6b44.zip
chore: cleanup duplicate markup
Diffstat (limited to 'packages/ui/src')
-rw-r--r--packages/ui/src/components/session-message-rail.css42
-rw-r--r--packages/ui/src/components/session-message-rail.tsx57
2 files changed, 99 insertions, 0 deletions
diff --git a/packages/ui/src/components/session-message-rail.css b/packages/ui/src/components/session-message-rail.css
new file mode 100644
index 000000000..9d302e10e
--- /dev/null
+++ b/packages/ui/src/components/session-message-rail.css
@@ -0,0 +1,42 @@
+[data-component="session-message-rail"] {
+ display: contents;
+}
+
+[data-slot="session-message-rail-compact"],
+[data-slot="session-message-rail-full"] {
+ position: absolute;
+ left: 1.5rem;
+ margin-top: 0.625rem;
+}
+
+[data-slot="session-message-rail-compact"] {
+ display: flex;
+}
+
+[data-slot="session-message-rail-full"] {
+ display: none;
+}
+
+@media (min-width: 72rem) {
+ [data-slot="session-message-rail-compact"] {
+ display: none;
+ }
+
+ [data-slot="session-message-rail-full"] {
+ display: flex;
+ }
+}
+
+[data-component="session-message-rail"] [data-slot="session-message-rail-full"] {
+ transform: none;
+}
+
+[data-component="session-message-rail"][data-wide] [data-slot="session-message-rail-full"] {
+ margin-top: 0.125rem;
+ left: calc(((100% - min(100%, 36.5rem)) / 2) - 1.5rem);
+ transform: translateX(-100%);
+}
+
+[data-component="session-message-rail"]:not([data-wide]) [data-slot="session-message-rail-full"] {
+ margin-top: 0.625rem;
+}
diff --git a/packages/ui/src/components/session-message-rail.tsx b/packages/ui/src/components/session-message-rail.tsx
new file mode 100644
index 000000000..29d9ac81e
--- /dev/null
+++ b/packages/ui/src/components/session-message-rail.tsx
@@ -0,0 +1,57 @@
+import { UserMessage } from "@opencode-ai/sdk"
+import { ComponentProps, Show, splitProps } from "solid-js"
+import { MessageNav } from "./message-nav"
+import "./session-message-rail.css"
+
+export interface SessionMessageRailProps extends ComponentProps<"div"> {
+ messages: UserMessage[]
+ current?: UserMessage
+ working?: boolean
+ wide?: boolean
+ onMessageSelect: (message: UserMessage) => void
+}
+
+export function SessionMessageRail(props: SessionMessageRailProps) {
+ const [local, others] = splitProps(props, [
+ "messages",
+ "current",
+ "working",
+ "wide",
+ "onMessageSelect",
+ "class",
+ "classList",
+ ])
+
+ return (
+ <Show when={(local.messages?.length ?? 0) > 1}>
+ <div
+ {...others}
+ data-component="session-message-rail"
+ data-wide={local.wide ? "" : undefined}
+ classList={{
+ ...(local.classList ?? {}),
+ [local.class ?? ""]: !!local.class,
+ }}
+ >
+ <div data-slot="session-message-rail-compact">
+ <MessageNav
+ messages={local.messages}
+ current={local.current}
+ onMessageSelect={local.onMessageSelect}
+ size="compact"
+ working={local.working}
+ />
+ </div>
+ <div data-slot="session-message-rail-full">
+ <MessageNav
+ messages={local.messages}
+ current={local.current}
+ onMessageSelect={local.onMessageSelect}
+ size={local.wide ? "normal" : "compact"}
+ working={local.working}
+ />
+ </div>
+ </div>
+ </Show>
+ )
+}