0.0.8 • Published 6 months ago

rotary-knob v0.0.8

Weekly downloads
-
License
MIT
Repository
github
Last release
6 months ago

Rotary Knob

This is a Knob UI component that includes features such as value adjustment through rotation, step, and angle limits. However, it does not include any styles. You need to create your own knob design.

Usage

Components

A knob with restricted values

import { Knob } from 'rotary-knob/react'
import 'rotray-knob/style/sample.css'
;<Knob
  defaultValue={0.3}
  minAngle={0}
  maxAngle={270}
  minValue={0}
  maxValue={1}
  startAngle={225}
>
  <button type="button" className="knob" />
</Knob>
import { Knob } from 'rotary-knob/react'
import 'rotray-knob/style/sample.css'
;<Knob
  defaultValue={1}
  minAngle={0}
  maxAngle={300}
  minValue={0}
  maxValue={5}
  startAngle={210}
  stepValue={60}
  onStatusChange={console.log}
>
  <button type="button" className="knob" />
</Knob>

Infinite knob

import { Knob } from 'rotary-knob/react'
import 'rotray-knob/style/sample.css'
;<Knob startAngle={225} onDeltaChange={console.log}>
  <button type="button" className="knob" />
</Knob>
import { Knob } from 'rotary-knob/react'
import 'rotray-knob/style/sample.css'
;<Knob stepAngle={30} onValueChange={console.log}>
  <button type="button" className="knob" />
</Knob>

Controlled Value

const [value, setValue] = useState(0)

<input
  type="number"
  min="0"
  max="1"
  step="0.1"
  value={value}
  onChange={(e) => setValue(Number(e.target.value))}
/>
<Knob
  defaultValue={0.3}
  value={value}
  onValueChange={setValue}
  minAngle={0}
  maxAngle={270}
  minValue={0}
  maxValue={1}
  startAngle={225}
>
  <button type="button" className="knob" />
</Knob>

Hooks

useKnob

import { type ReactNode } from 'react'
import { useKnob, UseKnobProps } from './hooks/useKnob'

interface KnobProps extends UseKnobProps {
  children: ReactNode
}

export function Knob({
  defaultValue = 0.5,
  minAngle,
  maxAngle,
  minValue = 0,
  maxValue = 1,
  children,
  startAngle = 0,
  stepAngle,
  value,
  onDeltaChange,
  onValueChange,
  onStatusChange,
}: KnobProps) {
  const { ref, angle } = useKnob({
    defaultValue,
    minAngle,
    maxAngle,
    minValue,
    maxValue,
    startAngle,
    stepAngle,
    value,
    onDeltaChange,
    onValueChange,
    onStatusChange,
  })

  if (!children) {
    return null
  }

  return (
    <div
      style={{
        display: 'inline-block',
        cursor: 'grab',
        transform: `rotate(${angle}deg)`,
      }}
      ref={ref}
    >
      {children}
    </div>
  )
}
0.0.8

6 months ago

0.0.7

6 months ago

0.0.6

6 months ago

0.0.5

6 months ago

0.0.4

6 months ago

0.0.3

6 months ago

0.0.2

6 months ago

0.0.1

6 months ago