@@ -99,7 +99,81 @@ class Map {
9999 }
100100}
101101
102+ class Slider {
103+ static KEY_DOWN_INCREMENT = 5 ;
104+ static DEFAULT_SLIDER_STATE = 50 ;
105+
106+ thumbElement = null ;
107+ sliderElement = null ;
108+ _currentState = 0 ;
109+
110+ constructor ( sliderElement ) {
111+ this . sliderElement = sliderElement ;
112+ this . currentState = Slider . DEFAULT_SLIDER_STATE ;
113+
114+ const thumb = this . sliderElement . querySelector ( '.slider__thumb' ) ;
115+ if ( ! thumb ) {
116+ throw new Error ( 'Couldn\'t find .slider__thumb element!' ) ;
117+ }
118+ this . thumbElement = thumb ;
119+ this . thumbElement . addEventListener ( 'pointerdown' , this . onThumbDown ) ;
120+ this . thumbElement . addEventListener ( 'ondragstart' , ( ) => false ) ;
121+ this . thumbElement . addEventListener ( 'focus' , this . onThumbFocus ) ;
122+ }
123+
124+ get currentState ( ) {
125+ return this . _currentState ;
126+ }
127+
128+ set currentState ( newState ) {
129+ this . _currentState = Math . max ( 0 , Math . min ( newState , 100 ) ) ;
130+ this . sliderElement . style . setProperty ( '--slider-state' , `${ this . _currentState } %` ) ;
131+ }
132+
133+ onThumbDown = ( evt ) => {
134+ evt . preventDefault ( ) ;
135+ this . thumbElement . setPointerCapture ( evt . pointerId ) ;
136+ this . thumbElement . addEventListener ( 'pointerup' , this . onThumbUp ) ;
137+ this . thumbElement . addEventListener ( 'pointermove' , this . onThumbMove ) ;
138+ } ;
139+
140+ onThumbUp = ( ) => {
141+ this . thumbElement . removeEventListener ( 'pointermove' , this . onThumbMove ) ;
142+ this . thumbElement . removeEventListener ( 'pointerup' , this . onThumbUp ) ;
143+ } ;
144+
145+ onThumbMove = ( evt ) => {
146+ const sliderBoundingRect = this . sliderElement . getBoundingClientRect ( ) ;
147+ const newPositionRatio = ( evt . clientX - sliderBoundingRect . x ) / sliderBoundingRect . width ;
148+ this . currentState = newPositionRatio * 100 ;
149+ } ;
150+
151+ onThumbFocus = ( evt ) => {
152+ evt . preventDefault ( ) ;
153+ document . addEventListener ( 'keydown' , this . onKeyDown ) ;
154+ this . thumbElement . addEventListener ( 'blur' , this . onThumbBlur ) ;
155+ } ;
156+
157+ onThumbBlur = ( ) => {
158+ document . removeEventListener ( 'keydown' , this . onKeyDown ) ;
159+ this . thumbElement . removeEventListener ( 'blur' , this . onThumbBlur ) ;
160+ } ;
161+
162+ onKeyDown = ( evt ) => {
163+ if ( evt . code === 'ArrowLeft' ) {
164+ this . currentState = this . currentState - Slider . KEY_DOWN_INCREMENT ;
165+ } else if ( evt . code === 'ArrowRight' ) {
166+ this . currentState = this . currentState + Slider . KEY_DOWN_INCREMENT ;
167+ }
168+ } ;
169+ }
170+
102171const navigationMenu = new NavigationMenu ( ) ;
103172navigationMenu . handleEvents ( ) ;
104173
105174new Map ( ) ;
175+
176+ const slider = document . querySelector ( '.slider' ) ;
177+ if ( slider ) {
178+ new Slider ( slider ) ;
179+ }
0 commit comments