-
Notifications
You must be signed in to change notification settings - Fork 0
/
classes.go
122 lines (109 loc) · 2.51 KB
/
classes.go
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
115
116
117
118
119
120
121
122
package gorgeous
import (
"fmt"
"strings"
)
var classes = map[string]CSSClass{}
var media = map[string][]CSS{}
// Create a CSS class from a map of CSS properties and
// adds it to the global css.
// Eg:
//
// gorgeous.Class(gorgeous.CSSClass{
// Selector: ".my-class",
// Props: gorgeous.CSSProps{
// "color": "red",
// },
// })
//
// renders as:
//
// `.my-class {
// color: red;
// }`
func Class(c *CSSClass) *CSSClass {
classes[c.Selector] = *c
return c
}
// Create a CSS class within a media query from a map of CSS properties and
// adds it to the global css.
// Eg:
//
// gorgeous.Media("(max-width: 600px)", "my-class", gorgeous.CSSProps{
// "color": "red",
// })
//
// renders as:
//
// `@media (max-width: 600px) {
// .my-class {
// color: red;
// }
// }`
func Media(query string, name string, class CSSProps) {
RawMedia(query, renderCSSProps(name, class))
}
// Create a CSS class within a media query from a string and adds it to the global css.
// Eg:
//
// gorgeous.RawMedia("(max-width: 600px)", `.my-class {
// color: red;
// }`)
//
// renders as:
//
// `@media (max-width: 600px) {
// .my-class {
// color: red;
// }
// }`
func RawMedia(query string, class CSS) {
if media[query] == nil {
media[query] = []CSS{}
}
media[query] = append(media[query], class)
}
// Create a CSS class from a string and adds it to the global css.
// Eg:
//
// gorgeous.RawClass("my-class", `.my-class {
// color: red;
// }`)
//
// renders as:
//
// `.my-class {
// color: red;
// }`
func RawClass(name string, class CSS) {
if classes[name].Selector != "" {
panic(fmt.Sprintf(`gorgeous: class '%s' is already registered`, name))
}
classes[name] = CSSClass{
Selector: name,
Raw: class,
}
}
// Collects all registered CSS classes into a single CSS string.
func collectClasses(document HTML) CSS {
var collected CSS
for _, class := range classes {
// If a document is provided, only include classes that are used in the document.
if !class.Include && document != "" && !strings.Contains(document.String(), extractClassName(class.Selector)) {
continue
}
if class.Raw != "" {
collected += class.Raw + "\n"
} else {
collected += renderCSSProps(class.Selector, class.Props) + "\n"
}
}
for query, classes := range media {
collected += "@media " + CSS(query) + " {\n"
for _, class := range classes {
collected += class + "\n"
}
collected += "}\n"
}
return collected
}