From 6a5438ed00f75e9d6964b9008357266f24f9c353 Mon Sep 17 00:00:00 2001 From: apatil Date: Mon, 5 May 2025 17:38:52 +0100 Subject: [PATCH] Attempt 2 to install MUI --- package-lock.json | 36 ++++++++++ package.json | 1 + src/app/layout.tsx | 45 +++++------- .../Header/{index.tsx => Header.tsx} | 6 +- src/components/Header/index.ts | 1 + src/components/ModeSwitch/ModeSwitch.tsx | 40 +++++++++++ src/components/ModeSwitch/index.ts | 1 + src/theme/index.ts | 1 + src/theme/theme.ts | 69 +++++++++---------- 9 files changed, 129 insertions(+), 71 deletions(-) rename src/components/Header/{index.tsx => Header.tsx} (90%) create mode 100644 src/components/Header/index.ts create mode 100644 src/components/ModeSwitch/ModeSwitch.tsx create mode 100644 src/components/ModeSwitch/index.ts create mode 100644 src/theme/index.ts diff --git a/package-lock.json b/package-lock.json index 05aaea8..25968cd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@fontsource/roboto": "^5.2.5", "@mui/icons-material": "^7.0.2", "@mui/material": "^7.0.2", + "@mui/material-nextjs": "^7.0.2", "next": "15.3.1", "react": "^19.0.0", "react-dom": "^19.0.0" @@ -1094,6 +1095,41 @@ } } }, + "node_modules/@mui/material-nextjs": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@mui/material-nextjs/-/material-nextjs-7.0.2.tgz", + "integrity": "sha512-hjm0MFSjx7HWbORMRldbwfKrQPHTSMXD6dkCCSTQZ2XX8fkKlnOXNnoXUFzlzFtMKMzs9QOfe3dHooTvnDEfuQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.27.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/cache": "^11.11.0", + "@emotion/react": "^11.11.4", + "@emotion/server": "^11.11.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "next": "^13.0.0 || ^14.0.0 || ^15.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/cache": { + "optional": true + }, + "@emotion/server": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, "node_modules/@mui/private-theming": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.0.2.tgz", diff --git a/package.json b/package.json index c975638..360e9c2 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "@fontsource/roboto": "^5.2.5", "@mui/icons-material": "^7.0.2", "@mui/material": "^7.0.2", + "@mui/material-nextjs": "^7.0.2", "next": "15.3.1", "react": "^19.0.0", "react-dom": "^19.0.0" diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 32b847c..2e5183c 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,12 +1,13 @@ -'use client' -/* eslint-disable @next/next/no-page-custom-font */ import type { Metadata } from "next"; import "./globals.css"; -import Header from "@/components/Header"; -import { light, dark } from "@/theme/theme"; +import theme from "@/theme/theme"; import { ThemeProvider } from "@mui/material/styles"; import { CssBaseline } from "@mui/material"; -import { useState } from "react"; +import InitColorSchemeScript from "@mui/material/InitColorSchemeScript"; +import { AppRouterCacheProvider } from "@mui/material-nextjs/v13-appRouter"; +import ModeSwitch from "@/components/ModeSwitch/ModeSwitch"; +import Header from "@/components/Header/Header"; + export const metadata: Metadata = { title: "The Coding Grizzly", @@ -18,33 +19,21 @@ export default function RootLayout({ }: Readonly<{ children: React.ReactNode; }>) { - const [isDarkMode, setIsDarkMode] = useState(false); - const toggleTheme = () => { - setIsDarkMode((prevMode) => !prevMode); - }; return ( - - - - - - - + - - -
- {children} - + + + + + +
+ {children} + + - + ); } diff --git a/src/components/Header/index.tsx b/src/components/Header/Header.tsx similarity index 90% rename from src/components/Header/index.tsx rename to src/components/Header/Header.tsx index 2d4ab21..aab7b13 100644 --- a/src/components/Header/index.tsx +++ b/src/components/Header/Header.tsx @@ -6,7 +6,6 @@ import MenuIcon from '@mui/icons-material/Menu' import { AppBar, Box, - Button, Drawer, IconButton, List, @@ -22,7 +21,7 @@ const navItems = [ { label: 'Info', href: '/info' }, { label: 'Music', href: '/music' } ] -export default function Header({ toggleTheme }: { toggleTheme: () => void }) { +export default function Header() { const [mobileOpen, setMobileOpen] = React.useState(false) const handleDrawerToggle = () => { setMobileOpen(!mobileOpen) @@ -30,9 +29,6 @@ export default function Header({ toggleTheme }: { toggleTheme: () => void }) { const drawer = ( Menu - {navItems.map((item) => ( diff --git a/src/components/Header/index.ts b/src/components/Header/index.ts new file mode 100644 index 0000000..266dec8 --- /dev/null +++ b/src/components/Header/index.ts @@ -0,0 +1 @@ +export * from './Header'; diff --git a/src/components/ModeSwitch/ModeSwitch.tsx b/src/components/ModeSwitch/ModeSwitch.tsx new file mode 100644 index 0000000..53ccf5a --- /dev/null +++ b/src/components/ModeSwitch/ModeSwitch.tsx @@ -0,0 +1,40 @@ +'use client'; +import * as React from 'react'; +import Box from '@mui/material/Box'; +import FormControl from '@mui/material/FormControl'; +import InputLabel from '@mui/material/InputLabel'; +import MenuItem from '@mui/material/MenuItem'; +import Select from '@mui/material/Select'; +import { useColorScheme } from '@mui/material/styles'; + +export default function ModeSwitch() { + const { mode, setMode } = useColorScheme(); + if (!mode) { + return null; + } + return ( + + + Theme + + + + ); +} \ No newline at end of file diff --git a/src/components/ModeSwitch/index.ts b/src/components/ModeSwitch/index.ts new file mode 100644 index 0000000..6d82f54 --- /dev/null +++ b/src/components/ModeSwitch/index.ts @@ -0,0 +1 @@ +export * from './ModeSwitch'; diff --git a/src/theme/index.ts b/src/theme/index.ts new file mode 100644 index 0000000..7b1f54e --- /dev/null +++ b/src/theme/index.ts @@ -0,0 +1 @@ +export * from './theme'; diff --git a/src/theme/theme.ts b/src/theme/theme.ts index 082213d..bb71ad7 100644 --- a/src/theme/theme.ts +++ b/src/theme/theme.ts @@ -1,44 +1,37 @@ -// theme.js +'use client'; import { createTheme } from '@mui/material/styles'; +import { Roboto } from 'next/font/google'; -const light = createTheme({ - palette: { - mode: 'light', - primary: { - main: '#1976d2', // Blue - }, - secondary: { - main: '#dc004e', // Red - }, - background: { - default: '#ffffff', // White - paper: '#f5f5f5', // Light Grey - }, - text: { - primary: '#000000', // Black - secondary: '#555555', // Dark Grey +const roboto = Roboto({ + weight: ['300', '400', '500', '700'], + subsets: ['latin'], + display: 'swap', +}); + +const theme = createTheme({ + colorSchemes: { light: true, dark: true }, + cssVariables: { + colorSchemeSelector: 'class', + }, + typography: { + fontFamily: roboto.style.fontFamily, + }, + components: { + MuiAlert: { + styleOverrides: { + root: { + variants: [ + { + props: { severity: 'info' }, + style: { + backgroundColor: '#60a5fa', + }, + }, + ], + }, + }, }, }, }); -const dark = createTheme({ - palette: { - mode: 'dark', - primary: { - main: '#90caf9', // Light Blue - }, - secondary: { - main: '#f48fb1', // Pink - }, - background: { - default: '#121212', // Dark Grey - paper: '#1d1d1d', // Slightly Lighter Grey - }, - text: { - primary: '#ffffff', // White - secondary: '#bbbbbb', // Light Grey - }, - }, -}); - -export { light, dark }; +export default theme;