# Dashboard State Lift + Theme System Refactor ## Summary Refactored dashboard state ownership, centralized theme semantics, and simplified component styling across the application. ## Changes ### Dashboard State Refactor * Moved dashboard state management from `Dashboard.view` into `Dashboard.tsx` * Added centralized `DashboardState` initialization in parent container * Introduced memoized dashboard state setter callbacks: * `toggleFlow` * `setFlow` * `togglePeriodType` * `toggleComparison` * `setSelectedPeriodId` * `setSelectedGroupKey` * Added `DashboardStateSetters` memoized object for prop-driven state management * Removed `onFlowChange` callback pattern * Converted dashboard component into stateless view layer * Renamed component export flow: * `Dashboard.tsx` → removed * `Dashboard.view.tsx` → primary implementation ### Dashboard Models Cleanup * Removed legacy palette configuration interfaces: * `ColorDefinition` * `ThemeAwarePalette` * Removed config-level style palette support from `DashboardConfig` * Renamed `DashboardProps` → `DashboardViewProps` * Added reusable `ColorScheme` interface * Simplified component color contract: * `primary` * `surface` * `text` ### Theme Architecture Refactor * Moved `AppTheme.tsx` into `shared-theme` * Added centralized semantic theme system * Introduced `themeConfig.ts` with semantic tokens: * surface * border * text * Added `semantic` extension to MUI theme typing * Added `flows` palette extension: * outflows * inflows * Centralized flow colors inside theme primitives * Added CSS semantic variables: * `--bg-page` * `--bg-card` * `--bg-elevated` * `--border-default` * `--border-subtle` * `--text-primary` * `--text-secondary` * `--text-muted` ### Theme Mode Improvements * Added explicit `ColorMode` type * Expanded `ColorModeContext`: * `mode` * `setMode` * `toggleColorMode` * Added `CssBaseline` * Added configurable `defaultMode` * Simplified dark theme palette handling * Standardized dark surfaces and shadows * Reduced excessive dark-mode glow/shadow intensity ### Dashboard UI Styling Improvements * Replaced hardcoded dashboard palette config with theme palette usage * Updated dashboard background gradients to use alpha-based semantic colors * Replaced `colorScheme.light` usage with `colorScheme.surface` * Standardized border usage with theme divider tokens * Removed manual dark-mode conditional styling where redundant * Simplified card and progress styling logic ### Shared Theme Customization Cleanup Updated customization layers for improved consistency: * `inputs` * `navigation` * `feedback` * `surfaces` Key improvements: * Reduced dark-mode contrast harshness * Unified divider usage * Replaced hardcoded grayscale backgrounds with semantic surfaces * Simplified hover and active state styling * Reduced shadow intensity across components * Improved dark-mode readability and layering ### Home Page Styling Cleanup * Replaced manual RGBA handling with `alpha()` utility * Improved dark-mode glassmorphism consistency * Updated CTA hover shadow to use theme primary color ### Miscellaneous Cleanup * Updated imports to new theme structure * Removed unused legacy color mode components: * `ColorModeIconDropdown.tsx` * `ColorModeSelect.tsx` * Removed dashboard config style palette definitions * Simplified flow-based color derivation logic ## Result * Cleaner separation of stateful vs presentational dashboard logic * Centralized semantic theming system * Consistent dark/light mode behavior * Reduced styling duplication * Improved maintainability and extensibility of theme architecture * Simplified dashboard component contracts * Better UI consistency across surfaces and controls Reviewed-on: #6 Co-authored-by: Vishesh 'ironeagle' Bangotra <aetoskia@gmail.com> Co-committed-by: Vishesh 'ironeagle' Bangotra <aetoskia@gmail.com>
94 lines
2.5 KiB
TypeScript
94 lines
2.5 KiB
TypeScript
import * as React from "react";
|
|
import {
|
|
List,
|
|
ListItem,
|
|
ListItemAvatar,
|
|
ListItemText,
|
|
Avatar,
|
|
Typography,
|
|
Box,
|
|
IconButton,
|
|
} from "@mui/material";
|
|
import { alpha } from "@mui/material/styles";
|
|
import ExpandMoreIcon from "@mui/icons-material/ExpandMore";
|
|
import { LatestItemsViewProps } from "./LatestItems.props";
|
|
|
|
export default function LatestItemsView({
|
|
items,
|
|
title,
|
|
canExpand,
|
|
onExpand,
|
|
isFetching,
|
|
colorScheme,
|
|
}: LatestItemsViewProps) {
|
|
const accentColor = colorScheme?.primary || "";
|
|
|
|
return (
|
|
<Box sx={{ width: "100%", bgcolor: "background.paper", borderRadius: 4, p: 2, opacity: isFetching ? 0.6 : 1, transition: "opacity 0.3s ease", pointerEvents: isFetching ? "none" : "auto" }}>
|
|
<Box sx={{ mb: 2, px: 2 }}>
|
|
<Typography variant="h6" fontWeight="bold">
|
|
{title}
|
|
</Typography>
|
|
</Box>
|
|
|
|
<List disablePadding>
|
|
{items.map((item, index) => (
|
|
<ListItem
|
|
key={item.id}
|
|
sx={{
|
|
px: { xs: 1, sm: 2 },
|
|
py: 2,
|
|
mb: index !== items.length - 1 ? 1 : 0,
|
|
borderRadius: 3,
|
|
"&:hover": { bgcolor: "action.hover" },
|
|
}}
|
|
>
|
|
<ListItemAvatar>
|
|
<Avatar
|
|
variant="rounded"
|
|
sx={{
|
|
bgcolor: alpha(accentColor, 0.13),
|
|
width: 48,
|
|
height: 48,
|
|
borderRadius: 3,
|
|
mr: 2,
|
|
}}
|
|
/>
|
|
</ListItemAvatar>
|
|
|
|
<ListItemText
|
|
primary={
|
|
<Typography variant="subtitle1" fontWeight={600}>
|
|
{item.title}
|
|
</Typography>
|
|
}
|
|
secondary={
|
|
<Typography variant="body2" color="text.secondary">
|
|
{item.subtitle}
|
|
</Typography>
|
|
}
|
|
/>
|
|
|
|
<Box sx={{ textAlign: "right" }}>
|
|
<Typography variant="subtitle1" fontWeight={700}>
|
|
{item.amount}
|
|
</Typography>
|
|
<Typography variant="caption" color="text.secondary">
|
|
{item.timeAgo}
|
|
</Typography>
|
|
</Box>
|
|
</ListItem>
|
|
))}
|
|
|
|
{canExpand && (
|
|
<Box sx={{ display: "flex", justifyContent: "center", mt: 2 }}>
|
|
<IconButton size="small" onClick={onExpand}>
|
|
<ExpandMoreIcon />
|
|
</IconButton>
|
|
</Box>
|
|
)}
|
|
</List>
|
|
</Box>
|
|
);
|
|
}
|