-
Notifications
You must be signed in to change notification settings - Fork 4.1k
/
Copy pathclassNameBuilders.js
134 lines (124 loc) · 3.72 KB
/
classNameBuilders.js
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
import { numberToWord } from './numberToWord'
/*
* There are 3 prop patterns used to build up the className for a component.
* Each utility here is meant for use in a classnames() argument.
*
* There is no util for valueOnly() because it would simply return val.
* Use the prop value inline instead.
* <Label size='big' />
* <div class="ui big label"></div>
*/
/**
* Props where only the prop key is used in the className.
* @param {*} val A props value
* @param {string} key A props key
*
* @example
* <Label tag />
* <div class="ui tag label"></div>
*/
export const getKeyOnly = (val, key) => val && key
/**
* Props that require both a key and value to create a className.
* @param {*} val A props value
* @param {string} key A props key
*
* @example
* <Label corner='left' />
* <div class="ui left corner label"></div>
*/
export const getValueAndKey = (val, key) => val && val !== true && `${val} ${key}`
/**
* Props whose key will be used in className, or value and key.
* @param {*} val A props value
* @param {string} key A props key
*
* @example Key Only
* <Label pointing />
* <div class="ui pointing label"></div>
*
* @example Key and Value
* <Label pointing='left' />
* <div class="ui left pointing label"></div>
*/
export const getKeyOrValueAndKey = (val, key) => val && (val === true ? key : `${val} ${key}`)
//
// Prop to className exceptions
//
/**
* The "multiple" prop implements control of visibility and reserved classes for Grid subcomponents.
*
* @param {*} val The value of the "multiple" prop
* @param {*} key A props key
*
* @example
* <Grid.Row only='mobile' />
* <Grid.Row only='mobile tablet' />
* <div class="mobile only row"></div>
* <div class="mobile only tablet only row"></div>
*/
export const getMultipleProp = (val, key) => {
if (!val || val === true) return null
return val
.replace('large screen', 'large-screen')
.replace(/ vertically/g, '-vertically')
.split(' ')
.map((prop) => `${prop.replace('-', ' ')} ${key}`)
.join(' ')
}
/**
* The "textAlign" prop follows the useValueAndKey except when the value is "justified'.
* In this case, only the class "justified" is used, ignoring the "aligned" class.
* @param {*} val The value of the "textAlign" prop
*
* @example
* <Container textAlign='justified' />
* <div class="ui justified container"></div>
*
* @example
* <Container textAlign='left' />
* <div class="ui left aligned container"></div>
*/
export const getTextAlignProp = (val) =>
val === 'justified' ? 'justified' : getValueAndKey(val, 'aligned')
/**
* The "verticalAlign" prop follows the useValueAndKey.
*
* @param {*} val The value of the "verticalAlign" prop
*
* @example
* <Grid verticalAlign='middle' />
* <div class="ui middle aligned grid"></div>
*/
export const getVerticalAlignProp = (val) => getValueAndKey(val, 'aligned')
/**
* Create "X", "X wide" and "equal width" classNames.
* "X" is a numberToWord value and "wide" is configurable.
* @param {*} val The prop value
* @param {string} [widthClass=''] The class
* @param {boolean} [canEqual=false] Flag that indicates possibility of "equal" value
*
* @example
* <Grid columns='equal' />
* <div class="ui equal width grid"></div>
*
* <Form widths='equal' />
* <div class="ui equal width form"></div>
*
* <FieldGroup widths='equal' />
* <div class="equal width fields"></div>
*
* @example
* <Grid columns={4} />
* <div class="ui four column grid"></div>
*/
export const getWidthProp = (val, widthClass = '', canEqual = false) => {
if (canEqual && val === 'equal') {
return 'equal width'
}
const valType = typeof val
if ((valType === 'string' || valType === 'number') && widthClass) {
return `${numberToWord(val)} ${widthClass}`
}
return numberToWord(val)
}