@symbo.ls/default-config 3.8.8 → 3.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +4 -1
  2. package/blank/font.js +1 -1
  3. package/blank/index.js +8 -8
  4. package/components/Atoms/Block.js +29 -0
  5. package/components/Atoms/Box.js +37 -0
  6. package/components/Atoms/Form.js +5 -0
  7. package/components/Atoms/Grid.js +37 -0
  8. package/components/Atoms/Hgroup.js +57 -0
  9. package/components/Atoms/Iframe.js +8 -0
  10. package/components/Atoms/Img.js +9 -0
  11. package/components/Atoms/InteractiveComponent.js +65 -0
  12. package/components/Atoms/Picture.js +34 -0
  13. package/components/Atoms/Shape/index.js +3 -0
  14. package/components/Atoms/Shape.js +249 -0
  15. package/components/Atoms/Svg.js +45 -0
  16. package/components/Atoms/Text.js +43 -0
  17. package/components/Atoms/Theme.js +20 -0
  18. package/components/Atoms/Video.js +11 -0
  19. package/components/Avatar.js +10 -0
  20. package/components/Button.js +72 -0
  21. package/components/Dialog.js +69 -0
  22. package/components/Dropdown.js +153 -0
  23. package/components/Icon/index.js +236 -0
  24. package/components/Icon/style.js +8 -0
  25. package/components/Input/Checkbox.js +54 -0
  26. package/components/Input/Input.js +37 -0
  27. package/components/Input/NumberInput.js +25 -0
  28. package/components/Input/Radio.js +31 -0
  29. package/components/Input/Textarea.js +47 -0
  30. package/components/Input/Toggle.js +36 -0
  31. package/components/Link.js +166 -0
  32. package/components/Notification.js +43 -0
  33. package/components/Range.js +106 -0
  34. package/components/Select.js +33 -0
  35. package/components/Tooltip/index.js +128 -0
  36. package/components/Tooltip/style.js +12 -0
  37. package/components/index.js +36 -0
  38. package/default/font.js +9 -2
  39. package/default/index.js +2 -2
  40. package/default/typography.js +1 -0
  41. package/designSystem/color.js +70 -0
  42. package/designSystem/font.js +21 -0
  43. package/designSystem/icons.js +69 -0
  44. package/designSystem/index.js +45 -0
  45. package/designSystem/media.js +31 -0
  46. package/designSystem/spacing.js +6 -0
  47. package/designSystem/theme.js +247 -0
  48. package/designSystem/timing.js +8 -0
  49. package/designSystem/typography.js +9 -0
  50. package/index.js +15 -0
  51. package/package.json +4 -1
@@ -0,0 +1,11 @@
1
+ 'use strict'
2
+
3
+ export const Video = {
4
+ tag: 'video',
5
+
6
+ controls: true,
7
+
8
+ childExtends: {
9
+ tag: 'source'
10
+ }
11
+ }
@@ -0,0 +1,10 @@
1
+ 'use strict'
2
+
3
+ export const Avatar = {
4
+ extends: 'Img',
5
+ display: 'block',
6
+ avatarType: 'adventurer-neutral',
7
+ borderRadius: '100%',
8
+ boxSize: 'C+X C+X',
9
+ src: el => `https://api.dicebear.com/7.x/${el.avatarType || 'initials'}/svg?seed=${el.key || 'no-avatar'}`
10
+ }
@@ -0,0 +1,72 @@
1
+ 'use strict'
2
+
3
+ /**
4
+ * A Button component
5
+ * The `Button` component represents a clickable button element with customizable styles and properties.
6
+ *
7
+ * @description
8
+ * @extends {FocusableComponent, IconText}
9
+ * @typedef {Object} Button
10
+ * @property {string} tag - The HTML tag used to render the button (e.g., 'button').
11
+ * @property {string} props.type - The type attribute of the button ('button' by default).
12
+ *
13
+ * @example
14
+ * // Example usage of the Button component:
15
+ * const myButton = {
16
+ * extends: Button
17
+ * }
18
+ */
19
+
20
+ export const Button = {
21
+ extends: ['IconText', 'FocusableComponent'],
22
+ tag: 'button',
23
+
24
+ fontSize: 'A',
25
+ type: 'button',
26
+ borderStyle: 'none',
27
+ display: 'inline-flex',
28
+ align: 'center center',
29
+ textDecoration: 'none',
30
+ lineHeight: '1',
31
+ whiteSpace: 'nowrap',
32
+ padding: 'Z B2',
33
+ fontWeight: '500',
34
+ fontFamily: 'inherit',
35
+ round: 'C2',
36
+
37
+ disabled: (el) => el.call('exec', el.disabled)
38
+ }
39
+
40
+ export const SquareButton = {
41
+ extends: 'Button',
42
+ fontSize: 'A',
43
+ width: 'A',
44
+ padding: 'Z',
45
+ aspectRatio: '1 / 1',
46
+ icon: 'smile',
47
+ boxSize: 'fit-content fit-content',
48
+ justifyContent: 'center',
49
+ round: 'Z2',
50
+ boxSizing: 'content-box'
51
+ }
52
+
53
+ export const CircleButton = {
54
+ extends: 'SquareButton',
55
+ round: 'C'
56
+ }
57
+
58
+ export const KangorooButton = {
59
+ extends: 'Button',
60
+ childExtends: 'IconText'
61
+ }
62
+
63
+ export const ButtonSet = {
64
+ tag: 'nav',
65
+ display: 'flex',
66
+ childExtends: 'SquareButton'
67
+ }
68
+
69
+ export const IconButton = {
70
+ extends: ['SquareButton', 'ClickableItem'],
71
+ round: 'Z'
72
+ }
@@ -0,0 +1,69 @@
1
+ 'use strict'
2
+
3
+ export const Dialog = {
4
+ display: 'flex',
5
+ tag: 'dialog',
6
+ flow: 'column',
7
+ border: '0',
8
+ theme: 'dialog',
9
+ round: 'Z2'
10
+ }
11
+
12
+ export const DialogHeader = {
13
+ extends: 'Hgroup',
14
+
15
+ minWidth: '100%',
16
+ gap: 'A',
17
+
18
+ Title: {
19
+ align: 'center space-between',
20
+
21
+ Text: { text: 'Title' },
22
+
23
+ SquareButton: {
24
+ icon: 'x',
25
+ theme: 'transparent'
26
+ }
27
+ },
28
+
29
+ Paragraph: {
30
+ color: 'caption'
31
+ }
32
+ }
33
+
34
+ export const DialogFooter = {
35
+ display: 'flex',
36
+
37
+ align: 'center flex-end',
38
+ gap: 'X2',
39
+ margin: 'auto - -',
40
+ padding: 'Y2 X2',
41
+
42
+ childExtends: {
43
+ extends: 'Button',
44
+ textTransform: 'uppercase',
45
+ background: 'transparent',
46
+ '@dark': {
47
+ theme: 'primary @dark .color-only'
48
+ },
49
+ '@light': {
50
+ theme: 'primary @light .color-only'
51
+ },
52
+ '&': {
53
+ padding: 'Z A'
54
+ },
55
+ ':hover': {
56
+ theme: 'tertiary'
57
+ },
58
+ ':active': {
59
+ background: 'white.1'
60
+ }
61
+ },
62
+
63
+ Cancel: {
64
+ text: 'cancel'
65
+ },
66
+ Ok: {
67
+ text: 'ok'
68
+ }
69
+ }
@@ -0,0 +1,153 @@
1
+ 'use strict'
2
+
3
+ export const Dropdown = {
4
+ attr: { dropdown: true },
5
+ position: 'absolute',
6
+ top: '100%',
7
+ left: '0',
8
+ zIndex: 1000,
9
+ theme: 'quaternary',
10
+ padding: 'Y',
11
+ round: 'Z2',
12
+ flow: 'column',
13
+ gap: 'X',
14
+ transition: 'B defaultBezier',
15
+ transitionProperty: 'transform, opacity, visibility',
16
+ transform: 'translate3d(0,10%,0)',
17
+ opacity: 0,
18
+ visibility: 'hidden'
19
+ }
20
+
21
+ export const DropdownList = {
22
+ display: 'flex',
23
+
24
+ attr: {
25
+ dropdown: true
26
+ },
27
+
28
+ padding: '0 Y',
29
+ maxHeight: 'G',
30
+ flow: 'column',
31
+ theme: 'quaternary',
32
+ overflow: 'hidden auto',
33
+ style: { listStyleType: 'none' },
34
+ transition: 'B defaultBezier',
35
+ transitionProperty: 'transform, opacity, visibility',
36
+ children: (el) => el.options || [],
37
+ childrenAs: 'props',
38
+
39
+ '.hidden': {
40
+ transform: 'translate3d(0,10%,0)',
41
+ opacity: 0,
42
+ visibility: 'hidden'
43
+ },
44
+
45
+ childExtends: {
46
+ extends: 'Button',
47
+ state: {},
48
+ isActive: ({ key, state }) => state.active === key,
49
+ position: 'relative',
50
+ round: '0',
51
+ align: 'center flex-end',
52
+ flow: 'row-reverse',
53
+ padding: 'Z2 C Z2 Y2',
54
+ margin: '0',
55
+ gap: 'Y2',
56
+ theme: 'quaternary .child',
57
+
58
+ ':hover': {
59
+ style: {
60
+ svg: { opacity: '0.5' }
61
+ }
62
+ },
63
+
64
+ Icon: {
65
+ isActive: ({ key, state }) => state.active === key,
66
+ name: 'checkmark',
67
+ opacity: '0.1',
68
+ '.active': { opacity: '1' }
69
+ },
70
+
71
+ ':not(:first-child)': {
72
+ '@dark': { border: 'solid gray4.65' },
73
+ '@light': { border: 'solid gray11' },
74
+ borderWidth: '1px 0 0'
75
+ }
76
+ }
77
+ }
78
+
79
+ export const DropdownParent = {
80
+ position: 'relative',
81
+ zIndex: 999,
82
+ style: {
83
+ '&:hover': {
84
+ zIndex: 1000,
85
+ '& [dropdown]': {
86
+ transform: 'translate3d(0,0,0)',
87
+ opacity: 1,
88
+ visibility: 'visible'
89
+ }
90
+ }
91
+ }
92
+ }
93
+
94
+ export const DropdownParentFocus = {
95
+ position: 'relative',
96
+ tabindex: '0',
97
+ style: {
98
+ '&:focus-within': {
99
+ zIndex: 1000,
100
+ '& [dropdown]': {
101
+ transform: 'translate3d(0,0,0)',
102
+ opacity: 1,
103
+ visibility: 'visible'
104
+ }
105
+ }
106
+ },
107
+
108
+ Input_trigger: {
109
+ type: 'checkbox',
110
+ opacity: '0',
111
+ position: 'absolute',
112
+ inset: '0',
113
+ width: '100%',
114
+ height: '100%',
115
+ cursor: 'pointer',
116
+ onClick: (ev, el) => {
117
+ if (el.node === document.activeElement) el.node.blur()
118
+ }
119
+ },
120
+
121
+ Dropdown: {
122
+ onClick: () => {
123
+ document.activeElement?.blur()
124
+ }
125
+ }
126
+ }
127
+ export const DropdownSiblingFocus = {
128
+ position: 'relative',
129
+ tabindex: '0',
130
+ style: {
131
+ '&:focus-within': {
132
+ zIndex: 1000,
133
+ '& ~ [dropdown]': {
134
+ transform: 'translate3d(0,0,0)',
135
+ opacity: 1,
136
+ visibility: 'visible'
137
+ }
138
+ }
139
+ },
140
+
141
+ Input_trigger: {
142
+ type: 'checkbox',
143
+ opacity: '0',
144
+ position: 'absolute',
145
+ inset: '0',
146
+ width: '100%',
147
+ height: '100%',
148
+ cursor: 'pointer',
149
+ onClick: (ev, el) => {
150
+ if (el.node === document.activeElement) el.node.blur()
151
+ }
152
+ }
153
+ }
@@ -0,0 +1,236 @@
1
+ 'use strict'
2
+
3
+ const inheritFromIsActive = (el) => {
4
+ const propsActive = el['.isActive']
5
+ if (!propsActive) return
6
+ return el.call('exec', propsActive.name || propsActive.icon)
7
+ }
8
+
9
+ const getIconName = (el, s) => {
10
+ const { key } = el
11
+ let icon = el.call('exec', el.name || el.icon || key, el)
12
+
13
+ if (el.call('isString', icon) && icon.includes('{{')) {
14
+ icon = el.call('replaceLiteralsWithObjectFields', icon)
15
+ }
16
+
17
+ return el.call('isString', icon) ? icon : key
18
+ }
19
+
20
+ export const Icon = {
21
+ extends: 'Svg',
22
+ width: 'A',
23
+ height: 'A',
24
+ display: 'inline-block',
25
+ style: { fill: 'currentColor', '*': { fill: 'currentColor' } },
26
+
27
+ onInit: (el, s, ctx) => {
28
+ const { parent } = el
29
+ const { icons, useIconSprite, verbose } = ctx && ctx.designSystem
30
+ const { toCamelCase } = ctx && ctx.utils
31
+
32
+ const inheritFromIsActive = (el) => {
33
+ const propsActive = el['.isActive']
34
+ if (!propsActive) return
35
+ return el.call('exec', propsActive.name || propsActive.icon)
36
+ }
37
+
38
+ const getSemanticIcon = (el, s, ctx) => {
39
+ const { semanticIcons } = ctx && ctx.designSystem
40
+ const { toCamelCase } = ctx && ctx.utils
41
+
42
+ let iconName = getIconName(el, s)
43
+ const camelCase = toCamelCase(iconName)
44
+ const isArray = camelCase.split(/([a-z])([A-Z])/g)
45
+ const semanticIconRootName = isArray[1]
46
+ ? isArray[0]
47
+ : iconName.split('.')[0].split(' ')[0]
48
+ const semanticIcon =
49
+ semanticIcons && semanticIcons[semanticIconRootName]
50
+ if (semanticIcon) {
51
+ const iconKey = iconName.includes('.')
52
+ ? 'sfsymbols.' + iconName.split('.').slice(1).join('.')
53
+ : 'sfsymbols'
54
+ iconName =
55
+ semanticIcon[iconKey] ||
56
+ semanticIcon[iconName.split('.')[0].split(' ')[0]]
57
+ return {
58
+ tag: 'span',
59
+ semanticIcons: true,
60
+ width: 'A',
61
+ height: 'A',
62
+ lineHeight: '1em',
63
+ ':after': {
64
+ fontSize: 'Z',
65
+ fontWeight: '300',
66
+ content: `"${iconName}"`,
67
+ textAlign: 'center',
68
+ display: 'inline-block',
69
+ style: {
70
+ color: 'currentColor',
71
+ fontFamily: "'SF Pro Icons', 'SF Pro', 'SF Symbols', 'Segoe UI'"
72
+ }
73
+ }
74
+ }
75
+ }
76
+ }
77
+
78
+ const getIconName = (el, s) => {
79
+ const { key } = el
80
+ let icon = el.call('exec', el.name || el.icon || key, el)
81
+
82
+ if (el.call('isString', icon) && icon.includes('{{')) {
83
+ icon = el.call('replaceLiteralsWithObjectFields', icon)
84
+ }
85
+
86
+ return el.call('isString', icon) ? icon : key
87
+ }
88
+
89
+ let iconName = getIconName(el, s)
90
+
91
+ // Handle variant suffixes (e.g. 'deviceBigScreen outline' -> 'deviceBigScreenOutline')
92
+ if (iconName.includes(' ')) {
93
+ const parts = iconName.split(' ')
94
+ iconName =
95
+ parts[0] +
96
+ parts
97
+ .slice(1)
98
+ .map((p) => p.charAt(0).toUpperCase() + p.slice(1))
99
+ .join('')
100
+ }
101
+
102
+ const camelCase = toCamelCase(iconName)
103
+ const isArray = camelCase.split(/([a-z])([A-Z])/g)
104
+ const semanticIcon = getSemanticIcon(el, s, ctx)
105
+ if (semanticIcon) {
106
+ Object.assign(el, semanticIcon)
107
+ return
108
+ }
109
+
110
+ let activeIconName
111
+ if (el.isActive) activeIconName = inheritFromIsActive(el)
112
+ const parentPropsActive = parent['.isActive']
113
+ if (
114
+ parent &&
115
+ parent.isActive &&
116
+ parentPropsActive &&
117
+ parentPropsActive.icon
118
+ ) {
119
+ activeIconName = el.call(
120
+ 'exec',
121
+ parentPropsActive.icon ||
122
+ parentPropsActive.Icon.name ||
123
+ parentPropsActive.Icon.icon,
124
+ el
125
+ )
126
+ }
127
+
128
+ if (el.call('isString', activeIconName) && activeIconName.includes('{{')) {
129
+ activeIconName = el.call(
130
+ 'replaceLiteralsWithObjectFields',
131
+ activeIconName
132
+ )
133
+ }
134
+
135
+ let iconInContext
136
+ if (icons[activeIconName]) iconInContext = activeIconName
137
+ if (icons[camelCase]) iconInContext = camelCase
138
+ else if (icons[isArray[0] + isArray[1]])
139
+ iconInContext = isArray[0] + isArray[1]
140
+ else if (icons[isArray[0]]) iconInContext = isArray[0]
141
+ else {
142
+ if (verbose) el.warn("Can't find icon:", iconName, iconInContext)
143
+ }
144
+
145
+ const iconFromLibrary = icons[iconInContext]
146
+ const directSrc = (parent && parent.src) || el.src
147
+
148
+ Object.assign(el, {
149
+ spriteId: useIconSprite && iconInContext,
150
+ src: iconFromLibrary || directSrc || icons.noIcon
151
+ })
152
+ },
153
+
154
+ attr: { viewBox: '0 0 24 24' }
155
+ }
156
+
157
+ export const IconText = {
158
+ display: 'flex',
159
+
160
+ align: 'center center',
161
+ lineHeight: 1,
162
+
163
+ '.reversed': {
164
+ flow: 'row-reverse'
165
+ },
166
+
167
+ '.vertical': {
168
+ flow: 'column'
169
+ },
170
+
171
+ Icon: {
172
+ if: (el) => {
173
+ const { parent } = el
174
+ return el.call(
175
+ 'exec',
176
+ parent.icon || el.name || el.sfSymbols || parent.sfSymbols,
177
+ el
178
+ )
179
+ },
180
+ icon: (el) => el.call('exec', el.parent.icon, el.parent)
181
+ },
182
+
183
+ text: (el) => el.text
184
+ }
185
+
186
+ export const FileIcon = {
187
+ display: 'flex',
188
+ theme: 'tertiary',
189
+ boxSize: 'C1',
190
+ align: 'center center',
191
+ round: 'Z2',
192
+ Icon: {
193
+ fontSize: 'B',
194
+ margin: 'auto',
195
+ icon: 'file'
196
+ }
197
+ }
198
+
199
+ const getSemanticIcon = (el, s, ctx) => {
200
+ const { semanticIcons } = ctx && ctx.designSystem
201
+ const { toCamelCase } = ctx && ctx.utils
202
+
203
+ let iconName = getIconName(el, s)
204
+ const camelCase = toCamelCase(iconName)
205
+ const isArray = camelCase.split(/([a-z])([A-Z])/g)
206
+ const semanticIconRootName = isArray[1]
207
+ ? isArray[0]
208
+ : iconName.split('.')[0].split(' ')[0]
209
+ const semanticIcon = semanticIcons && semanticIcons[semanticIconRootName]
210
+ if (semanticIcon) {
211
+ const iconKey = iconName.includes('.')
212
+ ? 'sfsymbols.' + iconName.split('.').slice(1).join('.')
213
+ : 'sfsymbols'
214
+ iconName =
215
+ semanticIcon[iconKey] ||
216
+ semanticIcon[iconName.split('.')[0].split(' ')[0]]
217
+ return {
218
+ tag: 'span',
219
+ semanticIcons: true,
220
+ width: 'A',
221
+ height: 'A',
222
+ lineHeight: '1em',
223
+ ':after': {
224
+ fontSize: 'Z',
225
+ fontWeight: '300',
226
+ content: `"${iconName}"`,
227
+ textAlign: 'center',
228
+ display: 'inline-block',
229
+ style: {
230
+ color: 'currentColor',
231
+ fontFamily: "'SF Pro Icons', 'SF Pro', 'SF Symbols', 'Segoe UI'"
232
+ }
233
+ }
234
+ }
235
+ }
236
+ }
@@ -0,0 +1,8 @@
1
+ 'use strict'
2
+
3
+ export default {
4
+ width: '1em',
5
+ height: '1em',
6
+ fill: 'currentColor',
7
+ display: 'inline-block'
8
+ }
@@ -0,0 +1,54 @@
1
+ 'use strict'
2
+
3
+ export const Checkbox = {
4
+ extends: 'Focusable',
5
+
6
+ tag: 'label',
7
+
8
+ boxSize: 'fit-content fit-content',
9
+ cursor: 'pointer',
10
+ round: 'Y',
11
+
12
+ Input: {
13
+ type: 'checkbox',
14
+ display: 'none',
15
+ ':checked + div': { theme: 'primary' },
16
+ ':checked + div > svg': {
17
+ transform: 'none',
18
+ opacity: '1'
19
+ },
20
+ attr: {
21
+ checked: el => el.call('exec', el.parent.checked)
22
+ }
23
+ },
24
+
25
+ Flex: {
26
+ align: 'center center',
27
+ fontSize: 'B1',
28
+ padding: 'V',
29
+ theme: 'field',
30
+ round: 'X2',
31
+ transition: 'background A defaultBezier',
32
+ Icon: {
33
+ icon: 'check',
34
+ opacity: '0',
35
+ transform: 'scale(0.9) rotate(-15deg)',
36
+ transition: 'opacity B defaultBezier'
37
+ }
38
+ }
39
+ }
40
+
41
+ export const CheckboxHgroup = {
42
+ display: 'flex',
43
+ tag: 'label',
44
+
45
+ boxSize: 'fit-content',
46
+ align: 'flex-start flex-start',
47
+ gap: 'A',
48
+
49
+ Checkbox: { tag: 'div' },
50
+ HgroupRows: {
51
+ gap: 'Z1',
52
+ margin: 'Y - - -'
53
+ }
54
+ }
@@ -0,0 +1,37 @@
1
+ 'use strict'
2
+
3
+ export const Input = {
4
+ extends: ['Focusable'],
5
+
6
+ tag: 'input',
7
+
8
+ border: 'none',
9
+ type: 'input',
10
+ theme: 'field',
11
+ fontSize: 'A',
12
+ round: 'C',
13
+ lineHeight: '1',
14
+ padding: 'Z2 B',
15
+
16
+ attr: {
17
+ pattern: (el) => el.pattern,
18
+ minLength: (el) => el.minlength,
19
+ maxLength: (el) => el.maxlength,
20
+ name: (el) => el.name,
21
+ autocomplete: (el) => el.autocomplete,
22
+ placeholder: (el) => el.placeholder,
23
+ value: el => {
24
+ if (!el.value) return
25
+ const val = el.call('exec', el.value, el)
26
+ if (el.call('isString', val) && val.includes('{{')) {
27
+ return el.call('replaceLiteralsWithObjectFields', val)
28
+ }
29
+ return val
30
+ },
31
+ checked: el => el.call('exec', el.checked, el),
32
+ disabled: (el) => el.disabled || null,
33
+ readonly: (el) => el.readonly,
34
+ required: (el) => el.required,
35
+ type: (el) => el.type
36
+ }
37
+ }
@@ -0,0 +1,25 @@
1
+ 'use strict'
2
+
3
+ export const NumberInput = {
4
+ extends: ['Flex', 'Input'],
5
+
6
+ type: 'number',
7
+ boxSize: 'C+X',
8
+ align: 'center center',
9
+ textAlign: 'center',
10
+ round: 'Y1',
11
+ theme: 'transparent',
12
+ border: 'solid gray3',
13
+ borderWidth: '1px',
14
+ placeholder: '0',
15
+ fontWeight: '400',
16
+ '::-webkit-inner-spin-button': {
17
+ appearance: 'none'
18
+ },
19
+
20
+ attr: {
21
+ step: (el) => el.step,
22
+ min: (el) => el.min,
23
+ max: (el) => el.max
24
+ }
25
+ }
@@ -0,0 +1,31 @@
1
+ 'use strict'
2
+
3
+ export const Radio = {
4
+ extends: 'Checkbox',
5
+
6
+ Input: {
7
+ type: 'radio',
8
+ ':checked + div:after': { opacity: '1' }
9
+ },
10
+
11
+ Flex: {
12
+ round: '100%',
13
+ padding: 'Y',
14
+ ':after': {
15
+ content: '""',
16
+ display: 'block',
17
+ boxSize: 'X+W1',
18
+ round: '100%',
19
+ background: 'white',
20
+ opacity: '0',
21
+ transition: 'opacity .15s ease-in-out'
22
+ },
23
+ Icon: null
24
+ }
25
+ }
26
+
27
+ export const RadioHgroup = {
28
+ extends: 'CheckboxHgroup',
29
+ Checkbox: null,
30
+ Radio: {}
31
+ }