This commit is contained in:
薇薇安 2026-01-19 13:46:34 +08:00
parent 03f746288b
commit 69de8b283d

View File

@ -0,0 +1,49 @@
import React, { useEffect, useRef, useState } from 'react'
export default function CollapsibleUserGuide({ text, maxHeight = 160 }) {
const [expanded, setExpanded] = useState(false)
const [collapsible, setCollapsible] = useState(false)
const bodyRef = useRef(null)
useEffect(() => {
try {
const el = bodyRef.current
if (!el) return
// maxHeight
const h = el.scrollHeight || 0
setCollapsible(h > Number(maxHeight) + 8)
} catch (e) {
// ignore
}
}, [text, maxHeight])
if (!text) return null
const effectiveMaxHeight = Math.max(60, Number(maxHeight) || 160)
const showToggle = collapsible
const isCollapsed = showToggle && !expanded
return (
<div className="collapsible-user-guide">
<div
ref={bodyRef}
className={`cug-body ${isCollapsed ? 'collapsed' : 'expanded'}`}
style={isCollapsed ? { maxHeight: `${effectiveMaxHeight}px` } : undefined}
>
<pre className="user-guide-content">{text}</pre>
{isCollapsed && <div className="cug-fade" />}
</div>
{showToggle && (
<button
type="button"
className="cug-toggle"
onClick={() => setExpanded((v) => !v)}
aria-expanded={expanded}
>
{expanded ? '收起' : '展开'}
</button>
)}
</div>
)
}