]> BookStack Code Mirror - bookstack/blob - resources/assets/sass/_layout.scss
53381fc143162971a84ed190ee8a4290522e5543
[bookstack] / resources / assets / sass / _layout.scss
1
2 /**
3  * Generic content container
4  */
5 .container {
6   max-width: $xxl;
7   margin-left: auto;
8   margin-right: auto;
9   padding-left: $-m;
10   padding-right: $-m;
11   &.small {
12     max-width: 840px;
13   }
14   &.very-small {
15     max-width: 480px;
16   }
17 }
18
19 /**
20  * Core grid layout system
21  */
22 .grid {
23   display: grid;
24   grid-column-gap: $-l;
25   grid-row-gap: $-l;
26   &.half {
27     grid-template-columns: 1fr 1fr;
28   }
29   &.third {
30     grid-template-columns: 1fr 1fr 1fr;
31   }
32   &.left-focus {
33     grid-template-columns: 2fr 1fr;
34   }
35   &.right-focus {
36     grid-template-columns: 1fr 3fr;
37   }
38   &.gap-y-xs {
39     grid-row-gap: $-xs;
40   }
41   &.gap-xl {
42     grid-column-gap: $-xl;
43     grid-row-gap: $-xl;
44   }
45   &.gap-xxl {
46     grid-column-gap: $-xxl;
47     grid-row-gap: $-xxl;
48   }
49   &.v-center {
50     align-items: center;
51   }
52 }
53
54 @include smaller-than($m) {
55   .grid.third {
56     grid-template-columns: 1fr 1fr;
57   }
58   .grid.half, .grid.left-focus, .grid.right-focus {
59     grid-template-columns: 1fr;
60   }
61   .grid.half.collapse-xs {
62     grid-template-columns: 1fr 1fr;
63   }
64   .grid.gap-xl {
65     grid-column-gap: $-m;
66     grid-row-gap: $-m;
67   }
68   .grid.right-focus.reverse-collapse > *:nth-child(2) {
69     order: 0;
70   }
71   .grid.right-focus.reverse-collapse > *:nth-child(1) {
72     order: 1;
73   }
74 }
75
76 @include smaller-than($s) {
77   .grid.third {
78     grid-template-columns: 1fr;
79   }
80 }
81
82 @include smaller-than($xs) {
83   .grid.half.collapse-xs {
84     grid-template-columns: 1fr;
85   }
86 }
87
88 /**
89  * Flexbox layout system
90  */
91 body.flexbox {
92   display: flex;
93   flex-direction: column;
94   align-items: stretch;
95   height: 100%;
96   min-height: 100%;
97   max-height: 100%;
98   overflow: hidden;
99   #content {
100     flex: 1;
101     display: flex;
102     min-height: 0;
103   }
104 }
105
106 .flex-fill {
107   display: flex;
108   align-items: stretch;
109   min-height: 0;
110   max-width: 100%;
111   position: relative;
112 }
113
114 .flex {
115   min-height: 0;
116   flex: 1;
117 }
118
119
120 /**
121  * Display and float utilities
122  */
123 .block {
124   display: block;
125   position: relative;
126 }
127
128 .inline {
129   display: inline;
130 }
131
132 .block.inline {
133   display: inline-block;
134 }
135
136 .float {
137   float: left;
138   &.right {
139     float: right;
140   }
141 }
142
143 /**
144  * Visibility
145  */
146 @each $sizeLetter, $size in $screen-sizes {
147   @include smaller-than($size) {
148     .hide-under-#{$sizeLetter} {
149       display: none !important;
150     }
151   }
152   @include larger-than($size) {
153     .hide-over-#{$sizeLetter} {
154       display: none !important;
155     }
156   }
157 }
158
159 /**
160  * Inline content columns
161  */
162 .dual-column-content {
163   columns: 2;
164 }
165
166 @include smaller-than($m) {
167   .dual-column-content {
168     columns: 1;
169   }
170 }
171
172
173 /**
174  * Fixes
175  */
176 .clearfix:before,
177 .clearfix:after {
178   content: " ";
179   display: table;
180 }
181 .clearfix:after {
182   clear: both;
183 }
184
185 /**
186  * View Layouts
187  */
188 .tri-layout-container {
189   display: grid;
190   margin-left: $-xl;
191   margin-right: $-xl;
192   grid-template-columns: 1fr 4fr 1fr;
193   grid-template-areas: "a b c";
194   grid-column-gap: $-xxl;
195   .tri-layout-right {
196     grid-area: c;
197     min-width: 0;
198   }
199   .tri-layout-left {
200     grid-area: a;
201     min-width: 0;
202   }
203   .tri-layout-middle {
204     grid-area: b;
205     padding-top: $-m;
206   }
207 }
208 @include smaller-than($xxl) {
209   .tri-layout-container {
210     grid-template-areas:  "c b b"
211     "a b b";
212     grid-template-columns: 1fr 3fr;
213     grid-template-rows: max-content min-content;
214     padding-right: $-l;
215     .content-wrap.card {
216       padding: $-l $-xl;
217     }
218   }
219 }
220 @include larger-than($xxl) {
221   .tri-layout-left-contents, .tri-layout-right-contents {
222     padding: $-m;
223     position: sticky;
224     top: $-m;
225     max-height: 100vh;
226     min-height: 50vh;
227     overflow-y: scroll;
228     overflow-x: hidden;
229     scrollbar-width: none;
230     -ms-overflow-style: none;
231     &::-webkit-scrollbar {
232       display: none;
233     }
234   }
235   .tri-layout-middle-contents {
236     max-width: 940px;
237     margin: 0 auto;
238   }
239 }
240
241 @include smaller-than($l) {
242   .tri-layout-container {
243     grid-template-areas:  none;
244     grid-template-columns: 10% 90%;
245     grid-column-gap: 0;
246     .tri-layout-left-contents, .tri-layout-right-contents {
247       padding-left: $-m;
248       padding-right: $-m;
249     }
250     .tri-layout-right-contents > div, .tri-layout-left-contents > div {
251       opacity: 0.6;
252       z-index: 0;
253     }
254     .tri-layout-left > *, .tri-layout-right > * {
255       pointer-events: none;
256     }
257     .tri-layout-right, .tri-layout-left, .tri-layout-middle {
258       grid-area: none;
259       grid-column: 1/3;
260       grid-row: 1;
261     }
262     .tri-layout-middle {
263       grid-row: 1/3;
264       grid-column: 2/3;
265       z-index: 1;
266       transition: transform ease-in-out 240ms;
267     }
268     .tri-layout-left {
269       grid-row: 2;
270     }
271     &.mobile-open {
272       overflow: hidden;
273       .tri-layout-middle {
274         transform: translateX(90%);
275       }
276       .tri-layout-right  > *, .tri-layout-left > * {
277         pointer-events: auto;
278       }
279     }
280   }
281 }
282
283 .tri-layout-left-contents > div, .tri-layout-right-contents > div {
284   opacity: 0.6;
285   transition: opacity ease-in-out 120ms;
286   &:hover {
287     opacity: 1;
288   }
289 }