diff --git a/app/globals.css b/app/globals.css index 12cbbb5..12ed325 100644 --- a/app/globals.css +++ b/app/globals.css @@ -18,7 +18,6 @@ .analysis-layout{display:grid;grid-template-columns:195px minmax(0,1fr);min-height:100vh}.analysis-sidebar{position:sticky;top:0;height:100vh;padding:22px 12px;border-right:1px solid rgba(203,213,225,.78);background:rgba(255,255,255,.58);backdrop-filter:blur(18px);display:flex;flex-direction:column}.analysis-brand{display:flex;align-items:center;gap:10px;padding:0 10px 24px;font-weight:700;font-size:16px}.analysis-brand__mark{display:grid;place-items:center;width:34px;height:34px;border-radius:9px;color:#fff;background:linear-gradient(135deg,#251b62,#5544ba);box-shadow:0 8px 20px rgba(67,52,157,.22)}.analysis-side-nav{display:grid;gap:6px}.analysis-side-nav a{display:flex;align-items:center;gap:11px;padding:11px 12px;border-radius:10px;color:#667085;font-size:13px;font-weight:500;text-decoration:none;transition:.18s}.analysis-side-nav a:hover{background:rgba(79,70,229,.06);color:#2d246f}.analysis-side-nav a.is-active{color:#312783;background:linear-gradient(90deg,rgba(79,70,229,.12),rgba(79,70,229,.04));font-weight:650}.analysis-side-footer{margin-top:auto;border-top:1px solid rgba(203,213,225,.72);padding:16px 10px 0;color:#7b8798;font-size:11px} .analysis-page{min-width:0;padding:18px 28px 28px}.analysis-topbar{display:flex;align-items:center;justify-content:space-between;gap:18px;padding-bottom:16px}.analysis-title-row{display:flex;align-items:center;gap:10px}.analysis-title-row h1{font-size:24px;line-height:1.1;letter-spacing:-.035em;font-weight:750}.analysis-sync{font-size:11px;color:#7b8798;display:flex;align-items:center;gap:6px}.analysis-top-actions{display:flex;gap:10px}.analysis-primary{display:inline-flex;align-items:center;justify-content:center;gap:8px;border:0;border-radius:9px;padding:10px 16px;background:linear-gradient(135deg,#241d58,#45369d);color:#fff;font-size:13px;font-weight:600;box-shadow:0 8px 18px rgba(49,39,120,.14)}.analysis-primary:disabled{opacity:.55}.analysis-raw-button{display:inline-flex;align-items:center;gap:.55rem;border:1px solid #dfe5ec;border-radius:.8rem;padding:.55rem .9rem;background:rgba(255,255,255,.8);color:#344054;font-size:.8rem;font-weight:600;box-shadow:0 4px 14px rgba(15,23,42,.04);transition:.15s ease}.analysis-raw-button:hover{background:#fff;transform:translateY(-1px);text-decoration:none} -/* Attendance currently renders Raw Data in the top action slot; visually place that same link in the shared sidebar. */ .analysis-top-actions>.analysis-raw-button{position:fixed;left:24px;top:174px;width:147px;min-height:42px;padding:11px 12px;border:0;border-radius:10px;background:transparent;box-shadow:none;color:#667085;font-size:13px;font-weight:500;z-index:20}.analysis-top-actions>.analysis-raw-button:hover{transform:none;background:rgba(79,70,229,.06);color:#2d246f}.analysis-top-actions>.analysis-raw-button span:first-child:before{content:"↓";display:inline-grid;place-items:center;width:18px;margin-right:9px;color:#667085;font-size:16px}.analysis-top-actions>.analysis-raw-button span:last-child{display:none} .subject-analysis-nav{margin-bottom:16px}.subject-analysis-nav__rail{display:flex;gap:4px;padding:5px 10px;border:1px solid rgba(203,213,225,.78);border-radius:14px;background:rgba(255,255,255,.5);box-shadow:0 8px 22px rgba(15,23,42,.035);overflow-x:auto}.subject-analysis-nav__item{display:flex;align-items:center;gap:9px;padding:10px 18px;border-radius:9px;color:#667085;font-size:13px;font-weight:600;text-decoration:none;white-space:nowrap;border-bottom:2px solid transparent}.subject-analysis-nav__item:hover{background:#fff;color:#2d246f}.subject-analysis-nav__item.is-active{color:#3d2ea0;background:rgba(79,70,229,.08);border-bottom-color:#5141bd} @@ -30,9 +29,13 @@ .analysis-panel{border:1px solid rgba(203,213,225,.72);border-radius:16px;background:linear-gradient(145deg,rgba(255,255,255,.9),rgba(248,249,251,.74));box-shadow:0 12px 34px rgba(15,23,42,.045)}.analysis-settings{padding:20px;margin-bottom:18px}.analysis-settings h3{font-size:14px;font-weight:700}.analysis-settings-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;align-items:end;margin-top:14px}.analysis-settings label{display:block;margin-bottom:7px;font-size:11px;font-weight:600;color:#667085}.analysis-settings input,.analysis-settings select{height:40px;background:rgba(255,255,255,.76)}.analysis-note{display:flex;align-items:center;gap:8px;margin-top:12px;padding:10px 12px;border:1px solid rgba(147,197,253,.28);border-radius:9px;background:rgba(239,246,255,.52);color:#52637a;font-size:11px} .analysis-content-grid{display:grid;grid-template-columns:minmax(520px,1.08fr) minmax(400px,.92fr);gap:16px}.analysis-table-panel{padding:18px}.analysis-panel-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:10px}.analysis-panel-head h3{font-size:14px;font-weight:700}.analysis-count{padding:4px 8px;border-radius:999px;background:#f1f3f7;color:#667085;font-size:10px}.analysis-table-wrap{max-height:500px;overflow:auto;scrollbar-gutter:stable}.analysis-table{width:100%;border-collapse:separate;border-spacing:0;font-size:12px}.analysis-table th{padding:10px 8px;text-align:left;color:#7b8798;font-size:10px;font-weight:700;border-bottom:1px solid #e9edf2}.analysis-table td{padding:10px 8px;border-bottom:1px solid #edf0f4;color:#566174}.analysis-table tr:hover td{background:rgba(79,70,229,.025)}.student-cell{display:flex;align-items:center;gap:9px;color:#172033!important;font-weight:500}.student-avatar{display:grid;place-items:center;width:26px;height:26px;border-radius:50%;background:#edf1ff;color:#4f46a8;font-size:9px;font-weight:700}.change-up{color:#15803d!important;font-weight:700}.change-down{color:#dc2626!important;font-weight:700}.trend-badge{display:inline-flex;padding:5px 8px;border-radius:999px;font-size:10px}.trend-up{background:#ecfdf3;color:#15803d}.trend-down{background:#fef2f2;color:#dc2626}.trend-stable{background:#f2f4f7;color:#667085}.analysis-right-stack{display:grid;gap:16px}.analysis-chart-panel{padding:18px}.analysis-chart-panel p{margin-top:4px;color:#98a2b3;font-size:10px}.analysis-chart{height:220px;margin-top:10px}.analysis-chart .recharts-cartesian-grid line{stroke:#e3e7ed}.analysis-chart .recharts-text{fill:#667085}.analysis-insight{display:flex;align-items:center;gap:14px;padding:16px 18px;margin-top:16px}.analysis-insight-copy h4{font-size:13px;font-weight:700}.analysis-insight-copy p{margin-top:4px;font-size:11px;color:#667085}.analysis-insight-actions{display:flex;gap:10px;margin-left:auto}.analysis-secondary{display:inline-flex;align-items:center;gap:8px;border:1px solid #dfe5ec;background:rgba(255,255,255,.8);color:#344054;border-radius:9px;padding:9px 14px;font-size:12px;font-weight:600} -/* Academic dashboard */ .academic-content-grid{align-items:start}.academic-table-wrap{height:620px;max-height:620px}.academic-stats-panel{padding:16px;display:grid;grid-template-columns:1fr 1.4fr;gap:14px}.academic-highest{padding:12px 14px;border:1px solid #edf0f4;border-radius:12px;background:rgba(255,255,255,.58);display:flex;flex-direction:column;gap:5px}.academic-highest span,.academic-tier-card span{font-size:11px;color:#667085}.academic-highest strong{font-size:26px;line-height:1;color:#172033}.academic-highest p{margin:0;color:#475467;font-size:12px;line-height:1.35}.academic-tier-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px}.academic-tier-card{min-height:70px;padding:10px 12px;border:1px solid;border-radius:12px;background:rgba(255,255,255,.52);display:flex;flex-direction:column;justify-content:space-between}.academic-tier-card strong{font-size:21px;line-height:1}.academic-rank-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px}.academic-rank-panel{padding:16px;min-width:0}.academic-rank-panel h3{font-size:14px;font-weight:700;margin-bottom:10px}.academic-rank-row{display:grid;grid-template-columns:24px minmax(0,1fr) 32px;align-items:center;gap:8px;padding:8px 0;border-bottom:1px solid #edf0f4}.academic-rank-row:last-child{border-bottom:0}.academic-rank-row>span{font-size:11px;color:#98a2b3}.academic-rank-row p{margin:0;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px;color:#475467}.academic-rank-row strong{justify-self:end;font-size:13px;color:#172033}.academic-rank-row strong.is-negative{color:#dc2626}.academic-table-panel .analysis-table td:first-child{min-width:210px}.academic-table-panel .analysis-table th:not(:first-child),.academic-table-panel .analysis-table td:not(:first-child){text-align:center}.academic-table-panel .student-cell{white-space:nowrap}.academic-content-grid .analysis-chart{height:190px} .recharts-tooltip-wrapper .recharts-default-tooltip{border-radius:12px!important;border:1px solid #e2e8f0!important;box-shadow:0 12px 28px rgba(15,23,42,.1)!important;background:rgba(255,255,255,.97)!important}.analysis-stat-card,.analysis-ranked-list,.analysis-grade-badge{border-color:#e2e8f0} -@media(max-width:1100px){.analysis-hero{grid-template-columns:1fr 1fr}.analysis-hero-copy{grid-column:1/-1}.analysis-content-grid{grid-template-columns:1fr}.analysis-settings-grid{grid-template-columns:1fr 1fr}.analysis-sidebar{position:fixed;transform:translateX(-100%)}.analysis-layout{grid-template-columns:1fr}.analysis-page{padding:18px}.academic-table-wrap{height:500px;max-height:500px}.analysis-top-actions>.analysis-raw-button{position:static;width:auto;min-height:0;border:1px solid #dfe5ec;background:rgba(255,255,255,.8);box-shadow:0 4px 14px rgba(15,23,42,.04)}.analysis-top-actions>.analysis-raw-button span:first-child:before{display:none}} -@media(max-width:700px){.analysis-topbar{align-items:flex-start;flex-direction:column}.analysis-title-row h1{font-size:21px}.analysis-top-actions{width:100%}.analysis-settings-grid{grid-template-columns:1fr}.analysis-hero{grid-template-columns:1fr}.analysis-content-grid{grid-template-columns:1fr}.analysis-page{padding:14px}.analysis-insight{align-items:flex-start;flex-direction:column}.analysis-insight-actions{margin-left:0;flex-wrap:wrap}.subject-analysis-nav__item{padding:9px 12px}.analysis-chart{height:200px}.academic-stats-panel,.academic-rank-grid{grid-template-columns:1fr}.academic-tier-grid{grid-template-columns:1fr 1fr}.academic-table-wrap{height:440px;max-height:440px}} + +/* Overall > At Risk */ +.at-risk-layout{display:grid;grid-template-columns:minmax(0,1fr) 330px;grid-template-areas:"filter filter" "table side";gap:12px;align-items:start}.at-risk-filter{grid-area:filter}.at-risk-table{grid-area:table;min-width:0}.at-risk-side-stack{grid-area:side;display:grid;gap:12px;min-width:0}.at-risk-side-stack>section:first-child{min-height:250px}.at-risk-filter-inner{padding:12px}.at-risk-filter-title{min-width:0;padding:0 2px}.at-risk-filter-title h3{font-size:14px;font-weight:700;color:#172033}.at-risk-filter-title p{margin-top:3px;font-size:10px;color:#667085}.at-risk-filter-controls{display:grid;grid-template-columns:repeat(4,minmax(0,1fr)) auto;gap:10px;align-items:end;margin-top:10px}.at-risk-filter label{display:block;min-width:0}.at-risk-filter label>span{display:block;margin:0 0 5px 2px;font-size:10px;font-weight:600;color:#667085}.at-risk-filter select,.at-risk-filter input{height:38px}.at-risk-apply{height:38px;padding:0 18px;border:0;border-radius:9px;background:linear-gradient(135deg,#251b62,#4637a3);color:#fff;font-size:12px;font-weight:600;box-shadow:0 7px 16px rgba(49,39,120,.14);white-space:nowrap}.at-risk-apply:hover{filter:brightness(1.03)}.at-risk-table table th,.at-risk-table table td{white-space:nowrap}.at-risk-table tbody tr:hover{background:rgba(79,70,229,.025)}.at-risk-side-stack>section{min-width:0}.at-risk-side-stack .recharts-pie-sector{cursor:pointer}.at-risk-side-stack .recharts-text{font-size:9px}.at-risk-side-stack>section:first-child{min-height:280px}.at-risk-table .bg-emerald-50.text-emerald-700,.at-risk-side-stack .bg-emerald-50.text-emerald-700{background:#eff6ff!important;color:#2563eb!important} + +@media(max-width:1100px){.analysis-hero{grid-template-columns:1fr 1fr}.analysis-hero-copy{grid-column:1/-1}.analysis-content-grid{grid-template-columns:1fr}.analysis-settings-grid{grid-template-columns:1fr 1fr}.analysis-sidebar{position:fixed;transform:translateX(-100%)}.analysis-layout{grid-template-columns:1fr}.analysis-page{padding:18px}.academic-table-wrap{height:500px;max-height:500px}.analysis-top-actions>.analysis-raw-button{position:static;width:auto;min-height:0;border:1px solid #dfe5ec;background:rgba(255,255,255,.8);box-shadow:0 4px 14px rgba(15,23,42,.04)}.analysis-top-actions>.analysis-raw-button span:first-child:before{display:none}.at-risk-layout{grid-template-columns:minmax(0,1fr) 280px}.at-risk-filter-controls{grid-template-columns:repeat(4,minmax(0,1fr)) auto;gap:8px}.at-risk-filter-title p{white-space:nowrap}} +@media(max-width:800px){.at-risk-layout{grid-template-columns:1fr;grid-template-areas:"filter" "table" "side"}.at-risk-filter-controls{grid-template-columns:1fr 1fr}.at-risk-apply{width:100%}.at-risk-side-stack{grid-template-columns:1fr 1fr}.at-risk-side-stack>section:first-child{min-height:0}} +@media(max-width:700px){.analysis-topbar{align-items:flex-start;flex-direction:column}.analysis-title-row h1{font-size:21px}.analysis-top-actions{width:100%}.analysis-settings-grid{grid-template-columns:1fr}.analysis-hero{grid-template-columns:1fr}.analysis-content-grid{grid-template-columns:1fr}.analysis-page{padding:14px}.analysis-insight{align-items:flex-start;flex-direction:column}.analysis-insight-actions{margin-left:0;flex-wrap:wrap}.subject-analysis-nav__item{padding:9px 12px}.analysis-chart{height:200px}.academic-stats-panel,.academic-rank-grid{grid-template-columns:1fr}.academic-tier-grid{grid-template-columns:1fr 1fr}.academic-table-wrap{height:440px;max-height:440px}.at-risk-filter-controls{grid-template-columns:1fr}.at-risk-filter-title{grid-column:auto}.at-risk-side-stack{grid-template-columns:1fr}.at-risk-filter-title p{white-space:normal}} diff --git a/components/AnalysisNav.tsx b/components/AnalysisNav.tsx index e345a09..dc2679d 100644 --- a/components/AnalysisNav.tsx +++ b/components/AnalysisNav.tsx @@ -1,51 +1,33 @@ import Link from "next/link"; import { useRouter } from "next/router"; +import { BarChart3, FileText, GraduationCap, LayoutDashboard } from "lucide-react"; -type Props = { - sectionId: string; -}; +type Props = { sectionId: string }; + +const items = [ + { label: "Attendance", icon: BarChart3, path: "attendance" }, + { label: "Academic", icon: GraduationCap, path: "academic" }, + { label: "Overall", icon: LayoutDashboard, path: "overall" }, + { label: "Student Report", icon: FileText, path: "students" }, +]; export default function AnalysisNav({ sectionId }: Props) { const router = useRouter(); - const items = [ - { - label: "Attendance", - href: `/section-analysis/${sectionId}/attendance`, - }, - { - label: "Academic", - href: `/section-analysis/${sectionId}/academic`, - }, - { - label: "Overall", - href: `/section-analysis/${sectionId}/overall`, - }, - { - label: "Student Report", - href: `/section-analysis/${sectionId}/students`, - }, - ]; - return ( -