diff options
| author | Jay V <[email protected]> | 2025-06-05 19:14:35 -0400 |
|---|---|---|
| committer | Jay V <[email protected]> | 2025-06-05 19:14:35 -0400 |
| commit | 65b2cf73d7595ae8f235bd670433220308efe61f (patch) | |
| tree | e2b3a1ffd8068c4847861a813bac6909cfdef35c /packages/web/src/components/Share.tsx | |
| parent | 95069af03fa38e64144b11f9068ead7c00831064 (diff) | |
| download | opencode-65b2cf73d7595ae8f235bd670433220308efe61f.tar.gz opencode-65b2cf73d7595ae8f235bd670433220308efe61f.zip | |
share page markdown
Diffstat (limited to 'packages/web/src/components/Share.tsx')
| -rw-r--r-- | packages/web/src/components/Share.tsx | 59 |
1 files changed, 57 insertions, 2 deletions
diff --git a/packages/web/src/components/Share.tsx b/packages/web/src/components/Share.tsx index d79620025..aac487739 100644 --- a/packages/web/src/components/Share.tsx +++ b/packages/web/src/components/Share.tsx @@ -12,6 +12,7 @@ import { createSignal, } from "solid-js" import { DateTime } from "luxon" +import { createStore, reconcile } from "solid-js/store" import { IconOpenAI, IconGemini, IconAnthropic } from "./icons/custom" import { IconCpuChip, @@ -32,9 +33,9 @@ import { } from "./icons" import DiffView from "./DiffView" import CodeBlock from "./CodeBlock" +import MarkdownView from "./MarkdownView" import styles from "./share.module.css" import { type UIMessage } from "ai" -import { createStore, reconcile } from "solid-js/store" const MIN_DURATION = 2 @@ -268,6 +269,60 @@ function TextPart(props: TextPartProps) { ) } +interface MarkdownPartProps extends JSX.HTMLAttributes<HTMLDivElement> { + text: string + expand?: boolean +} +function MarkdownPart(props: MarkdownPartProps) { + const [local, rest] = splitProps(props, ["text", "expand"]) + const [expanded, setExpanded] = createSignal(false) + const [overflowed, setOverflowed] = createSignal(false) + let divEl: HTMLDivElement | undefined + + function checkOverflow() { + if (divEl && !local.expand) { + setOverflowed(divEl.scrollHeight > divEl.clientHeight + 1) + } + } + + onMount(() => { + checkOverflow() + window.addEventListener("resize", checkOverflow) + }) + + createEffect(() => { + local.text + setTimeout(checkOverflow, 0) + }) + + onCleanup(() => { + window.removeEventListener("resize", checkOverflow) + }) + + return ( + <div + class={styles["message-markdown"]} + data-expanded={expanded() || local.expand === true} + {...rest} + > + <MarkdownView + data-elment-markdown + markdown={local.text} + ref={(el) => (divEl = el)} + /> + {((!local.expand && overflowed()) || expanded()) && ( + <button + type="button" + data-element-button-text + onClick={() => setExpanded((e) => !e)} + > + {expanded() ? "Show less" : "Show more"} + </button> + )} + </div> + ) +} + interface TerminalPartProps extends JSX.HTMLAttributes<HTMLDivElement> { text: string desc?: string @@ -682,7 +737,7 @@ export default function Share(props: { api: string }) { <div></div> </div> <div data-section="content"> - <TextPart + <MarkdownPart text={part().text} expand={isLastPart()} /> |
