@rolemodel/optics
Version:
Optics is a css package that provides base styles and components that can be integrated and customized in a variety of projects.
151 lines (128 loc) • 2.91 kB
CSS
.app-with-sidebar {
display: grid;
block-size: 100vh;
grid-template-columns: auto 1fr auto;
inline-size: 100%;
}
.app-body {
display: flex;
overflow: auto;
flex-direction: column;
}
.app__header {
position: sticky;
z-index: var(--op-z-index-header);
flex-grow: 0;
flex-shrink: 0;
inset-block-start: 0;
}
.app__content {
flex-grow: 1;
padding: 0 var(--op-space-large);
margin: 0 auto;
inline-size: 100%;
max-inline-size: var(--op-breakpoint-medium);
}
.app__content-no-margin {
flex-grow: 1;
padding: 0 var(--op-space-large);
inline-size: 100%;
overflow-y: auto;
}
.app__footer {
position: sticky;
z-index: var(--op-z-index-footer);
flex-grow: 0;
flex-shrink: 0;
inset-block-end: 0;
}
/*
<html lang='en'>
<head>...</head>
<body class="op-page">
<div class="op-page__sidebar">...</div>
<div class="op-page__main">
<div class="op-page__main-header">...</div>
<div class="op-page__main-content">...</div>
<div class="op-page__main-footer">...</div>
</div>
<div class="op-page__sidebar op-page__sidebar--right">...</div>
</body>
</html>
*/
:root:has(.op-page) {
/* Reset existing Optics layout */
overflow: unset;
body {
overflow: unset;
}
/* New Layout */
html,
body {
padding: 0;
margin: 0;
block-size: 100%;
min-block-size: 100%;
}
}
.op-page {
display: grid;
grid-template-areas: 'sidebar-left main sidebar-right';
grid-template-columns: minmax(0, auto) minmax(0, 1fr) minmax(0, auto);
min-block-size: 100dvh;
.op-page__sidebar {
grid-area: sidebar-left;
&.op-page__sidebar--right {
grid-area: sidebar-right;
}
}
.op-page__main {
grid-area: main;
}
.op-page__sidebar {
position: sticky;
z-index: var(--op-z-index-sidebar);
block-size: 100dvh;
inset-block-start: 0;
max-block-size: 100dvh;
> * {
block-size: 100%;
}
}
.op-page__main {
display: grid;
grid-template-areas:
'main-header'
'main-content'
'main-footer';
grid-template-columns: minmax(0, 1fr);
grid-template-rows: minmax(0, auto) minmax(0, 1fr) minmax(0, auto);
min-block-size: 100%;
.op-page__main-header {
grid-area: main-header;
}
.op-page__main-content {
grid-area: main-content;
}
.op-page__main-footer {
grid-area: main-footer;
}
.op-page__main-header {
position: sticky;
z-index: var(--op-z-index-header);
inset-block-start: 0;
}
.op-page__main-content {
inline-size: 100%;
margin-inline: auto;
max-inline-size: var(--op-breakpoint-medium);
padding-block: var(--op-space-medium);
padding-inline: var(--op-space-large);
}
.op-page__main-footer {
position: sticky;
z-index: var(--op-z-index-footer);
inset-block-end: 0;
}
}
}