@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.
Files changed (110) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +18 -0
  3. package/dist/app.css +1 -0
  4. package/dist/app.js +1 -0
  5. package/dist/storybook.css +1 -0
  6. package/package.json +60 -0
  7. package/src/.DS_Store +0 -0
  8. package/src/app.js +21 -0
  9. package/src/app.scss +8 -0
  10. package/src/foundation/_foundation.scss +108 -0
  11. package/src/helper/_align-items.scss +7 -0
  12. package/src/helper/_align-self.scss +17 -0
  13. package/src/helper/_align.scss +14 -0
  14. package/src/helper/_fluid-typography.scss +7 -0
  15. package/src/helper/_gap.scss +7 -0
  16. package/src/helper/_gutters.scss +7 -0
  17. package/src/helper/_helper.scss +21 -0
  18. package/src/helper/_justify-content.scss +7 -0
  19. package/src/helper/_justify-self.scss +17 -0
  20. package/src/helper/_padding.scss +7 -0
  21. package/src/layout-primitives/_layout-primitives.scss +33 -0
  22. package/src/layout-primitives/both-sides/BothSides.jsx +22 -0
  23. package/src/layout-primitives/both-sides/README.md +54 -0
  24. package/src/layout-primitives/both-sides/_both-sides.scss +24 -0
  25. package/src/layout-primitives/both-sides/stories/index.jsx +51 -0
  26. package/src/layout-primitives/center/Center.jsx +18 -0
  27. package/src/layout-primitives/center/README.md +33 -0
  28. package/src/layout-primitives/center/_center.scss +17 -0
  29. package/src/layout-primitives/center/stories/index.jsx +39 -0
  30. package/src/layout-primitives/cluster/Cluster.jsx +21 -0
  31. package/src/layout-primitives/cluster/README.md +35 -0
  32. package/src/layout-primitives/cluster/_cluster.scss +22 -0
  33. package/src/layout-primitives/cluster/stories/index.jsx +79 -0
  34. package/src/layout-primitives/container/Container.jsx +23 -0
  35. package/src/layout-primitives/container/README.md +39 -0
  36. package/src/layout-primitives/container/_container.scss +18 -0
  37. package/src/layout-primitives/container/stories/index.jsx +65 -0
  38. package/src/layout-primitives/cover/Cover.jsx +30 -0
  39. package/src/layout-primitives/cover/README.md +54 -0
  40. package/src/layout-primitives/cover/_cover.scss +37 -0
  41. package/src/layout-primitives/cover/stories/index.jsx +140 -0
  42. package/src/layout-primitives/decorator/Decorator.jsx +49 -0
  43. package/src/layout-primitives/decorator/README.md +49 -0
  44. package/src/layout-primitives/decorator/_decorator.scss +54 -0
  45. package/src/layout-primitives/decorator/stories/index.jsx +190 -0
  46. package/src/layout-primitives/float/Float.jsx +24 -0
  47. package/src/layout-primitives/float/README.md +24 -0
  48. package/src/layout-primitives/float/_float.scss +29 -0
  49. package/src/layout-primitives/float/stories/index.jsx +78 -0
  50. package/src/layout-primitives/frame/Frame.jsx +19 -0
  51. package/src/layout-primitives/frame/README.md +7 -0
  52. package/src/layout-primitives/frame/_frame.scss +45 -0
  53. package/src/layout-primitives/frame/stories/index.jsx +50 -0
  54. package/src/layout-primitives/gutters/Gutters.jsx +17 -0
  55. package/src/layout-primitives/gutters/README.md +23 -0
  56. package/src/layout-primitives/gutters/_gutters.scss +12 -0
  57. package/src/layout-primitives/gutters/stories/index.jsx +48 -0
  58. package/src/layout-primitives/layers/Layers.jsx +18 -0
  59. package/src/layout-primitives/layers/README.md +32 -0
  60. package/src/layout-primitives/layers/_layers.scss +51 -0
  61. package/src/layout-primitives/layers/stories/index.jsx +133 -0
  62. package/src/layout-primitives/responsive-grid/README.md +11 -0
  63. package/src/layout-primitives/responsive-grid/ResponsiveGrid.jsx +22 -0
  64. package/src/layout-primitives/responsive-grid/_responsive-grid.scss +14 -0
  65. package/src/layout-primitives/responsive-grid/stories/index.jsx +65 -0
  66. package/src/layout-primitives/stack/README.md +24 -0
  67. package/src/layout-primitives/stack/Stack.jsx +22 -0
  68. package/src/layout-primitives/stack/_stack.scss +31 -0
  69. package/src/layout-primitives/stack/stories/index.jsx +123 -0
  70. package/src/layout-primitives/switcher/README.md +17 -0
  71. package/src/layout-primitives/switcher/Switcher.jsx +19 -0
  72. package/src/layout-primitives/switcher/_switcher.scss +19 -0
  73. package/src/layout-primitives/switcher/stories/index.jsx +50 -0
  74. package/src/layout-primitives/text/README.md +16 -0
  75. package/src/layout-primitives/text/Text.jsx +19 -0
  76. package/src/layout-primitives/text/_text.scss +80 -0
  77. package/src/layout-primitives/text/stories/index.jsx +112 -0
  78. package/src/layout-primitives/with-sidebar/README.md +36 -0
  79. package/src/layout-primitives/with-sidebar/WithSidebar.jsx +35 -0
  80. package/src/layout-primitives/with-sidebar/_with-sidebar.scss +58 -0
  81. package/src/layout-primitives/with-sidebar/stories/index.jsx +127 -0
  82. package/src/patterns/features/features-1/Features1.jsx +52 -0
  83. package/src/patterns/features/features-1/stories/index.jsx +68 -0
  84. package/src/patterns/features/features-2/Features2.jsx +33 -0
  85. package/src/patterns/features/features-2/stories/index.jsx +67 -0
  86. package/src/patterns/header/header-1/Header1.jsx +31 -0
  87. package/src/patterns/header/header-1/stories/index.jsx +44 -0
  88. package/src/patterns/header/header-2/Header2.jsx +33 -0
  89. package/src/patterns/header/header-2/stories/index.jsx +44 -0
  90. package/src/patterns/header/header-3/Header3.jsx +30 -0
  91. package/src/patterns/header/header-3/stories/index.jsx +43 -0
  92. package/src/patterns/header/header-4/Header4.jsx +25 -0
  93. package/src/patterns/header/header-4/stories/index.jsx +41 -0
  94. package/src/patterns/header/header-5/Header5.jsx +32 -0
  95. package/src/patterns/header/header-5/stories/index.jsx +43 -0
  96. package/src/patterns/header/header-6/Header6.jsx +34 -0
  97. package/src/patterns/header/header-6/stories/index.jsx +58 -0
  98. package/src/patterns/media-text/media-text-1/MediaText1.jsx +41 -0
  99. package/src/patterns/media-text/media-text-1/stories/index.jsx +34 -0
  100. package/src/patterns/media-text/media-text-2/MediaText2.jsx +39 -0
  101. package/src/patterns/media-text/media-text-2/stories/index.jsx +34 -0
  102. package/src/settings/_body.scss +8 -0
  103. package/src/settings/_html.scss +3 -0
  104. package/src/settings/_root.scss +152 -0
  105. package/src/settings/_settings.scss +3 -0
  106. package/src/stories/1.introduction.stories.mdx +27 -0
  107. package/src/stories/2.get-started.stories.mdx +23 -0
  108. package/src/stories/3.global-api.stories.mdx +57 -0
  109. package/src/storybook.scss +11 -0
  110. 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,11 @@
1
+ ## Usage
2
+
3
+ ```html
4
+ <div data-unitone-layout="responsive-grid">
5
+ <div data-unitone-layout="stack">
6
+ <img src="https://placehold.jp/400x300.jpg" alt="" />
7
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit</p>
8
+ </div>
9
+ ...
10
+ </div>
11
+ ```
@@ -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
+ }