SCALE — Build Lab
UI部品 · REACT COMPONENT

期限超過バッジ

CATEGORYUI部品 TYPEReact Component EFFORT15〜30分 DIFFICULTY
PRIMARY CODE
tsx · components/tasks/OverdueBadge.tsx
"use client";

import { daysDiff } from "@/lib/tasks-api";

export default function OverdueBadge({ dueDate, status }: { dueDate: string; status?: string }) {
  if (!dueDate || status === "完了") return null;

  // daysDiff returns positive when overdue (today > dueDate), 0 = today, negative = future
  const diff = daysDiff(dueDate);

  if (diff > 0) {
    return (
      <span className="text-[10px] px-1.5 py-0.5 rounded bg-red-500/20 text-red-400 border border-red-500/25 font-medium whitespace-nowrap">
        {diff}日超過
      </span>
    );
  }

  if (diff === 0) {
    return (
      <span className="text-[10px] px-1.5 py-0.5 rounded bg-orange-500/20 text-orange-400 border border-orange-500/25 font-medium whitespace-nowrap">
        本日
      </span>
    );
  }

  const remaining = Math.abs(diff);

  if (remaining <= 2) {
    return (
      <span className="text-[10px] px-1.5 py-0.5 rounded bg-yellow-500/15 text-yellow-400 border border-yellow-500/25 font-medium whitespace-nowrap">
        あと{remaining}日
      </span>
    );
  }

  return (
    <span className="text-[10px] px-1.5 py-0.5 rounded bg-[#222]/60 text-[#888] font-medium whitespace-nowrap">
      あと{remaining}日
    </span>
  );
}

前提条件
Tailwind CSS v4TypeScript 5
USE CASES
  • タスク管理
  • 請求管理
  • 契約期日

期限超過バッジ

:LiTarget: 用途

期限を過ぎたタスクを赤バッジで強調表示。経過日数も表示。

:LiSparkle: 特徴

  • 経過日数自動計算
  • 色強調
  • ツールチップ

:LiCode: 実コード(SCALE Base より自動抽出)

:LiInfo: components/tasks/OverdueBadge.tsx の中身そのもの。コピペ即可。

"use client";

import { daysDiff } from "@/lib/tasks-api";

export default function OverdueBadge({ dueDate, status }: { dueDate: string; status?: string }) {
  if (!dueDate || status === "完了") return null;

  // daysDiff returns positive when overdue (today > dueDate), 0 = today, negative = future
  const diff = daysDiff(dueDate);

  if (diff > 0) {
    return (
      <span className="text-[10px] px-1.5 py-0.5 rounded bg-red-500/20 text-red-400 border border-red-500/25 font-medium whitespace-nowrap">
        {diff}日超過
      </span>
    );
  }

  if (diff === 0) {
    return (
      <span className="text-[10px] px-1.5 py-0.5 rounded bg-orange-500/20 text-orange-400 border border-orange-500/25 font-medium whitespace-nowrap">
        本日
      </span>
    );
  }

  const remaining = Math.abs(diff);

  if (remaining <= 2) {
    return (
      <span className="text-[10px] px-1.5 py-0.5 rounded bg-yellow-500/15 text-yellow-400 border border-yellow-500/25 font-medium whitespace-nowrap">
        あと{remaining}日
      </span>
    );
  }

  return (
    <span className="text-[10px] px-1.5 py-0.5 rounded bg-[#222]/60 text-[#888] font-medium whitespace-nowrap">
      あと{remaining}日
    </span>
  );
}

:LiFolder: ソースファイルのパス

/Users/oogushiyuuki/Library/CloudStorage/GoogleDrive-y-ogushi@scale-group.co.jp/マイドライブ/AI/scale-base/components/tasks/OverdueBadge.tsx

:LiHandPointer: 使い方

対象プロジェクトに該当ファイルをコピーして、props を流し込むだけ。

:LiAlertCircle: 注意事項

  • 依存パッケージを忘れず追加