Files
leaudit-platform-frontend/app/components/contract-template/ContractSearchHero.tsx
T

170 lines
5.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { useState, useRef } from 'react';
interface ContractSearchHeroProps {
onSearch: (query: string) => void;
initialQuery?: string;
tipText?: string;
tipIcon?: string;
}
export function ContractSearchHero({
onSearch,
initialQuery = '',
tipText = '支持自然语言描述,AI将为您匹配最相关的模板',
tipIcon = 'ri-lightbulb-line'
}: ContractSearchHeroProps) {
const [searchQuery, setSearchQuery] = useState(initialQuery);
const textareaRef = useRef<HTMLTextAreaElement>(null);
const handleSearchInputChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
const value = e.target.value;
setSearchQuery(value);
// 自动调整高度
if (textareaRef.current) {
textareaRef.current.style.height = 'auto';
textareaRef.current.style.height = Math.max(80, textareaRef.current.scrollHeight) + 'px';
}
};
const handleSearch = () => {
onSearch(searchQuery);
};
const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {
if (e.key === 'Enter') {
if (e.shiftKey) {
// Shift+回车:允许换行,不做任何处理
return;
} else {
// 单独回车:触发搜索
e.preventDefault();
handleSearch();
}
}
};
return (
<div style={{
textAlign: 'center',
padding: '60px 0',
background: 'linear-gradient(135deg, rgba(0, 104, 74, 0.05) 0%, rgba(0, 104, 74, 0.02) 100%)',
borderRadius: '5px',
// marginBottom: '32px'
}}>
<h1 style={{
fontSize: '32px',
fontWeight: '600',
color: 'rgba(0, 0, 0, 0.85)',
marginBottom: '12px',
margin: '0 0 12px 0'
}}>AI智能合同模板搜索</h1>
<p style={{
fontSize: '16px',
color: 'rgba(0, 0, 0, 0.45)',
marginBottom: '40px',
margin: '0 0 40px 0'
}}></p>
<div style={{
maxWidth: '600px',
margin: '0 auto',
position: 'relative'
}}>
<div style={{
background: 'white',
border: '2px solid #e5e7eb',
borderRadius: '12px',
padding: '16px 20px',
boxShadow: '0 4px 16px rgba(0, 0, 0, 0.08)',
transition: 'all 0.3s ease'
}}>
<textarea
ref={textareaRef}
placeholder="例如:销售合同、设备采购协议、包含违约责任条款的合同..."
value={searchQuery}
onChange={handleSearchInputChange}
onKeyDown={handleKeyDown}
aria-label="合同模板搜索输入框"
style={{
width: '100%',
minHeight: '80px',
border: 'none',
outline: 'none',
resize: 'vertical',
fontSize: '16px',
lineHeight: '1.5',
background: 'transparent',
margin: '0',
padding: '0',
fontFamily: 'inherit'
}}
/>
{/* 搜索操作区域 - 水平布局 */}
<div style={{
display: 'flex',
justifyContent: 'space-between',
alignItems: 'center',
width: '100%',
marginTop: '16px',
paddingTop: '16px',
borderTop: '1px solid #f0f0f0'
}}>
{/* 提示文字 - 左侧 */}
<div style={{
fontSize: '12px',
color: 'rgba(0, 0, 0, 0.45)',
display: 'flex',
alignItems: 'center',
flex: '1'
}}>
<i className={tipIcon} style={{ marginRight: '4px', fontSize: '12px' }}></i>
{tipText}
</div>
{/* 搜索按钮 - 右侧 */}
<button
onClick={handleSearch}
disabled={!searchQuery.trim()}
aria-label="开始搜索"
style={{
background: '#00684a',
color: 'white',
border: 'none',
borderRadius: '8px',
padding: '10px 24px',
fontSize: '14px',
fontWeight: '500',
cursor: 'pointer',
transition: 'all 0.3s ease',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
gap: '6px',
margin: '0',
flexShrink: '0'
}}
onMouseEnter={(e) => {
if (!e.currentTarget.disabled) {
e.currentTarget.style.background = '#005a40';
e.currentTarget.style.transform = 'translateY(-1px)';
}
}}
onMouseLeave={(e) => {
if (!e.currentTarget.disabled) {
e.currentTarget.style.background = '#00684a';
e.currentTarget.style.transform = 'translateY(0)';
}
}}
>
<i className="ri-search-line" style={{ fontSize: '14px' }}></i>
</button>
</div>
</div>
</div>
</div>
);
}