マッチカード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 / rightReactNode-左右に置く対象です。CompanyCell や PersonCell など任意の identity node を渡せます。
scoreReactNode-中央に置く適合度やスコアです。省略時は交換アイコンです。
factorsMatchFactor[]-評価項目ごとの判定です。
factorsLabelReactNode"適合の内訳"内訳の見出しです。
actionsReactNode-打診、申請、NDA などの次操作です。
labelReactNode-カード全体のアクセシブル名です。
MatchFactor.label / valueReactNode-評価項目名と判定値です。
MatchFactor.tone"default" | "success" | "warning" | "destructive" | "muted""default"判定チップのトーンです。
MatchFactor.detailReactNode-行下に置く詳細です。

使い方

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>
  );
}

設計の判断

  • 左右のどちらも「人」だと決めていない。leftright は任意のノードで、会社と制度、荷物と空車のように、種類の違う2つを並べられます。人どうしに固定した RelationshipRow とは、ここが分かれ目です。
  • 適合度の出し方をカードが決めない。真ん中の score は数値でもメーターでもバッジでもよく、渡さなければ左右をつなぐ記号が出るだけです。「何点なら良いか」は制度ごとに変わるので、部品は判定を持ちません。
  • 内訳は文字つきの印で出す。factors の各行は、丸や三角のような文字を色つきの小さな枠に入れて出します。色(tone)は補助で、意味は文字が持ちます。色だけで「適合」と「不適合」を分けないためです。
    一般のカードの設計は UIXHERO の「カード」にあります。 UIXHERO: カード(Card)

使用コンポーネント