@inc2734/unitone-css 0.23.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/LICENSE +21 -0
- package/README.md +18 -0
- package/dist/app.css +1 -0
- package/dist/app.js +1 -0
- package/dist/storybook.css +1 -0
- package/package.json +60 -0
- package/src/.DS_Store +0 -0
- package/src/app.js +21 -0
- package/src/app.scss +8 -0
- package/src/foundation/_foundation.scss +108 -0
- package/src/helper/_align-items.scss +7 -0
- package/src/helper/_align-self.scss +17 -0
- package/src/helper/_align.scss +14 -0
- package/src/helper/_fluid-typography.scss +7 -0
- package/src/helper/_gap.scss +7 -0
- package/src/helper/_gutters.scss +7 -0
- package/src/helper/_helper.scss +21 -0
- package/src/helper/_justify-content.scss +7 -0
- package/src/helper/_justify-self.scss +17 -0
- package/src/helper/_padding.scss +7 -0
- package/src/layout-primitives/_layout-primitives.scss +33 -0
- package/src/layout-primitives/both-sides/BothSides.jsx +22 -0
- package/src/layout-primitives/both-sides/README.md +54 -0
- package/src/layout-primitives/both-sides/_both-sides.scss +24 -0
- package/src/layout-primitives/both-sides/stories/index.jsx +51 -0
- package/src/layout-primitives/center/Center.jsx +18 -0
- package/src/layout-primitives/center/README.md +33 -0
- package/src/layout-primitives/center/_center.scss +17 -0
- package/src/layout-primitives/center/stories/index.jsx +39 -0
- package/src/layout-primitives/cluster/Cluster.jsx +21 -0
- package/src/layout-primitives/cluster/README.md +35 -0
- package/src/layout-primitives/cluster/_cluster.scss +22 -0
- package/src/layout-primitives/cluster/stories/index.jsx +79 -0
- package/src/layout-primitives/container/Container.jsx +23 -0
- package/src/layout-primitives/container/README.md +39 -0
- package/src/layout-primitives/container/_container.scss +18 -0
- package/src/layout-primitives/container/stories/index.jsx +65 -0
- package/src/layout-primitives/cover/Cover.jsx +30 -0
- package/src/layout-primitives/cover/README.md +54 -0
- package/src/layout-primitives/cover/_cover.scss +37 -0
- package/src/layout-primitives/cover/stories/index.jsx +140 -0
- package/src/layout-primitives/decorator/Decorator.jsx +49 -0
- package/src/layout-primitives/decorator/README.md +49 -0
- package/src/layout-primitives/decorator/_decorator.scss +54 -0
- package/src/layout-primitives/decorator/stories/index.jsx +190 -0
- package/src/layout-primitives/float/Float.jsx +24 -0
- package/src/layout-primitives/float/README.md +24 -0
- package/src/layout-primitives/float/_float.scss +29 -0
- package/src/layout-primitives/float/stories/index.jsx +78 -0
- package/src/layout-primitives/frame/Frame.jsx +19 -0
- package/src/layout-primitives/frame/README.md +7 -0
- package/src/layout-primitives/frame/_frame.scss +45 -0
- package/src/layout-primitives/frame/stories/index.jsx +50 -0
- package/src/layout-primitives/gutters/Gutters.jsx +17 -0
- package/src/layout-primitives/gutters/README.md +23 -0
- package/src/layout-primitives/gutters/_gutters.scss +12 -0
- package/src/layout-primitives/gutters/stories/index.jsx +48 -0
- package/src/layout-primitives/layers/Layers.jsx +18 -0
- package/src/layout-primitives/layers/README.md +32 -0
- package/src/layout-primitives/layers/_layers.scss +51 -0
- package/src/layout-primitives/layers/stories/index.jsx +133 -0
- package/src/layout-primitives/responsive-grid/README.md +11 -0
- package/src/layout-primitives/responsive-grid/ResponsiveGrid.jsx +22 -0
- package/src/layout-primitives/responsive-grid/_responsive-grid.scss +14 -0
- package/src/layout-primitives/responsive-grid/stories/index.jsx +65 -0
- package/src/layout-primitives/stack/README.md +24 -0
- package/src/layout-primitives/stack/Stack.jsx +22 -0
- package/src/layout-primitives/stack/_stack.scss +31 -0
- package/src/layout-primitives/stack/stories/index.jsx +123 -0
- package/src/layout-primitives/switcher/README.md +17 -0
- package/src/layout-primitives/switcher/Switcher.jsx +19 -0
- package/src/layout-primitives/switcher/_switcher.scss +19 -0
- package/src/layout-primitives/switcher/stories/index.jsx +50 -0
- package/src/layout-primitives/text/README.md +16 -0
- package/src/layout-primitives/text/Text.jsx +19 -0
- package/src/layout-primitives/text/_text.scss +80 -0
- package/src/layout-primitives/text/stories/index.jsx +112 -0
- package/src/layout-primitives/with-sidebar/README.md +36 -0
- package/src/layout-primitives/with-sidebar/WithSidebar.jsx +35 -0
- package/src/layout-primitives/with-sidebar/_with-sidebar.scss +58 -0
- package/src/layout-primitives/with-sidebar/stories/index.jsx +127 -0
- package/src/patterns/features/features-1/Features1.jsx +52 -0
- package/src/patterns/features/features-1/stories/index.jsx +68 -0
- package/src/patterns/features/features-2/Features2.jsx +33 -0
- package/src/patterns/features/features-2/stories/index.jsx +67 -0
- package/src/patterns/header/header-1/Header1.jsx +31 -0
- package/src/patterns/header/header-1/stories/index.jsx +44 -0
- package/src/patterns/header/header-2/Header2.jsx +33 -0
- package/src/patterns/header/header-2/stories/index.jsx +44 -0
- package/src/patterns/header/header-3/Header3.jsx +30 -0
- package/src/patterns/header/header-3/stories/index.jsx +43 -0
- package/src/patterns/header/header-4/Header4.jsx +25 -0
- package/src/patterns/header/header-4/stories/index.jsx +41 -0
- package/src/patterns/header/header-5/Header5.jsx +32 -0
- package/src/patterns/header/header-5/stories/index.jsx +43 -0
- package/src/patterns/header/header-6/Header6.jsx +34 -0
- package/src/patterns/header/header-6/stories/index.jsx +58 -0
- package/src/patterns/media-text/media-text-1/MediaText1.jsx +41 -0
- package/src/patterns/media-text/media-text-1/stories/index.jsx +34 -0
- package/src/patterns/media-text/media-text-2/MediaText2.jsx +39 -0
- package/src/patterns/media-text/media-text-2/stories/index.jsx +34 -0
- package/src/settings/_body.scss +8 -0
- package/src/settings/_html.scss +3 -0
- package/src/settings/_root.scss +152 -0
- package/src/settings/_settings.scss +3 -0
- package/src/stories/1.introduction.stories.mdx +27 -0
- package/src/stories/2.get-started.stories.mdx +23 -0
- package/src/stories/3.global-api.stories.mdx +57 -0
- package/src/storybook.scss +11 -0
- package/src/variables/_variables.scss +22 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
@mixin abstract-frame() {
|
|
2
|
+
--unitone--ratio: 16/9;
|
|
3
|
+
|
|
4
|
+
position: relative;
|
|
5
|
+
|
|
6
|
+
&::before {
|
|
7
|
+
content: '';
|
|
8
|
+
display: block;
|
|
9
|
+
padding: calc(100% / (var(--unitone--ratio))) 0 0;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
> * {
|
|
13
|
+
position: absolute;
|
|
14
|
+
top: 0;
|
|
15
|
+
right: 0;
|
|
16
|
+
bottom: 0;
|
|
17
|
+
left: 0;
|
|
18
|
+
display: flex;
|
|
19
|
+
justify-content: center;
|
|
20
|
+
align-items: center;
|
|
21
|
+
overflow: hidden;
|
|
22
|
+
width: 100%;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
img,
|
|
26
|
+
video {
|
|
27
|
+
height: 100%;
|
|
28
|
+
width: 100%;
|
|
29
|
+
object-fit: cover;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
@media (orientation: portrait) {
|
|
33
|
+
&[data-unitone-layout~="-switch"] {
|
|
34
|
+
&::before {
|
|
35
|
+
padding-top: calc(var(--unitone--ratio) * 100%);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@mixin frame() {
|
|
42
|
+
[data-unitone-layout~="frame"] {
|
|
43
|
+
@include abstract-frame();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import readme from '../README.md';
|
|
3
|
+
|
|
4
|
+
import { Frame } from '../Frame';
|
|
5
|
+
|
|
6
|
+
export default {
|
|
7
|
+
title: 'Layout Primitives/Frame',
|
|
8
|
+
component: Frame,
|
|
9
|
+
parameters: {
|
|
10
|
+
notes: { readme },
|
|
11
|
+
},
|
|
12
|
+
argTypes: {
|
|
13
|
+
ratio: {
|
|
14
|
+
control: { type: 'text' },
|
|
15
|
+
description: 'Aspect ratio. Set by CSS var `--unitone--ratio`.',
|
|
16
|
+
table: { defaultValue: { summary: '16/9' } },
|
|
17
|
+
type: { name: 'string', required: false },
|
|
18
|
+
},
|
|
19
|
+
switchRatio: {
|
|
20
|
+
control: { type: 'inline-radio' },
|
|
21
|
+
description: 'When the orientation switches, the `--unitone--ratio` also switches.',
|
|
22
|
+
options: [false, true],
|
|
23
|
+
table: { defaultValue: { summary: false } },
|
|
24
|
+
type: { name: 'boolean', required: false },
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
args: {
|
|
28
|
+
ratio: '16/9',
|
|
29
|
+
switchRatio: false,
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export const Default = (args) => {
|
|
34
|
+
return (
|
|
35
|
+
<Frame {...args}>
|
|
36
|
+
<img src="https://placehold.jp/400x300.jpg" alt="" />
|
|
37
|
+
</Frame>
|
|
38
|
+
);
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export const Switch = (args) => {
|
|
42
|
+
return (
|
|
43
|
+
<Frame {...args}>
|
|
44
|
+
<img src="https://placehold.jp/400x300.jpg" alt="" />
|
|
45
|
+
</Frame>
|
|
46
|
+
);
|
|
47
|
+
};
|
|
48
|
+
Switch.args = {
|
|
49
|
+
switchRatio: true,
|
|
50
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
export const Gutters = ({ padding, style, ...props }) => {
|
|
4
|
+
return (
|
|
5
|
+
<div
|
|
6
|
+
data-unitone-layout={[
|
|
7
|
+
'gutters',
|
|
8
|
+
'undefined' !== typeof padding ? `-padding:${padding}` : undefined,
|
|
9
|
+
]
|
|
10
|
+
.filter(Boolean)
|
|
11
|
+
.join(' ')}
|
|
12
|
+
style={style}
|
|
13
|
+
>
|
|
14
|
+
{props.children}
|
|
15
|
+
</div>
|
|
16
|
+
);
|
|
17
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
## Usage
|
|
2
|
+
|
|
3
|
+
```html
|
|
4
|
+
<div data-unitone-layout="section">
|
|
5
|
+
<div data-unitone-layout="stack">
|
|
6
|
+
<h2>Lorem ipsum dolor sit amet</h2>
|
|
7
|
+
<p>
|
|
8
|
+
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt
|
|
9
|
+
ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation
|
|
10
|
+
ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in
|
|
11
|
+
reprehenderit in voluptate velit esse cill
|
|
12
|
+
</p>
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### Customizing padding
|
|
18
|
+
|
|
19
|
+
```html
|
|
20
|
+
<div data-unitone-layout="section -padding:1">
|
|
21
|
+
...
|
|
22
|
+
</div>
|
|
23
|
+
```
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
@mixin abstract-gutters() {
|
|
2
|
+
--unitone--padding: var(--unitone--s4);
|
|
3
|
+
|
|
4
|
+
padding-top: var(--unitone--padding);
|
|
5
|
+
padding-bottom: var(--unitone--padding);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
@mixin gutters() {
|
|
9
|
+
[data-unitone-layout~="gutters"] {
|
|
10
|
+
@include abstract-gutters();
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import readme from '../README.md';
|
|
3
|
+
|
|
4
|
+
import { Gutters } from '../Gutters';
|
|
5
|
+
import { Center } from '../../center/Center';
|
|
6
|
+
import { Container } from '../../container/Container';
|
|
7
|
+
import { Stack } from '../../stack/Stack';
|
|
8
|
+
|
|
9
|
+
export default {
|
|
10
|
+
title: 'Layout Primitives/Gutters',
|
|
11
|
+
component: Gutters,
|
|
12
|
+
parameters: {
|
|
13
|
+
notes: { readme },
|
|
14
|
+
},
|
|
15
|
+
argTypes: {
|
|
16
|
+
padding: {
|
|
17
|
+
control: { type: 'inline-radio' },
|
|
18
|
+
description:
|
|
19
|
+
'Top and bottom padding. Set by CSS var `--unitone--padding` or `data-unitone-layout` attribute `-padding:x`.',
|
|
20
|
+
options: [1, 2, 3, 4, 5, 6, 7],
|
|
21
|
+
table: { defaultValue: { summary: 'var(--unitone--s4)' } },
|
|
22
|
+
type: { name: 'number', required: false },
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
args: {
|
|
26
|
+
padding: 4,
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export const Default = (args) => {
|
|
31
|
+
return (
|
|
32
|
+
<Gutters {...args}>
|
|
33
|
+
<Container>
|
|
34
|
+
<Stack gap={2}>
|
|
35
|
+
<Center>
|
|
36
|
+
<h2 style={{ '--unitone--font-size': 2 }}>Lorem ipsum dolor sit amet</h2>
|
|
37
|
+
</Center>
|
|
38
|
+
<p>
|
|
39
|
+
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
|
|
40
|
+
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
|
|
41
|
+
exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
|
|
42
|
+
dolor in reprehenderit in voluptate velit esse cill
|
|
43
|
+
</p>
|
|
44
|
+
</Stack>
|
|
45
|
+
</Container>
|
|
46
|
+
</Gutters>
|
|
47
|
+
);
|
|
48
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
export const Layers = ({ cover, style, ...props }) => {
|
|
4
|
+
style = {
|
|
5
|
+
...style,
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
return (
|
|
9
|
+
<div
|
|
10
|
+
data-unitone-layout={['layers', true === cover ? `-cover` : undefined]
|
|
11
|
+
.filter(Boolean)
|
|
12
|
+
.join(' ')}
|
|
13
|
+
style={style}
|
|
14
|
+
>
|
|
15
|
+
{props.children}
|
|
16
|
+
</div>
|
|
17
|
+
);
|
|
18
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
## Usage
|
|
2
|
+
|
|
3
|
+
```html
|
|
4
|
+
<div data-unitone-layout="layers">
|
|
5
|
+
<img src="https://placehold.jp/400x300.jpg" alt="" />
|
|
6
|
+
<div data-unitone-layout="decorator" style="--unitone--align-self:end">
|
|
7
|
+
Lorem ipsum dolor sit amet
|
|
8
|
+
</div>
|
|
9
|
+
</div>
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
### Covered image
|
|
13
|
+
|
|
14
|
+
```html
|
|
15
|
+
<div data-unitone-layout="layers -cover">
|
|
16
|
+
<img ...>
|
|
17
|
+
<div>
|
|
18
|
+
...
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Customizing position
|
|
24
|
+
|
|
25
|
+
```html
|
|
26
|
+
<div data-unitone-layout="layers">
|
|
27
|
+
<img ...>
|
|
28
|
+
<div style="--unitone--alilgn-self: end; --unitone--justify-self: center">
|
|
29
|
+
...
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
```
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
@mixin abstract-layers() {
|
|
2
|
+
--unitone--gap: var(--unitone--s1);
|
|
3
|
+
--unitone--columns: 12;
|
|
4
|
+
|
|
5
|
+
position: relative;
|
|
6
|
+
display: grid;
|
|
7
|
+
grid-template-columns: repeat(var(--unitone--columns), 1fr);
|
|
8
|
+
grid-template-rows: max-content;
|
|
9
|
+
gap: var(--unitone--gap);
|
|
10
|
+
overflow: hidden;
|
|
11
|
+
|
|
12
|
+
> * {
|
|
13
|
+
--unitone--align-self: auto;
|
|
14
|
+
--unitone--justify-self: auto;
|
|
15
|
+
--unitone--grid-column: 1/-1;
|
|
16
|
+
--unitone--grid-row: 1/-1;
|
|
17
|
+
|
|
18
|
+
position: relative;
|
|
19
|
+
grid-column: var(--unitone--grid-column);
|
|
20
|
+
grid-row: var(--unitone--grid-row);
|
|
21
|
+
align-self: var(--unitone--align-self);
|
|
22
|
+
justify-self: var(--unitone--justify-self);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
&[data-unitone-layout~="-cover"] {
|
|
26
|
+
> :where(img:first-child, video:first-child, picture:first-child, figure:first-child),
|
|
27
|
+
> :first-child :where(picture, figure) {
|
|
28
|
+
position: absolute;
|
|
29
|
+
top: 0;
|
|
30
|
+
right: 0;
|
|
31
|
+
bottom: 0;
|
|
32
|
+
left: 0;
|
|
33
|
+
height: 100%;
|
|
34
|
+
width: 100%;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
> :where(img:first-child, video:first-child),
|
|
38
|
+
> :first-child :where(img, video) {
|
|
39
|
+
object-fit: cover;
|
|
40
|
+
object-position: 50% 50%;
|
|
41
|
+
height: 100%;
|
|
42
|
+
width: 100%;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
@mixin layers() {
|
|
48
|
+
[data-unitone-layout~="layers"] {
|
|
49
|
+
@include abstract-layers();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import readme from '../README.md';
|
|
3
|
+
|
|
4
|
+
import { Layers } from '../Layers';
|
|
5
|
+
import { Decorator } from '../../decorator/Decorator';
|
|
6
|
+
|
|
7
|
+
export default {
|
|
8
|
+
title: 'Layout Primitives/Layers',
|
|
9
|
+
component: Layers,
|
|
10
|
+
parameters: {
|
|
11
|
+
notes: { readme },
|
|
12
|
+
},
|
|
13
|
+
argTypes: {
|
|
14
|
+
cover: {
|
|
15
|
+
control: { type: 'inline-radio' },
|
|
16
|
+
description:
|
|
17
|
+
"Background image/video is sized to maintain its aspect ratio while filling the element's entire content box. If the object's aspect ratio does not match the aspect ratio of its box, then the object will be clipped to fit.",
|
|
18
|
+
options: [false, true],
|
|
19
|
+
table: { defaultValue: { summary: false } },
|
|
20
|
+
type: { name: 'boolean', required: false },
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
args: {
|
|
24
|
+
cover: false,
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export const Default = (args) => {
|
|
29
|
+
return (
|
|
30
|
+
<Layers {...args}>
|
|
31
|
+
<img src="https://placehold.jp/600x400.jpg" alt="" />
|
|
32
|
+
<Decorator style={{ '--unitone--align-self': 'end' }} padding={1}>
|
|
33
|
+
Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
|
|
34
|
+
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
|
|
35
|
+
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
|
|
36
|
+
irure dolor in reprehenderit in voluptate velit esse cillLorem ipsum dolor sit amet,
|
|
37
|
+
consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
|
|
38
|
+
aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip
|
|
39
|
+
ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
|
40
|
+
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt
|
|
41
|
+
ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco
|
|
42
|
+
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
|
|
43
|
+
voluptate velit esse cillLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
|
|
44
|
+
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
|
|
45
|
+
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
|
|
46
|
+
irure dolor in reprehenderit in voluptate velit esse cill
|
|
47
|
+
</Decorator>
|
|
48
|
+
</Layers>
|
|
49
|
+
);
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export const ExamplePicture = (args) => {
|
|
53
|
+
return (
|
|
54
|
+
<Layers {...args}>
|
|
55
|
+
<picture>
|
|
56
|
+
<img src="https://placehold.jp/600x400.jpg" alt="" />
|
|
57
|
+
</picture>
|
|
58
|
+
<Decorator style={{ '--unitone--align-self': 'end' }} padding={1}>
|
|
59
|
+
Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
|
|
60
|
+
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
|
|
61
|
+
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
|
|
62
|
+
irure dolor in reprehenderit in voluptate velit esse cillLorem ipsum dolor sit amet,
|
|
63
|
+
consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
|
|
64
|
+
aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip
|
|
65
|
+
ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
|
66
|
+
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt
|
|
67
|
+
ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco
|
|
68
|
+
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
|
|
69
|
+
voluptate velit esse cillLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
|
|
70
|
+
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
|
|
71
|
+
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
|
|
72
|
+
irure dolor in reprehenderit in voluptate velit esse cill
|
|
73
|
+
</Decorator>
|
|
74
|
+
</Layers>
|
|
75
|
+
);
|
|
76
|
+
};
|
|
77
|
+
ExamplePicture.storyName = 'Example : picture';
|
|
78
|
+
|
|
79
|
+
export const ExampleFigure = (args) => {
|
|
80
|
+
return (
|
|
81
|
+
<Layers {...args}>
|
|
82
|
+
<figure>
|
|
83
|
+
<img src="https://placehold.jp/600x400.jpg" alt="" />
|
|
84
|
+
</figure>
|
|
85
|
+
<Decorator style={{ '--unitone--align-self': 'end' }} padding={1}>
|
|
86
|
+
Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
|
|
87
|
+
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
|
|
88
|
+
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
|
|
89
|
+
irure dolor in reprehenderit in voluptate velit esse cillLorem ipsum dolor sit amet,
|
|
90
|
+
consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
|
|
91
|
+
aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip
|
|
92
|
+
ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
|
93
|
+
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt
|
|
94
|
+
ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco
|
|
95
|
+
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
|
|
96
|
+
voluptate velit esse cillLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
|
|
97
|
+
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
|
|
98
|
+
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
|
|
99
|
+
irure dolor in reprehenderit in voluptate velit esse cill
|
|
100
|
+
</Decorator>
|
|
101
|
+
</Layers>
|
|
102
|
+
);
|
|
103
|
+
};
|
|
104
|
+
ExampleFigure.storyName = 'Example : figure';
|
|
105
|
+
|
|
106
|
+
export const ExampleFigurePicture = (args) => {
|
|
107
|
+
return (
|
|
108
|
+
<Layers {...args}>
|
|
109
|
+
<figure>
|
|
110
|
+
<picture>
|
|
111
|
+
<img src="https://placehold.jp/600x400.jpg" alt="" />
|
|
112
|
+
</picture>
|
|
113
|
+
</figure>
|
|
114
|
+
<Decorator style={{ '--unitone--align-self': 'end' }} padding={1}>
|
|
115
|
+
Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
|
|
116
|
+
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
|
|
117
|
+
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
|
|
118
|
+
irure dolor in reprehenderit in voluptate velit esse cillLorem ipsum dolor sit amet,
|
|
119
|
+
consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
|
|
120
|
+
aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip
|
|
121
|
+
ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
|
122
|
+
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt
|
|
123
|
+
ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco
|
|
124
|
+
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
|
|
125
|
+
voluptate velit esse cillLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
|
|
126
|
+
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
|
|
127
|
+
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
|
|
128
|
+
irure dolor in reprehenderit in voluptate velit esse cill
|
|
129
|
+
</Decorator>
|
|
130
|
+
</Layers>
|
|
131
|
+
);
|
|
132
|
+
};
|
|
133
|
+
ExampleFigurePicture.storyName = 'Example : figure > picture';
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
export const ResponsiveGrid = ({ columnMinWidth, gap, style, ...props }) => {
|
|
4
|
+
style = {
|
|
5
|
+
...style,
|
|
6
|
+
'--unitone--column-min-width': !!columnMinWidth ? columnMinWidth : undefined,
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
return (
|
|
10
|
+
<div
|
|
11
|
+
data-unitone-layout={[
|
|
12
|
+
'responsive-grid',
|
|
13
|
+
'undefined' !== typeof gap ? `-gap:${gap}` : undefined,
|
|
14
|
+
]
|
|
15
|
+
.filter(Boolean)
|
|
16
|
+
.join(' ')}
|
|
17
|
+
style={style}
|
|
18
|
+
>
|
|
19
|
+
{props.children}
|
|
20
|
+
</div>
|
|
21
|
+
);
|
|
22
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
@mixin abstract-responsive-grid() {
|
|
2
|
+
--unitone--column-min-width: 250px;
|
|
3
|
+
--unitone--gap: var(--unitone--s1);
|
|
4
|
+
|
|
5
|
+
display: grid;
|
|
6
|
+
grid-gap: var(--unitone--gap);
|
|
7
|
+
grid-template-columns: repeat(auto-fit, minmax(min(var(--unitone--column-min-width), 100%), 1fr));
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
@mixin responsive-grid() {
|
|
11
|
+
[data-unitone-layout~="responsive-grid"] {
|
|
12
|
+
@include abstract-responsive-grid();
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import readme from '../README.md';
|
|
3
|
+
|
|
4
|
+
import { ResponsiveGrid } from '../ResponsiveGrid';
|
|
5
|
+
import { Stack } from '../../stack/Stack';
|
|
6
|
+
|
|
7
|
+
export default {
|
|
8
|
+
title: 'Layout Primitives/ResponsiveGrid',
|
|
9
|
+
component: ResponsiveGrid,
|
|
10
|
+
parameters: {
|
|
11
|
+
notes: { readme },
|
|
12
|
+
},
|
|
13
|
+
argTypes: {
|
|
14
|
+
columnMinWidth: {
|
|
15
|
+
control: { type: 'text' },
|
|
16
|
+
description: 'Min width of each columns. Set by CSS var `--unitone--column-min-width`.',
|
|
17
|
+
table: { defaultValue: { summary: '250px' } },
|
|
18
|
+
type: { name: 'string', required: false },
|
|
19
|
+
},
|
|
20
|
+
gap: {
|
|
21
|
+
control: { type: 'inline-radio' },
|
|
22
|
+
description: 'Gap. Set by CSS var `--unitone--gap`.',
|
|
23
|
+
options: [-2, -1, 0, 1, 2, 3, 4, 5, 6, 7],
|
|
24
|
+
table: { defaultValue: { summary: 'var(--unitone--s1)' } },
|
|
25
|
+
type: { name: 'number', required: false },
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
args: {
|
|
29
|
+
columnMinWidth: '250px',
|
|
30
|
+
gap: 1,
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const content = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit';
|
|
35
|
+
|
|
36
|
+
export const Default = (args) => {
|
|
37
|
+
return (
|
|
38
|
+
<ResponsiveGrid {...args}>
|
|
39
|
+
<Stack gap={-2}>
|
|
40
|
+
<img src="https://placehold.jp/400x300.jpg" alt="" />
|
|
41
|
+
<p>{content}</p>
|
|
42
|
+
</Stack>
|
|
43
|
+
<Stack gap={-2}>
|
|
44
|
+
<img src="https://placehold.jp/400x300.jpg" alt="" />
|
|
45
|
+
<p>{content}</p>
|
|
46
|
+
</Stack>
|
|
47
|
+
<Stack gap={-2}>
|
|
48
|
+
<img src="https://placehold.jp/400x300.jpg" alt="" />
|
|
49
|
+
<p>{content}</p>
|
|
50
|
+
</Stack>
|
|
51
|
+
<Stack gap={-2}>
|
|
52
|
+
<img src="https://placehold.jp/400x300.jpg" alt="" />
|
|
53
|
+
<p>{content}</p>
|
|
54
|
+
</Stack>
|
|
55
|
+
<Stack gap={-2}>
|
|
56
|
+
<img src="https://placehold.jp/400x300.jpg" alt="" />
|
|
57
|
+
<p>{content}</p>
|
|
58
|
+
</Stack>
|
|
59
|
+
<Stack gap={-2}>
|
|
60
|
+
<img src="https://placehold.jp/400x300.jpg" alt="" />
|
|
61
|
+
<p>{content}</p>
|
|
62
|
+
</Stack>
|
|
63
|
+
</ResponsiveGrid>
|
|
64
|
+
);
|
|
65
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
## Usage
|
|
2
|
+
|
|
3
|
+
```html
|
|
4
|
+
<div data-unitone-layout="stack">
|
|
5
|
+
<p>Lorem Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cill</p>
|
|
6
|
+
<p>Lorem Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cill</p>
|
|
7
|
+
</div>
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
### Customizing gap
|
|
11
|
+
|
|
12
|
+
```html
|
|
13
|
+
<div data-unitone-layout="stack -gap:1">
|
|
14
|
+
...
|
|
15
|
+
</div>
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
### Using negative gap
|
|
19
|
+
|
|
20
|
+
```html
|
|
21
|
+
<div data-unitone-layout="stack -gap:1 -negative">
|
|
22
|
+
...
|
|
23
|
+
</div>
|
|
24
|
+
```
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
export const Stack = ({ center, gap, negative, style, ...props }) => {
|
|
4
|
+
style = {
|
|
5
|
+
...style,
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
return (
|
|
9
|
+
<div
|
|
10
|
+
data-unitone-layout={[
|
|
11
|
+
'stack',
|
|
12
|
+
'undefined' !== typeof gap ? `-gap:${gap}` : undefined,
|
|
13
|
+
true === negative ? '-negative' : undefined,
|
|
14
|
+
]
|
|
15
|
+
.filter(Boolean)
|
|
16
|
+
.join(' ')}
|
|
17
|
+
style={style}
|
|
18
|
+
>
|
|
19
|
+
{props.children}
|
|
20
|
+
</div>
|
|
21
|
+
);
|
|
22
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
@mixin abstract-stack() {
|
|
2
|
+
--unitone--gap: var(--unitone--s1);
|
|
3
|
+
|
|
4
|
+
display: flex;
|
|
5
|
+
flex-direction: column;
|
|
6
|
+
gap: var(--unitone--gap);
|
|
7
|
+
|
|
8
|
+
> * {
|
|
9
|
+
margin-top: 0;
|
|
10
|
+
margin-bottom: 0;
|
|
11
|
+
flex: 0 0 auto;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
&:only-child {
|
|
15
|
+
height: 100%;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
&[data-unitone-layout~="-negative"] {
|
|
19
|
+
gap: 0;
|
|
20
|
+
|
|
21
|
+
> * + * {
|
|
22
|
+
margin-top: calc(-1 * var(--unitone--gap));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
@mixin stack() {
|
|
28
|
+
[data-unitone-layout~="stack"] {
|
|
29
|
+
@include abstract-stack();
|
|
30
|
+
}
|
|
31
|
+
}
|