diff --git a/packages/web/src/components/share/content-code.module.css b/packages/web/src/components/share/content-code.module.css index b95f936d..9fa10567 100644 --- a/packages/web/src/components/share/content-code.module.css +++ b/packages/web/src/components/share/content-code.module.css @@ -13,6 +13,7 @@ pre { --shiki-dark-bg: var(--sl-color-bg-surface) !important; + background-color: var(--sl-color-bg-surface) !important; line-height: 1.6; font-size: 0.75rem; white-space: pre-wrap; diff --git a/packages/web/src/components/share/content-error.module.css b/packages/web/src/components/share/content-error.module.css new file mode 100644 index 00000000..70645d6b --- /dev/null +++ b/packages/web/src/components/share/content-error.module.css @@ -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; + } + +} diff --git a/packages/web/src/components/share/content-error.tsx b/packages/web/src/components/share/content-error.tsx new file mode 100644 index 00000000..b6d7023b --- /dev/null +++ b/packages/web/src/components/share/content-error.tsx @@ -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 { + expand?: boolean +} +export function ContentError(props: Props) { + const [expanded, setExpanded] = createSignal(false) + const overflow = createOverflow() + + return ( +
+
+ {props.children} +
+ {((!props.expand && overflow.status) || expanded()) && ( + + )} +
+ ) +} diff --git a/packages/web/src/components/share/part.tsx b/packages/web/src/components/share/part.tsx index cff9b42b..6f76660a 100644 --- a/packages/web/src/components/share/part.tsx +++ b/packages/web/src/components/share/part.tsx @@ -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 { IconHashtag, IconSparkles, @@ -17,17 +28,16 @@ import { IconDocumentMagnifyingGlass, } from "../icons" 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 map from "lang-map" -import type { Diagnostic } from "vscode-languageserver-types" - import { ContentCode } from "./content-code" 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 { index: number @@ -439,7 +449,7 @@ export function WebFetchTool(props: ToolProps) {
-
{formatErrorString(props.state.output)}
+ {formatErrorString(props.state.output)}
@@ -466,7 +476,7 @@ export function ReadTool(props: ToolProps) {
-
{formatErrorString(props.state.output)}
+ {formatErrorString(props.state.output)}
@@ -502,7 +512,7 @@ export function WriteTool(props: ToolProps) {
-
{formatErrorString(props.state.output)}
+ {formatErrorString(props.state.output)}
@@ -530,7 +540,7 @@ export function EditTool(props: ToolProps) {
-
{formatErrorString(props.state.metadata?.message || "")}
+ {formatErrorString(props.state.metadata?.message || "")}
@@ -707,6 +717,9 @@ export function ProviderIcon(props: { model: string; size?: number }) { + + + ) }