/** * @file * @copyright 2020 Aleksej Komarov * @license MIT */ import { keyOfMatchingRange, scale } from 'common/math'; import { classes } from 'common/react'; import { computeBoxClassName, computeBoxProps } from './Box'; import { DraggableControl } from './DraggableControl'; import { NumberInput } from './NumberInput'; export const Knob = (props) => { // IE8: I don't want to support a yet another component on IE8. // IE8: It also can't handle SVG. if (Byond.IS_LTE_IE8) { return ; } const { // Draggable props (passthrough) animated, format, maxValue, minValue, unclamped, onChange, onDrag, step, stepPixelSize, suppressFlicker, unit, value, // Own props className, style, fillValue, color, ranges = {}, size = 1, bipolar, children, ...rest } = props; return ( {(control) => { const { dragging, editing, value, displayValue, displayElement, inputElement, handleDragStart } = control; const scaledFillValue = scale(fillValue ?? displayValue, minValue, maxValue); const scaledDisplayValue = scale(displayValue, minValue, maxValue); const effectiveColor = color || keyOfMatchingRange(fillValue ?? value, ranges) || 'default'; const rotation = Math.min((scaledDisplayValue - 0.5) * 270, 225); return (
{dragging &&
{displayElement}
} {inputElement}
); }} ); };