feat(monitor/frontend): dashboard 3-col grid layout (320 / 1fr / 320, no body scroll)
Replaces the demolition scaffold with the structural grid that Tasks 8-21 fill in. Root is a 4-row grid (topstrip / alertbanner / main / bottomticker) with named grid-areas; the main row contains a 3-col sub-grid (left aside / center section / right aside) at fixed 320px / 1fr / 320px. 100dvh, no body scroll, ethos custom properties only — no template SCSS variables touched. Adds --col-panel-width: 320px to the ethos token block (no magic number in the layout module). index.tsx becomes a one-line re-export of Dashboard so the lazy-route contract in routers.tsx stays unchanged. No placeholder components. The empty <aside>/<section> elements are the column containers themselves; subsequent tasks add real children inside them rather than swap stub components. Verified in browser at 1920x1080: rgb(10,10,10) bg, 320/1247/320 col rects, 1px var(--fg-4) rules between columns, body has no scroll. All 5 Plan 5 Task 7 Design QA boxes checked.
This commit is contained in:
parent
50b0e96735
commit
c7a0dd33a2
|
|
@ -0,0 +1,43 @@
|
||||||
|
// ©AngelaMos | 2026
|
||||||
|
// Dashboard.module.scss
|
||||||
|
|
||||||
|
.root {
|
||||||
|
display: grid;
|
||||||
|
grid-template-rows: auto auto 1fr auto;
|
||||||
|
grid-template-areas:
|
||||||
|
'topstrip'
|
||||||
|
'alertbanner'
|
||||||
|
'main'
|
||||||
|
'bottomticker';
|
||||||
|
height: 100dvh;
|
||||||
|
width: 100vw;
|
||||||
|
background: var(--bg);
|
||||||
|
color: var(--fg-1);
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid {
|
||||||
|
grid-area: main;
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: var(--col-panel-width) 1fr var(--col-panel-width);
|
||||||
|
min-height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.left {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
overflow-y: auto;
|
||||||
|
border-right: 1px solid var(--fg-4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.center {
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.right {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
overflow-y: auto;
|
||||||
|
border-left: 1px solid var(--fg-4);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
// ©AngelaMos | 2026
|
||||||
|
// Dashboard.tsx
|
||||||
|
|
||||||
|
import styles from './Dashboard.module.scss'
|
||||||
|
|
||||||
|
export function Dashboard(): React.ReactElement {
|
||||||
|
return (
|
||||||
|
<div className={styles.root}>
|
||||||
|
<main className={styles.grid}>
|
||||||
|
<aside className={styles.left} />
|
||||||
|
<section className={styles.center} />
|
||||||
|
<aside className={styles.right} />
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
Dashboard.displayName = 'Dashboard'
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
// ©AngelaMos | 2026
|
|
||||||
// dashboard.module.scss
|
|
||||||
|
|
||||||
.scaffold {
|
|
||||||
height: 100dvh;
|
|
||||||
width: 100%;
|
|
||||||
background: var(--bg);
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.label {
|
|
||||||
font-family: var(--font-sans);
|
|
||||||
font-size: var(--type-label);
|
|
||||||
letter-spacing: var(--letter-spacing-label);
|
|
||||||
text-transform: uppercase;
|
|
||||||
color: var(--fg-3);
|
|
||||||
}
|
|
||||||
|
|
@ -1,14 +1,4 @@
|
||||||
// ©AngelaMos | 2026
|
// ©AngelaMos | 2026
|
||||||
// index.tsx
|
// index.tsx
|
||||||
|
|
||||||
import styles from './dashboard.module.scss'
|
export { Dashboard as Component } from './Dashboard'
|
||||||
|
|
||||||
export function Component(): React.ReactElement {
|
|
||||||
return (
|
|
||||||
<div className={styles.scaffold}>
|
|
||||||
<span className={styles.label}>MONITOR THE SITUATION · SCAFFOLD</span>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
Component.displayName = 'Dashboard'
|
|
||||||
|
|
|
||||||
|
|
@ -208,4 +208,7 @@ $container-full: 100%;
|
||||||
--type-label: 11px; // UPPERCASE labels
|
--type-label: 11px; // UPPERCASE labels
|
||||||
--type-num-l: 20px; // KPI numbers
|
--type-num-l: 20px; // KPI numbers
|
||||||
--type-num-xl: 28px; // hero KPI numbers (rare; only top-of-panel)
|
--type-num-xl: 28px; // hero KPI numbers (rare; only top-of-panel)
|
||||||
|
|
||||||
|
// Layout — fixed panel column width (spec §11.1)
|
||||||
|
--col-panel-width: 320px;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue