/** * @file Renders shortcut binding values for keyboard and pointer interactions. */ import * as React from "react"; import type { PointerShortcutDisplay } from "../../../utils/pointerShortcuts"; import styles from "./InspectorShortcutBindingValue.module.css"; type BaseProps = { className?: string; isCapturing: boolean; prompt: string; unassignedLabel: string; }; type KeyboardProps = BaseProps & { type: "keyboard"; label: string | null; }; type PointerProps = BaseProps & { type: "pointer"; descriptor: PointerShortcutDisplay | null; }; export type InspectorShortcutBindingValueProps = KeyboardProps | PointerProps; const mergeClassName = (className?: string): string => { return [styles.value, className].filter(Boolean).join(" "); }; const PointerIcon: React.FC<{ className?: string }> = ({ className }) => { return ( ); }; const renderPointerContent = (descriptor: PointerShortcutDisplay) => { const { modifiers, pointerToken, pointerDisplayType, gestureLabel, requireEmptyTarget } = descriptor; const elements: React.ReactNode[] = []; elements.push( {pointerDisplayType === "mouse" ? : null} {pointerToken} {modifiers.length > 0 ? ( <> + {modifiers.map((modifier, index) => ( {index > 0 ? + : null} {modifier} ))} ) : null} , ); const appendOperator = (key: string) => { elements.push( + , ); }; if (gestureLabel) { appendOperator("pointer-operator-gesture"); elements.push( {gestureLabel} , ); } if (requireEmptyTarget) { appendOperator("pointer-operator-empty"); elements.push( ∅ , ); } return elements; }; export const InspectorShortcutBindingValue: React.FC = (props) => { const className = mergeClassName(props.className); if (props.isCapturing) { return ( {props.prompt} ); } if (props.type === "keyboard") { const label = props.label; if (!label) { return ( {props.unassignedLabel} ); } return ( {label} ); } const descriptor = props.descriptor; if (!descriptor) { return ( {props.unassignedLabel} ); } return ( {renderPointerContent(descriptor)} ); }; InspectorShortcutBindingValue.displayName = "InspectorShortcutBindingValue";