Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com> Co-authored-by: Kit Langton <kit.langton@gmail.com> Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com> Co-authored-by: Affan Ali <93028901+affanali2k3@users.noreply.github.com> Co-authored-by: affanali2k3 <affanalikhanxx@gmail.com> Co-authored-by: Frank <frank@anoma.ly> Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com> Co-authored-by: 𝓛𝓲𝓽𝓽𝓵𝓮 𝓕𝓻𝓪𝓷𝓴 <little-frank@opencord.local> Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Co-authored-by: Jay V <air@live.ca> Co-authored-by: Dax Raad <d@ironbay.co> Co-authored-by: Aarav Sareen <96787824+arvsrn@users.noreply.github.com> Co-authored-by: OpeOginni <107570612+OpeOginni@users.noreply.github.com> Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com> Co-authored-by: Ben Guthrie <benjee.012@gmail.com> Co-authored-by: Dax <mail@thdxr.com> Co-authored-by: Filip <34747899+neriousy@users.noreply.github.com> Co-authored-by: Max Anderson <max.a.anderson95@gmail.com> Co-authored-by: Brendan Allan <git@brendonovich.dev> Co-authored-by: Jack <jack@anoma.ly> Co-authored-by: Shoubhit Dash <shoubhit2005@gmail.com> Co-authored-by: Dustin Deus <deusdustin@gmail.com> Co-authored-by: starptech <starptech@starptechs-MBP.fritz.box> Co-authored-by: Aiden Cline <aidenpcline@gmail.com> Co-authored-by: usrnk1 <7547651+usrnk1@users.noreply.github.com> Co-authored-by: Jay <53023+jayair@users.noreply.github.com> Co-authored-by: runvip <164729189+runvip@users.noreply.github.com> Co-authored-by: opencode <opencode@sst.dev> Co-authored-by: Julian Coy <julian@ex-machina.co> Co-authored-by: Vladimir Glafirov <vglafirov@gitlab.com>
88 lines
3.8 KiB
TypeScript
88 lines
3.8 KiB
TypeScript
import { Component, For, Show } from "solid-js"
|
|
import { FileIcon } from "@opencode-ai/ui/file-icon"
|
|
import { IconButton } from "@opencode-ai/ui/icon-button"
|
|
import { Tooltip } from "@opencode-ai/ui/tooltip"
|
|
import { getDirectory, getFilename, getFilenameTruncated } from "@opencode-ai/core/util/path"
|
|
import type { ContextItem } from "@/context/prompt"
|
|
|
|
type PromptContextItem = ContextItem & { key: string }
|
|
|
|
type ContextItemsProps = {
|
|
items: PromptContextItem[]
|
|
active: (item: PromptContextItem) => boolean
|
|
openComment: (item: PromptContextItem) => void
|
|
remove: (item: PromptContextItem) => void
|
|
t: (key: string) => string
|
|
}
|
|
|
|
export const PromptContextItems: Component<ContextItemsProps> = (props) => {
|
|
return (
|
|
<Show when={props.items.length > 0}>
|
|
<div class="flex flex-nowrap items-start gap-2 p-2 overflow-x-auto no-scrollbar">
|
|
<For each={props.items}>
|
|
{(item) => {
|
|
const directory = getDirectory(item.path)
|
|
const filename = getFilename(item.path)
|
|
const label = getFilenameTruncated(item.path, 14)
|
|
const selected = props.active(item)
|
|
|
|
return (
|
|
<Tooltip
|
|
value={
|
|
<span class="flex max-w-[300px]">
|
|
<span class="text-text-invert-base truncate-start [unicode-bidi:plaintext] min-w-0">
|
|
{directory}
|
|
</span>
|
|
<span class="shrink-0">{filename}</span>
|
|
</span>
|
|
}
|
|
placement="top"
|
|
openDelay={800}
|
|
>
|
|
<div
|
|
classList={{
|
|
"group shrink-0 flex flex-col rounded-[6px] pl-2 pr-1 py-1 max-w-[200px] h-12 cursor-default transition-all transition-transform shadow-xs-border hover:shadow-xs-border-hover": true,
|
|
"hover:bg-surface-interactive-weak": !!item.commentID && !selected,
|
|
"bg-surface-interactive-hover hover:bg-surface-interactive-hover shadow-xs-border-hover": selected,
|
|
"bg-background-stronger": !selected,
|
|
}}
|
|
onClick={() => props.openComment(item)}
|
|
>
|
|
<div class="flex items-center gap-1.5">
|
|
<FileIcon node={{ path: item.path, type: "file" }} class="shrink-0 size-3.5" />
|
|
<div class="flex items-center text-[12px] min-w-0 font-medium leading-5">
|
|
<span class="text-text-strong whitespace-nowrap">{label}</span>
|
|
<Show when={item.selection}>
|
|
{(sel) => (
|
|
<span class="text-text-weak whitespace-nowrap shrink-0">
|
|
{sel().startLine === sel().endLine
|
|
? `:${sel().startLine}`
|
|
: `:${sel().startLine}-${sel().endLine}`}
|
|
</span>
|
|
)}
|
|
</Show>
|
|
</div>
|
|
<IconButton
|
|
type="button"
|
|
icon="close-small"
|
|
variant="ghost"
|
|
class="ml-auto size-3.5 text-text-weak hover:text-text-strong transition-all"
|
|
onClick={(e) => {
|
|
e.stopPropagation()
|
|
props.remove(item)
|
|
}}
|
|
aria-label={props.t("prompt.context.removeFile")}
|
|
/>
|
|
</div>
|
|
<Show when={item.comment}>
|
|
{(comment) => <div class="text-12-regular text-text-strong ml-5 pr-1 truncate">{comment()}</div>}
|
|
</Show>
|
|
</div>
|
|
</Tooltip>
|
|
)
|
|
}}
|
|
</For>
|
|
</div>
|
|
</Show>
|
|
)
|
|
}
|