-
Notifications
You must be signed in to change notification settings - Fork 28
/
units.clj
114 lines (82 loc) · 1.85 KB
/
units.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
(ns cljss.css.units
(:require [clojure.spec.alpha :as s]))
;;
;; Numeric data types
;;
(s/def ::integer int?)
(s/def ::number number?)
(s/def ::percentage
(s/cat
:value (s/and
number?
#(s/int-in-range? 0 101 %))
:unit #{:%}))
(s/def ::angle
(s/cat
:value
(s/and
number?
#(s/int-in-range? 0 361 %))))
(s/def ::length-percentage
(s/alt
:length ::length
:percentage ::percentage))
;;
;; CSS Units
;;
(s/def ::length-units
#{:em :ex :ch :rem :vw :vh :vmin :vmax
:cm :mm :q :in :pc :pt :px})
(s/def ::angle-units
#{:deg :grad :rad :turn})
(s/def ::duration-units
#{:s :ms})
(s/def ::frequency-units
#{:hz :khz})
(s/def ::resolution-units
#{:dpi :dpcm :dppx})
;;
;; Dimensions (numbers with units)
;;
(s/def ::length
(s/cat
:value ::number
:unit ::length-units))
(s/def ::time
(s/cat
:value ::number
:unit ::duration-units))
(s/def ::frequency
(s/cat
:value ::number
:unit ::frequency-units))
(s/def ::resolution
(s/cat
:value ::number
:unit ::resolution-units))
;;
;; Generic CSS Dimensions spec
;;
(s/def ::dimension
(s/alt
:length ::length
:time ::time
:frequency ::frequency
:resolution ::resolution))
(comment
(s/conform ::dimension [100 :ms]))
(defmulti compile-css first)
(defmethod compile-css :length [[_ {:keys [value unit]}]]
(str value (name unit)))
(defmethod compile-css :time [[_ {:keys [value unit]}]]
(str value (name unit)))
(defmethod compile-css :frequency [[_ {:keys [value unit]}]]
(str value (name unit)))
(defmethod compile-css :resolution [[_ {:keys [value unit]}]]
(str value (name unit)))
(defmethod compile-css :numeric [[_ {:keys [value]}]]
(str value))
(defmethod compile-css :percentage [[_ {:keys [value]}]]
(str value "%"))
(defmethod compile-css :keyword [[_ value]]
(name value))