上限監視LimitMonitorExperimental

計測値を基準値や上限・下限と比較し、基準内、間近、超過、重大超過を表示します。

プレビュー

拘束時間(当日)12.4h / 13.0h基準間近

基準まで 残り 0.6h

連続運転4.2h / 4.0h基準超過

基準を 0.2h 超過

休息期間9.5h / 11.0h基準超過

下限まで 1.5h 不足

分類結果: near / -0.6h

状態とバリエーション

上限監視

拘束時間や連続運転のように、値を基準以下に保つ指標です。

拘束時間(当日)12.4h / 13.0h基準間近

基準まで 残り 0.6h

連続運転4.2h / 4.0h基準超過

基準を 0.2h 超過

休息期間9.5h / 11.0h基準超過

下限まで 1.5h 不足

分類結果: near / -0.6h

下限監視

休息期間のように、値を基準以上に保つ指標です。

休息期間9.5h / 11.0h基準超過

下限まで 1.5h 不足

分類結果: over / 1.5h

重大超過

hardLimit を超えると critical の塗りつぶし表示になります。

拘束時間(重大超過)16.2h / 13.0h上限超過

基準を 3.2h 超過

分類結果: critical / 3.2h

プロパティ

表は横にスクロールできます
プロパティ初期値説明
valuenumber-計測値です。
limitnumber-ソフトな基準値です。max に対する割合ではなく実単位で渡します。
hardLimitnumber-重大超過を判定する絶対上限または下限です。
warnWithinnumber0基準の手前で near とする余白です。
direction"ceiling" | "floor""ceiling"上限以下に保つか、下限以上に保つかを選びます。
maxnumber-バー正規化の最大値です。
labelReactNode-指標名です。
formatValue(value: number) => ReactNode-値と基準値の表示を整形します。
formatReadout({ state, over, direction, formatValue }) => ReactNode-バー下の説明文を整形します。
labelsPartial<Record<LimitState, ReactNode>>-状態チップのラベルを上書きします。
classifyLimit(value, options) => { state, over }-同じ基準分類を UI なしで返す純関数です。

使い方

import { LimitMonitor, classifyLimit } from "@gunjo/ui";

function formatHours(value: number) {
  return value.toFixed(1) + "h";
}

export function DriverLimitPanel() {
  const result = classifyLimit(13.5, { limit: 13, hardLimit: 16, warnWithin: 1 });

  return (
    <div className="flex w-full max-w-2xl flex-col gap-4 rounded-lg border bg-card p-4">
      <LimitMonitor
        label="拘束時間(当日)"
        value={13.5}
        limit={13}
        hardLimit={16}
        warnWithin={1}
        formatValue={formatHours}
      />
      <LimitMonitor
        label="連続運転"
        value={4.2}
        limit={4}
        hardLimit={4.5}
        warnWithin={0.25}
        formatValue={formatHours}
      />
      <LimitMonitor
        label="休息期間"
        value={9.5}
        limit={11}
        direction="floor"
        warnWithin={1}
        formatValue={formatHours}
      />
      <p className="rounded-md border bg-muted/30 px-3 py-2 text-sm text-muted-foreground">
        分類結果: {result.state} / {formatHours(result.over)}
      </p>
    </div>
  );
}

使用コンポーネント