import { useEffect, useState, type CSSProperties } from "react"; import type { AbilityTarget } from "../game/abilityCatalog"; import { useInputBindingLabels } from "../input/useInputBindingLabels"; import { ACTION_LAYER_LABELS, type ActionBindingControl, type ActionBindingLayer, } from "../game/actionBindings"; export interface ActionBarItem { id: string; name: string; shortLabel?: string; iconUrl?: string; description?: string; color?: string; resourceCost?: number; resourceLabel?: string; cooldownRemaining?: number; cooldownDuration?: number; disabled?: boolean; lockedUntilLevel?: number; target?: AbilityTarget; } export type ActionBarItems = Readonly>; export interface ActionBarProps { items: ActionBarItems; activeLayer: ActionBindingLayer; onActivate: (control: ActionBindingControl) => void; inputMode?: "keyboard" | "gamepad"; feedback?: string | null; variant?: "hud" | "compact"; } function cooldownPercent(remaining = 0, duration = 0): number { if (duration <= 0 || remaining <= 0) return 0; return Math.max(0, Math.min(100, (remaining / duration) * 100)); } export function ActionIcon({ item }: { item: ActionBarItem | null }) { const [failed, setFailed] = useState(false); useEffect(() => setFailed(false), [item?.iconUrl]); if (!item) return