You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
44 lines
2.1 KiB
Racket
44 lines
2.1 KiB
Racket
11 years ago
|
#lang racket/base
|
||
|
(require "core.rkt")
|
||
|
|
||
|
(provide (all-defined-out))
|
||
|
|
||
|
(define (make-css-background-gradient colors [stops #f]
|
||
|
#:radial [radial #f]
|
||
|
#:horizontal [horizontal #f]
|
||
|
#:direction [direction #f])
|
||
|
; this doesn't handle old-style webkit syntax. todo: add it? I think I don't care
|
||
|
|
||
|
; check inputs for failure
|
||
|
(when (or (not (list? colors)) (< (len colors) 2))
|
||
|
(error "Not enough colors to make gradient in" colors))
|
||
|
(when (and stops (< (len stops) (len colors)))
|
||
|
(error "Not enough stops for given number of colors in" stops))
|
||
|
|
||
|
(when (not stops) ; distribute colors evenly between 0 and 100
|
||
|
; new-stops is range of steps incremented properly and rounded to int, then append 100 to end
|
||
|
(let ([new-stops `(,@(map ->int (range 0 100 (/ 100 (sub1 (len colors))))) 100)])
|
||
|
; convert to list of percentages
|
||
|
(set! stops (map (λ(x) (format "~a%" x)) new-stops))))
|
||
|
|
||
|
; color / percentage pairs separated by commas
|
||
|
(define color-stop-string (string-join (map (λ(color stop) (format "~a ~a" color stop)) colors stops) ", "))
|
||
|
|
||
|
; set up gradient options
|
||
|
(define gradient-type (if radial "radial" "linear"))
|
||
|
(define gradient-direction (or direction (if horizontal "left" "top")))
|
||
|
|
||
|
; can't use standard make-css-strings in this case because the prefixes appear in the value,
|
||
|
; not in the property (which is always "background")
|
||
|
(define gradient-strings (map (λ(prefix) (format "background: ~a~a-gradient(~a, ~a)" prefix gradient-type gradient-direction color-stop-string)) css-property-prefixes))
|
||
|
|
||
|
; just fill with the last color if gradient not available
|
||
|
(define fallback-string (format "background: ~a" (last colors)))
|
||
|
|
||
|
; put fallback string at front of list
|
||
|
(join-css-strings (cons fallback-string gradient-strings)))
|
||
|
|
||
|
(module+ main
|
||
|
(display (make-css-background-gradient (list "hsl(216, 78%, 95%)" "hsl(0, 0%, 99%)")
|
||
|
(list "0%" "100%")
|
||
|
#:direction "to top right")))
|