diff --git a/packages/paste-website/package.json b/packages/paste-website/package.json index 8647bcfb57..f1e1e1017e 100644 --- a/packages/paste-website/package.json +++ b/packages/paste-website/package.json @@ -175,6 +175,7 @@ "micromark-extension-mdxjs": "^2.0.0", "minimist": "^1.2.8", "next": "^14.0.0", + "nookies": "^2.5.2", "openai": "^4.79.1", "pretty-format": "^28.1.0", "prism-react-renderer": "^1.3.5", diff --git a/packages/paste-website/src/components/color-swatch/ColorGradient.tsx b/packages/paste-website/src/components/color-swatch/ColorGradient.tsx index b4ebcfc5a4..fef89a6e2f 100644 --- a/packages/paste-website/src/components/color-swatch/ColorGradient.tsx +++ b/packages/paste-website/src/components/color-swatch/ColorGradient.tsx @@ -65,7 +65,7 @@ export const ColorGradient: React.FC< > = ({ aliasPrefix, makeTall = "false", index = 0 }) => { const [show, setShow] = React.useState(false); const { theme } = useDarkModeContext(); - const aliasValues = getAliasValuesFromPrefix(aliasPrefix, theme); + const aliasValues = getAliasValuesFromPrefix(aliasPrefix, theme || "twilio"); const count = aliasValues.length - 1; function handleVisibilityChange(isVisible: boolean): void { diff --git a/packages/paste-website/src/components/shortcodes/live-preview/index.tsx b/packages/paste-website/src/components/shortcodes/live-preview/index.tsx index 9b6f284ab7..1e24d59212 100644 --- a/packages/paste-website/src/components/shortcodes/live-preview/index.tsx +++ b/packages/paste-website/src/components/shortcodes/live-preview/index.tsx @@ -49,6 +49,8 @@ const LivePreview: React.FC> = ({ const overflow = showOverflow ? "visible" : "auto"; + if (!previewTheme) return null; + return ( void; }; diff --git a/packages/paste-website/src/hooks/useDarkMode.tsx b/packages/paste-website/src/hooks/useDarkMode.tsx index ef8b735f2f..9392e428ef 100644 --- a/packages/paste-website/src/hooks/useDarkMode.tsx +++ b/packages/paste-website/src/hooks/useDarkMode.tsx @@ -1,9 +1,8 @@ import type { ValueOf } from "@twilio-paste/types"; +import { parseCookies, setCookie } from "nookies"; import * as React from "react"; -import { SimpleStorage } from "../utils/SimpleStorage"; - -export type UseDarkModeReturn = [ValidThemeName, () => void, boolean]; +export type UseDarkModeReturn = [ValidThemeName | undefined, () => void, boolean]; const ValidThemes = { DEFAULT: "twilio", @@ -13,15 +12,16 @@ const ValidThemes = { type ValidThemeName = ValueOf; const isValidTheme = (themeName: ValidThemeName): boolean => { - return themeName === ValidThemes.DEFAULT || themeName === ValidThemes.DARK; + return Object.values(ValidThemes).includes(themeName); }; export const useDarkMode = (): UseDarkModeReturn => { - const [theme, setTheme] = React.useState(ValidThemes.DEFAULT); + const [theme, setTheme] = React.useState(); const [componentMounted, setComponentMounted] = React.useState(false); const setMode = (mode: ValidThemeName): void => { - SimpleStorage.set("theme", mode); + setCookie(null, "paste-docs-theme", mode, { path: "/" }); + document.body.dataset.theme = mode; setTheme(mode); }; @@ -34,7 +34,7 @@ export const useDarkMode = (): UseDarkModeReturn => { }; React.useEffect(() => { - const localTheme = SimpleStorage.get("theme") as ValidThemeName; + const localTheme = parseCookies()["paste-docs-theme"] as ValidThemeName; if (window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches && !localTheme) { setMode(ValidThemes.DARK); diff --git a/packages/paste-website/src/pages/_app.tsx b/packages/paste-website/src/pages/_app.tsx index 3a8dc61473..c6f2ab9663 100644 --- a/packages/paste-website/src/pages/_app.tsx +++ b/packages/paste-website/src/pages/_app.tsx @@ -1,4 +1,6 @@ import { datadogRum } from "@datadog/browser-rum"; +import "@twilio-paste/design-tokens/dist/themes/twilio-dark/tokens.data-theme.css"; +import "@twilio-paste/design-tokens/dist/themes/twilio/tokens.custom-properties.css"; import { Theme } from "@twilio-paste/theme"; import type { AppProps } from "next/app"; import Head from "next/head"; @@ -22,7 +24,7 @@ const App = ({ Component, pageProps }: AppProps): React.ReactElement => { const router = useRouter(); const localStorageKey = "cookie-consent-accepted"; const [theme, toggleMode, componentMounted] = useDarkMode(); - const [previewTheme, setPreviewTheme] = React.useState("twilio"); + const [previewTheme, setPreviewTheme] = React.useState(); const [cookiesAccepted, setCookiesAccepted] = React.useState(); React.useEffect(() => { @@ -111,7 +113,7 @@ const App = ({ Component, pageProps }: AppProps): React.ReactElement => { )} +