マッチカードMatchCardExperimental
2つの対象を左右に並べ、適合度、評価内訳、次の操作をまとめて表示するマッチングカードです。
プレビュー
協栄精密工業製造業・愛知
92%
ものづくり補助金設備投資・上限1,250万円
適合の内訳
- 対象事業者製造業・中小企業◎
- 設備投資要件見積追加が必要△
- 補助率上限 1,250万円2/3
状態とバリエーション
アクション付き
actions slot には次に取る操作を置き、プレビュー内で結果を表示します。
協栄精密工業製造業・愛知
92%
ものづくり補助金設備投資・上限1,250万円
適合の内訳
- 対象事業者製造業・中小企業◎
- 設備投資要件見積追加が必要△
- 補助率上限 1,250万円2/3
表示専用
actions を省略すると、比較結果だけを表示するカードになります。
協栄精密工業製造業・愛知
92%
ものづくり補助金設備投資・上限1,250万円
適合の内訳
- 対象事業者製造業・中小企業◎
- 設備投資要件見積追加が必要△
- 補助率上限 1,250万円2/3
左右の種類が違うとき
left と right はどちらも任意の識別の一片です。人と求人、荷物と空車のように種類が違っても成り立ちます。score を渡さないと中央は既定の連結記号になり、合わない項目は destructive の色で残します。
中
中村 涼
組込みソフト・7年
制御ソフト開発(東京)正社員・650万円
突き合わせた項目
- 経験年数希望5年 / 実績7年◎
- 勤務地本人は名古屋・勤務地は東京×
- 希望年収620万円 / 提示 650万円○
プロパティ
表は横にスクロールできます
| プロパティ | 型 | 初期値 | 説明 |
|---|---|---|---|
| left / right | ReactNode | - | 左右に置く対象です。CompanyCell や PersonCell など任意の identity node を渡せます。 |
| score | ReactNode | - | 中央に置く適合度やスコアです。省略時は交換アイコンです。 |
| factors | MatchFactor[] | - | 評価項目ごとの判定です。 |
| factorsLabel | ReactNode | "適合の内訳" | 内訳の見出しです。 |
| actions | ReactNode | - | 打診、申請、NDA などの次操作です。 |
| label | ReactNode | - | カード全体のアクセシブル名です。 |
| MatchFactor.label / value | ReactNode | - | 評価項目名と判定値です。 |
| MatchFactor.tone | "default" | "success" | "warning" | "destructive" | "muted" | "default" | 判定チップのトーンです。 |
| MatchFactor.detail | ReactNode | - | 行下に置く詳細です。 |
使い方
import * as React from "react";
import { Badge, Button, CompanyCell, MatchCard, Toast, type MatchFactor } from "@gunjo/ui";
const factors: MatchFactor[] = [
{ label: "対象事業者", value: "◎", tone: "success", detail: "製造業・中小企業" },
{ label: "設備投資要件", value: "△", tone: "warning", detail: "見積追加が必要" },
{ label: "補助率", value: "2/3", tone: "success", detail: "上限 1,250万円" },
];
export function SubsidyMatch() {
const rootRef = React.useRef<HTMLDivElement | null>(null);
const [portalContainer, setPortalContainer] = React.useState<HTMLElement | null>(null);
const [toastMessage, setToastMessage] = React.useState<string | null>(null);
React.useEffect(() => {
setPortalContainer(rootRef.current?.closest<HTMLElement>("[data-doc-component-preview-surface]") ?? rootRef.current);
}, []);
return (
<div ref={rootRef} className="relative flex w-full max-w-2xl flex-col gap-4">
{toastMessage ? (
<div className="pointer-events-none absolute right-3 top-3 z-[100] w-[min(340px,calc(100%-1.5rem))]">
<Toast
message={toastMessage}
type="success"
isVisible
onClose={() => setToastMessage(null)}
placement="inline"
closeLabel="閉じる"
tooltipPortalContainer={portalContainer}
/>
</div>
) : null}
<MatchCard
label="補助金適合カード"
left={<CompanyCell name="協栄精密工業" secondary="製造業・愛知" />}
right={<CompanyCell name="ものづくり補助金" secondary="設備投資・上限1,250万円" />}
score={<Badge variant="secondary">92%</Badge>}
factorsLabel="適合の内訳"
factors={factors}
actions={<Button size="sm" onClick={() => setToastMessage("申請準備を開始しました。")}>申請を準備する</Button>}
/>
</div>
);
}設計の判断
- 左右のどちらも「人」だと決めていない。
leftとrightは任意のノードで、会社と制度、荷物と空車のように、種類の違う2つを並べられます。人どうしに固定したRelationshipRowとは、ここが分かれ目です。 - 適合度の出し方をカードが決めない。真ん中の
scoreは数値でもメーターでもバッジでもよく、渡さなければ左右をつなぐ記号が出るだけです。「何点なら良いか」は制度ごとに変わるので、部品は判定を持ちません。 - 内訳は文字つきの印で出す。
factorsの各行は、丸や三角のような文字を色つきの小さな枠に入れて出します。色(tone)は補助で、意味は文字が持ちます。色だけで「適合」と「不適合」を分けないためです。
一般のカードの設計は UIXHERO の「カード」にあります。 UIXHERO: カード(Card)