From 0ade12251efe5e11d1c623a2d1c97eba4e6dcc4b Mon Sep 17 00:00:00 2001 From: jbpenrath Date: Wed, 14 Feb 2024 00:37:50 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8(demo)=20add=20theme=20selector?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As we aims to create several themes for this demo app, we add a select to easily switch between all existing themes. --- apps/demo/src/App.tsx | 94 ++++++++++++++++++++++++++++++++-------- apps/demo/src/index.scss | 6 +++ 2 files changed, 82 insertions(+), 18 deletions(-) diff --git a/apps/demo/src/App.tsx b/apps/demo/src/App.tsx index 991e2ab..824109c 100644 --- a/apps/demo/src/App.tsx +++ b/apps/demo/src/App.tsx @@ -1,13 +1,24 @@ -import { Button, CunninghamProvider } from "@openfun/cunningham-react"; -import React, { useEffect, useState } from "react"; +import { Button, CunninghamProvider, Select } from "@openfun/cunningham-react"; +import React, { useEffect, useMemo, useState } from "react"; import { Create } from "./Create"; import { Home } from "./Home"; enum Theme { - DEFAULT = "default", + CUNNINGHAM = "cunningham", +} + +enum Variant { + LIGHT = "light", DARK = "dark", } +const THEMES: Record> = { + [Theme.CUNNINGHAM]: { + light: "default", + dark: "dark", + }, +}; + export enum Page { HOME, CREATE, @@ -19,15 +30,27 @@ export interface PageProps { const preferredScheme = window.matchMedia("(prefers-color-scheme: dark)") .matches - ? Theme.DARK - : Theme.DEFAULT; + ? { theme: Theme.CUNNINGHAM, variant: Variant.DARK } + : { theme: Theme.CUNNINGHAM, variant: Variant.LIGHT }; export const App = () => { const [locale] = useState("en-US"); - const [theme, setTheme] = useState(preferredScheme); + const [theme, setTheme] = useState( + (sessionStorage.getItem("c-theme") as Theme | null) ?? + preferredScheme.theme, + ); + const [variant, setVariant] = useState( + (sessionStorage.getItem("c-variant") as Variant | null) ?? + preferredScheme.variant, + ); + const activeTheme = useMemo(() => THEMES[theme][variant], [theme, variant]); const [page, setPage] = useState(Page.HOME); - const handleThemeChange = (event: MediaQueryListEvent) => - setTheme(event.matches ? Theme.DARK : Theme.DEFAULT); + const handleThemeChange = (event: MediaQueryListEvent) => { + const nextVariant = event.matches ? Variant.DARK : Variant.LIGHT; + if (THEMES[theme][nextVariant] !== undefined) { + setVariant(nextVariant); + } + }; useEffect(() => { const query = window.matchMedia("(prefers-color-scheme: dark)"); @@ -38,31 +61,66 @@ export const App = () => { }; }, []); + useEffect(() => { + document.documentElement.setAttribute("data-theme", theme); + document.documentElement.setAttribute("data-variant", variant); + sessionStorage.setItem("c-theme", theme); + sessionStorage.setItem("c-variant", variant); + }, [theme, variant]); + return ( - +
- Background pattern + {theme === Theme.CUNNINGHAM && ( + Background pattern + )} {page === Page.HOME && setPage(p)} />} {page === Page.CREATE && setPage(p)} />}
+