diff --git a/website/plasma-theme-builder/package.json b/website/plasma-theme-builder/package.json index bcefc57b7d..0239f9f2f7 100644 --- a/website/plasma-theme-builder/package.json +++ b/website/plasma-theme-builder/package.json @@ -23,6 +23,7 @@ "prettier": "^2.6.2", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-router-dom": "^6.26.1", "react-scripts": "4.0.0", "styled-components": "^5.3.3" }, diff --git a/website/plasma-theme-builder/public/index.html b/website/plasma-theme-builder/public/index.html index 4671d8a003..323a7a520a 100644 --- a/website/plasma-theme-builder/public/index.html +++ b/website/plasma-theme-builder/public/index.html @@ -10,6 +10,8 @@ /> + + diff --git a/website/plasma-theme-builder/src/GlobalStyle.tsx b/website/plasma-theme-builder/src/GlobalStyle.tsx index 29945fc5f7..7e20f59771 100644 --- a/website/plasma-theme-builder/src/GlobalStyle.tsx +++ b/website/plasma-theme-builder/src/GlobalStyle.tsx @@ -1,10 +1,9 @@ -import React from 'react'; +import React, { useState, createContext, useContext } from 'react'; import { createGlobalStyle } from 'styled-components'; -import { plasma } from '@salutejs/plasma-typo'; +import { plasma, ruler, sage, mage, soulmate } from '@salutejs/plasma-typo'; import { dark } from '@salutejs/plasma-tokens-b2c/themes'; import { text } from '@salutejs/plasma-tokens-b2c'; import { b2c } from '@salutejs/plasma-tokens-b2c/typo'; -import type { ThemeMode } from '@salutejs/plasma-tokens-utils'; import { SBSansTextMono } from './components/mixins'; @@ -24,18 +23,46 @@ const DocumentStyle = createGlobalStyle` `; const DarkThemeStyle = createGlobalStyle(dark); -const TypoStyle = createGlobalStyle(plasma); const OldTypoStyle = createGlobalStyle(b2c); -export const GlobalStyle = () => { - const theme: ThemeMode = 'dark'; +const archetypeMap = { + plasma: createGlobalStyle(plasma), + ruler: createGlobalStyle(ruler), + sage: createGlobalStyle(sage), + mage: createGlobalStyle(mage), + soulmate: createGlobalStyle(soulmate), +}; + +export type Archetype = keyof typeof archetypeMap; + +const ThemeContext = createContext<{ + toggleArchetype: (value: Archetype) => void; +}>({ + toggleArchetype: () => {}, +}); + +export const useTheme = () => useContext(ThemeContext); + +export const GlobalStyle = ({ children }: any) => { + const [archetype, setArchetype] = useState('plasma'); + + const toggleArchetype = (value: Archetype) => { + setArchetype(value); + }; + + const TypoStyle = archetypeMap[archetype]; return ( - <> + - {theme === 'dark' && } + - + {children} + ); }; diff --git a/website/plasma-theme-builder/src/_new/examples/buildAndModifyMockTheme.ts b/website/plasma-theme-builder/src/_new/examples/buildAndModifyMockTheme.ts index 8c356e1568..80b5ba974e 100644 --- a/website/plasma-theme-builder/src/_new/examples/buildAndModifyMockTheme.ts +++ b/website/plasma-theme-builder/src/_new/examples/buildAndModifyMockTheme.ts @@ -263,13 +263,13 @@ export const buildAndModifyMockTheme = async () => { }, }); - const onlyGradientTokens = mockTheme.getTokens('gradient'); - console.log('onlyGradientTokens', onlyGradientTokens); + const allTokens = mockTheme.getTokens(); + console.log('allTokens', allTokens); mockTheme.setTokenValue('shadow.name', 'shadow', 'android', { color: 'red', elevation: 0 }); - const allTokens = mockTheme.getTokens(); - console.log('allTokens', allTokens); + const onlyGradientTokens = mockTheme.getTokens('gradient'); + console.log('onlyGradientTokens', onlyGradientTokens); const value = mockTheme.getTokenValue('shape.name', 'shape', 'ios'); const values = mockTheme.getTokenValue('shape.name', 'shape'); diff --git a/website/plasma-theme-builder/src/components/App.tsx b/website/plasma-theme-builder/src/components/App.tsx index 6b96c6fc88..a0fd727ff1 100644 --- a/website/plasma-theme-builder/src/components/App.tsx +++ b/website/plasma-theme-builder/src/components/App.tsx @@ -1,5 +1,6 @@ -import React, { useCallback, useEffect, useState } from 'react'; +import React, { useEffect, useState } from 'react'; import styled, { css } from 'styled-components'; +import { Route, Routes, useNavigate } from 'react-router-dom'; import { Footer } from './Footer/Footer'; import { Main } from './Main/Main'; @@ -12,6 +13,14 @@ import { useDefaultThemeData, useFetchTheme } from '../hooks'; import { multipleMediaQuery } from './mixins'; import { getURLParams, pushHistoryState } from '../utils'; import type { Theme as ThemeType } from '../types'; +// import { useDefaultThemeData, useFetchTheme } from '../hooks'; +// import { multipleMediaQuery } from './mixins'; +// import { getURLParams, pushHistoryState } from '../utils'; +// import type { Theme as ThemeType } from '../types'; +import { ToneGenerator } from './ColorGenerator/ToneGenerator'; +import { GrayscaleGenerator } from './ColorGenerator/GrayscaleGenerator'; +import { FontFamilyGenerator } from './ColorGenerator/FontFamilyGenerator'; +import { TokensEditor } from './_new/TokensEditor'; const StyledRoot = styled.div` min-width: 35rem; @@ -31,82 +40,66 @@ const StyledRoot = styled.div` `; const PAGE_TYPE = { - MAIN: 'MAIN', - GENERATOR: 'GENERATOR', - THEME: 'THEME', - PULL_REQUEST: 'PULL_REQUEST', - ERROR: 'ERROR', + TONE: 'TONE', + GRAYSCALE: 'GRAYSCALE', + FONT_FAMILY: 'FONT_FAMILY', + TOKENS_EDITOR: 'TOKENS_EDITOR', } as const; type PageType = typeof PAGE_TYPE[keyof typeof PAGE_TYPE]; const App = () => { - const [state, setState] = useState(PAGE_TYPE.MAIN); - const [data, setData] = useState(); - const [token, setToken] = useState(); - const defaultData = useDefaultThemeData(); + const [state, setState] = useState(PAGE_TYPE.TONE); + // const [data, setData] = useState(); + // const [token, setToken] = useState(); + // const defaultData = useDefaultThemeData(); + + const navigate = useNavigate(); const [themeName, branchName] = getURLParams(['theme', 'branch']); const [themeData, errorMessage] = useFetchTheme(themeName, branchName); - useEffect(() => { - if (!token) { - return; - } - - if (themeData) { - setState(PAGE_TYPE.THEME); - setData(themeData); - return; - } - - if (errorMessage) { - setState(PAGE_TYPE.ERROR); - } - }, [themeData, token, errorMessage]); - - const onSetToken = useCallback((value: string) => { - setToken(value); - }, []); - - const onMain = useCallback(() => { - setState(PAGE_TYPE.MAIN); - pushHistoryState('./'); - }, []); - - const onGenerateTheme = useCallback(() => { - setState(PAGE_TYPE.GENERATOR); - pushHistoryState('./'); - }, []); - - const onPreviewTheme = useCallback((data: ThemeType) => { - setState(PAGE_TYPE.THEME); - setData(data); - }, []); - - const onPullRequest = useCallback((data: ThemeType) => { - setState(PAGE_TYPE.PULL_REQUEST); - setData(data); - }, []); + const onGrayScale = () => { + setState(PAGE_TYPE.GRAYSCALE); + }; + + const onTokensEditor = () => { + setState(PAGE_TYPE.TOKENS_EDITOR); + }; + + const onTone = () => { + setState(PAGE_TYPE.TONE); + }; + + const onFontFamily = () => { + setState(PAGE_TYPE.FONT_FAMILY); + }; return ( - - {state === PAGE_TYPE.MAIN &&
} - {state === PAGE_TYPE.GENERATOR && } - {state === PAGE_TYPE.THEME && ( - - )} - {state === PAGE_TYPE.PULL_REQUEST && } - {state === PAGE_TYPE.ERROR && } -