react-dial-knob
Version:
Dial knob UI component for the web, based on pure HTML/SVG tags.
101 lines (72 loc) โข 4.1 kB
Markdown
#  React Knob (for web)
**๐ฆ Demo**: [Donut](https://pavelkukov.github.io/react-dial-knob/?path=/story/knob-skins--donut) | [Silver](https://pavelkukov.github.io/react-dial-knob/?path=/story/knob-skins--silver) | [White](https://pavelkukov.github.io/react-dial-knob/?path=/story/knob-skins--white) | [HighContrast](https://pavelkukov.github.io/react-dial-knob/?path=/story/knob-skins--high-contrast) | [Basic](https://pavelkukov.github.io/react-dial-knob/?path=/story/knob-skins--basic)
Mouse/touch/keyboard-friendly, accessible, knob component for the web.
Based on pure HTML/SVG elements without dependencies.
Implemented in TypeScript. Treeshakable with minimal footprint (core around 2kb).
## ๐ Performance
~10% scripting time while interacting, 90% Idle

## ๐งฉ Installing
```shell
npm install --save-dev react-dial-knob
```
**UMD module**
```html
https://unpkg.com/react-dial-knob/dist/react-dial-knob.umd.js
```
## ๐ฆ Skins & Demo
The package comes with five configurable skins - [Donut](https://pavelkukov.github.io/react-dial-knob/?path=/story/knob-skins--donut) | [Silver](https://pavelkukov.github.io/react-dial-knob/?path=/story/knob-skins--silver) | [White](https://pavelkukov.github.io/react-dial-knob/?path=/story/knob-skins--white) | [HighContrast](https://pavelkukov.github.io/react-dial-knob/?path=/story/knob-skins--high-contrast) | [Basic](https://pavelkukov.github.io/react-dial-knob/?path=/story/knob-skins--basic)
_________________________________________________________________________
A short tutorial on how to ["Create skin component"](https://pavelkukov.github.io/react-dial-knob/?path=/story/knob-knob-component--create-skin) can be found in the storybook and [CodePen](https://codepen.io/pavelkukov/pen/LYVOLoO?editors=0010). Essentially drop an SVG with few lines of code.
_________________________________________________________________________
## โ Usage
You have to store `value` and update the component (controlled component).
_________________________________________________________________________
[See at CodePen](https://codepen.io/pavelkukov/pen/xxGgZvL?editors=0010)
```typescript
import React, { useState } from 'react'
import { Donut } from 'react-dial-knob'
export default function MyPage() {
const [value, setValue] = useState(0)
return <Donut
diameter={200}
min={0}
max={100}
step={1}
value={value}
theme={{
donutColor: 'blue'
}}
onValueChange={setValue}
ariaLabelledBy={'my-label'}
>
<label id={'my-label'}>Some label</label>
</Donut>
}
```
#### Props
* value: number
* min: number
* max: number
* step: number
* ariaLabelledBy?: string
* onValueChange?: (value: number) => void
* and few [more](https://pavelkukov.github.io/react-dial-knob/?path=/story/knob-knob-component--props)...
## ๐งพ Notes
###### sideEffects is set to false - tree shaking will remove all unused parts and will further reduce the size of your final bundle.
Skins are independent of each other. The final bundle size is a sum of common dependencies plus skin size (typically around ~2.5kb with a single skin). Indicative stats on sizes can be found in ["stats.html"](https://github.com/pavelkukov/react-dial-knob/blob/master/stats.html)
** Core-only UMD build is available **
```
https://unpkg.com/react-dial-knob/dist/react-dial-knob.umd.core-only.min.js
```
* NPM - https://www.npmjs.com/package/react-dial-knob
* GitHub - https://github.com/pavelkukov/react-dial-knob
* Storybook - https://pavelkukov.github.io/react-dial-knob/?path=/story/knob-read-me--readme
## ๐ Author
Pavel Kukov <pavelkukov@gmail.com>
## ยฉ LICENSE (MIT)
See LICENSE.txt in the root directory
## ๐ Acknowledgments
* Repo structure and tooling are inspired by: https://github.com/danilowoz/react-content-loader
* Silver theme is based on https://codepen.io/simurai/pen/DwJdq
* Donut theme is based on https://codepen.io/Hyungsub08/pen/yLBPJKW