-
Notifications
You must be signed in to change notification settings - Fork 27
feat(footer, home, navbar): enhance UI components with improved layouts and styling for better user experience #28
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -50,12 +50,25 @@ function Footer() { | |
| <Typography variant="body2" color="text.secondary"> | ||
| Manage budgets, track expenses, and monitor transactions with clean UX and enterprise-ready data flows. | ||
| </Typography> | ||
| <Stack direction="row" spacing={1} flexWrap="wrap"> | ||
| <Chip label="MongoDB" size="small" /> | ||
| <Chip label="PostgreSQL" size="small" /> | ||
| <Chip label="Redis" size="small" /> | ||
| <Chip label="Elasticsearch" size="small" /> | ||
| </Stack> | ||
| <Box | ||
| sx={{ | ||
| display: 'flex', | ||
| flexWrap: 'wrap', | ||
| gap: 1, | ||
| }} | ||
| > | ||
| {['MongoDB', 'PostgreSQL', 'Redis', 'Elasticsearch'].map(label => ( | ||
| <Chip | ||
| key={label} | ||
| label={label} | ||
| size="small" | ||
| sx={{ | ||
| borderRadius: 999, | ||
| height: 26, | ||
| }} | ||
| /> | ||
| ))} | ||
| </Box> | ||
| </Stack> | ||
| </Grid> | ||
| <Grid item xs={12} md={5}> | ||
|
|
@@ -80,16 +93,16 @@ function Footer() { | |
| </Grid> | ||
| <Grid item xs={12} md={3}> | ||
| <FooterGroup title="Connect"> | ||
| <MuiLink href="https://github.com/yourgithub" target="_blank" rel="noopener" sx={linkStyle}> | ||
| <MuiLink href="https://github.com/hoangsonww" target="_blank" rel="noopener" sx={linkStyle}> | ||
| <GitHubIcon fontSize="small" /> GitHub | ||
| </MuiLink> | ||
| <MuiLink href="https://yourwebsite.com" target="_blank" rel="noopener" sx={linkStyle}> | ||
| <MuiLink href="https://sonnguyenhoang.com" target="_blank" rel="noopener" sx={linkStyle}> | ||
| <LanguageIcon fontSize="small" /> Website | ||
| </MuiLink> | ||
| <MuiLink href="https://linkedin.com/in/yourlinkedin" target="_blank" rel="noopener" sx={linkStyle}> | ||
| <MuiLink href="https://www.linkedin.com/in/hoangsonw/" target="_blank" rel="noopener" sx={linkStyle}> | ||
| <LinkedInIcon fontSize="small" /> LinkedIn | ||
|
Comment on lines
+96
to
103
|
||
| </MuiLink> | ||
| <MuiLink href="mailto:youremail@example.com" sx={linkStyle}> | ||
| <MuiLink href="mailto:hoangson091104@gmail.com" sx={linkStyle}> | ||
| <EmailIcon fontSize="small" /> Email | ||
| </MuiLink> | ||
|
Comment on lines
+96
to
107
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. To improve maintainability, consider defining this list of links as an array of objects and then mapping over it to render the For example: // Define this array outside your component or in a config file
const connectLinks = [
{ href: 'https://github.com/hoangsonww', Icon: GitHubIcon, label: 'GitHub', target: '_blank', rel: 'noopener' },
{ href: 'https://sonnguyenhoang.com', Icon: LanguageIcon, label: 'Website', target: '_blank', rel: 'noopener' },
{ href: 'https://www.linkedin.com/in/hoangsonw/', Icon: LinkedInIcon, label: 'LinkedIn', target: '_blank', rel: 'noopener' },
{ href: 'mailto:hoangson091104@gmail.com', Icon: EmailIcon, label: 'Email' },
];
// Then in your component, you can replace the hardcoded links with:
connectLinks.map(({ href, Icon, label, target, rel }) => (
<MuiLink key={label} href={href} target={target} rel={rel} sx={linkStyle}>
<Icon fontSize="small" /> {label}
</MuiLink>
)) |
||
| </FooterGroup> | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -101,7 +101,14 @@ function Navbar({ mode, setMode }) { | |
| <> | ||
| <AppBar position="sticky" elevation={0}> | ||
| <Toolbar sx={{ py: 1, gap: 2 }}> | ||
| <IconButton sx={{ display: isMobileNav ? 'block' : 'none' }} color="inherit" onClick={() => setDrawerOpen(true)}> | ||
| <IconButton | ||
| sx={{ | ||
| display: isMobileNav ? 'block' : 'none', | ||
| '&:hover': { backgroundColor: 'transparent' }, | ||
| }} | ||
| color="inherit" | ||
| onClick={() => setDrawerOpen(true)} | ||
| > | ||
|
Comment on lines
+104
to
+111
|
||
| <MenuIcon /> | ||
| </IconButton> | ||
| <Stack direction="row" spacing={1.5} alignItems="center" sx={{ flexGrow: 1 }}> | ||
|
|
||
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -153,97 +153,110 @@ function Home() { | |||||
| <Box | ||||||
| sx={{ | ||||||
| pt: { xs: 6, md: 8 }, | ||||||
| pb: { xs: 6, md: 10 }, | ||||||
| pb: { xs: 10, md: 10 }, | ||||||
| minHeight: { xs: 'calc(100vh - 64px)', md: 'calc(100vh - 72px)' }, | ||||||
| display: 'flex', | ||||||
| flexDirection: 'column', | ||||||
| alignItems: 'center', | ||||||
| justifyContent: 'center', | ||||||
| background: 'linear-gradient(135deg, rgba(31, 122, 99, 0.08), rgba(242, 179, 90, 0.18))', | ||||||
| position: 'relative', | ||||||
| }} | ||||||
| > | ||||||
| <Container> | ||||||
| <Grid container spacing={4} alignItems="center"> | ||||||
| <Grid item xs={12} md={6}> | ||||||
| <Reveal immediate> | ||||||
| <Stack spacing={3}> | ||||||
| <Chip label="Budget Management System" sx={{ alignSelf: 'flex-start', fontWeight: 600 }} /> | ||||||
| <Typography variant="h2">Operate budgets with clarity, scale, and precision.</Typography> | ||||||
| <Typography variant="body1" color="text.secondary" sx={{ fontSize: '1.05rem' }}> | ||||||
| A production-ready finance platform that connects budgets, expenses, transactions, and task automation. Monitor everything from a single | ||||||
| dashboard with searchable history and real-time operational insight. | ||||||
| </Typography> | ||||||
| <Stack direction={{ xs: 'column', sm: 'row' }} spacing={2}> | ||||||
| <Button variant="contained" size="large" component={Link} to="/dashboard" startIcon={<RocketLaunchIcon />}> | ||||||
| Launch Dashboard | ||||||
| </Button> | ||||||
| <Button variant="outlined" size="large" component={Link} to="/budgets"> | ||||||
| Explore Budgets | ||||||
| </Button> | ||||||
| </Stack> | ||||||
| <Stack direction="row" spacing={2} flexWrap="wrap"> | ||||||
| <Chip label="JWT auth" size="small" /> | ||||||
| <Chip label="PostgreSQL ledger" size="small" /> | ||||||
| <Chip label="Elasticsearch search" size="small" /> | ||||||
| <Chip label="Kafka + RabbitMQ" size="small" /> | ||||||
| <Box sx={{ width: '100%', flex: 1, display: 'flex', alignItems: 'center' }}> | ||||||
| <Container> | ||||||
| <Grid container spacing={4} alignItems="center"> | ||||||
| <Grid item xs={12} md={6}> | ||||||
| <Reveal immediate> | ||||||
| <Stack spacing={3}> | ||||||
| <Chip label="Budget Management System" sx={{ alignSelf: 'flex-start', fontWeight: 600 }} /> | ||||||
| <Typography variant="h2">Operate budgets with clarity, scale, and precision.</Typography> | ||||||
|
||||||
| <Typography variant="h2">Operate budgets with clarity, scale, and precision.</Typography> | |
| <Typography variant="h2">Welcome to your budget app</Typography> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For consistency with other parts of the app (like in Footer.js) and for better maintainability, it's better to generate these Chip components by mapping over an array of labels instead of hardcoding them.
<Box
sx={{
display: 'flex',
flexWrap: 'wrap',
gap: 1,
alignItems: 'center',
}}
>
{['JWT auth', 'PostgreSQL ledger', 'Elasticsearch search', 'Kafka + RabbitMQ'].map(label => (
<Chip key={label} label={label} size="small" />
))}
</Box>There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
To improve consistency and maintainability, consider generating these Chip components by mapping over an array of labels. Since this list of technologies is used elsewhere, defining it as a shared constant could also help reduce code duplication.
<Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 1 }}>
{['MongoDB', 'PostgreSQL', 'Redis', 'Elasticsearch', 'Kafka', 'RabbitMQ'].map(label => (
<Chip key={label} label={label} />
))}
</Box>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The
borderRadius: 999style is redundant here, as it's already applied globally to allChipcomponents via the theme intheme.js(line 197). For better maintainability, you could also extract the array of technology labels into a constant defined outside the component.