diff --git a/.all-contributorsrc b/.all-contributorsrc
index 2c9ebe827d8..e8ee7bb9ed1 100644
--- a/.all-contributorsrc
+++ b/.all-contributorsrc
@@ -12497,6 +12497,24 @@
"contributions": [
"doc"
]
+ },
+ {
+ "login": "r4f4ss",
+ "name": "rafaelss",
+ "avatar_url": "https://avatars.githubusercontent.com/u/5679073?v=4",
+ "profile": "https://github.com/r4f4ss",
+ "contributions": [
+ "content"
+ ]
+ },
+ {
+ "login": "preetjdp",
+ "name": "Preet Parekh",
+ "avatar_url": "https://avatars.githubusercontent.com/u/27439197?v=4",
+ "profile": "https://preetjdp.dev/",
+ "contributions": [
+ "content"
+ ]
}
],
"contributorsPerLine": 7,
diff --git a/.eslintrc.json b/.eslintrc.json
index 29cb65525fb..c8813d5bbf6 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -65,6 +65,17 @@
"varsIgnorePattern": "^_$"
}
],
- "unused-imports/no-unused-imports-ts": "warn"
+ "unused-imports/no-unused-imports-ts": "warn",
+ "no-restricted-imports": [
+ "warn",
+ {
+ "paths": [
+ {
+ "name": "react-i18next",
+ "message": "Please use next-i18next instead of react-i18next."
+ }
+ ]
+ }
+ ]
}
}
diff --git a/.storybook/i18next.ts b/.storybook/i18next.ts
index 9915d3be8d8..1470c134a11 100644
--- a/.storybook/i18next.ts
+++ b/.storybook/i18next.ts
@@ -1,4 +1,5 @@
import i18n, { Resource } from "i18next"
+// eslint-disable-next-line no-restricted-imports
import { initReactI18next } from "react-i18next"
export const baseLocales = {
diff --git a/.storybook/utils.ts b/.storybook/utils.ts
index 56e99af5192..9b523865e1a 100644
--- a/.storybook/utils.ts
+++ b/.storybook/utils.ts
@@ -1,3 +1,4 @@
+// eslint-disable-next-line no-restricted-imports
import { getI18n } from "react-i18next"
import { ns as exposedNs } from "./i18next"
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 00000000000..6d6e6fbff71
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,71 @@
+# Code of conduct
+
+## Mission
+
+To develop and maintain the most comprehensive and accessible knowledge hub for Ethereum.
+
+## Values
+
+The ethereum.org community strives to be:
+
+- educational, intended to help everyone to understand Ethereum
+- inclusive
+- accessible
+- community-driven
+- focused on Ethereum’s underlying technology and use-cases
+- focused on Ethereum concepts and design principles
+
+## What we are not
+
+- The Ethereum Foundation website
+- A platform for promoting investments or profiteering of any kind
+- A platform for elevating or endorsing individual projects or organizations
+- A DEX, CEX or any other form of financial platform
+- A platform that gives financial or legal advice of any kind
+
+## Code of conduct
+
+### Pledge
+
+Open participation is core to the ethereum.org ethos. We are a website and community maintained by thousands of contributors, and this is only possible if we maintain a welcoming, participatory environment. To this end, contributors to this site pledge to maintain a harassment-free environment for all participants across all ethereum.org platforms and community spaces. The ethereum.org community welcomes and values anyone who wants to participate in a constructive and friendly way, regardless of age, disability, ethnicity, sex characteristics, gender identity, level of experience, area of expertise, education, socio-economic status, nationality, personal appearance, race, religion or any other dimension of diversity.
+
+### Scope
+
+This Code of Conduct applies to all ethereum.org spaces (such as GitHub, Discord, Figma, Crowdin, Twitter and other online platforms), and it also applies when the community is represented in real-world public spaces such as at meetups, conferences and events.
+
+### Our standards
+
+Examples of behavior that contributes to creating a positive environment include:
+
+- Using welcoming and inclusive language
+- Being respectful of differing viewpoints and experiences
+- Gracefully accepting and/or empathetically providing constructive criticism
+- Acting calmly and professionally when resolving conflicts or disagreements
+- Showing empathy and tolerance towards other community members
+- Encouraging and amplifying new voices in the community
+
+Examples of unacceptable behavior by participants include:
+
+- Physical violence, threatening physical violence or encouraging of physical violence of any kind
+- Using sexualized language or imagery or imposing unwelcome sexual attention
+- Impersonating another individual or otherwise dishonestly claiming affiliation with some individual or organization
+- Trolling, insulting/derogatory comments, and personal or political attacks
+- Harassing other community members in public or private channels
+- Publishing others’ private information, such as a physical or electronic address, without explicit permission
+- Social engineering, scamming or otherwise manipulating other community members
+- Promoting investments, tokens, projects or anything else for personal monetary or non-monetary gain
+- Spamming servers with off-topic content
+- Disregarding requests or warnings from community moderators
+- Engaging in other conduct which could reasonably be considered inappropriate in a professional setting
+
+### Reporting
+
+Violations of the code of conduct will normally be visible to the community as we try to do everything in open, public channels, allowing community members to self-police.
+
+However, if something happens that you feel needs attention, you can raise it with someone who has a moderation role (e.g. discord guide) so that they can help investigate and execute the appropriate response.
+
+When reporting, please include as much detail as possible, including specific examples and timestamps. This will help to ensure a fair outcome.
+
+### Enforcement
+
+Depending on the severity, people who violate the code of conduct can receive warnings, temporary bans or permanent bans from ethereum.org communities.
diff --git a/README.md b/README.md
index 763720854c1..b1021e5ba9b 100644
--- a/README.md
+++ b/README.md
@@ -1910,6 +1910,8 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Christina 🖋
Nipun Hedaoo 💻
april 📖
+ rafaelss 🖋
+ Preet Parekh 🖋
diff --git a/package.json b/package.json
index 251b03de0f7..083361dbdd2 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ethereum-org-website",
- "version": "9.0.0",
+ "version": "9.0.1",
"license": "MIT",
"private": true,
"scripts": {
@@ -39,6 +39,7 @@
"@radix-ui/react-checkbox": "^1.1.1",
"@radix-ui/react-compose-refs": "^1.1.0",
"@radix-ui/react-dialog": "^1.1.1",
+ "@radix-ui/react-dropdown-menu": "^2.1.1",
"@radix-ui/react-navigation-menu": "^1.2.0",
"@radix-ui/react-popover": "^1.1.1",
"@radix-ui/react-portal": "^1.1.1",
@@ -46,6 +47,7 @@
"@radix-ui/react-radio-group": "^1.2.0",
"@radix-ui/react-slot": "^1.1.0",
"@radix-ui/react-switch": "^1.1.0",
+ "@radix-ui/react-tabs": "^1.1.0",
"@radix-ui/react-tooltip": "^1.1.2",
"@radix-ui/react-visually-hidden": "^1.1.0",
"@socialgouv/matomo-next": "^1.8.0",
diff --git a/public/content/developers/docs/ides/index.md b/public/content/developers/docs/ides/index.md
index b396f4fd70e..94dc345ba90 100644
--- a/public/content/developers/docs/ides/index.md
+++ b/public/content/developers/docs/ides/index.md
@@ -41,12 +41,6 @@ Most established IDEs have built plugins to enhance the Ethereum development exp
- [Code samples](https://github.com/Azure-Samples/blockchain/blob/master/blockchain-workbench/application-and-smart-contract-samples/readme.md)
- [GitHub](https://github.com/microsoft/vscode)
-**Atom -** **_A hackable text editor for the 21st Century_**
-
-- [Atom](https://atom.io/)
-- [GitHub](https://github.com/atom)
-- [Ethereum packages](https://atom.io/packages/search?utf8=%E2%9C%93&q=keyword%3Aethereum&commit=Search)
-
**JetBrains IDEs (IntelliJ IDEA, etc.) -** **_Essential tools for software developers and teams_**
- [JetBrains](https://www.jetbrains.com/)
diff --git a/public/content/developers/docs/networking-layer/portal-network/index.md b/public/content/developers/docs/networking-layer/portal-network/index.md
index b47f6e1ce40..2d4d822267b 100644
--- a/public/content/developers/docs/networking-layer/portal-network/index.md
+++ b/public/content/developers/docs/networking-layer/portal-network/index.md
@@ -76,7 +76,7 @@ The Portal Network clients are:
- [Trin](https://github.com/ethereum/trin): written in Rust
- [Fluffy](https://nimbus.team/docs/fluffy.html): written in Nim
- [Ultralight](https://github.com/ethereumjs/ultralight): written in Typescript
-- [Shisui](https://github.com/GrapeBaBa/shisui): written in Go
+- [Shisui](https://github.com/optimism-java/shisui): written in Go
Having multiple independent client implementations enhances the resilience and decentralization of the Ethereum network.
diff --git a/public/content/developers/docs/nodes-and-clients/index.md b/public/content/developers/docs/nodes-and-clients/index.md
index d5b8819a231..743f178b7bc 100644
--- a/public/content/developers/docs/nodes-and-clients/index.md
+++ b/public/content/developers/docs/nodes-and-clients/index.md
@@ -194,13 +194,13 @@ Learn more about it by reading its [documentation](https://github.com/ethereumjs
There are multiple consensus clients (previously known as 'Eth2' clients) to support the [consensus upgrades](/roadmap/beacon-chain/). They are responsible for all consensus-related logic including the fork-choice algorithm, processing attestations and managing [proof-of-stake](/developers/docs/consensus-mechanisms/pos) rewards and penalties.
| Client | Language | Operating systems | Networks |
-| ------------------------------------------------------------- | ---------- | --------------------- | ----------------------------------------------------------------- | |
+| ------------------------------------------------------------- | ---------- | --------------------- | ----------------------------------------------------------------- |
| [Lighthouse](https://lighthouse.sigmaprime.io/) | Rust | Linux, Windows, macOS | Beacon Chain, Goerli, Pyrmont, Sepolia, Ropsten, and more |
| [Lodestar](https://lodestar.chainsafe.io/) | TypeScript | Linux, Windows, macOS | Beacon Chain, Goerli, Sepolia, Ropsten, and more |
| [Nimbus](https://nimbus.team/) | Nim | Linux, Windows, macOS | Beacon Chain, Goerli, Sepolia, Ropsten, and more |
| [Prysm](https://docs.prylabs.network/docs/getting-started/) | Go | Linux, Windows, macOS | Beacon Chain, Gnosis, Goerli, Pyrmont, Sepolia, Ropsten, and more |
| [Teku](https://consensys.net/knowledge-base/ethereum-2/teku/) | Java | Linux, Windows, macOS | Beacon Chain, Gnosis, Goerli, Sepolia, Ropsten, and more |
-| [Grandine](https://docs.grandine.io/) (beta) | Rust | Linux, Windows, macOS | Beacon Chain, Goerli, Sepolia, and more
+| [Grandine](https://docs.grandine.io/) (beta) | Rust | Linux, Windows, macOS | Beacon Chain, Goerli, Sepolia, and more |
### Lighthouse {#lighthouse}
diff --git a/public/content/translations/ca/roadmap/beacon-chain/index.md b/public/content/translations/ca/roadmap/beacon-chain/index.md
index a49cae9e9fa..091d93d7404 100644
--- a/public/content/translations/ca/roadmap/beacon-chain/index.md
+++ b/public/content/translations/ca/roadmap/beacon-chain/index.md
@@ -62,7 +62,3 @@ Les cadenes de fragments només poden entrar de forma segura a l'ecosistema Ethe
-
-## Interactuar amb la cadena de balisa {#interact-with-beacon-chain}
-
-
diff --git a/public/content/translations/nl/roadmap/beacon-chain/index.md b/public/content/translations/nl/roadmap/beacon-chain/index.md
index 554332d71f8..f79d4b981c1 100644
--- a/public/content/translations/nl/roadmap/beacon-chain/index.md
+++ b/public/content/translations/nl/roadmap/beacon-chain/index.md
@@ -62,7 +62,3 @@ Shardketens kunnen alleen op een veilige manier in het Ethereum-netwerk komen al
-
-## Heb interactie met de Beacon Chain {#interact-with-beacon-chain}
-
-
diff --git a/public/content/translations/sw/roadmap/beacon-chain/index.md b/public/content/translations/sw/roadmap/beacon-chain/index.md
index fa3535dda90..e934864ec32 100644
--- a/public/content/translations/sw/roadmap/beacon-chain/index.md
+++ b/public/content/translations/sw/roadmap/beacon-chain/index.md
@@ -62,7 +62,3 @@ Minyororo ya Vigae itakua salama kuingia katika ikolojia ya Ethereum pale tu uta
-
-## Ingiliana na Mnyororo Kioleza {#interact-with-beacon-chain}
-
-
diff --git a/public/images/dapps/augur.png b/public/images/dapps/augur.png
deleted file mode 100644
index b182acaecb2..00000000000
Binary files a/public/images/dapps/augur.png and /dev/null differ
diff --git a/src/components/AssetDownload/AssetDownloadArtist.tsx b/src/components/AssetDownload/AssetDownloadArtist.tsx
index 1de7487f7d6..483b44df0a6 100644
--- a/src/components/AssetDownload/AssetDownloadArtist.tsx
+++ b/src/components/AssetDownload/AssetDownloadArtist.tsx
@@ -1,9 +1,11 @@
import { useTranslation } from "next-i18next"
-import { Flex } from "@chakra-ui/react"
import Emoji from "@/components/Emoji"
-import Link from "@/components/Link"
-import Text from "@/components/OldText"
+
+import { cn } from "@/lib/utils/cn"
+
+import { Flex } from "../ui/flex"
+import { BaseLink } from "../ui/Link"
type AssetDownloadArtistProps = {
artistName: string
@@ -16,21 +18,13 @@ const AssetDownloadArtist = ({
}: AssetDownloadArtistProps) => {
const { t } = useTranslation("page-assets")
return (
-
-
+
+
{t("page-assets-download-artist")}
- {artistUrl && {artistName}}
- {!artistUrl && {artistName} }
+ {artistUrl && {artistName} }
+ {!artistUrl && {artistName}
}
)
}
diff --git a/src/components/AssetDownload/AssetDownloadImage.tsx b/src/components/AssetDownload/AssetDownloadImage.tsx
index aa374017cf1..e5a7c0b58be 100644
--- a/src/components/AssetDownload/AssetDownloadImage.tsx
+++ b/src/components/AssetDownload/AssetDownloadImage.tsx
@@ -1,6 +1,7 @@
-import { Center } from "@chakra-ui/react"
+import { ImageProps } from "next/image"
-import { Image, type ImageProps } from "@/components/Image"
+import { TwImage } from "../Image"
+import { Center } from "../ui/flex"
interface AssetDownloadImageProps {
image: ImageProps["src"]
@@ -8,8 +9,8 @@ interface AssetDownloadImageProps {
}
const AssetDownloadImage = ({ image, alt }: AssetDownloadImageProps) => (
-
-
+
+
)
diff --git a/src/components/AssetDownload/index.tsx b/src/components/AssetDownload/index.tsx
index 613d8d9eceb..2cc141bf5dc 100644
--- a/src/components/AssetDownload/index.tsx
+++ b/src/components/AssetDownload/index.tsx
@@ -1,17 +1,18 @@
import { extname } from "path"
-import type { StaticImageData } from "next/image"
+import { BaseHTMLAttributes } from "react"
+import type { ImageProps, StaticImageData } from "next/image"
import { useTranslation } from "next-i18next"
-import { Box, Flex, type FlexProps } from "@chakra-ui/react"
import AssetDownloadArtist from "@/components/AssetDownload/AssetDownloadArtist"
import AssetDownloadImage from "@/components/AssetDownload/AssetDownloadImage"
-import { ButtonLink } from "@/components/Buttons"
-import type { ImageProps } from "@/components/Image"
-import OldHeading from "@/components/OldHeading"
+import { cn } from "@/lib/utils/cn"
import { trackCustomEvent } from "@/lib/utils/matomo"
+import { ButtonLink } from "../ui/buttons/Button"
+import { Flex, Stack } from "../ui/flex"
+
type AssetDownloadProps = {
title: string
alt: string
@@ -19,7 +20,7 @@ type AssetDownloadProps = {
artistUrl?: string
image: ImageProps["src"]
svgUrl?: string
-} & FlexProps
+} & BaseHTMLAttributes
const AssetDownload = ({
alt,
@@ -28,6 +29,7 @@ const AssetDownload = ({
image,
svgUrl,
title,
+ className,
...props
}: AssetDownloadProps) => {
const { t } = useTranslation(["page-assets"])
@@ -41,23 +43,18 @@ const AssetDownload = ({
const imgSrc = (image as StaticImageData).src
return (
-
-
- {title}
-
-
+ {title}
+
{artistName && (
)}
-
-
+
+
)}
-
+
)
}
diff --git a/src/components/Banners/BugBountyBanner/index.tsx b/src/components/Banners/BugBountyBanner/index.tsx
index ac5b4c0a23e..14342c2c21e 100644
--- a/src/components/Banners/BugBountyBanner/index.tsx
+++ b/src/components/Banners/BugBountyBanner/index.tsx
@@ -1,17 +1,17 @@
// Libraries
import React from "react"
-import { Center, Text } from "@chakra-ui/react"
// Components
import BannerNotification from "@/components/Banners/BannerNotification"
+import { Center } from "@/components/ui/flex"
const BugBountyBanner = () => (
-
+
All Dencun-related bounties currently receive a 2x bonus multiplier (up
to 500,000 USD) up to two weeks before the scheduled mainnet hardfork.
-
+
)
diff --git a/src/components/Banners/UpgradeBannerNotification.tsx b/src/components/Banners/UpgradeBannerNotification.tsx
index bd1e6928bcf..a4098ff89b1 100644
--- a/src/components/Banners/UpgradeBannerNotification.tsx
+++ b/src/components/Banners/UpgradeBannerNotification.tsx
@@ -1,14 +1,12 @@
-import { Box } from "@chakra-ui/react"
-
import Emoji from "../Emoji"
-import InlineLink from "../Link"
+import InlineLink from "../ui/Link"
import BannerNotification from "./BannerNotification"
const UpgradeBannerNotification = () => (
-
+
We've deprecated our use of 'Eth1' and 'Eth2'
terms.
@@ -16,7 +14,7 @@ const UpgradeBannerNotification = () => (
Read the full announcement
-
+
)
diff --git a/src/components/BeaconChainActions.tsx b/src/components/BeaconChainActions.tsx
deleted file mode 100644
index 75ba2f769e6..00000000000
--- a/src/components/BeaconChainActions.tsx
+++ /dev/null
@@ -1,99 +0,0 @@
-import { useTranslation } from "next-i18next"
-import { Box, Flex } from "@chakra-ui/react"
-
-import { ChildOnlyProp } from "@/lib/types"
-
-import { ButtonLink } from "@/components/Buttons"
-import Card from "@/components/Card"
-import CardList, { type CardListItem } from "@/components/CardList"
-import OldHeading from "@/components/OldHeading"
-import Translation from "@/components/Translation"
-
-import beaconchain from "@/public/images/upgrades/beaconchainemoji.png"
-import beaconscan from "@/public/images/upgrades/etherscan.png"
-
-const H3 = ({ children }: ChildOnlyProp) => (
-
- {children}
-
-)
-
-const BeaconChainActions = () => {
- const { t } = useTranslation(["page-upgrades-index", "page-upgrades"])
-
- const datapoints: CardListItem[] = [
- {
- title: t("consensus-beaconscan-title"),
- image: beaconscan,
- alt: "",
- link: "https://beaconscan.com",
- description: t("consensus-beaconscan-desc"),
- },
- {
- title: t("consensus-beaconscan-in-title"),
- image: beaconchain,
- alt: "",
- link: "https://beaconcha.in",
- description: t("consensus-beaconcha-in-desc"),
- },
- ]
-
- //TODO: we should refactor the naming here instead of using authors into the description field
- const reads: CardListItem[] = [
- {
- title: t("page-upgrade-article-title-two-point-oh"),
- description: t("page-upgrade-article-author-status"),
- link: "https://our.status.im/two-point-oh-the-beacon-chain/",
- },
- {
- title: t("page-upgrade-article-title-beacon-chain-explainer"),
- description: t("page-upgrade-article-author-ethos-dev"),
- link: "https://ethos.dev/beacon-chain/",
- },
- {
- title: t("page-upgrade-article-title-sharding-consensus"),
- description: t("page-upgrade-article-author-ethereum-foundation"),
- link: "https://blog.ethereum.org/2020/03/27/sharding-consensus/",
- },
- ]
-
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- )
-}
-
-export default BeaconChainActions
diff --git a/src/components/ButtonDropdown.tsx b/src/components/ButtonDropdown.tsx
index 57fd8a939bc..57ab13fc5c6 100644
--- a/src/components/ButtonDropdown.tsx
+++ b/src/components/ButtonDropdown.tsx
@@ -1,20 +1,17 @@
-import React, { MouseEvent, useState } from "react"
-import { useTranslation } from "next-i18next"
+import React, { useState } from "react"
import { MdMenu } from "react-icons/md"
-import {
- Button,
- ButtonProps,
- Menu,
- MenuButton,
- MenuItem,
- MenuList,
-} from "@chakra-ui/react"
-// Utils
+import { cn } from "@/lib/utils/cn"
import { trackCustomEvent } from "@/lib/utils/matomo"
-// Components
-import { BaseLink } from "./Link"
+import { Button } from "./ui/buttons/Button"
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuTrigger,
+} from "./ui/dropdown-menu"
+import { BaseLink } from "./ui/Link"
export interface ListItem {
text: string
@@ -33,18 +30,14 @@ export interface List {
items: Array
}
-export type ButtonDropdownProps = ButtonProps & {
+export type ButtonDropdownProps = {
list: List
+ className?: string
}
-const ButtonDropdown = ({ list, ...rest }: ButtonDropdownProps) => {
- const { t } = useTranslation("common")
+const ButtonDropdown = ({ list, className }: ButtonDropdownProps) => {
const [selectedItem, setSelectedItem] = useState(list.text)
- const handleClick = (
- e: MouseEvent,
- item: ListItem,
- idx: number
- ) => {
+ const handleClick = (item: ListItem, idx: number) => {
const { matomo, callback } = item
if (matomo) {
@@ -52,72 +45,59 @@ const ButtonDropdown = ({ list, ...rest }: ButtonDropdownProps) => {
}
if (callback) {
- e.preventDefault()
callback(idx)
}
setSelectedItem(item.text)
}
return (
-
- }
- variant="outline"
- _active={{ bg: "transparent" }}
- {...rest}
- >
- {t(selectedItem)}
-
-
+
+
+
+ {selectedItem}
+
+
+
{list.items.map((item, idx) => {
const { text, href } = item
- return href ? (
-
- handleClick(e, item, idx)}
- p={2}
- textAlign="center"
- justifyContent="center"
- bg="dropdownBackground"
- _hover={{
- color: "primary.base",
- bg: "dropdownBackgroundHover",
- }}
- _focus={{
- color: "primary.base",
- bg: "dropdownBackgroundHover",
- }}
+ if (href) {
+ return (
+ handleClick(item, idx)}
+ asChild
>
- {t(text)}
-
-
- ) : (
- handleClick(e, item, idx)}>
- {t(text)}
-
+
+ {text}
+
+
+ )
+ }
+
+ return (
+ handleClick(item, idx)}
+ >
+ {text}
+
)
})}
-
-
+
+
)
}
diff --git a/src/components/CopyToClipboard.tsx b/src/components/CopyToClipboard.tsx
index 52b768c09d3..bcf61df9432 100644
--- a/src/components/CopyToClipboard.tsx
+++ b/src/components/CopyToClipboard.tsx
@@ -1,4 +1,6 @@
-import { Box, useClipboard } from "@chakra-ui/react"
+import { cn } from "@/lib/utils/cn"
+
+import { useClipboard } from "@/hooks/useClipboard"
export type CopyToClipboardProps = {
text: string
@@ -11,16 +13,15 @@ const CopyToClipboard = ({
text,
inline = false,
}: CopyToClipboardProps) => {
- const { onCopy, hasCopied } = useClipboard(text, { timeout: 1500 })
+ const { onCopy, hasCopied } = useClipboard({ timeout: 1500 })
return (
- onCopy(text)}
>
{children(hasCopied)}
-
+
)
}
diff --git a/src/components/DevconGrantsBanner.tsx b/src/components/DevconGrantsBanner.tsx
index 8548eb55a87..b9c8be6e3ff 100644
--- a/src/components/DevconGrantsBanner.tsx
+++ b/src/components/DevconGrantsBanner.tsx
@@ -1,8 +1,7 @@
-import { Text } from "@chakra-ui/react"
-
import DismissableBanner from "@/components/Banners/DismissableBanner"
import Emoji from "@/components/Emoji"
-import Link from "@/components/Link"
+
+import { BaseLink } from "./ui/Link"
type DevconGrantsBannerProps = {
pathname: string
@@ -12,14 +11,14 @@ const DevconGrantsBanner = ({ pathname }: DevconGrantsBannerProps) => {
if (pathname.includes("community") && pathname.includes("events")) {
return (
-
+
The Road to Devcon Grants support Ethereum education initiatives in
and close to Southeast Asia {" "}
Learn more{" "}
-
+
here.
-
-
+
+
)
}
diff --git a/src/components/EnvWarningBanner.tsx b/src/components/EnvWarningBanner.tsx
index 6a67d95fb3b..ad1c303d181 100644
--- a/src/components/EnvWarningBanner.tsx
+++ b/src/components/EnvWarningBanner.tsx
@@ -1,11 +1,10 @@
import React from "react"
-import { FlexProps } from "@chakra-ui/react"
import InfoBanner from "./InfoBanner"
import Translation from "./Translation"
-const EnvWarningBanner = ({ ...flexProps }: FlexProps) => (
-
+const EnvWarningBanner = () => (
+
)
diff --git a/src/components/EthVideo.tsx b/src/components/EthVideo.tsx
index 6e01cf46cb1..66f477b33c9 100644
--- a/src/components/EthVideo.tsx
+++ b/src/components/EthVideo.tsx
@@ -1,5 +1,4 @@
-import { Box } from "@chakra-ui/react"
-import { useColorModeValue } from "@chakra-ui/react"
+import useColorModeValue from "@/hooks/useColorModeValue"
const EthVideo = () => {
const src = useColorModeValue(
@@ -8,7 +7,7 @@ const EthVideo = () => {
)
return (
-
+
{
loop
muted
/>
-
+
)
}
diff --git a/src/components/FeaturedText/index.tsx b/src/components/FeaturedText/index.tsx
index 754c407e58b..ec73d713b4e 100644
--- a/src/components/FeaturedText/index.tsx
+++ b/src/components/FeaturedText/index.tsx
@@ -1,17 +1,10 @@
-import { Box } from "@chakra-ui/react"
-
import type { ChildOnlyProp } from "@/lib/types"
function FeaturedText({ children }: ChildOnlyProp) {
return (
-
+
{children}
-
+
)
}
diff --git a/src/components/FeedbackWidget/FixedDot.tsx b/src/components/FeedbackWidget/FixedDot.tsx
index aa5c8010625..952470553a7 100644
--- a/src/components/FeedbackWidget/FixedDot.tsx
+++ b/src/components/FeedbackWidget/FixedDot.tsx
@@ -23,7 +23,7 @@ const FixedDot = forwardRef(
data-testid="feedback-widget-button"
aria-label={t("feedback-widget")}
className={cn(
- "lg:mt-inherit sticky bottom-4 z-20 me-4 ms-auto flex size-12 items-center gap-0 rounded-full text-white shadow-table-item-box",
+ "lg:mt-inherit sticky bottom-4 z-overlay me-4 ms-auto flex size-12 items-center gap-0 rounded-full text-white shadow-table-item-box",
"transition-all duration-200 hover:shadow-none hover:transition-transform hover:duration-200",
!suppressScale && "hover:scale-110",
offsetBottom && "bottom-31 lg:bottom-4",
diff --git a/src/components/Glossary/GlossaryDefinition/index.tsx b/src/components/Glossary/GlossaryDefinition/index.tsx
index 274b3e09828..9b68ecfc9b8 100644
--- a/src/components/Glossary/GlossaryDefinition/index.tsx
+++ b/src/components/Glossary/GlossaryDefinition/index.tsx
@@ -31,7 +31,7 @@ const GlossaryDefinition = ({
return (
diff --git a/src/components/Hero/ContentHero/index.tsx b/src/components/Hero/ContentHero/index.tsx
index ba42f38da8f..9df5a3ba499 100644
--- a/src/components/Hero/ContentHero/index.tsx
+++ b/src/components/Hero/ContentHero/index.tsx
@@ -1,42 +1,22 @@
-import { Box, Heading, SimpleGrid, Stack, Text } from "@chakra-ui/react"
-
import type { CommonHeroProps } from "@/lib/types"
import Breadcrumbs from "@/components/Breadcrumbs"
-import { Image } from "@/components/Image"
+import { TwImage } from "@/components/Image"
+import { Stack } from "@/components/ui/flex"
import { CallToAction } from "../CallToAction"
export type ContentHeroProps = Omit, "header">
const ContentHero = (props: ContentHeroProps) => {
- const {
- breadcrumbs,
- heroImg,
- buttons,
- title,
- description,
- blurDataURL,
- maxHeight,
- } = props
+ const { breadcrumbs, heroImg, buttons, title, description, blurDataURL } =
+ props
return (
-
-
-
-
+
+
+ {
height={451}
// TODO: adjust value when the old theme breakpoints are removed (src/theme.ts)
sizes="(max-width: 992px) 100vw, 760px"
- boxSize="full"
- style={{ objectFit: "contain" }}
- flex={{ base: "1 1 100%", md: "none" }}
- maxHeight={451}
/>
-
-
+
+
-
-
- {title}
-
+
+ {title}
{typeof description === "string" ? (
- {description}
+ {description}
) : (
description
)}
{buttons && (
-
+
{buttons.map((button, idx) => {
if (!button) return
return
@@ -75,8 +49,8 @@ const ContentHero = (props: ContentHeroProps) => {
* Add conditional Big Stat box here
*/}
-
-
+
+
)
}
diff --git a/src/components/Hero/MdxHero/index.tsx b/src/components/Hero/MdxHero/index.tsx
index a560fab7da5..fd101c48ce9 100644
--- a/src/components/Hero/MdxHero/index.tsx
+++ b/src/components/Hero/MdxHero/index.tsx
@@ -1,17 +1,14 @@
-import { Heading, Stack } from "@chakra-ui/react"
-
import type { CommonHeroProps } from "@/lib/types"
import Breadcrumbs from "@/components/Breadcrumbs"
+import { Stack } from "@/components/ui/flex"
export type MdxHeroProps = Pick
const MdxHero = ({ breadcrumbs, title }: MdxHeroProps) => (
-
+
-
- {title}
-
+ {title}
)
diff --git a/src/components/Homepage/useHome.ts b/src/components/Homepage/useHome.ts
index 09f75ed791a..e5c70f57b85 100644
--- a/src/components/Homepage/useHome.ts
+++ b/src/components/Homepage/useHome.ts
@@ -146,14 +146,14 @@ export const useHome = () => {
{
label: t("page-index:page-index-popular-topics-whitepaper"),
Svg: Whitepaper,
- className: cn(isRtl && "[&_svg]:-scale-x-100"),
+ className: cn(isRtl && "[&_div_div:has(svg)]:-scale-x-100"),
href: "/whitepaper/",
eventName: "whitepaper",
},
{
label: t("page-index:page-index-popular-topics-roadmap"),
Svg: RoadmapSign,
- className: cn(isRtl && "[&_svg]:-scale-x-100"),
+ className: cn(isRtl && "[&_div_div:has(svg)]:-scale-x-100 "),
href: "/roadmap/",
eventName: "roadmap",
},
diff --git a/src/components/IdAnchor.tsx b/src/components/IdAnchor.tsx
index 72569a8bed2..ea151b87b93 100644
--- a/src/components/IdAnchor.tsx
+++ b/src/components/IdAnchor.tsx
@@ -1,23 +1,17 @@
import { CiLink } from "react-icons/ci"
-import { Icon } from "@chakra-ui/react"
-import Link from "@/components/Link"
+import { BaseLink } from "@/components/ui/Link"
const IdAnchor = ({ id }: { id?: string }) => {
if (!id) return null
return (
-
-
-
+
+
)
}
diff --git a/src/components/LearningToolsCardGrid.tsx b/src/components/LearningToolsCardGrid.tsx
index 28165f156bf..747579abdfd 100644
--- a/src/components/LearningToolsCardGrid.tsx
+++ b/src/components/LearningToolsCardGrid.tsx
@@ -1,5 +1,4 @@
import React from "react"
-import { Grid } from "@chakra-ui/react"
import { LearningToolsCardGridProps } from "@/lib/types"
@@ -8,11 +7,7 @@ import Translation from "./Translation"
const LearningToolsCardGrid = ({ category }: LearningToolsCardGridProps) => {
return (
-
+
{category
.sort(({ locales }) => (locales?.length ? -1 : 0))
.map(({ name, description, background, url, alt, image, subjects }) => (
@@ -28,7 +23,7 @@ const LearningToolsCardGrid = ({ category }: LearningToolsCardGridProps) => {
))}
-
+
)
}
diff --git a/src/components/LeftNavBar/index.tsx b/src/components/LeftNavBar/index.tsx
index ee654d9280e..d2f95aa9920 100644
--- a/src/components/LeftNavBar/index.tsx
+++ b/src/components/LeftNavBar/index.tsx
@@ -32,7 +32,10 @@ const LeftNavBar = ({
>
{dropdownLinks && (
-
+
)}
diff --git a/src/components/MarkdownImage.tsx b/src/components/MarkdownImage.tsx
index 31b8528c5c0..28eb16ac05b 100644
--- a/src/components/MarkdownImage.tsx
+++ b/src/components/MarkdownImage.tsx
@@ -1,14 +1,13 @@
import { extname } from "path"
-import { Flex } from "@chakra-ui/react"
-
-import { Image, type ImageProps } from "@/components/Image"
-import Link from "@/components/Link"
+import { type ImageProps, TwImage } from "@/components/Image"
import { toPosixPath } from "@/lib/utils/relativePath"
import { CONTENT_IMAGES_MAX_WIDTH } from "@/lib/constants"
+import InlineLink from "./ui/Link"
+
interface MarkdownImageProps extends Omit {
width: string
height: string
@@ -42,20 +41,25 @@ const MarkdownImage = ({
return (
// display the wrapper as a `span` to avoid dom nesting warnings as mdx
// sometimes wraps images in `p` tags
-
-
-
+
+
-
-
+
+
)
}
diff --git a/src/components/MdComponents/MdComponents.stories.tsx b/src/components/MdComponents/MdComponents.stories.tsx
index 9d101a7334d..52db25e5037 100644
--- a/src/components/MdComponents/MdComponents.stories.tsx
+++ b/src/components/MdComponents/MdComponents.stories.tsx
@@ -1,8 +1,6 @@
import pickBy from "lodash/pickBy"
import type { Meta, StoryObj } from "@storybook/react/*"
-import type { List as ButtonDropdownList } from "@/components/ButtonDropdown"
-
import { viewportModes } from "../../../.storybook/modes"
import MdComponentSet from "."
@@ -34,8 +32,6 @@ const {
hr: HR,
pre: Pre,
Page,
- MobileButton,
- MobileButtonDropdown,
} = MdComponentSet
const Para = () => (
@@ -53,9 +49,6 @@ export const MdComponents: StoryObj = {
-
-
-
Heading1
Heading2
@@ -75,55 +68,3 @@ export const MdComponents: StoryObj = {
),
}
-
-const roadmapDropdownLinks: ButtonDropdownList = {
- text: "nav-roadmap-options",
- ariaLabel: "nav-roadmap-options-alt",
- items: [
- {
- text: "nav-roadmap-home",
- href: "/roadmap/",
- matomo: {
- eventCategory: `Roadmap dropdown`,
- eventAction: `Clicked`,
- eventName: "clicked roadmap home",
- },
- },
- {
- text: "nav-roadmap-security",
- href: "/roadmap/security",
- matomo: {
- eventCategory: `Roadmap security dropdown`,
- eventAction: `Clicked`,
- eventName: "clicked roadmap security",
- },
- },
- {
- text: "nav-roadmap-scaling",
- href: "/roadmap/scaling",
- matomo: {
- eventCategory: `Roadmap scaling dropdown`,
- eventAction: `Clicked`,
- eventName: "clicked roadmap scaling home",
- },
- },
- {
- text: "nav-roadmap-user-experience",
- href: "/roadmap/user-experience/",
- matomo: {
- eventCategory: `Roadmap user experience dropdown`,
- eventAction: `Clicked`,
- eventName: "clicked roadmap user experience home",
- },
- },
- {
- text: "nav-roadmap-future-proofing",
- href: "/roadmap/future-proofing",
- matomo: {
- eventCategory: `Roadmap future-proofing dropdown`,
- eventAction: `Clicked`,
- eventName: "clicked roadmap future-proofing home",
- },
- },
- ],
-}
diff --git a/src/components/MdComponents/index.tsx b/src/components/MdComponents/index.tsx
index e9ec3c529a3..18f90ad1f14 100644
--- a/src/components/MdComponents/index.tsx
+++ b/src/components/MdComponents/index.tsx
@@ -1,11 +1,8 @@
-import { ComponentProps, type HTMLAttributes } from "react"
+import { type HTMLAttributes } from "react"
import { Badge, Box, type BoxProps } from "@chakra-ui/react"
import type { ChildOnlyProp } from "@/lib/types"
-import ButtonDropdown, {
- type ButtonDropdownProps,
-} from "@/components/ButtonDropdown"
import Contributors from "@/components/Contributors"
import MarkdownImage from "@/components/MarkdownImage"
import TooltipLink from "@/components/TooltipLink"
@@ -36,7 +33,7 @@ export const commonHeadingAttributes = (className: string, id?: string) => ({
id,
className: cn(
"font-bold leading-xs my-8",
- id && "scroll-mt-28 relative",
+ id && "scroll-mt-28 relative group",
className
),
"data-group": !!id || undefined,
@@ -155,32 +152,6 @@ export const ContentContainer = (props: Pick) => {
)
}
-export const MobileButton = (props: ChildOnlyProp) => {
- return (
-
- )
-}
-
-export const StyledButtonDropdown = ({
- list,
- className,
- ...rest
-}: HTMLAttributes & Pick) => (
-
-
-
-)
-
-export const MobileButtonDropdown = ({
- className,
- ...props
-}: ComponentProps) => (
-
-)
-
// All custom React components
export const reactComponents = {
Badge,
@@ -196,11 +167,8 @@ export const reactComponents = {
FeaturedText,
GlossaryTooltip,
InfoBanner,
- MobileButton,
- MobileButtonDropdown,
Page,
QuizWidget: StandaloneQuizWidget,
- StyledButtonDropdown,
IssuesList,
Title,
YouTube,
diff --git a/src/components/MergeArticleList.tsx b/src/components/MergeArticleList.tsx
index 7408c027615..10b3f03dfae 100644
--- a/src/components/MergeArticleList.tsx
+++ b/src/components/MergeArticleList.tsx
@@ -1,5 +1,4 @@
import { useTranslation } from "next-i18next"
-import { Box } from "@chakra-ui/react"
import CardList, { type CardListItem } from "@/components/CardList"
@@ -78,9 +77,9 @@ const MergeArticleList = () => {
]
return (
-
+
-
+
)
}
diff --git a/src/components/MobileButtonDropdown.tsx b/src/components/MobileButtonDropdown.tsx
new file mode 100644
index 00000000000..bc53f5ebdf7
--- /dev/null
+++ b/src/components/MobileButtonDropdown.tsx
@@ -0,0 +1,11 @@
+import ButtonDropdown, { type ButtonDropdownProps } from "./ButtonDropdown"
+
+const MobileButtonDropdown = (props: ButtonDropdownProps) => {
+ return (
+
+
+
+ )
+}
+
+export default MobileButtonDropdown
diff --git a/src/components/Staking/StakingConsiderations/index.tsx b/src/components/Staking/StakingConsiderations/index.tsx
index ceca0aeed77..ed0f0d9b1ef 100644
--- a/src/components/Staking/StakingConsiderations/index.tsx
+++ b/src/components/Staking/StakingConsiderations/index.tsx
@@ -76,7 +76,7 @@ const StakingConsiderations = ({ page }: StakingConsiderationsProps) => {
return (
-
+
{/* TODO: Improve a11y */}
{!!pageData && (
diff --git a/src/components/StatErrorMessage.tsx b/src/components/StatErrorMessage.tsx
index 58f7797554f..2dd5eebb856 100644
--- a/src/components/StatErrorMessage.tsx
+++ b/src/components/StatErrorMessage.tsx
@@ -1,12 +1,16 @@
-import type { TextProps } from "@chakra-ui/react"
+import { HTMLAttributes } from "react"
+
+import { cn } from "@/lib/utils/cn"
-import Text from "./OldText"
import Translation from "./Translation"
-const StatErrorMessage = (props: TextProps) => (
-
+const StatErrorMessage = ({
+ className,
+ ...props
+}: HTMLAttributes) => (
+
-
+
)
export default StatErrorMessage
diff --git a/src/components/Tabs.tsx b/src/components/Tabs.tsx
deleted file mode 100644
index 01eed98203c..00000000000
--- a/src/components/Tabs.tsx
+++ /dev/null
@@ -1,45 +0,0 @@
-import React, { ReactNode } from "react"
-import {
- Tab,
- TabList,
- TabPanel,
- TabPanels,
- Tabs as ChakraTabs,
-} from "@chakra-ui/react"
-
-interface Tab {
- title: string
- content: ReactNode
-}
-
-export type TabsProps = {
- tabs: Array
- onTabClick?: (tabIndex: number) => void
-}
-
-const Tabs = ({ tabs, onTabClick }: TabsProps) => {
- const handleTabClick = (index: number) => {
- if (onTabClick) {
- onTabClick(index)
- }
- }
-
- return (
-
-
- {tabs.map((tab, index) => (
- handleTabClick(index)}>
- {tab.title}
-
- ))}
-
-
- {tabs.map((tab, index) => (
- {tab.content}
- ))}
-
-
- )
-}
-
-export default Tabs
diff --git a/src/components/TranslationChartImage/index.tsx b/src/components/TranslationChartImage/index.tsx
index f819899b6b8..d7d5f8e07b7 100644
--- a/src/components/TranslationChartImage/index.tsx
+++ b/src/components/TranslationChartImage/index.tsx
@@ -1,7 +1,6 @@
-import { useColorModeValue } from "@chakra-ui/react"
-
import { TwImage } from "@/components/Image"
+import useColorModeValue from "@/hooks/useColorModeValue"
import pageviewsDark from "@/public/images/translation-program/pageviews-dark.png"
import pageviewsLight from "@/public/images/translation-program/pageviews-light.png"
diff --git a/src/components/YouTube.tsx b/src/components/YouTube.tsx
index 1eb42ff7ba9..52b2e92405f 100644
--- a/src/components/YouTube.tsx
+++ b/src/components/YouTube.tsx
@@ -1,6 +1,5 @@
import React from "react"
import LiteYouTubeEmbed from "react-lite-youtube-embed"
-import { Box } from "@chakra-ui/react"
import "react-lite-youtube-embed/dist/LiteYouTubeEmbed.css"
@@ -24,7 +23,7 @@ const YouTube = ({ id, start = "0", title = "YouTube" }: YouTubeProps) => {
const params = new URLSearchParams()
;+start > 0 && params.set("start", start)
return (
-
+
{
params={params.toString()}
noCookie
/>
-
+
)
}
diff --git a/src/components/ui/__stories__/Tag.stories.tsx b/src/components/ui/__stories__/Tag.stories.tsx
new file mode 100644
index 00000000000..230422b56e1
--- /dev/null
+++ b/src/components/ui/__stories__/Tag.stories.tsx
@@ -0,0 +1,37 @@
+import { Meta, StoryObj } from "@storybook/react"
+
+import { HStack, VStack } from "../flex"
+import { Tag } from "../tag"
+
+const meta = {
+ title: "Molecules / Display Content / New Tags",
+ component: Tag,
+} satisfies Meta
+
+export default meta
+
+type Story = StoryObj
+
+// "normal" is default status
+const statusArray = ["normal", "tag", "success", "error", "warning"] as const
+
+// "subtle" is default variant
+const variantArray = ["subtle", "highContrast", "solid", "outline"] as const
+
+const StyleVariantList = () => (
+
+ {statusArray.map((status) => (
+
+ {variantArray.map((variant) => (
+
+ Tag Name
+
+ ))}
+
+ ))}
+
+)
+
+export const StyleVariantsBasic: Story = {
+ render: (args) => ,
+}
diff --git a/src/components/ui/dropdown-menu.tsx b/src/components/ui/dropdown-menu.tsx
new file mode 100644
index 00000000000..4e2d58bece1
--- /dev/null
+++ b/src/components/ui/dropdown-menu.tsx
@@ -0,0 +1,198 @@
+import * as React from "react"
+import { MdCheck, MdChevronRight, MdCircle } from "react-icons/md"
+import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"
+
+import { cn } from "@/lib/utils/cn"
+
+const DropdownMenu = DropdownMenuPrimitive.Root
+
+const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger
+
+const DropdownMenuGroup = DropdownMenuPrimitive.Group
+
+const DropdownMenuPortal = DropdownMenuPrimitive.Portal
+
+const DropdownMenuSub = DropdownMenuPrimitive.Sub
+
+const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup
+
+const DropdownMenuSubTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean
+ }
+>(({ className, inset, children, ...props }, ref) => (
+
+ {children}
+
+
+))
+DropdownMenuSubTrigger.displayName =
+ DropdownMenuPrimitive.SubTrigger.displayName
+
+const DropdownMenuSubContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+DropdownMenuSubContent.displayName =
+ DropdownMenuPrimitive.SubContent.displayName
+
+const DropdownMenuContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, sideOffset = 4, ...props }, ref) => (
+
+
+
+))
+DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName
+
+const DropdownMenuItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean
+ }
+>(({ className, inset, ...props }, ref) => (
+
+))
+DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName
+
+const DropdownMenuCheckboxItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, checked, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+))
+DropdownMenuCheckboxItem.displayName =
+ DropdownMenuPrimitive.CheckboxItem.displayName
+
+const DropdownMenuRadioItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+))
+DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName
+
+const DropdownMenuLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean
+ }
+>(({ className, inset, ...props }, ref) => (
+
+))
+DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName
+
+const DropdownMenuSeparator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName
+
+const DropdownMenuShortcut = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => {
+ return (
+
+ )
+}
+DropdownMenuShortcut.displayName = "DropdownMenuShortcut"
+
+export {
+ DropdownMenu,
+ DropdownMenuCheckboxItem,
+ DropdownMenuContent,
+ DropdownMenuGroup,
+ DropdownMenuItem,
+ DropdownMenuLabel,
+ DropdownMenuPortal,
+ DropdownMenuRadioGroup,
+ DropdownMenuRadioItem,
+ DropdownMenuSeparator,
+ DropdownMenuShortcut,
+ DropdownMenuSub,
+ DropdownMenuSubContent,
+ DropdownMenuSubTrigger,
+ DropdownMenuTrigger,
+}
diff --git a/src/components/ui/tabs.tsx b/src/components/ui/tabs.tsx
new file mode 100644
index 00000000000..5908c8879ef
--- /dev/null
+++ b/src/components/ui/tabs.tsx
@@ -0,0 +1,53 @@
+import * as React from "react"
+import * as TabsPrimitive from "@radix-ui/react-tabs"
+
+import { cn } from "@/lib/utils/cn"
+
+const Tabs = TabsPrimitive.Root
+
+const TabsList = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+TabsList.displayName = TabsPrimitive.List.displayName
+
+const TabsTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+TabsTrigger.displayName = TabsPrimitive.Trigger.displayName
+
+const TabsContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+TabsContent.displayName = TabsPrimitive.Content.displayName
+
+export { Tabs, TabsContent, TabsList, TabsTrigger }
diff --git a/src/components/ui/tag.tsx b/src/components/ui/tag.tsx
new file mode 100644
index 00000000000..657c3a60254
--- /dev/null
+++ b/src/components/ui/tag.tsx
@@ -0,0 +1,109 @@
+import { cva, VariantProps } from "class-variance-authority"
+import { Slot } from "@radix-ui/react-slot"
+
+import { cn } from "@/lib/utils/cn"
+
+const tagVariants = cva(
+ "inline-flex items-center rounded-full border px-2 py-0.5 min-h-8 text-xs uppercase transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
+ {
+ variants: {
+ status: {
+ normal: "bg-background-highlight text-body-medium border-body-medium",
+ tag: "bg-primary-low-contrast text-primary-high-contrast border-primary",
+ success: "bg-success-light text-success border-success-border",
+ error: "bg-error-light text-error border-error-border",
+ warning: "bg-warning-light text-warning-dark border-warning-border",
+ },
+ variant: {
+ subtle: "border-transparent",
+ highContrast: "border-transparent",
+ solid: "border-transparent text-body-inverse",
+ outline: "bg-transparent",
+ },
+ },
+ compoundVariants: [
+ {
+ variant: "solid",
+ status: "normal",
+ className: "bg-body-medium",
+ },
+ {
+ variant: "solid",
+ status: "tag",
+ className: "bg-primary",
+ },
+ {
+ variant: "solid",
+ status: "success",
+ className: "bg-success text-success-light",
+ },
+ {
+ variant: "solid",
+ status: "error",
+ className: "bg-error text-error-light",
+ },
+ {
+ variant: "solid",
+ status: "warning",
+ className: "bg-warning text-warning-dark",
+ },
+ {
+ variant: "highContrast",
+ status: "normal",
+ className: "bg-body-light text-body",
+ },
+ {
+ variant: "highContrast",
+ status: "tag",
+ className: "bg-background-highlight",
+ },
+ {
+ variant: "highContrast",
+ status: "success",
+ className: "text-success-dark",
+ },
+ {
+ variant: "highContrast",
+ status: "error",
+ className: "text-error-dark",
+ },
+ {
+ variant: "outline",
+ status: "success",
+ className: "text-success-border",
+ },
+ {
+ variant: "outline",
+ status: "error",
+ className: "text-error-border",
+ },
+ {
+ variant: "outline",
+ status: "warning",
+ className: "text-warning-border",
+ },
+ ],
+ defaultVariants: {
+ variant: "subtle",
+ status: "normal",
+ },
+ }
+)
+
+export interface TagProps
+ extends React.HTMLAttributes,
+ VariantProps {
+ asChild?: boolean
+}
+
+function Tag({ className, asChild, variant, status, ...props }: TagProps) {
+ const Comp = asChild ? Slot : "div"
+ return (
+
+ )
+}
+
+export { Tag }
diff --git a/src/data/community-events.json b/src/data/community-events.json
index e84cebf131e..26f2983e4d4 100644
--- a/src/data/community-events.json
+++ b/src/data/community-events.json
@@ -658,7 +658,7 @@
"endDate": "2024-12-3",
"imageUrl": "https://ethriyadh.com/banner.jpg"
},
-{
+ {
"title": "ETH Pura Vida 2024",
"href": "https://ethereum.cr/",
"location": "San Jose, Costa Rica",
@@ -666,4 +666,14 @@
"startDate": "2024-10-19",
"endDate": "2024-10-26",
"imageUrl": "https://ethereum.cr/assets/eth-pura-vida/eth-pura-vida-desktop-graphic.svg"
+ },
+ {
+ "title": "ETHIndia 2024",
+ "href": "https://ethindia.co/",
+ "location": "Bengaluru, India",
+ "description": "ETHIndia is a hackathon — a movement with the goal of inspiring and fostering a community of builders promoting technological advancements for Ethereum.",
+ "startDate": "2024-12-6",
+ "endDate": "2024-12-8",
+ "imageUrl": "https://ethindia.co/assets/images/og-image.png"
+ }
]
diff --git a/src/data/crowdin/combined-translators.json b/src/data/crowdin/combined-translators.json
index 79ed0a75bc5..bf0c4d26154 100644
--- a/src/data/crowdin/combined-translators.json
+++ b/src/data/crowdin/combined-translators.json
@@ -69564,6 +69564,12 @@
"totalCosts": 39.39,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14045960/medium/01a57dd06ba1a0e6203aff54f82e00f3.jpeg"
},
+ {
+ "id": 16597191,
+ "username": "tr.eternallove.nt20405",
+ "totalCosts": 35.35,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16597191/medium/d053f9e0e596c2557d05866013f64f4c.png"
+ },
{
"id": 16373356,
"username": "minhbom141",
@@ -83109,7 +83115,7 @@
{
"id": 13672373,
"username": "comme.le.gnu",
- "totalCosts": 609.03,
+ "totalCosts": 681.75,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13672373/medium/9921ca5aa36af788bfd5fc5a898fbf43.jpg"
}
]
diff --git a/src/data/placeholders/content-guides-how-to-create-an-ethereum-account-data.json b/src/data/placeholders/content-guides-how-to-create-an-ethereum-account-data.json
index fe1b90a0354..aa798ec5e8f 100644
--- a/src/data/placeholders/content-guides-how-to-create-an-ethereum-account-data.json
+++ b/src/data/placeholders/content-guides-how-to-create-an-ethereum-account-data.json
@@ -1,6 +1,6 @@
{
"/content/guides/how-to-create-an-ethereum-account/wallet-box.png": {
- "hash": "9feaf357",
- "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAHCAYAAAABIM1CAAAACXBIWXMAABYlAAAWJQFJUiTwAAABeklEQVR4nGWQv0sbARzFb1Gc/JFULxC9hCY0huT0FOMQU2hJNcRLYk6JJv7mzkCuuhQhYEmHjIWO2RwcnIRSEYU6OcTAgX+CIgoZXdq94VNykkEcHt/Hd/jw3hN+1k/QDZ1qtcquaWIYOqZp8tksUakc2H6/XGY2HkcOh4lEpgiOBlla1mjcXiEcXx5Rq9X414KGdcPZxW/u7h+5qjd4+vOXVqtFs9kknV1EdEuMKRMvAefWKT7fWyb9I+xpcZY/RJiblimq71mIjtM/4MQvudlOxvixl2d6PEhXdw+ZxRTWQ/0ZEAqFiE3KfN9d55uRY1P9yOHXEl/yKQaHRMKj79hMf6K8kWFmagxRdL0GzKsZNvQdtJUCW7pBMrNE/6ALlygSjc5QLJls6UXyhYK9xYsKiqIgSRJyOITf58Pr8fDG6aSvt9f+D7vdtm9fh8OBIAio2STWwzXCmfWLRCJBLpdD0zTW11ZJp1QCgYCtdrqO78jr8doJ2hX+A2R85qAN4BZDAAAAAElFTkSuQmCC"
+ "hash": "eb0a1014",
+ "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAFCAYAAABM6GxJAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA7klEQVR4nH2PMUuFYBSGv9nFGlxc1Q8ER4cbTi4OtrT4NxzChvwBeQlsuEhBhWX3RtDgcGlpSNojt0vR0uzQL2h4up9EEEHDw8t5eTnnPcL3fcIwROlkMlmzRRRFo2cYBkKI/2mahr7vWVzP6R472rZlGAZWqxWe540hXdfZ0DfRNO0PwrElZ7NbHpbPVIc1T907O9sJtmOPjaSUHB1UfH7A3u4+QRAQx/HYUCHU8PryxmJ+w2V9xd3ynpPjU6pqRpIkWJZFURTU5xdrnZJlGXmeU5YlaZoiVEBtktIZryl1XfcH0zS/ffnLV+8p/QJlLJqxJ5CtqQAAAABJRU5ErkJggg=="
}
}
\ No newline at end of file
diff --git a/src/data/published.json b/src/data/published.json
index 24c1298dc1e..90dc855f7e7 100644
--- a/src/data/published.json
+++ b/src/data/published.json
@@ -1 +1 @@
-{"date":"2024-09-18"}
+{"date":"2024-10-02"}
diff --git a/src/data/wallets/wallet-data.ts b/src/data/wallets/wallet-data.ts
index ecf253f3893..46f62df074d 100644
--- a/src/data/wallets/wallet-data.ts
+++ b/src/data/wallets/wallet-data.ts
@@ -1892,7 +1892,7 @@ export const walletsData: WalletData[] = [
"https://docs.getaurox.com/product-docs/aurox-ecosystem/what-is-the-aurox-ecosystem",
},
{
- last_updated: "2024-06-07",
+ last_updated: "2024-09-09",
name: "ShapeShift Mobile",
image: ShapeShiftImage,
brand_color: "#386FF9",
@@ -1940,7 +1940,7 @@ export const walletsData: WalletData[] = [
layer_2: true,
gas_fee_customization: true,
ens_support: true,
- erc_20_support: false,
+ erc_20_support: true,
buy_crypto: true,
withdraw_crypto: true,
multisig: false,
diff --git a/src/intl/en/page-dapps.json b/src/intl/en/page-dapps.json
index e91d21c8a70..b8f753d3e42 100644
--- a/src/intl/en/page-dapps.json
+++ b/src/intl/en/page-dapps.json
@@ -7,7 +7,6 @@
"page-dapps-api3-logo-alt": "API3 logo",
"page-dapps-arweave-logo-alt": "ARweave logo",
"page-dapps-audius-logo-alt": "Audius logo",
- "page-dapps-augur-logo-alt": "Augur logo",
"page-dapps-axie-infinity-logo-alt": "Axie Infinity logo",
"page-dapps-balancer-logo-alt": "Balancer logo",
"page-dapps-brave-logo-alt": "Brave logo",
@@ -41,7 +40,7 @@
"page-dapps-choose-category": "Choose category",
"page-dapps-category-social": "Social media",
"page-dapps-category-content": "Content",
- "page-dapps-category-community": "Community",
+ "page-dapps-category-community": "Community",
"page-dapps-category-messaging": "Messaging",
"page-dapps-category-identity": "Identity",
"page-dapps-collectibles-benefits-1-description": "When art is tokenised on Ethereum, ownership can be proved for all to see. You can trace the artwork's journey from creation to its current holder. This prevents forgeries.",
@@ -69,7 +68,6 @@
"page-dapps-dapp-description-arweave": "Store data permanently, sustainably, with a single upfront fee.",
"page-dapps-dapp-description-async-art": "Create, collect, and trade #ProgrammableArt - digital paintings split into “Layers” which you can use to affect the overall image. Each Master and Layer is an ERC721 token.",
"page-dapps-dapp-description-audius": "Decentralized streaming platform. Listens = money for creators, not labels.",
- "page-dapps-dapp-description-augur": "Bet on outcomes of sports, economics, and more world events.",
"page-dapps-dapp-description-axie-infinity": "Trade and battle creatures called Axies. And earn as you play – available on mobile",
"page-dapps-dapp-description-balancer": "Balancer is an automated portfolio manager and trading platform.",
"page-dapps-dapp-description-brave": "Earn tokens for browsing and support your favorite creators with them.",
@@ -221,7 +219,7 @@
"page-dapps-marble-cards-logo-alt": "marble.cards logo",
"page-dapps-async-logo-alt": "Async logo",
"page-dapps-matcha-logo-alt": "Matcha logo",
- "page-dapps-meeds-logo-alt": "Meeds logo",
+ "page-dapps-meeds-logo-alt": "Meeds logo",
"page-dapps-metaverse-benefits-title": "metaverse",
"page-dapps-metaverse-benefits-description": "What is it about Ethereum that allows the metaverse to thrive?",
"page-dapps-metaverse-benefits-1-title": "NFTs",
diff --git a/src/layouts/ContentLayout.tsx b/src/layouts/ContentLayout.tsx
index b2ed18fe549..230d5d5bcf0 100644
--- a/src/layouts/ContentLayout.tsx
+++ b/src/layouts/ContentLayout.tsx
@@ -2,12 +2,8 @@ import type { HTMLAttributes } from "react"
import FeedbackCard from "@/components/FeedbackCard"
import LeftNavBar, { LeftNavBarProps } from "@/components/LeftNavBar"
-import {
- ContentContainer,
- MobileButton,
- MobileButtonDropdown,
- Page,
-} from "@/components/MdComponents"
+import { ContentContainer, Page } from "@/components/MdComponents"
+import MobileButtonDropdown from "@/components/MobileButtonDropdown"
type ContentLayoutProps = HTMLAttributes &
Pick & {
@@ -40,11 +36,7 @@ export const ContentLayout = ({
- {dropdownLinks && (
-
-
-
- )}
+ {dropdownLinks && }
)
diff --git a/src/layouts/Docs.tsx b/src/layouts/Docs.tsx
index a6d7d1d591f..32263f6437a 100644
--- a/src/layouts/Docs.tsx
+++ b/src/layouts/Docs.tsx
@@ -1,16 +1,6 @@
import { useRouter } from "next/router"
import type { HTMLAttributes } from "react"
-import {
- Badge,
- Box,
- type BoxProps,
- Flex,
- type FlexProps,
- type ListProps,
- OrderedList as ChakraOrderedList,
- UnorderedList as ChakraUnorderedList,
- useToken,
-} from "@chakra-ui/react"
+import { Badge } from "@chakra-ui/react"
import { ChildOnlyProp } from "@/lib/types"
import type { DocsFrontmatter, MdPageContent } from "@/lib/interfaces"
@@ -27,14 +17,12 @@ import FeedbackCard from "@/components/FeedbackCard"
import FileContributors from "@/components/FileContributors"
import GlossaryTooltip from "@/components/Glossary/GlossaryTooltip"
import InfoBanner from "@/components/InfoBanner"
-import Link from "@/components/Link"
import MainArticle from "@/components/MainArticle"
import {
Heading1 as MdHeading1,
Heading2 as MdHeading2,
Heading3 as MdHeading3,
Heading4 as MdHeading4,
- Paragraph,
} from "@/components/MdComponents"
import RollupProductDevDoc from "@/components/RollupProductDevDoc"
import SideNav from "@/components/SideNav"
@@ -42,37 +30,15 @@ import SideNavMobile from "@/components/SideNavMobile"
import TableOfContents from "@/components/TableOfContents"
import Translation from "@/components/Translation"
import { Divider } from "@/components/ui/divider"
+import InlineLink from "@/components/ui/Link"
import { mdxTableComponents } from "@/components/ui/Table"
import YouTube from "@/components/YouTube"
import { cn } from "@/lib/utils/cn"
import { getEditPath } from "@/lib/utils/editPath"
-const Page = (props: ChildOnlyProp & Pick) => (
-
-)
-
-type ContentContainerProps = Pick
-
-const ContentContainer = (props: ContentContainerProps) => (
-
-)
-
-const baseHeadingClasses = "font-mono uppercase font-bold scroll-mt-40"
+const baseHeadingClasses =
+ "font-mono uppercase font-bold scroll-mt-40 break-words"
const H1 = (props: HTMLAttributes) => (
) => (
/>
)
-const baseSubHeadingClasses = "leading-xs font-semibold"
+const baseSubHeadingClasses = "leading-xs font-semibold break-words"
const H3 = (props: HTMLAttributes) => (
@@ -101,51 +67,12 @@ const H4 = (props: HTMLAttributes) => (
)
-const UnorderedList = (props: ListProps) => (
-
-)
-const OrderedList = (props: ListProps) => (
-
-)
-
-// Apply styles for classes within markdown here
-const Content = (props: ChildOnlyProp) => {
- const mdBreakpoint = useToken("breakpoints", "md")
-
- return (
-
- )
-}
-
const BackToTop = (props: ChildOnlyProp) => (
-
-
+
+
↑
-
-
+
+
)
export const docsComponents = {
@@ -153,9 +80,6 @@ export const docsComponents = {
h2: H2,
h3: H3,
h4: H4,
- p: Paragraph,
- ul: UnorderedList,
- ol: OrderedList,
pre: Codeblock,
...mdxTableComponents,
Badge,
@@ -197,16 +121,19 @@ export const DocsLayout = ({
const absoluteEditPath = getEditPath(relativePath)
return (
-
+
{isPageIncomplete && (
)}
-
+
-
+
{frontmatter.title}
- {children}
+
+ {children}
+
{isPageIncomplete && }
-
+
{tocItems && (
)}
-
-
+
+
)
}
diff --git a/src/layouts/Tutorial.tsx b/src/layouts/Tutorial.tsx
index 087f9fe9492..8fc1bcdba0e 100644
--- a/src/layouts/Tutorial.tsx
+++ b/src/layouts/Tutorial.tsx
@@ -1,15 +1,6 @@
import { useRouter } from "next/router"
import type { HTMLAttributes } from "react"
-import {
- Badge,
- Box,
- type BoxProps,
- Flex,
- Kbd,
- Text,
- type TextProps,
- useToken,
-} from "@chakra-ui/react"
+import { Badge } from "@chakra-ui/react"
import type { ChildOnlyProp } from "@/lib/types"
import type { MdPageContent, TutorialFrontmatter } from "@/lib/interfaces"
@@ -22,7 +13,6 @@ import Emoji from "@/components/Emoji"
import EnvWarningBanner from "@/components/EnvWarningBanner"
import FeedbackCard from "@/components/FeedbackCard"
import FileContributors from "@/components/FileContributors"
-import GlossaryTooltip from "@/components/Glossary/GlossaryTooltip"
import InfoBanner from "@/components/InfoBanner"
import MainArticle from "@/components/MainArticle"
import {
@@ -34,37 +24,11 @@ import {
import TableOfContents from "@/components/TableOfContents"
import TooltipLink from "@/components/TooltipLink"
import TutorialMetadata from "@/components/TutorialMetadata"
-import { Divider } from "@/components/ui/divider"
import { mdxTableComponents } from "@/components/ui/Table"
import YouTube from "@/components/YouTube"
import { getEditPath } from "@/lib/utils/editPath"
-type ContentContainerProps = Pick
-
-const ContentContainer = (props: ContentContainerProps) => {
- const boxShadow = useToken("colors", "tableBoxShadow")
-
- return (
-
- )
-}
-
const Heading1 = (props: HTMLAttributes) => (
) => (
/>
)
-const StyledDivider = (props) =>
-
-const Paragraph = (props: TextProps) => (
-
+const Paragraph = (props: HTMLAttributes) => (
+
)
-const KBD = (props) => {
- const borderColor = useToken("colors", "primary.base")
-
- return (
-
- )
-}
+const KBD = (props: HTMLAttributes) => (
+
+)
export const tutorialsComponents = {
a: TooltipLink,
@@ -129,9 +84,7 @@ export const tutorialsComponents = {
Card,
Emoji,
EnvWarningBanner,
- GlossaryTooltip,
InfoBanner,
- StyledDivider,
YouTube,
}
type TutorialLayoutProps = ChildOnlyProp &
@@ -153,44 +106,37 @@ export const TutorialLayout = ({
const { asPath: relativePath } = useRouter()
const absoluteEditPath = getEditPath(relativePath)
- const borderColor = useToken("colors", "border")
-
return (
- <>
-
+
-
- {frontmatter.title}
-
-
- {children}
-
-
-
- {tocItems && (
-
- )}
-
- >
+ {frontmatter.title}
+
+
+ {children}
+
+
+
+ {tocItems && (
+
+ )}
+
)
}
diff --git a/src/layouts/md/Upgrade.tsx b/src/layouts/md/Upgrade.tsx
index 64939d8bade..d48f2261097 100644
--- a/src/layouts/md/Upgrade.tsx
+++ b/src/layouts/md/Upgrade.tsx
@@ -3,7 +3,6 @@ import { useTranslation } from "next-i18next"
import type { ChildOnlyProp } from "@/lib/types"
import type { MdPageContent, UpgradeFrontmatter } from "@/lib/interfaces"
-import BeaconChainActions from "@/components/BeaconChainActions"
import type { List as ButtonDropdownList } from "@/components/ButtonDropdown"
import { ContentHero } from "@/components/Hero"
import MergeArticleList from "@/components/MergeArticleList"
@@ -20,7 +19,6 @@ export const upgradeComponents = {
MergeArticleList,
MergeInfographic,
UpgradeStatus,
- BeaconChainActions,
}
type UpgradeLayoutProps = ChildOnlyProp &
diff --git a/src/lib/types.ts b/src/lib/types.ts
index c5b6b840387..33e25b6f564 100644
--- a/src/lib/types.ts
+++ b/src/lib/types.ts
@@ -458,10 +458,6 @@ export type CommonHeroProps<
* Preface text about the content in the given page
*/
description: ReactNode
- /**
- * The maximum height of the image in the hero
- */
- maxHeight?: string
}
// Learning Tools
diff --git a/src/pages/assets.tsx b/src/pages/assets.tsx
index ea09478749e..81e0f3fdb7f 100644
--- a/src/pages/assets.tsx
+++ b/src/pages/assets.tsx
@@ -262,22 +262,19 @@ const AssetsPage = () => {
title={t("page-assets-doge")}
alt={t("page-assets-doge")}
image={doge}
- artistName="William Tempest"
- artistUrl="https://cargocollective.com/willtempest"
+ artistName="WT"
/>
@@ -285,22 +282,19 @@ const AssetsPage = () => {
title={t("page-assets-infrastructure")}
alt={t("page-assets-infrastructure")}
image={infrastructure}
- artistName="William Tempest"
- artistUrl="https://cargocollective.com/willtempest"
+ artistName="WT"
/>
@@ -308,22 +302,19 @@ const AssetsPage = () => {
title={t("page-assets-future")}
alt={t("page-assets-future")}
image={future}
- artistName="William Tempest"
- artistUrl="https://cargocollective.com/willtempest"
+ artistName="WT"
/>
diff --git a/src/pages/dapps.tsx b/src/pages/dapps.tsx
index 64ac402ffa8..4b826b70fa2 100644
--- a/src/pages/dapps.tsx
+++ b/src/pages/dapps.tsx
@@ -61,7 +61,6 @@ import artblocks from "@/public/images/dapps/artblocks.png"
import arweave from "@/public/images/dapps/arweave.png"
import asyncart from "@/public/images/dapps/asyncart.png"
import audius from "@/public/images/dapps/audius.png"
-import augur from "@/public/images/dapps/augur.png"
import axie from "@/public/images/dapps/axie.png"
import balancer from "@/public/images/dapps/balancer.png"
import brave from "@/public/images/dapps/brave.png"
@@ -781,13 +780,6 @@ const DappsPage = () => {
image: polymarket,
alt: t("page-dapps-polymarket-logo-alt"),
},
- {
- title: "Augur",
- description: t("page-dapps-dapp-description-augur"),
- link: "https://augur.net",
- image: augur,
- alt: t("page-dapps-augur-logo-alt"),
- },
{
title: "Synthetix",
description: t("page-dapps-dapp-description-synthetix"),
diff --git a/src/pages/get-eth.tsx b/src/pages/get-eth.tsx
index 5c224abc8bc..e4e9cba713f 100644
--- a/src/pages/get-eth.tsx
+++ b/src/pages/get-eth.tsx
@@ -2,7 +2,6 @@ import type { GetStaticProps, InferGetStaticPropsType } from "next/types"
import { useTranslation } from "next-i18next"
import { serverSideTranslations } from "next-i18next/serverSideTranslations"
import type { ReactNode } from "react"
-import { useBreakpointValue } from "@chakra-ui/react"
import type { BasePageProps, ChildOnlyProp, Lang } from "@/lib/types"
@@ -38,6 +37,7 @@ import { trackCustomEvent } from "@/lib/utils/matomo"
import { getLocaleTimestamp } from "@/lib/utils/time"
import { getRequiredNamespacesForPage } from "@/lib/utils/translations"
+import { useBreakpointValue } from "@/hooks/useBreakpointValue"
import uniswap from "@/public/images/dapps/uni.png"
import dapps from "@/public/images/doge-computer.png"
import oneinch from "@/public/images/exchanges/1inch.png"
@@ -104,6 +104,12 @@ const GetEthPage = ({
}: InferGetStaticPropsType) => {
const { t } = useTranslation("page-get-eth")
+ const walletImageWidth = useBreakpointValue({
+ base: "full",
+ sm: "60%",
+ md: "50%",
+ })
+
const tokenSwaps: CardListItem[] = [
{
title: "Uniswap",
@@ -144,12 +150,6 @@ const GetEthPage = ({
},
]
- const walletImageWidth = useBreakpointValue({
- base: "full",
- sm: "60%",
- md: "50%",
- })
-
return (
diff --git a/src/pages/staking/index.tsx b/src/pages/staking/index.tsx
index f63b074f2fc..ab418a02e45 100644
--- a/src/pages/staking/index.tsx
+++ b/src/pages/staking/index.tsx
@@ -20,12 +20,8 @@ import Card from "@/components/Card"
import ExpandableCard from "@/components/ExpandableCard"
import FeedbackCard from "@/components/FeedbackCard"
import LeftNavBar from "@/components/LeftNavBar"
-import {
- ContentContainer,
- MobileButton,
- MobileButtonDropdown,
- Page,
-} from "@/components/MdComponents"
+import { ContentContainer, Page } from "@/components/MdComponents"
+import MobileButtonDropdown from "@/components/MobileButtonDropdown"
import PageHero from "@/components/PageHero"
import PageMetadata from "@/components/PageMetadata"
import StakingCommunityCallout from "@/components/Staking/StakingCommunityCallout"
@@ -632,9 +628,7 @@ const StakingPage = ({
-
-
-
+
)
diff --git a/src/pages/what-is-ethereum.tsx b/src/pages/what-is-ethereum.tsx
index 13c028d27a7..a01677e7eb2 100644
--- a/src/pages/what-is-ethereum.tsx
+++ b/src/pages/what-is-ethereum.tsx
@@ -30,7 +30,6 @@ import MainArticle from "@/components/MainArticle"
import PageMetadata from "@/components/PageMetadata"
import { StandaloneQuizWidget } from "@/components/Quiz/QuizWidget"
import StatErrorMessage from "@/components/StatErrorMessage"
-import Tabs from "@/components/Tabs"
import Tooltip from "@/components/Tooltip"
import Translation from "@/components/Translation"
import { Button, ButtonLink } from "@/components/ui/buttons/Button"
@@ -42,6 +41,7 @@ import {
SwiperNavigation,
SwiperSlide,
} from "@/components/ui/swiper"
+import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
import { cn } from "@/lib/utils/cn"
import { existsNamespace } from "@/lib/utils/existsNamespace"
@@ -288,7 +288,7 @@ const WhatIsEthereumPage = ({
),
},
- ]
+ ] as const
const slides = [
{ eventName: "Payments slide" },
@@ -383,15 +383,28 @@ const WhatIsEthereumPage = ({
{
+ defaultValue="0"
+ onValueChange={(index) => {
trackCustomEvent({
eventCategory: `Blockchain/crypto tab`,
eventAction: `Clicked`,
eventName: tabs[index].eventName,
})
}}
- tabs={tabs}
- />
+ >
+
+ {tabs.map((tab, index) => (
+
+ {tab.title}
+
+ ))}
+
+ {tabs.map((tab, index) => (
+
+ {tab.content}
+
+ ))}
+
@@ -601,7 +614,7 @@ const WhatIsEthereumPage = ({
- {txStat || }
+ {txStat || }
{/* TODO: Extract strings for translation */}
diff --git a/src/styles/colors.css b/src/styles/colors.css
index 757da8e11d2..69d044fc0f2 100644
--- a/src/styles/colors.css
+++ b/src/styles/colors.css
@@ -72,8 +72,8 @@
--yellow-500: 38, 92%, 50%; /* #F59E0B */
--yellow-600: 32, 95%, 44%; /* #D97706 */
--yellow-700: 26, 90%, 37%; /* #B45309 */
- --yellow-800: 23, 83%, 31%; /* #92400E */
- --yellow-900: 22, 78%, 26%; /* #78350F */
+ --yellow-800: 23, 88%, 22%; /* #6B2D07 */
+ --yellow-900: 22, 84%, 15%; /* #471E06 */
--red-50: 0, 86%, 97%; /* #fef2f2 */
--red-100: 0, 93%, 94%; /* #fee2e2 */
@@ -84,7 +84,7 @@
--red-600: 0, 72%, 51%; /* #dc2626 */
--red-700: 0, 74%, 42%; /* #b91c1c */
--red-800: 0, 70%, 35%; /* #991b1b */
- --red-900: 0, 63%, 31%; /* #7f1d1d */
+ --red-900: 0, 82%, 19%; /* #5A0909 */
--green-50: 138, 76%, 97%; /* #F0FDF4 */
--green-100: 141, 84%, 93%; /* #DCFCE7 */
@@ -94,8 +94,8 @@
--green-500: 142, 71%, 45%; /* #22C55E */
--green-600: 142, 76%, 36%; /* #16A34A */
--green-700: 142, 72%, 29%; /* #15803D */
- --green-800: 143, 64%, 24%; /* #166534 */
- --green-900: 144, 61%, 20%; /* #14532D */
+ --green-800: 143, 74%, 19%; /* #0D5629 */
+ --green-900: 143, 79%, 11%; /* #063418 */
--orange-100: 30, 100%, 94%; /* #FFF0DB */
--orange-800: 10, 76%, 28%; /* #7D2711 */
diff --git a/src/styles/semantic-tokens.css b/src/styles/semantic-tokens.css
index 7833a789d40..2b6b2bfde38 100644
--- a/src/styles/semantic-tokens.css
+++ b/src/styles/semantic-tokens.css
@@ -47,12 +47,18 @@
--success: var(--green-600);
--success-light: var(--green-100);
+ --success-dark: var(--green-900);
+ --success-border: var(--green-700);
--error: var(--red-700);
--error-light: var(--red-100);
+ --error-dark: var(--red-900);
+ --error-border: var(--red-800);
- --warning: var(--yellow-400);
+ --warning: var(--yellow-300);
--warning-light: var(--yellow-100);
+ --warning-dark: var(--yellow-900);
+ --warning-border: var(--yellow-700);
/**
/* Gradients (radial, conic, or linear over 3 stops)
@@ -152,7 +158,20 @@
--accent-c: var(--teal-400);
--accent-c-hover: var(--teal-300);
+ --success: var(--green-600);
+ --success-light: var(--green-100);
+ --success-dark: var(--green-900);
+ --success-border: var(--green-400);
+
+ --error: var(--red-700);
+ --error-light: var(--red-100);
+ --error-dark: var(--red-900);
+ --error-border: var(--red-300);
+
--warning: var(--yellow-300);
+ --warning-light: var(--yellow-100);
+ --warning-dark: var(--yellow-900);
+ --warning-border: var(--yellow-200);
/* Gradients (dark mode adjustments) */
--radial-a-opacity-1: 0.16;
diff --git a/tailwind.config.ts b/tailwind.config.ts
index 1b7c9f17226..4baa00e0eb1 100644
--- a/tailwind.config.ts
+++ b/tailwind.config.ts
@@ -189,16 +189,22 @@ const config = {
success: {
DEFAULT: "hsla(var(--success))",
light: "hsla(var(--success-light))",
+ dark: "hsla(var(--success-dark))",
+ border: "hsla(var(--success-border))",
},
error: {
DEFAULT: "hsla(var(--error))",
light: "hsla(var(--error-light))",
+ dark: "hsla(var(--error-dark))",
+ border: "hsla(var(--error-border))",
},
warning: {
DEFAULT: "hsla(var(--warning))",
light: "hsla(var(--warning-light))",
+ dark: "hsla(var(--warning-dark))",
+ border: "hsla(var(--warning-border))",
},
/** @deprecated */
diff --git a/yarn.lock b/yarn.lock
index 68cac5a2196..0b790c08766 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3932,6 +3932,19 @@
"@radix-ui/react-use-callback-ref" "1.1.0"
"@radix-ui/react-use-escape-keydown" "1.1.0"
+"@radix-ui/react-dropdown-menu@^2.1.1":
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.1.tgz#3dc578488688250dbbe109d9ff2ca28a9bca27ec"
+ integrity sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==
+ dependencies:
+ "@radix-ui/primitive" "1.1.0"
+ "@radix-ui/react-compose-refs" "1.1.0"
+ "@radix-ui/react-context" "1.1.0"
+ "@radix-ui/react-id" "1.1.0"
+ "@radix-ui/react-menu" "2.1.1"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-use-controllable-state" "1.1.0"
+
"@radix-ui/react-focus-guards@1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz#1ea7e32092216b946397866199d892f71f7f98ad"
@@ -3978,6 +3991,30 @@
dependencies:
"@radix-ui/react-use-layout-effect" "1.1.0"
+"@radix-ui/react-menu@2.1.1":
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-menu/-/react-menu-2.1.1.tgz#bd623ace0e1ae1ac78023a505fec0541d59fb346"
+ integrity sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ==
+ dependencies:
+ "@radix-ui/primitive" "1.1.0"
+ "@radix-ui/react-collection" "1.1.0"
+ "@radix-ui/react-compose-refs" "1.1.0"
+ "@radix-ui/react-context" "1.1.0"
+ "@radix-ui/react-direction" "1.1.0"
+ "@radix-ui/react-dismissable-layer" "1.1.0"
+ "@radix-ui/react-focus-guards" "1.1.0"
+ "@radix-ui/react-focus-scope" "1.1.0"
+ "@radix-ui/react-id" "1.1.0"
+ "@radix-ui/react-popper" "1.2.0"
+ "@radix-ui/react-portal" "1.1.1"
+ "@radix-ui/react-presence" "1.1.0"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-roving-focus" "1.1.0"
+ "@radix-ui/react-slot" "1.1.0"
+ "@radix-ui/react-use-callback-ref" "1.1.0"
+ aria-hidden "^1.1.1"
+ react-remove-scroll "2.5.7"
+
"@radix-ui/react-navigation-menu@^1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.0.tgz#884c9b9fd141cc5db257bd3f6bf3b84e349c6617"
@@ -4150,6 +4187,20 @@
"@radix-ui/react-use-previous" "1.1.0"
"@radix-ui/react-use-size" "1.1.0"
+"@radix-ui/react-tabs@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-tabs/-/react-tabs-1.1.0.tgz#0a6db1caed56776a1176aae68532060e301cc1c0"
+ integrity sha512-bZgOKB/LtZIij75FSuPzyEti/XBhJH52ExgtdVqjCIh+Nx/FW+LhnbXtbCzIi34ccyMsyOja8T0thCzoHFXNKA==
+ dependencies:
+ "@radix-ui/primitive" "1.1.0"
+ "@radix-ui/react-context" "1.1.0"
+ "@radix-ui/react-direction" "1.1.0"
+ "@radix-ui/react-id" "1.1.0"
+ "@radix-ui/react-presence" "1.1.0"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-roving-focus" "1.1.0"
+ "@radix-ui/react-use-controllable-state" "1.1.0"
+
"@radix-ui/react-tooltip@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@radix-ui/react-tooltip/-/react-tooltip-1.1.2.tgz#c42db2ffd7dcc6ff3d65407c8cb70490288f518d"
@@ -12175,7 +12226,7 @@ prelude-ls@^1.2.1:
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
-"prettier-fallback@npm:prettier@^3", prettier@^3.1.1:
+"prettier-fallback@npm:prettier@^3":
version "3.3.2"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.2.tgz#03ff86dc7c835f2d2559ee76876a3914cec4a90a"
integrity sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==
@@ -12190,6 +12241,11 @@ prettier@^2.0.5, prettier@^2.8.8:
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da"
integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
+prettier@^3.1.1:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.2.tgz#03ff86dc7c835f2d2559ee76876a3914cec4a90a"
+ integrity sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==
+
prettier@^3.3.3:
version "3.3.3"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105"