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;