11import * as d3 from 'd3'
22import { forwardRef , useEffect , useImperativeHandle , useRef , useState } from 'react'
33import { useResizeObserver } from '../../../lib/hooks/useResizeObserver'
4- import { cn } from '../../../lib/utils'
4+ import { cn , validValue } from '../../../lib/utils'
55import { LFOProps , LFORef } from './types'
66import { useStyle } from './styles'
77import {
@@ -14,24 +14,25 @@ import {
1414 LINE_COLOR ,
1515 MIN ,
1616 MAX ,
17- AMPLITUDE ,
1817 FREQUENCY ,
1918} from './constants'
2019
2120export const LFO = forwardRef < LFORef , LFOProps > ( ( props , ref ) => {
2221 const {
2322 type = TYPE ,
23+ frequency : _frequency = FREQUENCY ,
2424 delay = DELAY ,
25- speed = SPEED ,
26- amplitude = AMPLITUDE ,
27- frequency = FREQUENCY ,
25+ speed : _speed = SPEED ,
2826 min = MIN ,
2927 max = MAX ,
3028 lineWidth = LINE_WIDTH ,
3129 lineColor = LINE_COLOR ,
3230 ...restProps
3331 } = props
3432
33+ const speed = validValue ( _speed , 0.1 , 1 )
34+ const frequency = validValue ( _frequency , 0 , 1 )
35+
3536 const LFORef = useRef < LFORef | null > ( null )
3637 const xScale = useRef < d3 . ScaleLinear < number , number > | null > ( null )
3738 const yScale = useRef < d3 . ScaleLinear < number , number > | null > ( null )
@@ -48,15 +49,15 @@ export const LFO = forwardRef<LFORef, LFOProps>((props, ref) => {
4849
4950 xScale . current = d3
5051 . scaleLinear ( )
51- . domain ( [ 0 , 4 * Math . PI * speed ] )
52+ . domain ( [ 0 , 4 * Math . PI * ( speed * 10 ) ] )
5253 . range ( [ 0 , width ] )
5354 yScale . current = d3 . scaleLinear ( ) . domain ( [ min , max ] ) . range ( [ height , 0 ] )
5455 }
5556
5657 useEffect ( ( ) => {
5758 generateScales ( )
5859 generateWave ( )
59- } , [ speed ] )
60+ } , [ speed , frequency ] )
6061
6162 const generateWave = ( ) => {
6263 generateSineWave ( )
@@ -70,9 +71,9 @@ export const LFO = forwardRef<LFORef, LFOProps>((props, ref) => {
7071 const svg = d3 . select ( LFORef . current ) . select ( 'svg' ) . attr ( 'width' , width ) . attr ( 'height' , height )
7172 svg . selectAll ( '*' ) . remove ( )
7273
73- const data = d3 . range ( 0 , 4 * Math . PI * speed , 0.01 ) . map ( ( x ) => ( {
74+ const data = d3 . range ( 0 , 4 * Math . PI * ( speed * 10 ) , 0.01 ) . map ( ( x ) => ( {
7475 x,
75- y : Math . sin ( x ) ,
76+ y : Math . sin ( x ) * frequency * ( max - min ) * 0.5 + ( max + min ) / 2 ,
7677 } ) )
7778
7879 const line = d3
0 commit comments