1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- import "./ToolIcon.scss";
- import React from "react";
- type ToolIconSize = "s" | "m";
- type ToolButtonBaseProps = {
- icon?: React.ReactNode;
- "aria-label": string;
- "aria-keyshortcuts"?: string;
- "data-testid"?: string;
- label?: string;
- title?: string;
- name?: string;
- id?: string;
- size?: ToolIconSize;
- keyBindingLabel?: string;
- showAriaLabel?: boolean;
- visible?: boolean;
- selected?: boolean;
- className?: string;
- };
- type ToolButtonProps =
- | (ToolButtonBaseProps & {
- type: "button";
- children?: React.ReactNode;
- onClick?(): void;
- })
- | (ToolButtonBaseProps & {
- type: "radio";
- checked: boolean;
- onChange?(): void;
- });
- const DEFAULT_SIZE: ToolIconSize = "m";
- export const ToolButton = React.forwardRef((props: ToolButtonProps, ref) => {
- const innerRef = React.useRef(null);
- React.useImperativeHandle(ref, () => innerRef.current);
- const sizeCn = `ToolIcon_size_${props.size || DEFAULT_SIZE}`;
- if (props.type === "button") {
- return (
- <button
- className={`ToolIcon_type_button ToolIcon ${sizeCn}${
- props.selected ? " ToolIcon--selected" : ""
- } ${props.className} ${
- props.visible
- ? "ToolIcon_type_button--show"
- : "ToolIcon_type_button--hide"
- }`}
- title={props.title}
- aria-label={props["aria-label"]}
- type="button"
- onClick={props.onClick}
- ref={innerRef}
- >
- <div className="ToolIcon__icon" aria-hidden="true">
- {props.icon || props.label}
- </div>
- {props.showAriaLabel && (
- <div className="ToolIcon__label">{props["aria-label"]}</div>
- )}
- {props.children}
- </button>
- );
- }
- return (
- <label className="ToolIcon" title={props.title}>
- <input
- className={`ToolIcon_type_radio ${sizeCn}`}
- type="radio"
- name={props.name}
- aria-label={props["aria-label"]}
- aria-keyshortcuts={props["aria-keyshortcuts"]}
- data-testid={props["data-testid"]}
- id={props.id}
- onChange={props.onChange}
- checked={props.checked}
- ref={innerRef}
- />
- <div className="ToolIcon__icon">
- {props.icon}
- {props.keyBindingLabel && (
- <span className="ToolIcon__keybinding">{props.keyBindingLabel}</span>
- )}
- </div>
- </label>
- );
- });
- ToolButton.defaultProps = {
- visible: true,
- className: "",
- };
|