Compact left column layout and require manual cast start.

Stop stretching input cards to match AI panel height, and show a start button before online/offline hexagram casting begins.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-12 06:42:02 +08:00
parent 98b83a5f75
commit 1cde9ffc9c
4 changed files with 71 additions and 14 deletions
+16 -3
View File
@@ -29,6 +29,7 @@ export default function LiuyaoForm() {
const [calcDate, setCalcDate] = useState(nowDateString);
const [calcTime, setCalcTime] = useState(nowTimeString);
const [castMode, setCastMode] = useState<"online" | "offline">("online");
const [castActive, setCastActive] = useState(false);
const [guaData, setGuaData] = useState<GuaResult | null>(null);
const [completion, setCompletion] = useState("");
const [error, setError] = useState("");
@@ -37,6 +38,11 @@ export default function LiuyaoForm() {
const location = useRegionLocation(provinceCode, cityCode);
const formReady = question.trim() !== "" && location !== null;
useEffect(() => {
setCastActive(false);
setGuaData(null);
}, [provinceCode, cityCode, castMode, question]);
function validate(): string | null {
if (!question.trim()) {
return "请输入问事";
@@ -92,6 +98,8 @@ export default function LiuyaoForm() {
setCityCode("");
setCalcDate(nowDateString());
setCalcTime(nowTimeString());
setCastMode("online");
setCastActive(false);
setGuaData(null);
setCompletion("");
setError("");
@@ -117,7 +125,7 @@ export default function LiuyaoForm() {
/>
}
>
<ZenCard title="问事 · 心意" subtitle="所求何事,心诚则灵" className="flex h-full min-h-0 flex-col">
<ZenCard title="问事 · 心意" subtitle="所求何事,心诚则灵">
<Textarea
placeholder="您想算点什么?"
value={question}
@@ -139,7 +147,7 @@ export default function LiuyaoForm() {
</div>
</ZenCard>
<ZenCard title="起卦 · 时空" subtitle="地域、时辰与六爻" className="flex h-full min-h-0 flex-col">
<ZenCard title="起卦 · 时空" subtitle="地域、时辰与六爻">
<RegionSelect
label="起卦地域"
provinceCode={provinceCode}
@@ -182,8 +190,13 @@ export default function LiuyaoForm() {
key={castMode}
mode={castMode}
enabled={formReady}
active={castActive}
onStart={() => setCastActive(true)}
onResult={handleGuaResult}
onClear={() => setGuaData(null)}
onClear={() => {
setGuaData(null);
setCastActive(false);
}}
/>
{guaData && (
<div className="rounded-xl border border-primary/20 bg-primary/5 p-4">