I use below to compute adjusted colors given that lighten doesn't work when black multipliers are all zero.
(defun my/color-rgb-transform-by-frac (c1 c2 frac)
"Compute RGB color from C1 adjusted closer to C2 by FRAC.
FRAC is a floating-point number between 0 and 1."
(cl-destructuring-bind (c1-r c1-g c1-b) c1
(cl-destructuring-bind (c2-r c2-g c2-b) c2
(list (+ c1-r (* (- c2-r c1-r) frac))
(+ c1-g (* (- c2-g c1-g) frac))
(+ c1-b (* (- c2-b c1-b) frac))))))
(defun my/color-hex-transform-by-frac (c1 c2 frac)
"Compute hex color from C1 adjusted closer to C2 by FRAC.
FRAC is a floating-point number between 0 and 1."
(apply #'color-rgb-to-hex
(my/color-rgb-transform-by-frac (color-name-to-rgb c1)
(color-name-to-rgb c2)
frac)))
;; e.g.,
(my/color-hex-transform-by-frac "black"
"white"
0.10) ; produces "#199919991999"
(color-lighten-name "black" 10) ; produces "#000000000000"