mirror of
https://github.com/anomalyco/opencode.git
synced 2026-04-24 14:55:19 +00:00
75 lines
2.5 KiB
TypeScript
75 lines
2.5 KiB
TypeScript
import { useSync } from "@tui/context/sync"
|
|
import { createMemo, Show } from "solid-js"
|
|
import { useTheme } from "../../context/theme"
|
|
import { useTuiConfig } from "../../context/tui-config"
|
|
import { Installation } from "@/installation"
|
|
import { TuiPluginRuntime } from "../../plugin"
|
|
|
|
import { getScrollAcceleration } from "../../util/scroll"
|
|
|
|
export function Sidebar(props: { sessionID: string; overlay?: boolean }) {
|
|
const sync = useSync()
|
|
const { theme } = useTheme()
|
|
const tuiConfig = useTuiConfig()
|
|
const session = createMemo(() => sync.session.get(props.sessionID))
|
|
const scrollAcceleration = createMemo(() => getScrollAcceleration(tuiConfig))
|
|
|
|
return (
|
|
<Show when={session()}>
|
|
<box
|
|
backgroundColor={theme.backgroundPanel}
|
|
width={42}
|
|
height="100%"
|
|
paddingTop={1}
|
|
paddingBottom={1}
|
|
paddingLeft={2}
|
|
paddingRight={2}
|
|
position={props.overlay ? "absolute" : "relative"}
|
|
>
|
|
<scrollbox
|
|
flexGrow={1}
|
|
scrollAcceleration={scrollAcceleration()}
|
|
verticalScrollbarOptions={{
|
|
trackOptions: {
|
|
backgroundColor: theme.background,
|
|
foregroundColor: theme.borderActive,
|
|
},
|
|
}}
|
|
>
|
|
<box flexShrink={0} gap={1} paddingRight={1}>
|
|
<TuiPluginRuntime.Slot
|
|
name="sidebar_title"
|
|
mode="single_winner"
|
|
session_id={props.sessionID}
|
|
title={session()!.title}
|
|
share_url={session()!.share?.url}
|
|
>
|
|
<box paddingRight={1}>
|
|
<text fg={theme.text}>
|
|
<b>{session()!.title}</b>
|
|
</text>
|
|
<Show when={session()!.share?.url}>
|
|
<text fg={theme.textMuted}>{session()!.share!.url}</text>
|
|
</Show>
|
|
</box>
|
|
</TuiPluginRuntime.Slot>
|
|
<TuiPluginRuntime.Slot name="sidebar_content" session_id={props.sessionID} />
|
|
</box>
|
|
</scrollbox>
|
|
|
|
<box flexShrink={0} gap={1} paddingTop={1}>
|
|
<TuiPluginRuntime.Slot name="sidebar_footer" mode="single_winner" session_id={props.sessionID}>
|
|
<text fg={theme.textMuted}>
|
|
<span style={{ fg: theme.success }}>•</span> <b>Open</b>
|
|
<span style={{ fg: theme.text }}>
|
|
<b>Code</b>
|
|
</span>{" "}
|
|
<span>{Installation.VERSION}</span>
|
|
</text>
|
|
</TuiPluginRuntime.Slot>
|
|
</box>
|
|
</box>
|
|
</Show>
|
|
)
|
|
}
|