Files
metabuilder/scss/atoms/layout.module.scss
2026-03-09 22:30:41 +00:00

226 lines
4.0 KiB
SCSS

/**
* Layout Module - Material Design 3
* Scoped styles for app layout structure
*/
.layout {
display: flex;
flex-direction: column;
min-height: 100vh;
background: var(--mat-sys-surface);
}
.content {
display: flex;
flex: 1;
min-height: 0;
}
.main {
flex: 1;
padding: 24px;
overflow-y: auto;
background: var(--mat-sys-surface-container-lowest);
// Full-height workspace pages (unit-tests, playwright, etc.) — strip padding
// so the workspace component can manage its own layout
&:has(:global(.workspace__body)) {
padding: 0;
overflow: hidden;
display: flex;
flex-direction: column;
}
}
// Sidebar
.sidebar {
display: flex;
flex-direction: column;
width: 240px;
align-self: stretch;
background: var(--mat-sys-surface-container-low);
border-right: 1px solid var(--mat-sys-outline-variant);
flex-shrink: 0;
overflow-y: auto;
}
.sidebarHidden {
width: 0;
overflow: hidden;
}
.sidebarHeader {
padding: 16px;
border-bottom: 1px solid var(--mat-sys-outline-variant);
}
.sidebarTitle {
font: var(--mat-sys-title-medium-font);
color: var(--mat-sys-on-surface);
margin: 0;
}
.sidebarContent {
flex: 1;
padding: 8px 0;
}
.sidebarFooter {
padding: 16px;
border-top: 1px solid var(--mat-sys-outline-variant);
margin-top: auto;
}
// Mobile drawer
.drawerMobile {
position: fixed;
top: 0;
left: 0;
bottom: 0;
width: 280px;
z-index: 1200;
box-shadow: var(--mat-sys-level4);
transform: translateX(-100%);
transition: transform var(--mat-sys-motion-duration-medium2) var(--mat-sys-motion-easing-emphasized);
}
.drawerMobileOpen {
transform: translateX(0);
}
.drawerBackdrop {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.5);
z-index: 1100;
}
// App bar / Header
.appBar {
display: flex;
align-items: center;
justify-content: space-between;
height: 64px;
padding: 0 16px;
background: var(--mat-sys-surface-container);
border-bottom: 1px solid var(--mat-sys-outline-variant);
flex-shrink: 0;
}
.appBarTitle {
font: var(--mat-sys-title-large-font);
color: var(--mat-sys-on-surface);
margin: 0;
}
.appBarActions {
display: flex;
align-items: center;
gap: 8px;
}
.appBarLeft {
display: flex;
align-items: center;
gap: 12px;
}
.appBarBrand {
display: flex;
align-items: center;
gap: 10px;
}
// Navigation sections
.navSection {
padding: 8px 0;
&:not(:last-child) {
border-bottom: 1px solid var(--mat-sys-outline-variant);
}
}
.navSectionTitle {
font-size: 0.7rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
color: var(--mat-sys-on-surface-variant);
padding: 8px 16px 4px;
margin: 0;
}
// Navigation list
.navList {
list-style: none;
margin: 0;
padding: 0;
}
.navItem {
display: block;
}
.navLink {
display: flex;
align-items: center;
gap: 12px;
padding: 10px 16px;
color: var(--mat-sys-on-surface-variant);
text-decoration: none;
font-size: 0.875rem;
border-radius: 0 24px 24px 0;
margin-right: 12px;
transition: all var(--mat-sys-motion-duration-short4) var(--mat-sys-motion-easing-standard);
&:hover {
background: color-mix(in srgb, var(--mat-sys-on-surface) 8%, transparent);
color: var(--mat-sys-on-surface);
}
&:focus-visible {
outline: 2px solid var(--mat-sys-primary);
outline-offset: -2px;
}
}
.navLinkActive {
background: var(--mat-sys-secondary-container);
color: var(--mat-sys-on-secondary-container);
.navIcon {
color: var(--mat-sys-on-secondary-container);
}
}
.navIcon {
display: flex;
align-items: center;
justify-content: center;
width: 24px;
height: 24px;
flex-shrink: 0;
color: var(--mat-sys-on-surface-variant);
}
.navLabel {
flex: 1;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.navBadge {
display: flex;
align-items: center;
justify-content: center;
min-width: 20px;
height: 20px;
padding: 0 6px;
border-radius: 10px;
background: var(--mat-sys-error);
color: var(--mat-sys-on-error);
font-size: 0.7rem;
font-weight: 600;
}