Skip to content

Commit 74bc188

Browse files
feat(devtools): homepage UI
1 parent aff71fc commit 74bc188

File tree

13 files changed

+364
-2
lines changed

13 files changed

+364
-2
lines changed

web-devtools/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
"react": "^18.2.0",
4444
"react-dom": "^18.2.0",
4545
"react-markdown": "^8.0.7",
46+
"typewriter-effect": "^2.21.0",
4647
"vanilla-jsoneditor": "^0.21.4",
4748
"viem": "^2.1.0",
4849
"wagmi": "^2.2.1"
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import React from "react";
2+
import styled from "styled-components";
3+
4+
import Typewriter from "typewriter-effect";
5+
6+
import { responsiveSize } from "styles/responsiveSize";
7+
8+
const StyledHeader = styled.div`
9+
display: flex;
10+
justify-content: space-between;
11+
`;
12+
13+
const StyledH1 = styled.h1`
14+
display: flex;
15+
gap: 8px;
16+
font-size: ${responsiveSize(21, 24)};
17+
font-weight: 500;
18+
margin-bottom: 48px;
19+
letter-spacing: 1px;
20+
`;
21+
22+
const TypewriterContainer = styled.div`
23+
.typewriter-text {
24+
color: ${({ theme }) => theme.klerosUIComponentsSecondaryPurple};
25+
}
26+
`;
27+
28+
const Header: React.FC = () => {
29+
const Phrases = ["Manage Courts", "Get Insights", "Edit Dispute Templates", "Get PNK Faucets", "Boost productivity"];
30+
31+
return (
32+
<StyledHeader>
33+
<StyledH1>
34+
Developer Toolkit:
35+
<TypewriterContainer>
36+
<Typewriter
37+
options={{
38+
strings: Phrases,
39+
autoStart: true,
40+
loop: true,
41+
wrapperClassName: "typewriter-text",
42+
}}
43+
/>
44+
</TypewriterContainer>
45+
</StyledH1>
46+
</StyledHeader>
47+
);
48+
};
49+
50+
export default Header;
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import React from "react";
2+
import styled from "styled-components";
3+
4+
import Link from "next/link";
5+
6+
import PaperIcon from "svgs/icons/arrow.svg";
7+
8+
const Container = styled.div`
9+
display: flex;
10+
flex-direction: column;
11+
align-items: center;
12+
gap: 16px;
13+
border-top: 3px solid ${({ theme }) => theme.klerosUIComponentsSecondaryPurple};
14+
border-top-left-radius: 3px;
15+
border-top-right-radius: 3px;
16+
background-color: ${({ theme }) => theme.klerosUIComponentsWhiteBackground};
17+
padding: 16px;
18+
`;
19+
20+
const ToolList = styled.div`
21+
display: grid;
22+
grid-template-columns: repeat(2, 1fr);
23+
gap: 8px;
24+
width: 100%;
25+
@media (max-width: 768px) {
26+
grid-template-columns: 1fr;
27+
}
28+
`;
29+
30+
const ToolItem = styled.li`
31+
display: flex;
32+
align-items: center;
33+
gap: 8px;
34+
padding: 16px 16px;
35+
border: 1px solid ${({ theme }) => theme.klerosUIComponentsLightBlue};
36+
border-radius: 3px;
37+
background-color: ${({ theme }) => theme.klerosUIComponentsLightBackground};
38+
width: 100%;
39+
transition: background-color 0.3s;
40+
`;
41+
42+
const ToolLink = styled.div`
43+
display: flex;
44+
align-items: center;
45+
text-decoration: none;
46+
gap: 8px;
47+
color: ${({ theme }) => theme.klerosUIComponentsSecondaryText};
48+
width: 100%;
49+
`;
50+
51+
const SVGContainer = styled.div`
52+
display: flex;
53+
align-items: center;
54+
justify-content: center;
55+
svg {
56+
fill: ${({ theme }) => theme.klerosUIComponentsSecondaryPurple};
57+
height: 12px;
58+
width: 12px;
59+
}
60+
`;
61+
62+
const ToolName = styled.span`
63+
font-size: 16px;
64+
`;
65+
66+
const tools = [
67+
{ name: "Dispute Templates Preview", route: "/dispute-template" },
68+
{ name: "Configure Ruler", route: "/ruler" },
69+
{ name: "Courts Manager (comming soon)", route: "/" },
70+
{ name: "Arbitrable Explorer (comming soon)", route: "/" },
71+
];
72+
73+
const Tools: React.FC = () => {
74+
return (
75+
<Container>
76+
<p>Tools</p>
77+
<ToolList>
78+
{tools.map((tool, index) => (
79+
<ToolItem key={index}>
80+
<Link href={tool.route} passHref>
81+
<ToolLink>
82+
<SVGContainer>
83+
<PaperIcon />
84+
</SVGContainer>
85+
<ToolName>{tool.name}</ToolName>
86+
</ToolLink>
87+
</Link>
88+
</ToolItem>
89+
))}
90+
</ToolList>
91+
</Container>
92+
);
93+
};
94+
95+
export default Tools;
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
"use client";
2+
import React from "react";
3+
import styled from "styled-components";
4+
5+
import { responsiveSize } from "styles/responsiveSize";
6+
7+
import HeroImage from "components/HeroImage";
8+
9+
import Header from "./Header";
10+
import Tools from "./Tools";
11+
12+
const Container = styled.div`
13+
width: 100%;
14+
background-color: ${({ theme }) => theme.klerosUIComponentsLightBackground};
15+
padding: ${responsiveSize(32, 72)} ${responsiveSize(24, 132)} ${responsiveSize(76, 96)};
16+
max-width: 1780px;
17+
margin: 0 auto;
18+
`;
19+
20+
const Home: React.FC = () => {
21+
return (
22+
<div>
23+
<HeroImage />
24+
<Container>
25+
<Header />
26+
<Tools />
27+
</Container>
28+
</div>
29+
);
30+
};
31+
32+
export default Home;

web-devtools/src/app/(main)/page.tsx renamed to web-devtools/src/app/(main)/ruler/page.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ const SettingsPane = styled.div`
3030
margin: 16px 0;
3131
`;
3232

33-
const Home: React.FC = () => {
33+
const Ruler: React.FC = () => {
3434
return (
3535
<Container>
3636
<h1>Ruler</h1>
@@ -59,4 +59,4 @@ const Home: React.FC = () => {
5959
</Container>
6060
);
6161
};
62-
export default Home;
62+
export default Ruler;

web-devtools/src/assets/svgs/hero/hero-darkmode-desktop.svg

Lines changed: 74 additions & 0 deletions
Loading

web-devtools/src/assets/svgs/hero/hero-darkmode-mobile.svg

Lines changed: 53 additions & 0 deletions
Loading
Lines changed: 10 additions & 0 deletions
Loading
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import React from "react";
2+
3+
import HeroDarkDesktop from "svgs/hero/hero-darkmode-desktop.svg";
4+
import HeroDarkMobile from "svgs/hero/hero-darkmode-mobile.svg";
5+
6+
import useIsDesktop from "hooks/useIsDesktop";
7+
8+
const HeroImage = () => {
9+
const isDesktop = useIsDesktop();
10+
return <div>{isDesktop ? <HeroDesktop /> : <HeroMobile />}</div>;
11+
};
12+
13+
const HeroDesktop: React.FC = () => {
14+
return <HeroDarkDesktop />;
15+
};
16+
17+
const HeroMobile: React.FC = () => {
18+
return <HeroDarkMobile />;
19+
};
20+
21+
export default HeroImage;
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { useMemo } from "react";
2+
3+
import { useWindowSize } from "react-use";
4+
5+
import { BREAKPOINT_LANDSCAPE } from "styles/landscapeStyle";
6+
7+
const useIsDesktop = () => {
8+
const { width } = useWindowSize();
9+
return useMemo(() => width > BREAKPOINT_LANDSCAPE, [width]);
10+
};
11+
12+
export default useIsDesktop;

yarn.lock

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8065,6 +8065,7 @@ __metadata:
80658065
react-markdown: "npm:^8.0.7"
80668066
ts-node: "npm:^10.9.2"
80678067
typescript: "npm:^5.5.3"
8068+
typewriter-effect: "npm:^2.21.0"
80688069
vanilla-jsoneditor: "npm:^0.21.4"
80698070
viem: "npm:^2.1.0"
80708071
wagmi: "npm:^2.2.1"
@@ -38419,6 +38420,19 @@ __metadata:
3841938420
languageName: node
3842038421
linkType: hard
3842138422

38423+
"typewriter-effect@npm:^2.21.0":
38424+
version: 2.21.0
38425+
resolution: "typewriter-effect@npm:2.21.0"
38426+
dependencies:
38427+
prop-types: "npm:^15.8.1"
38428+
raf: "npm:^3.4.1"
38429+
peerDependencies:
38430+
react: ^17.x || ^18.x
38431+
react-dom: ^17.x || ^18.x
38432+
checksum: eaefe01da5ecfc866a1031efa34ad365f4f52fc57be9acf67d4877e01361844a2798f1aba035845fc9f60edaa56bdbb6f7597341ae8e4015793795e1d7b6763d
38433+
languageName: node
38434+
linkType: hard
38435+
3842238436
"typical@npm:^4.0.0":
3842338437
version: 4.0.0
3842438438
resolution: "typical@npm:4.0.0"

0 commit comments

Comments
 (0)