@@ -4,6 +4,7 @@ import type {RGBA} from '../../../utils/color';
44import { rgbToHSL , parse , hslToString , rgbToHexString } from '../../../utils/color' ;
55import { clamp , scale } from '../../../utils/math' ;
66import { createSwipeHandler } from '../../utils' ;
7+ import { isElementHidden } from '../utils' ;
78
89interface HSB {
910 h : number ;
@@ -18,12 +19,23 @@ interface HSBPickerProps {
1819}
1920
2021interface HSBPickerState {
22+ wasPrevHidden : boolean ;
23+ hueCanvasRendered : boolean ;
2124 activeHSB : HSB ;
2225 activeChangeHandler : ( color : string ) => void ;
2326 hueTouchStartHandler : ( e : TouchEvent ) => void ;
2427 sbTouchStartHandler : ( e : TouchEvent ) => void ;
2528}
2629
30+ const hsbPickerDefaults : HSBPickerState = {
31+ wasPrevHidden : true ,
32+ hueCanvasRendered : false ,
33+ activeHSB : null ,
34+ activeChangeHandler : null ,
35+ hueTouchStartHandler : null ,
36+ sbTouchStartHandler : null
37+ } ;
38+
2739function rgbToHSB ( { r, g, b} : RGBA ) {
2840 const min = Math . min ( r , g , b ) ;
2941 const max = Math . max ( r , g , b ) ;
@@ -102,7 +114,7 @@ function renderSB(hue: number, canvas: HTMLCanvasElement) {
102114
103115export default function HSBPicker ( props : HSBPickerProps ) {
104116 const context = getContext ( ) ;
105- const store = context . store as HSBPickerState ;
117+ const store = context . getStore ( hsbPickerDefaults ) as HSBPickerState ;
106118 store . activeChangeHandler = props . onChange ;
107119
108120 const prevColor = context . prev && context . prev . props . color ;
@@ -118,15 +130,22 @@ export default function HSBPicker(props: HSBPickerProps) {
118130 }
119131
120132 function onSBCanvasRender ( canvas : HTMLCanvasElement ) {
133+ if ( isElementHidden ( canvas ) ) {
134+ return ;
135+ }
121136 const hue = activeHSB . h ;
122137 const prevHue = prevColor && rgbToHSB ( parse ( prevColor ) ) . h ;
123- if ( hue = == prevHue ) {
124- return ;
138+ if ( store . wasPrevHidden || hue ! == prevHue ) {
139+ renderSB ( hue , canvas ) ;
125140 }
126- renderSB ( hue , canvas ) ;
141+ store . wasPrevHidden = false ;
127142 }
128143
129- function onHueCanvasCreate ( canvas : HTMLCanvasElement ) {
144+ function onHueCanvasRender ( canvas : HTMLCanvasElement ) {
145+ if ( store . hueCanvasRendered || isElementHidden ( canvas ) ) {
146+ return ;
147+ }
148+ store . hueCanvasRendered = true ;
130149 renderHue ( canvas ) ;
131150 }
132151
@@ -207,7 +226,7 @@ export default function HSBPicker(props: HSBPickerProps) {
207226 store . hueTouchStartHandler = onHuePointerDown ;
208227 } }
209228 >
210- < canvas class = "hsb-picker__hue-canvas" oncreate = { onHueCanvasCreate } />
229+ < canvas class = "hsb-picker__hue-canvas" onrender = { onHueCanvasRender } />
211230 < span class = "hsb-picker__hue-cursor" style = { hueCursorStyle } > </ span >
212231 </ span >
213232 </ span >
0 commit comments