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

235 lines
5.9 KiB
SCSS

// App layout, navigation, header, branding, tabs, scroll area
// Uses MD3 CSS custom properties from var(--mat-sys-*)
// ─── Navigation item ────────────────────────────────────────────────────────
.nav-item {
width: 100%;
display: flex;
align-items: center;
gap: 12px;
padding: 8px 12px;
border-radius: 8px;
border: none;
background: transparent;
color: var(--mat-sys-on-surface);
font-size: 14px;
cursor: pointer;
text-align: left;
transition: background 0.15s ease, color 0.15s ease;
&:hover {
background: color-mix(in srgb, var(--mat-sys-on-surface) 8%, transparent);
}
&--active {
background: color-mix(in srgb, var(--mat-sys-primary) 12%, transparent);
color: var(--mat-sys-primary);
font-weight: 500;
&:hover {
background: color-mix(in srgb, var(--mat-sys-primary) 16%, transparent);
}
}
&__icon {
flex-shrink: 0;
}
&__label {
flex: 1;
text-align: left;
}
&__badge {
margin-left: auto;
}
}
// ─── Tab bar ────────────────────────────────────────────────────────────────
.tab-bar {
display: flex;
gap: 4px;
&__tab {
display: flex;
align-items: center;
gap: 6px;
padding: 6px 12px;
border-radius: 6px;
border: none;
background: transparent;
color: var(--mat-sys-on-surface-variant);
font-size: 13px;
font-weight: 500;
cursor: pointer;
transition: background 0.15s ease, color 0.15s ease;
&:hover {
background: color-mix(in srgb, var(--mat-sys-on-surface) 8%, transparent);
color: var(--mat-sys-on-surface);
}
&--active {
background: color-mix(in srgb, var(--mat-sys-primary) 12%, transparent);
color: var(--mat-sys-primary);
&:hover {
background: color-mix(in srgb, var(--mat-sys-primary) 16%, transparent);
}
}
}
}
// ─── App layout root ────────────────────────────────────────────────────────
.app-layout {
height: 100vh;
display: flex;
flex-direction: column;
background: var(--mat-sys-surface);
overflow: hidden;
}
// ─── App header ─────────────────────────────────────────────────────────────
.app-header {
flex-shrink: 0;
background: var(--mat-sys-surface-container);
border-bottom: 1px solid var(--mat-sys-outline-variant);
&__top {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
padding: 12px 16px;
}
&__left {
display: flex;
align-items: center;
gap: 8px;
flex: 1;
min-width: 0;
}
&__right {
display: flex;
align-items: center;
gap: 4px;
flex-shrink: 0;
}
&__bottom {
padding: 8px 16px;
}
&__logo {
display: flex;
align-items: center;
gap: 12px;
}
&__title {
margin: 0;
font-size: 20px;
font-weight: 700;
letter-spacing: -0.02em;
color: var(--mat-sys-on-surface);
}
}
// ─── App branding ───────────────────────────────────────────────────────────
.app-branding {
display: flex;
align-items: center;
gap: 12px;
&__title {
margin: 0;
font-size: 20px;
font-weight: 700;
letter-spacing: -0.02em;
color: var(--mat-sys-on-surface);
}
}
// ─── App logo ───────────────────────────────────────────────────────────────
.app-logo {
width: 40px;
height: 40px;
border-radius: 10px;
background: linear-gradient(
135deg,
var(--mat-sys-primary),
var(--mat-sys-tertiary, var(--mat-sys-secondary))
);
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
box-shadow: 0 2px 8px color-mix(in srgb, var(--mat-sys-shadow, #000) 20%, transparent);
color: var(--mat-sys-on-primary);
&--lg {
width: 48px;
height: 48px;
}
}
// ─── Scroll area ─────────────────────────────────────────────────────────────
.scroll-area {
overflow-y: auto;
height: 100%;
&--horizontal {
overflow-x: auto;
overflow-y: hidden;
height: auto;
}
&--both {
overflow: auto;
}
}
// ─── Responsive container ───────────────────────────────────────────────────
.responsive-container {
width: 100%;
max-width: 100%;
&--sm { max-width: 640px; margin-inline: auto; }
&--md { max-width: 768px; margin-inline: auto; }
&--lg { max-width: 1024px; margin-inline: auto; }
&--xl { max-width: 1280px; margin-inline: auto; }
&--2xl { max-width: 1536px; margin-inline: auto; }
}
// ─── PWA status bar pulse ────────────────────────────────────────────────────
.pwa-status-loading {
height: 4px;
background: var(--mat-sys-primary);
animation: pwa-pulse 1.5s ease-in-out infinite;
}
@keyframes pwa-pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.4; }
}
// ─── Main content area ───────────────────────────────────────────────────────
.app-content {
flex: 1;
overflow: hidden;
display: flex;
flex-direction: column;
}