mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-04-24 13:54:57 +00:00
235 lines
5.9 KiB
SCSS
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;
|
|
}
|