11// from https://css-tricks.com/converting-color-spaces-in-javascript/
2- export const rgbToHsl = ( [ r , g , b ] : number [ ] ) => {
2+ const rgbToHsl = ( [ r , g , b ] : number [ ] ) => {
33 r /= 255 ;
44 g /= 255 ;
55 b /= 255 ;
@@ -27,17 +27,8 @@ export const rgbToHsl = ([r, g, b]: number[]) => {
2727 return [ h , s , l ] ;
2828} ;
2929
30- export const rgbToHex = ( rgb : Rgb ) : Hex =>
31- `#${ rgb
32- . map ( ( val ) => {
33- const hex = val . toString ( 16 ) ;
34- return hex . length === 1 ? `0${ hex } ` : hex ;
35- } )
36- . join ( '' ) } `;
37-
3830type Args = {
3931 amount : number ;
40- format : string ;
4132 group : number ;
4233 sample : number ;
4334 canvasBuilder : ( ) => any ;
@@ -61,14 +52,12 @@ const getSrc = (item: Item): string =>
6152
6253const getArgs = ( {
6354 amount = 3 ,
64- format = 'array' ,
6555 group = 20 ,
6656 sample = 10 ,
6757 canvasBuilder = browserCanvasBuilder ,
6858 imageClass = Image ,
6959} : ProminentOptions = { } ) : Args => ( {
7060 amount,
71- format,
7261 group,
7362 sample,
7463 canvasBuilder,
@@ -77,8 +66,7 @@ const getArgs = ({
7766
7867const format = ( input : Input , args : Args ) : Output => {
7968 const list = input . map ( ( val ) => {
80- const rgb = Array . isArray ( val ) ? val : ( val . split ( ',' ) . map ( Number ) as Rgb ) ;
81- return args . format === 'hex' ? rgbToHex ( rgb ) : rgb ;
69+ return Array . isArray ( val ) ? val : ( val . split ( ',' ) . map ( Number ) as Rgb ) ;
8270 } ) ;
8371
8472 return args . amount === 1 || list . length === 1 ? list [ 0 ] : list ;
@@ -143,32 +131,23 @@ const processImage = (
143131 . catch ( ( error ) => reject ( error ) )
144132 ) ;
145133
134+ // from https://github.com/luukdv/color.js
146135const prominent = ( item : Item , opts ?: ProminentOptions ) =>
147136 processImage ( getProminent , item , opts ) ;
148137
149138export const getBestTextColor = async (
150139 coverArt : string | undefined ,
151140 colorArgs ?: ProminentOptions
152- ) : Promise < string > => {
153- if ( ! coverArt ) return '#000' ;
141+ ) : Promise < [ h : number , s : number , l : number ] | undefined > => {
142+ if ( ! coverArt ) return undefined ;
154143
155- const colors = ( await prominent ( coverArt , {
144+ const colors = ( ( await prominent ( coverArt , {
156145 amount : 3 ,
157146 group : 10 ,
158- format : 'array' ,
159- sample : 10 ,
160147 ...colorArgs ,
161- } ) ) as number [ ] [ ] ;
162-
163- let [ bestH , bestS , bestL ] = rgbToHsl ( colors [ 0 ] ) ;
164- for ( const rgb of colors ) {
165- const [ h , s , l ] = rgbToHsl ( rgb ) ;
166- if ( s > 40 ) {
167- [ bestH , bestS , bestL ] = [ h , s , l ] ;
168- break ;
169- }
170- }
148+ } ) ) as number [ ] [ ] ) . map ( rgbToHsl ) ;
149+
150+ const saturatedColors = [ ...colors . filter ( ( [ , s ] ) => s > 10 ) , ...colors ] ;
171151
172- // clamp lightness value to preserve both colorfulness and readability
173- return `hsl(${ bestH } , ${ bestS } %, ${ Math . max ( Math . min ( bestL , 40 ) , 30 ) } %)` ;
152+ return saturatedColors [ 0 ] as Rgb ;
174153} ;
0 commit comments