From 54a3b3b8be5ad2530ac13278728a2bcceec7a05a Mon Sep 17 00:00:00 2001 From: Nils Pukropp Date: Tue, 17 Feb 2026 04:47:29 +0100 Subject: [PATCH] added frosted design --- frontend/src/pages/CommunityFeed.tsx | 11 ++++- frontend/src/pages/MainPage.tsx | 40 +++++++++++---- frontend/src/pages/flavors/FlavorDetail.tsx | 55 ++++++++++++++++----- frontend/src/theme.ts | 23 +++++++-- 4 files changed, 102 insertions(+), 27 deletions(-) diff --git a/frontend/src/pages/CommunityFeed.tsx b/frontend/src/pages/CommunityFeed.tsx index 0be2472..4536971 100644 --- a/frontend/src/pages/CommunityFeed.tsx +++ b/frontend/src/pages/CommunityFeed.tsx @@ -18,7 +18,8 @@ import { ListItemButton, Pagination, TextField, - InputAdornment + InputAdornment, + alpha } from '@mui/material'; import SearchIcon from '@mui/icons-material/Search'; import { Link } from 'react-router-dom'; @@ -216,7 +217,13 @@ const CommunityFeed: React.FC = () => { - + alpha(theme.palette.background.paper, 0.4), + backdropFilter: 'blur(8px)', + borderBottom: '1px solid', + borderColor: 'divider' + }}> Following ({following.length}) { py: { xs: 4, md: 8 }, px: { xs: 2, sm: 4, md: 6 }, background: (theme) => theme.palette.mode === 'dark' - ? 'linear-gradient(180deg, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0) 100%)' - : 'linear-gradient(180deg, rgba(0,0,0,0.05) 0%, rgba(0,0,0,0) 100%)', + ? `linear-gradient(180deg, ${alpha('#000', 0.4)} 0%, ${alpha('#000', 0)} 100%)` + : `linear-gradient(180deg, ${alpha(theme.palette.primary.main, 0.05)} 0%, ${alpha(theme.palette.primary.main, 0)} 100%)`, borderBottom: '1px solid', borderColor: 'divider', mb: 4 @@ -251,7 +252,18 @@ const MainPage: React.FC = () => { ) : ( {feedRatings.map(rating => ( - + alpha(theme.palette.background.paper, 0.4), + backdropFilter: 'blur(10px)', + border: '1px solid', + borderColor: (theme) => alpha(theme.palette.text.primary, 0.05) + }} + > @@ -306,13 +318,15 @@ const MainPage: React.FC = () => { mb: 4, borderRadius: 0, background: (theme) => theme.palette.mode === 'dark' - ? 'linear-gradient(135deg, #1a1a2e 0%, #16213e 100%)' - : 'linear-gradient(135deg, #fdf6f7 0%, #f8e1e5 100%)', + ? `radial-gradient(circle at top right, ${alpha(theme.palette.primary.main, 0.15)}, transparent), linear-gradient(135deg, #0f0f0f 0%, #1a1a1a 100%)` + : `radial-gradient(circle at top right, ${alpha(theme.palette.primary.main, 0.1)}, transparent), linear-gradient(135deg, #fdf6f7 0%, #f8e1e5 100%)`, textAlign: 'center', - borderBottom: '1px solid rgba(255,255,255,0.1)', + borderBottom: '1px solid', + borderColor: 'divider', width: '100%', boxSizing: 'border-box', - overflow: 'hidden' + overflow: 'hidden', + position: 'relative' }} > @@ -395,7 +409,15 @@ const MainPage: React.FC = () => { {featuredReview && ( - + alpha(theme.palette.background.paper, 0.4), + backdropFilter: 'blur(8px)', + borderRadius: 3, + border: '1px solid', + borderColor: (theme) => alpha(theme.palette.text.primary, 0.05), + position: 'relative' + }}> "{featuredReview.comment}" diff --git a/frontend/src/pages/flavors/FlavorDetail.tsx b/frontend/src/pages/flavors/FlavorDetail.tsx index dca26f5..eff4848 100644 --- a/frontend/src/pages/flavors/FlavorDetail.tsx +++ b/frontend/src/pages/flavors/FlavorDetail.tsx @@ -15,7 +15,8 @@ import { Container, Grid, Chip, - Stack + Stack, + alpha } from '@mui/material'; import api from '../../api'; import { useTitle } from '../../hooks/useTitle'; @@ -189,19 +190,21 @@ const FlavorDetail: React.FC = () => { display: 'flex', alignItems: 'center', justifyContent: 'center', - bgcolor: 'background.paper', + bgcolor: (theme) => alpha(theme.palette.background.paper, 0.4), + backdropFilter: 'blur(10px)', borderRadius: 4, overflow: 'hidden', border: '1px solid', - borderColor: 'divider', - position: 'relative' + borderColor: (theme) => alpha(theme.palette.text.primary, 0.05), + position: 'relative', + boxShadow: '0 20px 40px rgba(0,0,0,0.1)' }} > {!flavor.is_available && ( alpha(theme.palette[flavor.is_legacy ? 'warning' : 'error'].main, 0.8) }} /> )} {flavor.image_url ? ( @@ -209,10 +212,10 @@ const FlavorDetail: React.FC = () => { component="img" src={flavor.image_url} sx={{ - width: '80%', - height: '80%', + width: '85%', + height: '85%', objectFit: 'contain', - filter: 'drop-shadow(0px 10px 20px rgba(0,0,0,0.15))' + filter: 'drop-shadow(0px 15px 30px rgba(0,0,0,0.2))' }} /> ) : ( @@ -276,7 +279,18 @@ const FlavorDetail: React.FC = () => { {/* New Rating Form */} {currentUser && flavor.user_rating === null && ( - + alpha(theme.palette.background.paper, 0.3), + backdropFilter: 'blur(8px)', + border: '1px dashed', + borderColor: 'divider', + boxShadow: 'none' + }} + > Rate this flavor
@@ -343,9 +357,18 @@ const FlavorDetail: React.FC = () => { - + alpha(theme.palette.primary.main, 0.1), + backdropFilter: 'blur(4px)', + px: 1.5, py: 0.5, + borderRadius: 2, + border: '1px solid', + borderColor: (theme) => alpha(theme.palette.primary.main, 0.1) + }}> - {rating.score}/10 + {rating.score}/10 @@ -370,7 +393,15 @@ const FlavorDetail: React.FC = () => { {/* Replies */} {rating.replies.length > 0 && ( - + alpha(theme.palette.text.primary, 0.03), + backdropFilter: 'blur(4px)', + p: 2, + borderRadius: 2, + border: '1px solid', + borderColor: (theme) => alpha(theme.palette.text.primary, 0.05) + }}> {rating.replies.map((reply: any) => ( diff --git a/frontend/src/theme.ts b/frontend/src/theme.ts index ee134e6..4f7aec1 100644 --- a/frontend/src/theme.ts +++ b/frontend/src/theme.ts @@ -1,4 +1,4 @@ -import { createTheme, type ThemeOptions } from '@mui/material/styles'; +import { createTheme, type ThemeOptions, alpha } from '@mui/material/styles'; import { flavors } from '@catppuccin/palette'; export type CatppuccinTheme = @@ -173,18 +173,33 @@ export const getTheme = (mode: CatppuccinTheme) => { fontFamily: '"Roboto", "Helvetica", "Arial", sans-serif', }, components: { + MuiPaper: { + styleOverrides: { + root: { + backgroundColor: alpha(palette.surface0.hex, 0.7), + backdropFilter: 'blur(12px)', + border: '1px solid', + borderColor: alpha(palette.text.hex, 0.1), + boxShadow: '0 4px 30px rgba(0, 0, 0, 0.1)', + } + } + }, MuiCard: { styleOverrides: { root: { - backgroundColor: palette.surface0.hex, - color: palette.text.hex, + backgroundColor: alpha(palette.surface0.hex, 0.6), + backdropFilter: 'blur(10px)', + border: '1px solid', + borderColor: alpha(palette.text.hex, 0.1), + borderRadius: '16px', } } }, MuiAppBar: { styleOverrides: { root: { - backgroundColor: palette.crust.hex, + backgroundColor: alpha(palette.crust.hex, 0.8), + backdropFilter: 'blur(16px)', color: palette.text.hex, } }