diff --git a/.vscode/settings.json b/.vscode/settings.json
index c54c7f3cb..34a94eef5 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -12,5 +12,8 @@
"sonarlint.connectedMode.project": {
"connectionId": "kleros",
"projectKey": "kleros_kleros-v2"
+ },
+ "editor.codeActionsOnSave": {
+ "source.fixAll.eslint": true
}
}
diff --git a/web/src/consts/index.ts b/web/src/consts/index.ts
index 2b6cad7cb..d2859b4e8 100644
--- a/web/src/consts/index.ts
+++ b/web/src/consts/index.ts
@@ -28,9 +28,9 @@ export const ETH_SIGNATURE_REGEX = /^0x[a-fA-F0-9]{130}$/;
export const isProductionDeployment = () => process.env.REACT_APP_DEPLOYMENT === "mainnet";
-export const isKlerosUniversity = () => arbitratorType() === ArbitratorTypes.university;
-export const isKlerosNeo = () => arbitratorType() === ArbitratorTypes.neo;
-export const arbitratorType = (): ArbitratorTypes =>
+export const isKlerosUniversity = () => getArbitratorType() === ArbitratorTypes.university;
+export const isKlerosNeo = () => getArbitratorType() === ArbitratorTypes.neo;
+export const getArbitratorType = (): ArbitratorTypes =>
ArbitratorTypes[process.env.REACT_APP_ARBITRATOR_TYPE?.toLowerCase() ?? "vanilla"];
export const GENESIS_BLOCK_ARBSEPOLIA = BigInt(process.env.REACT_APP_GENESIS_BLOCK_ARBSEPOLIA ?? 0);
diff --git a/web/src/layout/Header/DesktopHeader.tsx b/web/src/layout/Header/DesktopHeader.tsx
index 30b97acfd..0409b87f2 100644
--- a/web/src/layout/Header/DesktopHeader.tsx
+++ b/web/src/layout/Header/DesktopHeader.tsx
@@ -1,17 +1,12 @@
import React from "react";
import styled, { css } from "styled-components";
-import { Link } from "react-router-dom";
import { useToggle } from "react-use";
-import KlerosCourtUniversityLogo from "svgs/header/kleros-court-university.svg";
-import KlerosCourtLogo from "svgs/header/kleros-court.svg";
import KlerosSolutionsIcon from "svgs/menu-icons/kleros-solutions.svg";
import { useLockOverlayScroll } from "hooks/useLockOverlayScroll";
-import { isKlerosUniversity } from "src/consts";
-
import { landscapeStyle } from "styles/landscapeStyle";
import { responsiveSize } from "styles/responsiveSize";
@@ -19,14 +14,13 @@ import ConnectWallet from "components/ConnectWallet";
import LightButton from "components/LightButton";
import { Overlay } from "components/Overlay";
+import Logo from "./Logo";
import DappList from "./navbar/DappList";
import Explore from "./navbar/Explore";
import Menu from "./navbar/Menu";
import Help from "./navbar/Menu/Help";
import Settings from "./navbar/Menu/Settings";
-import { PopupContainer } from ".";
-
const Container = styled.div`
display: none;
position: absolute;
@@ -73,10 +67,6 @@ const LightButtonContainer = styled.div`
margin-right: ${responsiveSize(12, 16)};
`;
-const StyledLink = styled(Link)`
- min-height: 48px;
-`;
-
const StyledKlerosSolutionsIcon = styled(KlerosSolutionsIcon)`
fill: ${({ theme }) => theme.white} !important;
`;
@@ -87,6 +77,15 @@ const ConnectWalletContainer = styled.div`
}
`;
+const PopupContainer = styled.div`
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: 30;
+`;
+
const DesktopHeader = () => {
const [isDappListOpen, toggleIsDappListOpen] = useToggle(false);
const [isHelpOpen, toggleIsHelpOpen] = useToggle(false);
@@ -106,7 +105,7 @@ const DesktopHeader = () => {
Icon={StyledKlerosSolutionsIcon}
/>
- {isKlerosUniversity() ? : }
+
diff --git a/web/src/layout/Header/Logo.tsx b/web/src/layout/Header/Logo.tsx
new file mode 100644
index 000000000..956bc5771
--- /dev/null
+++ b/web/src/layout/Header/Logo.tsx
@@ -0,0 +1,62 @@
+import React, { useMemo } from "react";
+import styled, { Theme } from "styled-components";
+
+import { Link } from "react-router-dom";
+
+import KlerosCourtLogo from "svgs/header/kleros-court.svg";
+
+import { ArbitratorTypes, getArbitratorType } from "consts/index";
+import { isUndefined } from "utils/index";
+
+const Container = styled.div`
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ gap: 16px;
+`;
+
+const StyledLink = styled(Link)`
+ min-height: 48px;
+`;
+
+const BadgeContainer = styled.div<{ backgroundColor: keyof Theme }>`
+ transform: skewX(-15deg);
+ background-color: ${({ theme, backgroundColor }) => theme[backgroundColor]};
+ border-radius: 3px;
+ padding: 1px 8px;
+ height: fit-content;
+`;
+
+const BadgeText = styled.label`
+ color: ${({ theme }) => theme.darkPurple};
+`;
+
+const CourtBadge: React.FC = () => {
+ const { text, color } = useMemo<{ text?: string; color?: keyof Theme }>(() => {
+ switch (getArbitratorType()) {
+ case ArbitratorTypes.neo:
+ return { text: "Neo", color: "paleCyan" };
+ case ArbitratorTypes.university:
+ return { text: "Uni", color: "limeGreen" };
+ }
+ return {};
+ }, []);
+
+ return !isUndefined(color) ? (
+
+ {text}
+
+ ) : null;
+};
+
+const Logo: React.FC = () => (
+
+ {" "}
+
+
+
+
+
+);
+
+export default Logo;
diff --git a/web/src/layout/Header/MobileHeader.tsx b/web/src/layout/Header/MobileHeader.tsx
index 53846ae11..c8a22877c 100644
--- a/web/src/layout/Header/MobileHeader.tsx
+++ b/web/src/layout/Header/MobileHeader.tsx
@@ -1,19 +1,15 @@
import React, { useContext, useMemo, useRef } from "react";
import styled, { css } from "styled-components";
-import { Link } from "react-router-dom";
import { useClickAway, useToggle } from "react-use";
import HamburgerIcon from "svgs/header/hamburger.svg";
-import KlerosCourtUniversityLogo from "svgs/header/kleros-court-university.svg";
-import KlerosCourtLogo from "svgs/header/kleros-court.svg";
-
-import { isKlerosUniversity } from "src/consts";
import { landscapeStyle } from "styles/landscapeStyle";
import LightButton from "components/LightButton";
+import Logo from "./Logo";
import NavBar from "./navbar";
const Container = styled.div`
@@ -41,10 +37,6 @@ const StyledLightButton = styled(LightButton)`
}
`;
-const StyledLink = styled(Link)`
- min-height: 48px;
-`;
-
const OpenContext = React.createContext({
isOpen: false,
toggleIsOpen: () => {
@@ -64,7 +56,7 @@ const MobileHeader = () => {
return (
- {isKlerosUniversity() ? : }
+
diff --git a/web/src/layout/Header/index.tsx b/web/src/layout/Header/index.tsx
index 96fca094c..fa8da3fb3 100644
--- a/web/src/layout/Header/index.tsx
+++ b/web/src/layout/Header/index.tsx
@@ -23,15 +23,6 @@ const HeaderContainer = styled.div`
padding: 4px 24px 8px;
`;
-export const PopupContainer = styled.div`
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- z-index: 30;
-`;
-
const Header: React.FC = () => {
return (
diff --git a/web/src/layout/Header/navbar/index.tsx b/web/src/layout/Header/navbar/index.tsx
index 7742a7a68..c58742477 100644
--- a/web/src/layout/Header/navbar/index.tsx
+++ b/web/src/layout/Header/navbar/index.tsx
@@ -12,7 +12,6 @@ import ConnectWallet from "components/ConnectWallet";
import LightButton from "components/LightButton";
import { Overlay } from "components/Overlay";
-import { PopupContainer } from "..";
import { useOpenContext } from "../MobileHeader";
import DappList from "./DappList";
@@ -72,6 +71,15 @@ const DisconnectWalletButtonContainer = styled.div`
align-items: center;
`;
+const PopupContainer = styled.div`
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: 30;
+`;
+
export interface ISettings {
toggleIsSettingsOpen: () => void;
}
diff --git a/web/src/styles/themes.ts b/web/src/styles/themes.ts
index 015f42704..6715eccfb 100644
--- a/web/src/styles/themes.ts
+++ b/web/src/styles/themes.ts
@@ -6,6 +6,7 @@ export const lightTheme = {
white: "#FFFFFF",
primaryPurple: "#4D00B4",
secondaryPurple: "#9013FE",
+ darkPurple: "#220050",
mediumPurple: "#F8F1FF",
lightPurple: "#FBF9FE",
violetPurple: "#6A1DCD",
@@ -41,6 +42,9 @@ export const lightTheme = {
skeletonBackground: "#EBEBEB",
skeletonHighlight: "#F5F5F5",
+
+ paleCyan: "#ACFFFF",
+ limeGreen: "#F3FFD9",
};
export const darkTheme = {
@@ -49,6 +53,7 @@ export const darkTheme = {
white: "#FFFFFF",
primaryPurple: "#7E1BD4",
secondaryPurple: "#B45FFF",
+ darkPurple: "#220050",
mediumPurple: "#390F6C",
lightPurple: "#FCFBFF",
violetPurple: "#6A1DCD",
@@ -84,4 +89,7 @@ export const darkTheme = {
skeletonBackground: "#3A2270",
skeletonHighlight: "#3E307C",
+
+ paleCyan: "#ACFFFF",
+ limeGreen: "#F3FFD9",
};
diff --git a/web/wagmi.config.ts b/web/wagmi.config.ts
index bc481a0bb..2b98ff501 100644
--- a/web/wagmi.config.ts
+++ b/web/wagmi.config.ts
@@ -10,7 +10,7 @@ import { Abi } from "viem";
import IArbitrableV2 from "@kleros/kleros-v2-contracts/artifacts/src/arbitration/interfaces/IArbitrableV2.sol/IArbitrableV2.json" assert { type: "json" };
import IHomeGateway from "@kleros/kleros-v2-contracts/artifacts/src/gateway/interfaces/IHomeGateway.sol/IHomeGateway.json" assert { type: "json" };
-import { ArbitratorTypes, arbitratorType } from "src/consts";
+import { ArbitratorTypes, getArbitratorType } from "src/consts";
dotenv.config();
@@ -71,7 +71,7 @@ const readArtifacts = async (type: ArbitratorTypes, viemChainName: string, hardh
const getConfig = async (): Promise => {
const deployment = process.env.REACT_APP_DEPLOYMENT ?? "testnet";
- const type = arbitratorType();
+ const type = getArbitratorType();
let viemNetwork: string;
let hardhatNetwork: string;