mirror of
https://github.com/sst/opencode.git
synced 2025-08-04 05:28:16 +00:00
docs: share error part
This commit is contained in:
parent
7e4e6f6e51
commit
f99e2b3429
4 changed files with 124 additions and 13 deletions
|
@ -13,6 +13,7 @@
|
||||||
|
|
||||||
pre {
|
pre {
|
||||||
--shiki-dark-bg: var(--sl-color-bg-surface) !important;
|
--shiki-dark-bg: var(--sl-color-bg-surface) !important;
|
||||||
|
background-color: var(--sl-color-bg-surface) !important;
|
||||||
line-height: 1.6;
|
line-height: 1.6;
|
||||||
font-size: 0.75rem;
|
font-size: 0.75rem;
|
||||||
white-space: pre-wrap;
|
white-space: pre-wrap;
|
||||||
|
|
66
packages/web/src/components/share/content-error.module.css
Normal file
66
packages/web/src/components/share/content-error.module.css
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
.root {
|
||||||
|
background-color: var(--sl-color-bg-surface);
|
||||||
|
padding: 0.5rem calc(0.5rem + 3px);
|
||||||
|
border-radius: 0.25rem;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: flex-start;
|
||||||
|
gap: 1rem;
|
||||||
|
align-self: flex-start;
|
||||||
|
max-width: var(--md-tool-width);
|
||||||
|
|
||||||
|
[data-section="content"] {
|
||||||
|
pre {
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
line-height: 1.5;
|
||||||
|
font-size: 0.75rem;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
word-break: break-word;
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
margin-right: 0.25rem;
|
||||||
|
&:last-child {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
span[data-color="red"] {
|
||||||
|
color: var(--sl-color-red);
|
||||||
|
}
|
||||||
|
span[data-color="dimmed"] {
|
||||||
|
color: var(--sl-color-text-dimmed);
|
||||||
|
}
|
||||||
|
span[data-marker="label"] {
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: -0.5px;
|
||||||
|
}
|
||||||
|
span[data-separator] {
|
||||||
|
margin-right: 0.375rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&[data-expanded="true"] {
|
||||||
|
[data-section="content"] {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&[data-expanded="false"] {
|
||||||
|
[data-section="content"] {
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
-webkit-line-clamp: 7;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
flex: 0 0 auto;
|
||||||
|
padding: 2px 0;
|
||||||
|
font-size: 0.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
31
packages/web/src/components/share/content-error.tsx
Normal file
31
packages/web/src/components/share/content-error.tsx
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
import style from "./content-error.module.css"
|
||||||
|
import { type JSX, createSignal } from "solid-js"
|
||||||
|
import { createOverflow } from "./common"
|
||||||
|
|
||||||
|
interface Props extends JSX.HTMLAttributes<HTMLDivElement> {
|
||||||
|
expand?: boolean
|
||||||
|
}
|
||||||
|
export function ContentError(props: Props) {
|
||||||
|
const [expanded, setExpanded] = createSignal(false)
|
||||||
|
const overflow = createOverflow()
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
class={style.root}
|
||||||
|
data-expanded={expanded() || props.expand === true ? true : undefined}
|
||||||
|
>
|
||||||
|
<div data-section="content" ref={overflow.ref}>
|
||||||
|
{props.children}
|
||||||
|
</div>
|
||||||
|
{((!props.expand && overflow.status) || expanded()) && (
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
data-element-button-text
|
||||||
|
onClick={() => setExpanded((e) => !e)}
|
||||||
|
>
|
||||||
|
{expanded() ? "Show less" : "Show more"}
|
||||||
|
</button>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
|
@ -1,4 +1,15 @@
|
||||||
import { For, Show, Match, Switch, type JSX, createMemo, createSignal, type ParentProps } from "solid-js"
|
import map from "lang-map"
|
||||||
|
import { DateTime } from "luxon"
|
||||||
|
import {
|
||||||
|
For,
|
||||||
|
Show,
|
||||||
|
Match,
|
||||||
|
Switch,
|
||||||
|
type JSX,
|
||||||
|
createMemo,
|
||||||
|
createSignal,
|
||||||
|
type ParentProps
|
||||||
|
} from "solid-js"
|
||||||
import {
|
import {
|
||||||
IconHashtag,
|
IconHashtag,
|
||||||
IconSparkles,
|
IconSparkles,
|
||||||
|
@ -17,17 +28,16 @@ import {
|
||||||
IconDocumentMagnifyingGlass,
|
IconDocumentMagnifyingGlass,
|
||||||
} from "../icons"
|
} from "../icons"
|
||||||
import { IconMeta, IconOpenAI, IconGemini, IconAnthropic } from "../icons/custom"
|
import { IconMeta, IconOpenAI, IconGemini, IconAnthropic } from "../icons/custom"
|
||||||
import styles from "./part.module.css"
|
|
||||||
import type { MessageV2 } from "opencode/session/message-v2"
|
|
||||||
import { ContentText } from "./content-text"
|
|
||||||
import { ContentMarkdown } from "./content-markdown"
|
|
||||||
import { DateTime } from "luxon"
|
|
||||||
import CodeBlock from "../CodeBlock"
|
import CodeBlock from "../CodeBlock"
|
||||||
import map from "lang-map"
|
|
||||||
import type { Diagnostic } from "vscode-languageserver-types"
|
|
||||||
|
|
||||||
import { ContentCode } from "./content-code"
|
import { ContentCode } from "./content-code"
|
||||||
import { ContentDiff } from "./content-diff"
|
import { ContentDiff } from "./content-diff"
|
||||||
|
import { ContentText } from "./content-text"
|
||||||
|
import { ContentError } from "./content-error"
|
||||||
|
import { ContentMarkdown } from "./content-markdown"
|
||||||
|
import type { MessageV2 } from "opencode/session/message-v2"
|
||||||
|
import type { Diagnostic } from "vscode-languageserver-types"
|
||||||
|
|
||||||
|
import styles from "./part.module.css"
|
||||||
|
|
||||||
export interface PartProps {
|
export interface PartProps {
|
||||||
index: number
|
index: number
|
||||||
|
@ -439,7 +449,7 @@ export function WebFetchTool(props: ToolProps) {
|
||||||
<div data-component="tool-result">
|
<div data-component="tool-result">
|
||||||
<Switch>
|
<Switch>
|
||||||
<Match when={props.state.metadata?.error}>
|
<Match when={props.state.metadata?.error}>
|
||||||
<div data-component="error">{formatErrorString(props.state.output)}</div>
|
<ContentError>{formatErrorString(props.state.output)}</ContentError>
|
||||||
</Match>
|
</Match>
|
||||||
<Match when={props.state.output}>
|
<Match when={props.state.output}>
|
||||||
<ResultsButton>
|
<ResultsButton>
|
||||||
|
@ -466,7 +476,7 @@ export function ReadTool(props: ToolProps) {
|
||||||
<div data-component="tool-result">
|
<div data-component="tool-result">
|
||||||
<Switch>
|
<Switch>
|
||||||
<Match when={props.state.metadata?.error}>
|
<Match when={props.state.metadata?.error}>
|
||||||
<div data-component="error">{formatErrorString(props.state.output)}</div>
|
<ContentError>{formatErrorString(props.state.output)}</ContentError>
|
||||||
</Match>
|
</Match>
|
||||||
<Match when={typeof props.state.metadata?.preview === "string"}>
|
<Match when={typeof props.state.metadata?.preview === "string"}>
|
||||||
<ResultsButton showCopy="Show preview" hideCopy="Hide preview">
|
<ResultsButton showCopy="Show preview" hideCopy="Hide preview">
|
||||||
|
@ -502,7 +512,7 @@ export function WriteTool(props: ToolProps) {
|
||||||
<div data-component="tool-result">
|
<div data-component="tool-result">
|
||||||
<Switch>
|
<Switch>
|
||||||
<Match when={props.state.metadata?.error}>
|
<Match when={props.state.metadata?.error}>
|
||||||
<div data-component="error">{formatErrorString(props.state.output)}</div>
|
<ContentError>{formatErrorString(props.state.output)}</ContentError>
|
||||||
</Match>
|
</Match>
|
||||||
<Match when={props.state.input?.content}>
|
<Match when={props.state.input?.content}>
|
||||||
<ResultsButton showCopy="Show contents" hideCopy="Hide contents">
|
<ResultsButton showCopy="Show contents" hideCopy="Hide contents">
|
||||||
|
@ -530,7 +540,7 @@ export function EditTool(props: ToolProps) {
|
||||||
<div data-component="tool-result">
|
<div data-component="tool-result">
|
||||||
<Switch>
|
<Switch>
|
||||||
<Match when={props.state.metadata?.error}>
|
<Match when={props.state.metadata?.error}>
|
||||||
<div data-component="error">{formatErrorString(props.state.metadata?.message || "")}</div>
|
<ContentError>{formatErrorString(props.state.metadata?.message || "")}</ContentError>
|
||||||
</Match>
|
</Match>
|
||||||
<Match when={props.state.metadata?.diff}>
|
<Match when={props.state.metadata?.diff}>
|
||||||
<div data-component="diff">
|
<div data-component="diff">
|
||||||
|
@ -707,6 +717,9 @@ export function ProviderIcon(props: { model: string; size?: number }) {
|
||||||
<Match when={provider === "gemini"}>
|
<Match when={provider === "gemini"}>
|
||||||
<IconGemini width={size} height={size} />
|
<IconGemini width={size} height={size} />
|
||||||
</Match>
|
</Match>
|
||||||
|
<Match when={provider === "meta"}>
|
||||||
|
<IconMeta width={size} height={size} />
|
||||||
|
</Match>
|
||||||
</Switch>
|
</Switch>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue