import React, { type CSSProperties } from 'react'; import { Card, Col, Row } from 'antd'; import { useIntersectionObserver } from 'usehooks-ts'; import ReactECharts from '../../components/ECharts'; import type { ClassroomOccupancy, GanttRoom } from './Dashboard.types'; import { buildClassroomHeatmapOption, buildGanttOption } from './DashboardCharts'; const useInViewport = (rootMargin = '200px') => { const { ref, isIntersecting } = useIntersectionObserver({ rootMargin, freezeOnceVisible: true, }); return { ref, inView: isIntersecting }; }; const LazySection: React.FC<{ title: string; vp: { ref: (node?: Element | null) => void; inView: boolean }; minHeight: number; style?: CSSProperties; children: React.ReactNode; }> = ({ title, vp, minHeight, style, children }) => { return (