From 4e9b405c4c77dad7c779311531eb2bef492df1e6 Mon Sep 17 00:00:00 2001 From: Mayank Date: Sun, 23 Jun 2024 13:49:09 +0530 Subject: [PATCH] Example/update blog starter (#66926) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit What? Updated blog-starter example to support dark theme. Also added a button to switch modes (User preference). → User can opt for dark / light / system mode → Mode is persisted using localStorage → Mode is also synced across browsing contexts → No FOUC (Flash of Unstyled Content) → Full SSG → No additional dependency Why? Now that dark mode is a first-class feature of many operating systems, it’s becoming more and more common to design a dark version of your website to go along with the default design. How? - Used tailwind `dark:` modifier - Used localStorage for persisting user's preference - Used storage event to sync the mode across tabs/iframes - Injected script to avoid FOUC - Added appropriate comments in the code for clarity and readability --- examples/blog-starter/package.json | 22 ++-- .../src/app/_components/alert.tsx | 2 +- .../src/app/_components/footer.tsx | 2 +- .../src/app/_components/header.tsx | 2 +- .../src/app/_components/switch.module.css | 56 +++++++++ .../src/app/_components/theme-switcher.tsx | 113 ++++++++++++++++++ examples/blog-starter/src/app/layout.tsx | 7 +- examples/blog-starter/tailwind.config.ts | 1 + 8 files changed, 190 insertions(+), 15 deletions(-) create mode 100644 examples/blog-starter/src/app/_components/switch.module.css create mode 100644 examples/blog-starter/src/app/_components/theme-switcher.tsx diff --git a/examples/blog-starter/package.json b/examples/blog-starter/package.json index fbf73a0fa1..8293f65cd4 100644 --- a/examples/blog-starter/package.json +++ b/examples/blog-starter/package.json @@ -7,21 +7,21 @@ }, "dependencies": { "classnames": "^2.5.1", - "date-fns": "^3.3.1", + "date-fns": "^3.6.0", "gray-matter": "^4.0.3", - "next": "14.1.0", - "react": "^18", - "react-dom": "^18", + "next": "latest", + "react": "^18.3.1", + "react-dom": "^18.3.1", "remark": "^15.0.1", "remark-html": "^16.0.1" }, "devDependencies": { - "@types/node": "^20", - "@types/react": "^18", - "@types/react-dom": "^18", - "autoprefixer": "^10.0.1", - "postcss": "^8", - "tailwindcss": "^3.3.0", - "typescript": "^5" + "@types/node": "^20.14.8", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "autoprefixer": "^10.4.19", + "postcss": "^8.4.38", + "tailwindcss": "^3.4.4", + "typescript": "^5.5.2" } } diff --git a/examples/blog-starter/src/app/_components/alert.tsx b/examples/blog-starter/src/app/_components/alert.tsx index c800a9ffc8..d758ba016e 100644 --- a/examples/blog-starter/src/app/_components/alert.tsx +++ b/examples/blog-starter/src/app/_components/alert.tsx @@ -9,7 +9,7 @@ type Props = { const Alert = ({ preview }: Props) => { return (
+