a
This commit is contained in:
parent
03f746288b
commit
69de8b283d
49
frontend/src/components/CollapsibleUserGuide.jsx
Normal file
49
frontend/src/components/CollapsibleUserGuide.jsx
Normal 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>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
Loading…
Reference in New Issue
Block a user