jbx 2.4.0 → 2.6.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.
- package/.nvmrc +1 -0
- package/README.md +6 -6
- package/dist/index.cjs +3001 -0
- package/dist/index.esm.js +2968 -0
- package/dist/index.mjs +2968 -0
- package/dist/main.css +359 -0
- package/dist/main.js +238 -0
- package/dist/main.js.map +1 -0
- package/dist/types/index.d.ts +233 -0
- package/package.json +24 -4
- package/pnpm-global/5/pnpm-lock.yaml +621 -0
- package/roll.js +235 -0
- package/src/components/Layout.tsx +29 -0
- package/src/components/MoreExperiments.tsx +110 -0
- package/{index.js → src/index.tsx} +49 -39
- package/{style.css → src/style.css} +143 -54
- package/tsconfig.json +20 -0
package/roll.js
ADDED
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import React, { Fragment } from 'react';
|
|
2
|
+
|
|
3
|
+
// import './style.css';
|
|
4
|
+
|
|
5
|
+
const SIZE = window.innerWidth > 1280 ? 16 : window.innerWidth > 640 ? 14 : 12;
|
|
6
|
+
const BASE_RADIUS = SIZE / 3;
|
|
7
|
+
const BASE_FONT_SIZE = SIZE;
|
|
8
|
+
|
|
9
|
+
function Component(className, styleSrc = {}, config = {}) {
|
|
10
|
+
const { element = `div`, styleProps } = config;
|
|
11
|
+
|
|
12
|
+
return function MakeComponent({ children, style = {}, ...props }) {
|
|
13
|
+
const passProps = styleProps
|
|
14
|
+
? Object.keys(props)
|
|
15
|
+
.filter((e) => !styleProps.includes(e))
|
|
16
|
+
.reduce((acc, p) => {
|
|
17
|
+
acc[p] = props[p];
|
|
18
|
+
return acc;
|
|
19
|
+
}, {})
|
|
20
|
+
: props;
|
|
21
|
+
|
|
22
|
+
const calculatedStyle = typeof styleSrc === 'function' ? styleSrc(props) : styleSrc;
|
|
23
|
+
|
|
24
|
+
return React.createElement(
|
|
25
|
+
element,
|
|
26
|
+
{
|
|
27
|
+
className,
|
|
28
|
+
style: { ...style, ...calculatedStyle },
|
|
29
|
+
...passProps
|
|
30
|
+
},
|
|
31
|
+
children
|
|
32
|
+
);
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const Container = Component(`jbx-container`);
|
|
37
|
+
|
|
38
|
+
const Text = Component(`jbx-text`);
|
|
39
|
+
|
|
40
|
+
const SmallText = Component(`jbx-small-text`);
|
|
41
|
+
|
|
42
|
+
const Button = Component(`jbx-button`, {}, { element: 'button' });
|
|
43
|
+
|
|
44
|
+
const Input = Component(`jbx-input`, null, { element: 'input' });
|
|
45
|
+
const Range = Component(`jbx-range`, null, { element: 'input' });
|
|
46
|
+
|
|
47
|
+
const HeaderH1 = Component(`jbx-h${1}`, null, { element: 'h1' });
|
|
48
|
+
const HeaderH2 = Component(`jbx-h${2}`, null, { element: 'h2' });
|
|
49
|
+
const HeaderH3 = Component(`jbx-h${3}`, null, { element: 'h3' });
|
|
50
|
+
const HeaderH4 = Component(`jbx-h${4}`, null, { element: 'h4' });
|
|
51
|
+
|
|
52
|
+
const MainHeader = function MainHeader({ children, style }) {
|
|
53
|
+
const content = String(children).split(' ');
|
|
54
|
+
|
|
55
|
+
return React.createElement(
|
|
56
|
+
Fragment,
|
|
57
|
+
{},
|
|
58
|
+
content.map((word) =>
|
|
59
|
+
React.createElement(
|
|
60
|
+
HeaderH1,
|
|
61
|
+
{
|
|
62
|
+
key: word,
|
|
63
|
+
style: {
|
|
64
|
+
fontWeight: 900,
|
|
65
|
+
display: 'inline-block',
|
|
66
|
+
width: 'auto',
|
|
67
|
+
padding: '6px',
|
|
68
|
+
margin: 0,
|
|
69
|
+
backgroundColor: 'var(--accent-color)',
|
|
70
|
+
...style
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
word
|
|
74
|
+
)
|
|
75
|
+
)
|
|
76
|
+
);
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const A = Component(`jbx-a`, null, { element: 'a' });
|
|
80
|
+
|
|
81
|
+
const Space = Component(`jbx-space`, (props) => ({
|
|
82
|
+
display: props.inline ? 'inline-block' : 'block',
|
|
83
|
+
height: `${SIZE * props.h}px`,
|
|
84
|
+
width: `${SIZE * props.w}px`
|
|
85
|
+
}));
|
|
86
|
+
|
|
87
|
+
const Box = Component(`jbx-box`, ({ padding, hideOnSmall, flex, minWidth }) => {
|
|
88
|
+
return {
|
|
89
|
+
flex,
|
|
90
|
+
minWidth,
|
|
91
|
+
padding: padding
|
|
92
|
+
? [padding]
|
|
93
|
+
.flat()
|
|
94
|
+
.map((paddingValue) => `${paddingValue * SIZE}px`)
|
|
95
|
+
.join(` `)
|
|
96
|
+
: null
|
|
97
|
+
};
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
const Inline = Component(`jbx-inline`, ({ v, h, gap }) => ({
|
|
101
|
+
marginLeft: `${h * SIZE}px`,
|
|
102
|
+
marginRight: `${h * SIZE}px`,
|
|
103
|
+
marginTop: `${v * SIZE}px`,
|
|
104
|
+
marginBottom: `${v * SIZE}px`,
|
|
105
|
+
gap: `${gap * SIZE}px`
|
|
106
|
+
}));
|
|
107
|
+
|
|
108
|
+
const Stack = Component(`jbx-stack`, ({ v, h, gap }) => ({
|
|
109
|
+
marginLeft: `${h * SIZE}px`,
|
|
110
|
+
marginRight: `${h * SIZE}px`,
|
|
111
|
+
marginTop: `${v * SIZE}px`,
|
|
112
|
+
marginBottom: `${v * SIZE}px`,
|
|
113
|
+
gap: `${gap * SIZE}px`
|
|
114
|
+
}));
|
|
115
|
+
|
|
116
|
+
// export const LinkButton = Styled.a({
|
|
117
|
+
// capHeight: BASE_FONT_SIZE,
|
|
118
|
+
// color: '#3498db',
|
|
119
|
+
// cursor: 'pointer',
|
|
120
|
+
// borderRadius: 5,
|
|
121
|
+
// borderTop: '1px solid #3498db10',
|
|
122
|
+
// borderBottom: '1px solid #0000',
|
|
123
|
+
// backgroundColor: '#3498db20',
|
|
124
|
+
// height: BASE_FONT_SIZE * 2,
|
|
125
|
+
// display: 'flex',
|
|
126
|
+
// alignItems: 'center',
|
|
127
|
+
// alignContent: 'center',
|
|
128
|
+
// justifyContent: 'center',
|
|
129
|
+
// padding: 0,
|
|
130
|
+
// '&:hover': {
|
|
131
|
+
// boxShadow: `rgba(0, 0, 0, 0.1) 0 1px 1px, rgba(0, 0, 0, 0.1) 0 3px 12px`
|
|
132
|
+
// }
|
|
133
|
+
// });
|
|
134
|
+
|
|
135
|
+
const Dropzone = Component(`jbx-dropzone`);
|
|
136
|
+
|
|
137
|
+
const Ul = Component(
|
|
138
|
+
`jbx-ul`,
|
|
139
|
+
{
|
|
140
|
+
margin: 0,
|
|
141
|
+
padding: `0 0 0 ${BASE_FONT_SIZE / 4}px`
|
|
142
|
+
},
|
|
143
|
+
{ element: 'ul' }
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
const Li = Component(
|
|
147
|
+
`jbx-li`,
|
|
148
|
+
{
|
|
149
|
+
margin: `0 0 0 ${SIZE}px`,
|
|
150
|
+
padding: `${SIZE / 4}px 0`
|
|
151
|
+
},
|
|
152
|
+
{ element: 'li' }
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
const Tabs = Component(`jbx-tabs`);
|
|
156
|
+
|
|
157
|
+
const Tab = Component(
|
|
158
|
+
`jbx-tabs--tab`,
|
|
159
|
+
({ info, active }) => ({
|
|
160
|
+
userSelect: 'none',
|
|
161
|
+
cursor: 'pointer',
|
|
162
|
+
backgroundColor: active ? '#000' : info ? '#fff' : '#ecf0f1',
|
|
163
|
+
color: active ? '#fff' : '#000',
|
|
164
|
+
padding: SIZE / 2,
|
|
165
|
+
paddingLeft: info ? 0 : SIZE / 2
|
|
166
|
+
}),
|
|
167
|
+
{ styleProps: ['info', 'active'] }
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
const CodeSnippet = Component(`jbx-code-snippet`, null, { element: 'pre' });
|
|
171
|
+
const CodeTextarea = Component(`jbx-code-area`, null, { element: 'textarea' });
|
|
172
|
+
|
|
173
|
+
const CheckboxHidden = Component(`jbx-checkbox-hidden`, ({ checked }) => {
|
|
174
|
+
return {
|
|
175
|
+
height: SIZE * 2 - 4,
|
|
176
|
+
width: SIZE * 2 - 4,
|
|
177
|
+
paddingTop: 2,
|
|
178
|
+
paddingLeft: 2,
|
|
179
|
+
backgroundColor: checked ? 'var(--accent-color)' : 'white',
|
|
180
|
+
borderRadius: BASE_RADIUS,
|
|
181
|
+
boxShadow: checked
|
|
182
|
+
? 'inset rgba(0, 0, 0, 0.07) 0 0 0 1px'
|
|
183
|
+
: 'inset rgba(0, 0, 0, 0.33) 0 0 0 1.5px',
|
|
184
|
+
cursor: 'pointer'
|
|
185
|
+
};
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
const Checkbox = function Checkbox({ label, checked, onChange }) {
|
|
189
|
+
return React.createElement(
|
|
190
|
+
Inline,
|
|
191
|
+
{
|
|
192
|
+
onClick: () => {
|
|
193
|
+
if (onChange) {
|
|
194
|
+
onChange(!checked);
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
style: {
|
|
198
|
+
alignItems: 'center',
|
|
199
|
+
cursor: 'pointer'
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
[
|
|
203
|
+
React.createElement(
|
|
204
|
+
CheckboxHidden,
|
|
205
|
+
{
|
|
206
|
+
key: 0,
|
|
207
|
+
checked
|
|
208
|
+
},
|
|
209
|
+
React.createElement(
|
|
210
|
+
'svg',
|
|
211
|
+
{
|
|
212
|
+
xmlns: 'http://www.w3.org/2000/svg',
|
|
213
|
+
width: SIZE * 2 - 8,
|
|
214
|
+
height: SIZE * 2 - 8,
|
|
215
|
+
fill: 'none',
|
|
216
|
+
stroke: 'currentColor',
|
|
217
|
+
strokeLinecap: 'round',
|
|
218
|
+
strokeLinejoin: 'round',
|
|
219
|
+
strokeWidth: '2',
|
|
220
|
+
className: 'feather feather-check',
|
|
221
|
+
viewBox: '0 0 24 24',
|
|
222
|
+
color: checked ? 'white' : '#ddd'
|
|
223
|
+
},
|
|
224
|
+
React.createElement('path', {
|
|
225
|
+
d: 'M20 6L9 17 4 12'
|
|
226
|
+
})
|
|
227
|
+
)
|
|
228
|
+
),
|
|
229
|
+
React.createElement(Space, { key: 1, w: 0.5 }),
|
|
230
|
+
React.createElement(Text, { key: 2, style: { userSelect: 'none' } }, label)
|
|
231
|
+
]
|
|
232
|
+
);
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
export { A, Box, Button, Checkbox, CheckboxHidden, CodeSnippet, CodeTextarea, Component, Container, Dropzone, HeaderH1, HeaderH2, HeaderH3, HeaderH4, Inline, Input, Li, MainHeader, Range, SmallText, Space, Stack, Tab, Tabs, Text, Ul };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { classList, layoutPropsToStyles } from '../';
|
|
3
|
+
|
|
4
|
+
type Box = {
|
|
5
|
+
children?: React.ReactNode;
|
|
6
|
+
smallText?: true | false;
|
|
7
|
+
padding?: number;
|
|
8
|
+
flex?: number;
|
|
9
|
+
style: any;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export function Box({ children, smallText, padding, flex, style }: Box) {
|
|
13
|
+
const styles = {
|
|
14
|
+
flex,
|
|
15
|
+
...layoutPropsToStyles({ padding }),
|
|
16
|
+
...style
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const className = classList({
|
|
20
|
+
'jb-box': true,
|
|
21
|
+
'jbx-small-text': smallText
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<div className={className} style={styles}>
|
|
26
|
+
{children}
|
|
27
|
+
</div>
|
|
28
|
+
);
|
|
29
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
|
|
3
|
+
import React, { Fragment } from 'react';
|
|
4
|
+
import { Text, Space, Ul, Li, Inline, Box, A } from '../index';
|
|
5
|
+
|
|
6
|
+
const PROJECT_DATA = [
|
|
7
|
+
{
|
|
8
|
+
name: 'PINTR',
|
|
9
|
+
description: 'Tool that turns your images into plotter-like line drawings',
|
|
10
|
+
url: 'https://javier.xyz/pintr/'
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
name: 'Visual Center',
|
|
14
|
+
description: 'Tool that help you visually center objects in a container',
|
|
15
|
+
url: 'https://javier.xyz/visual-center/'
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'Brutalita',
|
|
19
|
+
description:
|
|
20
|
+
'Grid based font editor and font. Create fonts in the browser and export OpenType files',
|
|
21
|
+
url: 'https://brutalita.com/'
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: 'Morphin',
|
|
25
|
+
description:
|
|
26
|
+
'Create animated CSS transitions. Add sprites and get the code ready to paste in your site',
|
|
27
|
+
url: 'https://javier.xyz/morphin/'
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: 'Droste Creator',
|
|
31
|
+
description: 'Create recursive images with the droste effect',
|
|
32
|
+
url: 'https://javier.xyz/droste-creator/'
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: 'Sombras.app',
|
|
36
|
+
description: 'Create art with shadows. Draw shadows and get 3D objects that project them.',
|
|
37
|
+
url: 'https://sombras.app/'
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: 'Cohesive Colors',
|
|
41
|
+
description: 'Tool that can help you to create cohesive color palettes',
|
|
42
|
+
url: 'https://javier.xyz/cohesive-colors/'
|
|
43
|
+
}
|
|
44
|
+
] as const;
|
|
45
|
+
|
|
46
|
+
const projects = PROJECT_DATA.filter(
|
|
47
|
+
(project) => !project.url.includes(document.location.pathname)
|
|
48
|
+
);
|
|
49
|
+
const projectIndex = PROJECT_DATA.findIndex(
|
|
50
|
+
(project) => !project.url.includes(document.location.pathname)
|
|
51
|
+
);
|
|
52
|
+
const seed = Math.floor(new Date().getTime() / (60 * 60 * 1000)) + projectIndex;
|
|
53
|
+
|
|
54
|
+
export function MoreExperiments() {
|
|
55
|
+
const items = new Array(4).fill('').map((_0, idx) => {
|
|
56
|
+
const project = projects[(seed + idx) % projects.length];
|
|
57
|
+
return (
|
|
58
|
+
<Li key={project.url}>
|
|
59
|
+
<A href={project.url}>{project.name}</A>
|
|
60
|
+
{`, `}
|
|
61
|
+
{project.description}.
|
|
62
|
+
</Li>
|
|
63
|
+
);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
return (
|
|
67
|
+
<Fragment>
|
|
68
|
+
<Text>More experiments</Text>
|
|
69
|
+
<Space h={1} />
|
|
70
|
+
<Ul>{items}</Ul>
|
|
71
|
+
</Fragment>
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function MoreExperimentsBlocks() {
|
|
76
|
+
const items = new Array(3).fill('').map((_0, idx) => {
|
|
77
|
+
const project = projects[(seed + idx) % projects.length];
|
|
78
|
+
return <MoreExperimentsBlock key={project.name} {...project} />;
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
return (
|
|
82
|
+
<Fragment>
|
|
83
|
+
<Text>More experiments</Text>
|
|
84
|
+
<Space h={1} />
|
|
85
|
+
<Inline wrap gap={1}>
|
|
86
|
+
{items}
|
|
87
|
+
</Inline>
|
|
88
|
+
</Fragment>
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function MoreExperimentsBlock({
|
|
93
|
+
name,
|
|
94
|
+
description,
|
|
95
|
+
url
|
|
96
|
+
}: {
|
|
97
|
+
name: string;
|
|
98
|
+
description: string;
|
|
99
|
+
url: string;
|
|
100
|
+
}) {
|
|
101
|
+
return (
|
|
102
|
+
<Box smallText style={{ width: 300 }}>
|
|
103
|
+
<a className="jbx-a" href={url}>
|
|
104
|
+
{name}
|
|
105
|
+
</a>
|
|
106
|
+
<Space h={0.5} />
|
|
107
|
+
<Text>{description}.</Text>
|
|
108
|
+
</Box>
|
|
109
|
+
);
|
|
110
|
+
}
|
|
@@ -1,12 +1,42 @@
|
|
|
1
|
-
|
|
1
|
+
// @ts-nocheck
|
|
2
2
|
|
|
3
3
|
import React, { Fragment } from 'react';
|
|
4
4
|
|
|
5
|
-
const SIZE =
|
|
6
|
-
const BASE_RADIUS = SIZE /
|
|
5
|
+
const SIZE = getSettings().size;
|
|
6
|
+
const BASE_RADIUS = SIZE / 3;
|
|
7
7
|
const BASE_FONT_SIZE = SIZE;
|
|
8
8
|
|
|
9
|
-
export function
|
|
9
|
+
export function getSettings() {
|
|
10
|
+
const sizeSrc = getComputedStyle(document.documentElement).getPropertyValue('--size');
|
|
11
|
+
|
|
12
|
+
return {
|
|
13
|
+
size: parseInt(sizeSrc)
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function classList(classes: any[] | Record<string, any>) {
|
|
18
|
+
if (Array.isArray(classes)) {
|
|
19
|
+
return classes.filter((e) => e).join(' ');
|
|
20
|
+
} else {
|
|
21
|
+
return Object.keys(classes)
|
|
22
|
+
.filter((e) => classes[e])
|
|
23
|
+
.join(' ');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function layoutPropsToStyles({ padding }: { padding?: number }): { [prop: string]: string } {
|
|
28
|
+
let newStyles: { [prop: string]: string } = {};
|
|
29
|
+
if (padding) {
|
|
30
|
+
newStyles.padding = `${getSettings().size * padding}px`;
|
|
31
|
+
}
|
|
32
|
+
return newStyles;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function Component(
|
|
36
|
+
className: string,
|
|
37
|
+
styleSrc = {},
|
|
38
|
+
config: { element?: string; styleProps?: any } = {}
|
|
39
|
+
) {
|
|
10
40
|
const { element = `div`, styleProps } = config;
|
|
11
41
|
|
|
12
42
|
return function MakeComponent({ children, style = {}, ...props }) {
|
|
@@ -48,6 +78,7 @@ export const HeaderH1 = Component(`jbx-h${1}`, null, { element: 'h1' });
|
|
|
48
78
|
export const HeaderH2 = Component(`jbx-h${2}`, null, { element: 'h2' });
|
|
49
79
|
export const HeaderH3 = Component(`jbx-h${3}`, null, { element: 'h3' });
|
|
50
80
|
export const HeaderH4 = Component(`jbx-h${4}`, null, { element: 'h4' });
|
|
81
|
+
export const HR = Component(`jbx-hr`, null, { element: 'hr' });
|
|
51
82
|
|
|
52
83
|
export const MainHeader = function MainHeader({ children, style }) {
|
|
53
84
|
const content = String(children).split(' ');
|
|
@@ -61,7 +92,6 @@ export const MainHeader = function MainHeader({ children, style }) {
|
|
|
61
92
|
{
|
|
62
93
|
key: word,
|
|
63
94
|
style: {
|
|
64
|
-
fontWeight: 900,
|
|
65
95
|
display: 'inline-block',
|
|
66
96
|
width: 'auto',
|
|
67
97
|
padding: '6px',
|
|
@@ -84,25 +114,13 @@ export const Space = Component(`jbx-space`, (props) => ({
|
|
|
84
114
|
width: `${SIZE * props.w}px`
|
|
85
115
|
}));
|
|
86
116
|
|
|
87
|
-
export const
|
|
88
|
-
return {
|
|
89
|
-
flex,
|
|
90
|
-
minWidth,
|
|
91
|
-
padding: padding
|
|
92
|
-
? [padding]
|
|
93
|
-
.flat()
|
|
94
|
-
.map((paddingValue) => `${paddingValue * SIZE}px`)
|
|
95
|
-
.join(` `)
|
|
96
|
-
: null
|
|
97
|
-
};
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
export const Inline = Component(`jbx-inline`, ({ v, h, gap }) => ({
|
|
117
|
+
export const Inline = Component(`jbx-inline`, ({ v, h, gap, wrap = false }) => ({
|
|
101
118
|
marginLeft: `${h * SIZE}px`,
|
|
102
119
|
marginRight: `${h * SIZE}px`,
|
|
103
120
|
marginTop: `${v * SIZE}px`,
|
|
104
121
|
marginBottom: `${v * SIZE}px`,
|
|
105
|
-
gap: `${gap * SIZE}px
|
|
122
|
+
gap: `${gap * SIZE}px`,
|
|
123
|
+
flexWrap: wrap ? 'wrap' : 'no-wrap'
|
|
106
124
|
}));
|
|
107
125
|
|
|
108
126
|
export const Stack = Component(`jbx-stack`, ({ v, h, gap }) => ({
|
|
@@ -113,25 +131,6 @@ export const Stack = Component(`jbx-stack`, ({ v, h, gap }) => ({
|
|
|
113
131
|
gap: `${gap * SIZE}px`
|
|
114
132
|
}));
|
|
115
133
|
|
|
116
|
-
// export const LinkButton = Styled.a({
|
|
117
|
-
// capHeight: BASE_FONT_SIZE,
|
|
118
|
-
// color: '#3498db',
|
|
119
|
-
// cursor: 'pointer',
|
|
120
|
-
// borderRadius: 5,
|
|
121
|
-
// borderTop: '1px solid #3498db10',
|
|
122
|
-
// borderBottom: '1px solid #0000',
|
|
123
|
-
// backgroundColor: '#3498db20',
|
|
124
|
-
// height: BASE_FONT_SIZE * 2,
|
|
125
|
-
// display: 'flex',
|
|
126
|
-
// alignItems: 'center',
|
|
127
|
-
// alignContent: 'center',
|
|
128
|
-
// justifyContent: 'center',
|
|
129
|
-
// padding: 0,
|
|
130
|
-
// '&:hover': {
|
|
131
|
-
// boxShadow: `rgba(0, 0, 0, 0.1) 0 1px 1px, rgba(0, 0, 0, 0.1) 0 3px 12px`
|
|
132
|
-
// }
|
|
133
|
-
// });
|
|
134
|
-
|
|
135
134
|
export const Dropzone = Component(`jbx-dropzone`);
|
|
136
135
|
|
|
137
136
|
export const Ul = Component(
|
|
@@ -231,3 +230,14 @@ export const Checkbox = function Checkbox({ label, checked, onChange }) {
|
|
|
231
230
|
]
|
|
232
231
|
);
|
|
233
232
|
};
|
|
233
|
+
|
|
234
|
+
export function Bullet({ value }: { value: string }) {
|
|
235
|
+
return (
|
|
236
|
+
<div className="jbx-bullet-container">
|
|
237
|
+
<div className="jbx-bullet">{value}</div>
|
|
238
|
+
</div>
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
export { Box } from './components/Layout';
|
|
243
|
+
export { MoreExperiments } from './components/MoreExperiments';
|