-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.mjs
151 lines (139 loc) · 5.94 KB
/
index.mjs
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
import sheetHeader from './lib/sheet-header.mjs'
import resetStyles from './lib/reset.mjs'
// Custom properties
import borderRadius from './properties/border-radius.mjs'
import borderWidths from './properties/border-widths.mjs'
import colorScales from './properties/color-scales.mjs'
import colorSpots from './properties/color-spots.mjs'
import customProperties from './properties/custom-properties.mjs'
import fonts from './properties/fonts.mjs'
import spaceScale from './properties/space-scale.mjs'
import typeScale from './properties/type-scale.mjs'
// Custom classes
import borders from './classes/custom/borders.mjs'
import fontFamily from './classes/custom/font-family.mjs'
import fontSize from './classes/custom/font-size.mjs'
import gap from './classes/custom/gap.mjs'
import grid from './classes/custom/grid.mjs'
import margin from './classes/custom/margin.mjs'
import padding from './classes/custom/padding.mjs'
// Basic classes
import background from './classes/basic/background.mjs'
import boxAlign from './classes/basic/box-align.mjs'
import color from './classes/basic/color.mjs'
import cursor from './classes/basic/cursor.mjs'
import debug from './classes/basic/debug.mjs'
import display from './classes/basic/display.mjs'
import flexbox from './classes/basic/flexbox.mjs'
import fontSmoothing from './classes/basic/font-smoothing.mjs'
import fontStyle from './classes/basic/font-style.mjs'
import fontWeight from './classes/basic/font-weight.mjs'
import inset from './classes/basic/inset.mjs'
import lineHeight from './classes/basic/line-height.mjs'
import listStyle from './classes/basic/list-style.mjs'
import objectFit from './classes/basic/object-fit.mjs'
import objectPosition from './classes/basic/object-position.mjs'
import opacity from './classes/basic/opacity.mjs'
import order from './classes/basic/order.mjs'
import outline from './classes/basic/outline.mjs'
import overflow from './classes/basic/overflow.mjs'
import position from './classes/basic/position.mjs'
import size from './classes/basic/size.mjs'
import textAlign from './classes/basic/text-align.mjs'
import textDecoration from './classes/basic/text-decoration.mjs'
import tracking from './classes/basic/tracking.mjs'
import transform from './classes/basic/transform.mjs'
import userSelect from './classes/basic/user-select.mjs'
import visibility from './classes/basic/visibility.mjs'
import whiteSpace from './classes/basic/white-space.mjs'
import wordBreak from './classes/basic/word-break.mjs'
import zIndex from './classes/basic/z-index.mjs'
export default function write(config) {
try {
const {
breakpoints = {},
classes = true,
reset = true,
} = config
let output = sheetHeader() + '\n\n'
// Allow optout of the CSS reset
if (reset) {
output += resetStyles()
output += '\n'
}
// Run a CSS generator function only if its respective config field is truthy
function conditionallyWrite(field, generator, breakpoint = '') {
if (field !== false) {
const result = generator({ config, breakpoint })
output += result ? (result + '\n\n') : ''
}
}
function writeClasses(breakpoint = '') {
// Custom classes; optional based on their respective fields being truthy
conditionallyWrite(config.borders, borders, breakpoint)
conditionallyWrite(config.fonts, fontFamily, breakpoint)
conditionallyWrite(config.typeScale, fontSize, breakpoint)
conditionallyWrite(config.spaceScale, gap, breakpoint)
conditionallyWrite(config.grid, grid, breakpoint)
conditionallyWrite(config.spaceScale, margin, breakpoint)
conditionallyWrite(config.spaceScale, padding, breakpoint)
// Basic classes; some don't get rerun for each breakpoint
output += background({ breakpoint })
output += boxAlign({ breakpoint })
breakpoint === '' ? output += color() : ''
output += cursor({ breakpoint })
breakpoint === '' ? output += debug() : ''
output += display({ breakpoint })
output += flexbox({ breakpoint })
breakpoint === '' ? output += fontSmoothing() : ''
output += fontStyle({ breakpoint })
output += fontWeight({ breakpoint })
output += inset({ breakpoint })
output += lineHeight({ breakpoint })
output += listStyle({ breakpoint })
output += objectFit({ breakpoint })
output += objectPosition({ breakpoint })
output += opacity({ breakpoint })
output += order({ breakpoint })
output += outline({ breakpoint })
output += overflow({ breakpoint })
output += position({ breakpoint })
output += size({ breakpoint })
output += textAlign({ breakpoint })
output += textDecoration({ breakpoint })
output += tracking({ breakpoint })
output += transform({ breakpoint })
output += userSelect({ breakpoint })
output += visibility({ breakpoint })
output += whiteSpace({ breakpoint })
output += wordBreak({ breakpoint })
output += zIndex({ breakpoint })
}
// Emit custom properties
conditionallyWrite(config.borders?.radii, borderRadius)
conditionallyWrite(config.borders?.widths, borderWidths)
conditionallyWrite(config.color?.scales, colorScales)
conditionallyWrite(config.color?.spots, colorSpots)
conditionallyWrite(config.customProperties, customProperties)
conditionallyWrite(config.fonts, fonts)
conditionallyWrite(config.spaceScale, spaceScale)
conditionallyWrite(config.typeScale, typeScale)
// Optionally emit classes
if (classes) {
// Write default classes
writeClasses()
// Write media query scoped classes for each entry in `config.breakpoints`
Object.entries(breakpoints).forEach(breakpoint => {
const [label, width] = breakpoint
output += '\n'
output += `/*** Breakpoint: ${label} (${width}) ***/\n\n`
output += `@media (min-width: ${width}) {\n`
writeClasses(`-${label}`)
output += '\n}'
})
}
return output
} catch (err) {
throw err
}
}