import { useState } from "react"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display"; import { SearchInput } from "@godxjp/ui/data-entry"; import { Text } from "@godxjp/ui/general"; import { Flex, PageContainer } from "@godxjp/ui/layout"; /** * SearchInput — debounced search box with a built-in clear button. * onSearch runs after a changed query settles, never on mount. * Always listen to onSearch (NOT onChange). Uncontrolled for local filters, * controlled when search state lives in a URL param. Never a raw . * Composed only from real @godxjp/ui components. */ export default function Demo() { const [journalQuery, setJournalQuery] = useState(""); const [partnerQuery, setPartnerQuery] = useState(""); const journals = [ { id: "JE-0001", desc: "売上計上 · 株式会社山田商事" }, { id: "JE-0002", desc: "仕入計上 · 有限会社田中工業" }, { id: "JE-0003", desc: "経費精算 · 交通費" }, { id: "JE-0004", desc: "売上計上 · ABC株式会社" }, { id: "JE-0005", desc: "給与支払 · 2024年3月分" }, ]; const filtered = journals.filter( (j) => j.id.toLowerCase().includes(journalQuery.toLowerCase()) || j.desc.toLowerCase().includes(journalQuery.toLowerCase()), ); return ( 仕訳一覧フィルター(制御モード) value + onValueChange で即時制御(入力に追従)。onSearch は 250 ms デバウンス後に発火。 {}} /> {filtered.length === 0 ? ( 該当なし ) : ( filtered.map((j) => ( {j.id} {" "} {j.desc} )) )} 取引先検索(非制御モード) defaultValue のみ渡して非制御。ローカルフィルターに適す。 {partnerQuery && ( 検索中:{" "} {partnerQuery} )} カスタム ariaLabel 隣接するラベルがない場合は ariaLabel で補完する。 {}} /> ); }