Skip to content

Commit

Permalink
website: add themes home page.
Browse files Browse the repository at this point in the history
  • Loading branch information
jaywcjlove committed Dec 7, 2022
1 parent 00c84f8 commit fea984f
Show file tree
Hide file tree
Showing 12 changed files with 247 additions and 118 deletions.
48 changes: 48 additions & 0 deletions www/src/components/Header.tsx
@@ -0,0 +1,48 @@
import styled from 'styled-components';
import { NavLink } from 'react-router-dom';
import logo from '../logo.png';
import { NavMenus } from './NavMenus';

export const Warpper = styled.div`
display: flex;
flex-direction: column;
`;

const HeaderWarpper = styled.div`
display: flex;
justify-content: space-between;
align-items: center;
height: 42px;
padding-left: 10px;
padding-right: 10px;
border-bottom: 1px solid var(--color-border-default);
position: sticky;
top: 0;
z-index: 9999;
background-color: var(--color-canvas-subtle);
`;

const Title = styled(NavLink)`
font-size: 14px;
font-weight: bold;
display: flex;
align-items: center;
gap: 10px;
text-decoration: none;
color: var(--color-fg-muted);
> img {
height: 21px;
}
`;

export const Header = () => {
return (
<HeaderWarpper>
<Title to="/">
<img src={logo} alt="Logo" />
<span>CodeMirror Theme</span>
</Title>
<NavMenus />
</HeaderWarpper>
);
};
48 changes: 48 additions & 0 deletions www/src/components/NavMenus.tsx
@@ -0,0 +1,48 @@
import styled, { css } from 'styled-components';
import { NavLink } from 'react-router-dom';

export const Tools = styled.div`
display: flex;
justify-content: center;
align-items: center;
gap: 2px;
& a {
display: flex;
align-items: center;
}
`;

const style = css`
padding: 2px 5px;
border-radius: 3px;
text-decoration: none;
color: var(--color-accent-emphasis);
&.active {
background-color: var(--color-neutral-muted);
color: var(--color-fg-default);
}
`;

export const Link = styled(NavLink)`
${style}
`;

export const Hyperlink = styled.a`
${style}
`;

export const NavMenus = () => {
return (
<Tools>
<Link to="/">Home</Link>
<Link to="/extensions">Extensions</Link>
<Link to="/theme/">Themes</Link>
<Link to="/editor/theme">Themes Editor</Link>
<Link to="/theme/doc">Theme Doc</Link>
<Hyperlink href="https://github.com/uiwjs/react-codemirror" target="__blank">
Github
</Hyperlink>
<dark-mode permanent />
</Tools>
);
};
Expand Up @@ -15,7 +15,7 @@ export const Warpper: FC<PropsWithChildren<{}>> = (props) => {
const [element, setElement] = useState<HTMLDivElement>();
useEffect(() => setElement($dom.current!), []);
return (
<Container ref={$dom}>
<Container ref={$dom} {...props}>
{props.children}
<BackToUp element={element} style={{ position: 'fixed' }}>
Top
Expand Down
6 changes: 6 additions & 0 deletions www/src/index.tsx
Expand Up @@ -5,6 +5,7 @@ import { createGlobalStyle } from 'styled-components';
import Home from './pages/home';
import { ThemeEditor } from './pages/theme/editor';
import { ThemeLayout } from './pages/theme';
import { ThemesHome } from './pages/theme/home';
import { ThemeDoc } from './pages/theme/docs';
import { ThemeOkaidia } from './pages/theme/themes';
import { ExtensionsLayout } from './pages/extensions';
Expand Down Expand Up @@ -66,7 +67,12 @@ root.render(
<Routes>
<Route index element={<Home />} />
<Route path="/" element={<Home />} />
<Route path="/editor/theme/" element={<ThemeLayout />}>
<Route index element={<Navigate to="single" replace />} />
<Route path=":type" element={<ThemeEditor />} />
</Route>
<Route path="/theme/" element={<ThemeLayout />}>
<Route index element={<ThemesHome />} />
<Route path="data" element={<Navigate to="sublime" replace />} />
<Route path="data/:name" element={<ThemeOkaidia />} />
<Route path="data/:name/:lightOrDark" element={<ThemeOkaidia />} />
Expand Down
2 changes: 1 addition & 1 deletion www/src/pages/extensions/Document.tsx
@@ -1,5 +1,5 @@
import { FC, PropsWithChildren } from 'react';
import { Warpper } from '../theme/themes/Warpper';
import { Warpper } from '../../components/Warpper';
import { Content } from '../theme/themes/Document';

interface DocumentProps {
Expand Down
18 changes: 3 additions & 15 deletions www/src/pages/extensions/index.tsx
@@ -1,12 +1,11 @@
import { Outlet, useLocation } from 'react-router-dom';
import { useEffect } from 'react';
import styled from 'styled-components';
import { Warpper, Header, Title, Tools, Link } from '../theme';
import { Header, Warpper } from '../../components/Header';
import { Document } from './Document';
import logo from '../../logo.png';
import { Sider } from '../theme/editor';
import { Content } from '../theme';
import { MenuItem } from '../theme/themes';
import { MenuItem } from '../theme/themes/SiderMenus';
import { mdSource } from './datas';

export const PageWarpper = styled.div`
Expand All @@ -26,18 +25,7 @@ export const ExtensionsLayout = () => {

return (
<Warpper>
<Header>
<Title to="/">
<img src={logo} alt="Logo" />
<span>CodeMirror Extensions</span>
</Title>
<Tools>
<Link to="/">Home</Link>
<Link to="/extensions">Extensions</Link>
<Link to="/theme/data">Themes</Link>
<dark-mode permanent />
</Tools>
</Header>
<Header />
<Content>
<Sider>
{Object.keys(mdSource).map((name, key) => {
Expand Down
4 changes: 2 additions & 2 deletions www/src/pages/home/index.tsx
Expand Up @@ -141,10 +141,10 @@ export default function App() {
</AppTitle>
<Describe>CodeMirror component for React. </Describe>
<Buttons>
<Link to="/theme/editor" className="special">
<Link to="/editor/theme" className="special">
Theme Editor
</Link>
<Link to="/theme/data" className="themes">
<Link to="/theme/" className="themes">
Themes
</Link>
<Link to="/extensions" className="extensions">
Expand Down
91 changes: 91 additions & 0 deletions www/src/pages/theme/home/index.tsx
@@ -0,0 +1,91 @@
import { Fragment } from 'react';
import styled from 'styled-components';
import { Link } from 'react-router-dom';
import CodeMirror from '@uiw/react-codemirror';
import { color } from '@uiw/codemirror-extensions-color';
import { langs } from '@uiw/codemirror-extensions-langs';
import { SiderMenus } from '../themes/SiderMenus';
import { Warpper } from '../../../components/Warpper';
import { themeData } from '../themes/Datas';
import { toSnakeCase } from '../themes/Document';

export const toTitleCase = (str: string = '') =>
str
.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g)
?.map((x) => x.charAt(0).toUpperCase() + x.slice(1))
.join(' ');

const ThemesWarpper = styled.div`
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 2.5rem;
display: grid;
padding: 2.6rem;
a {
text-decoration: none;
}
@media (max-width: 1280px) {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
@media (max-width: 1024px) {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
@media (max-width: 860px) {
grid-template-columns: repeat(1, minmax(0, 1fr));
}
`;

const ThemeCard = styled.div`
padding: 1rem;
box-shadow: 0 0 #0000, 0 0 #0000, 0 0 #0000, 0 1px 2px 0 rgba(0, 0, 0, 0.05);
border-radius: 0.5rem;
border: 1px solid var(--color-neutral-muted);
background-color: var(--color-canvas-subtle);
transition-property: all;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 0.2s;
&:hover {
transform: translate(0, -0.25rem) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1);
}
`;

const Title = styled.div`
font-weight: 600;
padding-bottom: 0.68rem;
`;

const codeString = `import React, {useState} from 'react';
// My favorite component
const Counter = () => {
const [value, setValue] = useState(0);
return <span>{value}</span>;
};`;

export function ThemesHome() {
return (
<Fragment>
<SiderMenus />
<Warpper>
<ThemesWarpper>
{Object.keys(themeData).map((name, idx) => {
const [_name, _theme] = toSnakeCase(name) || [];
return (
<Link key={idx} to={`/theme/data/${_name}${_theme ? `/${_theme}` : ''}`}>
<ThemeCard>
<Title>{toTitleCase(name)}</Title>
<CodeMirror
value={codeString}
height="165px"
theme={themeData[name as keyof typeof themeData]}
extensions={[color, langs.jsx()]}
/>
</ThemeCard>
</Link>
);
})}
</ThemesWarpper>
</Warpper>
</Fragment>
);
}
69 changes: 3 additions & 66 deletions www/src/pages/theme/index.tsx
@@ -1,64 +1,14 @@
import styled from 'styled-components';
import { useEffect } from 'react';
import { NavLink, Outlet, useParams } from 'react-router-dom';
import { Outlet, useParams } from 'react-router-dom';
import '@wcj/dark-mode';
import logo from '../../logo.png';

export const Warpper = styled.div`
display: flex;
flex-direction: column;
`;

export const Title = styled(NavLink)`
font-size: 14px;
font-weight: bold;
display: flex;
align-items: center;
gap: 10px;
text-decoration: none;
color: var(--color-fg-muted);
> img {
height: 21px;
}
`;

export const Tools = styled.div`
display: flex;
justify-content: center;
align-items: center;
gap: 2px;
& a {
display: flex;
align-items: center;
}
`;
import { Header, Warpper } from '../../components/Header';

export const Content = styled.div`
display: flex;
flex: 1;
`;

export const Header = styled.div`
display: flex;
justify-content: space-between;
align-items: center;
height: 42px;
padding-left: 10px;
padding-right: 10px;
border-bottom: 1px solid var(--color-border-default);
`;

export const Link = styled(NavLink)`
padding: 2px 5px;
border-radius: 3px;
text-decoration: none;
color: var(--color-accent-emphasis);
&.active {
background-color: var(--color-neutral-muted);
color: var(--color-fg-default);
}
`;

export function ThemeLayout() {
const { name = '', lightOrDark = '' } = useParams();

Expand All @@ -72,20 +22,7 @@ export function ThemeLayout() {

return (
<Warpper>
<Header>
<Title to="/">
<img src={logo} alt="Logo" />
<span>CodeMirror Theme</span>
</Title>
<Tools>
<Link to="/">Home</Link>
<Link to="/extensions">Extensions</Link>
<Link to="/theme/data">Themes</Link>
<Link to="/theme/editor">Editor</Link>
<Link to="/theme/doc">Theme Doc</Link>
<dark-mode permanent />
</Tools>
</Header>
<Header />
<Content>
<Outlet />
</Content>
Expand Down
2 changes: 1 addition & 1 deletion www/src/pages/theme/themes/Document.tsx
Expand Up @@ -3,7 +3,7 @@ import MarkdownPreview from '@uiw/react-markdown-preview';
import styled from 'styled-components';
import { PreCode } from './PreCode';
import { mdSource } from './Datas';
import { Warpper } from './Warpper';
import { Warpper } from '../../../components/Warpper';

export const toSnakeCase = (str: string = '') =>
str
Expand Down

0 comments on commit fea984f

Please sign in to comment.