/**
* @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";