summaryrefslogtreecommitdiffhomepage
path: root/packages/web/src/components
diff options
context:
space:
mode:
authorJay V <[email protected]>2025-07-04 17:57:10 -0400
committerJay V <[email protected]>2025-07-04 17:57:12 -0400
commit107363b1d9f3eec6b180170e428f66162bf622c7 (patch)
treeda0be60dbb8cb646fb1de436576fb5593468f5f2 /packages/web/src/components
parent85214d7c598959be5d4723625cb4f559645eadc2 (diff)
downloadopencode-107363b1d9f3eec6b180170e428f66162bf622c7.tar.gz
opencode-107363b1d9f3eec6b180170e428f66162bf622c7.zip
docs: fix show more in share page
Diffstat (limited to 'packages/web/src/components')
-rw-r--r--packages/web/src/components/Share.tsx167
-rw-r--r--packages/web/src/components/share.module.css2
2 files changed, 62 insertions, 107 deletions
diff --git a/packages/web/src/components/Share.tsx b/packages/web/src/components/Share.tsx
index e2e880f61..ed889790d 100644
--- a/packages/web/src/components/Share.tsx
+++ b/packages/web/src/components/Share.tsx
@@ -243,6 +243,44 @@ function getStatusText(status: [Status, string?]): string {
}
}
+function checkOverflow(getEl: () => HTMLElement | undefined, watch?: () => any) {
+ const [needsToggle, setNeedsToggle] = createSignal(false)
+
+ function measure() {
+ const el = getEl()
+ if (!el) return
+ setNeedsToggle(el.scrollHeight > el.clientHeight + 1)
+ }
+
+ onMount(() => {
+ let raf = 0
+
+ function probe() {
+ const el = getEl()
+ if (el && el.offsetParent !== null && el.getBoundingClientRect().height) {
+ measure()
+ }
+ else {
+ raf = requestAnimationFrame(probe)
+ }
+ }
+ raf = requestAnimationFrame(probe)
+
+ const ro = new ResizeObserver(measure)
+ const el = getEl()
+ if (el) ro.observe(el)
+
+ onCleanup(() => {
+ cancelAnimationFrame(raf)
+ ro.disconnect()
+ })
+ })
+
+ if (watch) createEffect(measure)
+
+ return needsToggle
+}
+
function ProviderIcon(props: { provider: string; size?: number }) {
const size = props.size || 16
return (
@@ -296,34 +334,11 @@ interface TextPartProps extends JSX.HTMLAttributes<HTMLDivElement> {
expand?: boolean
}
function TextPart(props: TextPartProps) {
- const [local, rest] = splitProps(props, [
- "text",
- "expand",
- ])
- const [expanded, setExpanded] = createSignal(false)
- const [overflowed, setOverflowed] = createSignal(false)
let preEl: HTMLPreElement | undefined
- function checkOverflow() {
- if (preEl && !local.expand) {
- setOverflowed(preEl.scrollHeight > preEl.clientHeight + 1)
- }
- }
-
- onMount(() => {
- checkOverflow()
- window.addEventListener("resize", checkOverflow)
- })
-
- createEffect(() => {
- local.text
- local.expand
- setTimeout(checkOverflow, 0)
- })
-
- onCleanup(() => {
- window.removeEventListener("resize", checkOverflow)
- })
+ const [local, rest] = splitProps(props, ["text", "expand"])
+ const [expanded, setExpanded] = createSignal(false)
+ const overflowed = checkOverflow(() => preEl, () => local.expand)
return (
<div
@@ -331,7 +346,7 @@ function TextPart(props: TextPartProps) {
data-expanded={expanded() || local.expand === true}
{...rest}
>
- <pre ref={(el) => (preEl = el)}>{local.text}</pre>
+ <pre ref={preEl}>{local.text}</pre>
{((!local.expand && overflowed()) || expanded()) && (
<button
type="button"
@@ -349,31 +364,11 @@ interface ErrorPartProps extends JSX.HTMLAttributes<HTMLDivElement> {
expand?: boolean
}
function ErrorPart(props: ErrorPartProps) {
+ let preEl: HTMLDivElement | undefined
+
const [local, rest] = splitProps(props, ["expand", "children"])
const [expanded, setExpanded] = createSignal(false)
- const [overflowed, setOverflowed] = createSignal(false)
- let preEl: HTMLElement | undefined
-
- function checkOverflow() {
- if (preEl && !local.expand) {
- setOverflowed(preEl.scrollHeight > preEl.clientHeight + 1)
- }
- }
-
- onMount(() => {
- checkOverflow()
- window.addEventListener("resize", checkOverflow)
- })
-
- createEffect(() => {
- local.children
- local.expand
- setTimeout(checkOverflow, 0)
- })
-
- onCleanup(() => {
- window.removeEventListener("resize", checkOverflow)
- })
+ const overflowed = checkOverflow(() => preEl, () => local.expand)
return (
<div
@@ -381,7 +376,7 @@ function ErrorPart(props: ErrorPartProps) {
data-expanded={expanded() || local.expand === true}
{...rest}
>
- <div data-section="content" ref={(el) => (preEl = el)}>
+ <div data-section="content" ref={preEl}>
{local.children}
</div>
{((!local.expand && overflowed()) || expanded()) && (
@@ -403,31 +398,11 @@ interface MarkdownPartProps extends JSX.HTMLAttributes<HTMLDivElement> {
highlight?: boolean
}
function MarkdownPart(props: MarkdownPartProps) {
- const [local, rest] = splitProps(props, ["text", "expand", "highlight"])
- 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
- local.expand
- setTimeout(checkOverflow, 0)
- })
-
- onCleanup(() => {
- window.removeEventListener("resize", checkOverflow)
- })
+ const [local, rest] = splitProps(props, ["text", "expand", "highlight"])
+ const [expanded, setExpanded] = createSignal(false)
+ const overflowed = checkOverflow(() => divEl, () => local.expand)
return (
<div
@@ -469,36 +444,16 @@ function TerminalPart(props: TerminalPartProps) {
"desc",
"expand",
])
- const [expanded, setExpanded] = createSignal(false)
- const [overflowed, setOverflowed] = createSignal(false)
- let preEl: HTMLElement | undefined
-
- function checkOverflow() {
- if (!preEl) return
-
- const code = preEl.getElementsByTagName("code")[0]
-
- if (code && !local.expand) {
- setOverflowed(preEl.clientHeight < code.offsetHeight)
- }
- }
-
- createEffect(() => {
- local.command
- local.result
- local.error
- local.expand
- setTimeout(checkOverflow, 0)
- })
+ let preEl: HTMLDivElement | undefined
- onMount(() => {
- checkOverflow()
- window.addEventListener("resize", checkOverflow)
- })
-
- onCleanup(() => {
- window.removeEventListener("resize", checkOverflow)
- })
+ const [expanded, setExpanded] = createSignal(false)
+ const overflowed = checkOverflow(
+ () => {
+ if (!preEl) return
+ return preEl.getElementsByTagName("pre")[0]
+ },
+ () => local.expand
+ )
return (
<div
@@ -515,16 +470,16 @@ function TerminalPart(props: TerminalPartProps) {
<Switch>
<Match when={local.error}>
<CodeBlock
- data-section="error"
+ ref={preEl}
lang="text"
- ref={(el) => (preEl = el)}
+ data-section="error"
code={local.error || ""}
/>
</Match>
<Match when={local.result}>
<CodeBlock
+ ref={preEl}
lang="console"
- ref={(el) => (preEl = el)}
code={local.result || ""}
/>
</Match>
diff --git a/packages/web/src/components/share.module.css b/packages/web/src/components/share.module.css
index d8eac0e58..c339d2b80 100644
--- a/packages/web/src/components/share.module.css
+++ b/packages/web/src/components/share.module.css
@@ -253,7 +253,7 @@
line-height: 18px;
font-size: 0.875rem;
color: var(--sl-color-text-secondary);
- max-width: var(--sm-tool-width);
+ max-width: var(--md-tool-width);
display: flex;
align-items: flex-start;