+ {t("page-collectibles-contributing-since")}:{" "}
+ {new Intl.DateTimeFormat(locale, {
+ year: "numeric",
+ }).format(new Date().setFullYear(contributorSinceYear))}
+
+ )}
+
diff --git a/next.config.js b/next.config.js
index 5c39cb7693e..1f819d3b2e3 100644
--- a/next.config.js
+++ b/next.config.js
@@ -93,6 +93,18 @@ module.exports = (phase, { defaultConfig }) => {
protocol: "https",
hostname: "coin-images.coingecko.com",
},
+ {
+ protocol: "https",
+ hostname: "cdn.galxe.com",
+ },
+ {
+ protocol: "https",
+ hostname: "assets.poap.xyz",
+ },
+ {
+ protocol: "https",
+ hostname: "unavatar.io",
+ },
],
},
async headers() {
diff --git a/src/components/Nav/useNavigation.ts b/src/components/Nav/useNavigation.ts
index 3a88df8de89..fd247467f2c 100644
--- a/src/components/Nav/useNavigation.ts
+++ b/src/components/Nav/useNavigation.ts
@@ -402,6 +402,11 @@ export const useNavigation = () => {
description: t("nav-translation-program-description"),
href: "/contributing/translation-program/",
},
+ {
+ label: t("nav-collectibles-label"),
+ description: t("nav-collectibles-description"),
+ href: "/collectibles/",
+ },
{
label: t("about-ethereum-org"),
description: t("nav-about-description"),
diff --git a/src/components/StartWithEthereumFlow/index.tsx b/src/components/StartWithEthereumFlow/index.tsx
index 3ab7fdf29f7..cafad0256ba 100644
--- a/src/components/StartWithEthereumFlow/index.tsx
+++ b/src/components/StartWithEthereumFlow/index.tsx
@@ -36,10 +36,8 @@ const queryClient = new QueryClient()
const StartWithEthereumFlow = ({
newToCryptoWallets,
- locale,
}: {
newToCryptoWallets: Wallet[]
- locale: string
}) => {
const swiperRef = useRef
(null)
const containerRef = useRef(null)
@@ -100,7 +98,7 @@ const StartWithEthereumFlow = ({
return (
-
+
{
+const WalletProviders = ({ children }: WalletProvidersProps) => {
+ const locale = useLocale()
return (
{
+ const { twFlipForRtl } = useRtlFlip()
+ return (
+
+ )
+}
+
type BaseProps = {
hideArrow?: boolean
isPartiallyActive?: boolean
@@ -53,8 +66,6 @@ export const BaseLink = forwardRef(function Link(
ref
) {
const pathname = usePathname()
- const { twFlipForRtl } = useRtlFlip()
-
if (!href) {
// If troubleshooting this warning, check for multiple h1's in markdown content—these will result in broken id hrefs
console.warn(`Link component missing href prop, pathname: ${pathname}`)
@@ -116,15 +127,7 @@ export const BaseLink = forwardRef(function Link(
{isMailto ? "opens email client" : "opens in a new tab"}
- {!hideArrow && !isMailto && (
-
- )}
+ {!hideArrow && !isMailto && }
)
}
diff --git a/src/components/ui/accordion.tsx b/src/components/ui/accordion.tsx
index d2f725add36..585908bde16 100644
--- a/src/components/ui/accordion.tsx
+++ b/src/components/ui/accordion.tsx
@@ -25,7 +25,7 @@ const AccordionTrigger = React.forwardRef<
svg]:rotate-90 [&[data-state=open]>svg]:-rotate-90 [&[data-state=open]]:bg-background-highlight [&[data-state=open]]:text-primary-high-contrast",
+ "flex flex-1 items-center justify-between gap-2 px-2 py-2 font-medium transition-all hover:bg-background-highlight hover:text-primary-hover focus-visible:outline-1 focus-visible:-outline-offset-1 focus-visible:outline-primary-hover md:px-4 [&[data-state=open]:dir(rtl)_svg]:rotate-90 [&[data-state=open]]:bg-background-highlight [&[data-state=open]]:text-primary-high-contrast [&[data-state=open]_svg]:-rotate-90",
className
)}
{...props}
diff --git a/src/components/ui/progress.tsx b/src/components/ui/progress.tsx
index 483dace9cd3..ca13ff8031e 100644
--- a/src/components/ui/progress.tsx
+++ b/src/components/ui/progress.tsx
@@ -1,22 +1,44 @@
import * as React from "react"
+import { cva, VariantProps } from "class-variance-authority"
import * as ProgressPrimitive from "@radix-ui/react-progress"
import { cn } from "@/lib/utils/cn"
+const progressIndicatorVariants = cva(
+ "h-full w-full flex-1 rounded-full transition-all",
+ {
+ variants: {
+ color: {
+ disabled: "bg-disabled",
+ primary: "bg-primary",
+ },
+ },
+ defaultVariants: {
+ color: "disabled",
+ },
+ }
+)
+
+type ProgressProps = React.ComponentPropsWithoutRef<
+ typeof ProgressPrimitive.Root
+> &
+ VariantProps
+
const Progress = React.forwardRef<
React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, value, ...props }, ref) => (
+ ProgressProps
+>(({ className, value, color, ...props }, ref) => (
diff --git a/src/intl/en/common.json b/src/intl/en/common.json
index a4c1fb95edc..a986f48d1e5 100644
--- a/src/intl/en/common.json
+++ b/src/intl/en/common.json
@@ -239,6 +239,8 @@
"nav-builders-home-description": "A builder's manual for Ethereum—by builders, for builders",
"nav-builders-home-label": "Builder's home",
"nav-code-of-conduct": "Code of conduct",
+ "nav-collectibles-description": "Contributor dashboard for ethereum.org contributor collectibles",
+ "nav-collectibles-label": "ethereum.org collectibles",
"nav-contribute-description": "If you want to help, this will guide you",
"nav-contribute-label": "Contributing to ethereum.org",
"nav-dao-description": "Member-owned communities without centralized authority",
diff --git a/src/intl/en/page-collectibles.json b/src/intl/en/page-collectibles.json
new file mode 100644
index 00000000000..03455feddf3
--- /dev/null
+++ b/src/intl/en/page-collectibles.json
@@ -0,0 +1,67 @@
+{
+ "page-collectibles-already-desc": "Check your progress",
+ "page-collectibles-already-title": "Already a contributor?",
+ "page-collectibles-code-content-desc": "Fix issues, write or improve articles or propose design improvements to the website.",
+ "page-collectibles-code-content-design-1issue": "Design issue solved badge",
+ "page-collectibles-code-content-design-desc": "Do design crits, improve our design system or participate in user testing.",
+ "page-collectibles-code-content-design-title": "Design",
+ "page-collectibles-code-content-design-user-testing": "Participate in user testing badge",
+ "page-collectibles-code-content-developer-10pr": "10 PRs merged badge",
+ "page-collectibles-code-content-developer-1pr": "1 PR merged badge",
+ "page-collectibles-code-content-developer-5pr": "5 PRs merged badge",
+ "page-collectibles-code-content-developer-desc": "Any improvement merged to the website.",
+ "page-collectibles-code-content-developer-title": "Developer",
+ "page-collectibles-code-content-gitpoap-1pr": "PR merged badge",
+ "page-collectibles-code-content-gitpoap-desc": "Automatically claimable after your PR is merged.",
+ "page-collectibles-code-content-gitpoap-title": "GitPOAP",
+ "page-collectibles-code-content-instructions-1": "Go to our GitHub repository",
+ "page-collectibles-code-content-instructions-2": "Choose an issue to work on",
+ "page-collectibles-code-content-instructions-3": "Commit a fix or improvement",
+ "page-collectibles-code-content-title": "Code & Content",
+ "page-collectibles-code-content-writing-badge-1": "Content contribution badge",
+ "page-collectibles-code-content-writing-desc": "For any content improvement merged to master.",
+ "page-collectibles-code-content-writing-title": "Writing",
+ "page-collectibles-connect-wallet": "Connect wallet",
+ "page-collectibles-contributing-since": "Contributing since",
+ "page-collectibles-contributor-img-alt": "Two contributors chatting",
+ "page-collectibles-contributor-progress-label": "Claimed",
+ "page-collectibles-current-year-title": "Current year",
+ "page-collectibles-get-started": "Get Started",
+ "page-collectibles-hero-description": "Prove that you worked on ethereum.org, onchain.",
+ "page-collectibles-hero-header": "Ethereum.org Collectibles",
+ "page-collectibles-hero-title": "Badges",
+ "page-collectibles-how-step1-desc": "to the website",
+ "page-collectibles-how-step1-title": "Contribute",
+ "page-collectibles-how-step2-desc": "on Discord",
+ "page-collectibles-how-step2-title": "Get verified",
+ "page-collectibles-how-step3-desc": "on Galxe",
+ "page-collectibles-how-step3-title": "Claim NFT",
+ "page-collectibles-how-title": "How it works",
+ "page-collectibles-improve-desc-1": "Earn unique NFTs by helping maintain and expand ethereum.org website. These badges recognize your participation onchain.",
+ "page-collectibles-improve-desc-2": "Top holders get contributor swag or discounted tickets to events like Devcon. Your onchain badges makes it easy for others to support you.",
+ "page-collectibles-improve-title": "Improve ethereum.org",
+ "page-collectibles-index-frequency": "Results updated once daily at 15:15 UTC",
+ "page-collectibles-instructions-label": "Instructions",
+ "page-collectibles-previous-years-badge-count": "{count, plural, =0 {no badges} =1 {1 badge} other {# badges}}",
+ "page-collectibles-previous-years-collectors-count": "{count, plural, =0 {no collectors} =1 {1 collector} other {# collectors}}",
+ "page-collectibles-previous-years-no-badges": "No badges minted",
+ "page-collectibles-previous-years": "Previous years",
+ "page-collectibles-social-desc": "Join any of our Discord calls to bug test the website before releases or keep up with the ethereum.org news on our monthly community calls.",
+ "page-collectibles-social-instructions-1": "Join our Discord server",
+ "page-collectibles-social-instructions-2": "See schedule",
+ "page-collectibles-social-instructions-3": "Join!",
+ "page-collectibles-social-title": "Social",
+ "page-collectibles-stats-collectors": "Collectors",
+ "page-collectibles-stats-minted": "Minted",
+ "page-collectibles-stats-unique-badges": "Unique Badges",
+ "page-collectibles-translations-1000": "1,000 words badge",
+ "page-collectibles-translations-10000": "10,000 words badge",
+ "page-collectibles-translations-250": "250 words badge",
+ "page-collectibles-translations-50000": "50,000 words badge",
+ "page-collectibles-translations-badge-desc": "To any language.",
+ "page-collectibles-translations-desc": "Most users do not speak English, therefore it's crucial to help translate our articles to other languages, no translation experience needed.",
+ "page-collectibles-translations-instructions-1": "Register on Crowdin",
+ "page-collectibles-translations-instructions-2": "Select language",
+ "page-collectibles-translations-instructions-3": "Start translating",
+ "page-collectibles-translations-title": "Translations"
+}
diff --git a/src/intl/es/page-collectibles.json b/src/intl/es/page-collectibles.json
new file mode 100644
index 00000000000..a3a298f0689
--- /dev/null
+++ b/src/intl/es/page-collectibles.json
@@ -0,0 +1,67 @@
+{
+ "page-collectibles-already-desc": "Revisa tu progreso",
+ "page-collectibles-already-title": "¿Ya eres colaborador?",
+ "page-collectibles-code-content-desc": "Corrige errores, escribe o mejora artículos o propone mejoras de diseño para el sitio web.",
+ "page-collectibles-code-content-design-1issue": "Insignia por resolver un issue de diseño",
+ "page-collectibles-code-content-design-desc": "Haz críticas de diseño, mejora nuestro sistema de diseño o participa en pruebas de usuario.",
+ "page-collectibles-code-content-design-title": "Diseño",
+ "page-collectibles-code-content-design-user-testing": "Insignia por participar en pruebas de usuario",
+ "page-collectibles-code-content-developer-10pr": "Insignia por 10 PRs mergeados",
+ "page-collectibles-code-content-developer-1pr": "Insignia por 1 PR mergeado",
+ "page-collectibles-code-content-developer-5pr": "Insignia por 5 PRs mergeados",
+ "page-collectibles-code-content-developer-desc": "Cualquier mejora mergeada al sitio web.",
+ "page-collectibles-code-content-developer-title": "Desarrollador",
+ "page-collectibles-code-content-gitpoap-1pr": "Insignia por 1 PR mergeado",
+ "page-collectibles-code-content-gitpoap-desc": "Reclamable automáticamente después de que tu PR sea mergeada.",
+ "page-collectibles-code-content-gitpoap-title": "GitPOAP",
+ "page-collectibles-code-content-instructions-1": "Ve a nuestro repositorio de GitHub",
+ "page-collectibles-code-content-instructions-2": "Elige un issue en el que trabajar",
+ "page-collectibles-code-content-instructions-3": "Confirma una corrección o mejora",
+ "page-collectibles-code-content-title": "Código y Contenido",
+ "page-collectibles-code-content-writing-badge-1": "Insignia por contribución de contenido",
+ "page-collectibles-code-content-writing-desc": "Por cualquier mejora de contenido mergeada a master.",
+ "page-collectibles-code-content-writing-title": "Redacción",
+ "page-collectibles-connect-wallet": "Conectar billetera",
+ "page-collectibles-contributing-since": "Contribuyendo desde",
+ "page-collectibles-contributor-img-alt": "Dos colaboradores conversando",
+ "page-collectibles-contributor-progress-label": "Reclamado",
+ "page-collectibles-current-year-title": "Año actual",
+ "page-collectibles-get-started": "Comenzar",
+ "page-collectibles-hero-description": "Prueba que has trabajado en ethereum.org, onchain.",
+ "page-collectibles-hero-header": "Coleccionables Ethereum.org",
+ "page-collectibles-hero-title": "Insignias",
+ "page-collectibles-how-step1-desc": "al sitio web",
+ "page-collectibles-how-step1-title": "Contribuye",
+ "page-collectibles-how-step2-desc": "en Discord",
+ "page-collectibles-how-step2-title": "Verifícate",
+ "page-collectibles-how-step3-desc": "en Galxe",
+ "page-collectibles-how-step3-title": "Reclama NFT",
+ "page-collectibles-how-title": "Cómo funciona",
+ "page-collectibles-improve-desc-1": "Gana NFTs únicos ayudando a mantener y expandir el sitio web ethereum.org. Estas insignias reconocen tu participación onchain.",
+ "page-collectibles-improve-desc-2": "Los principales poseedores obtienen mercaderia de colaborador o entradas con descuento a eventos como Devcon. Tu insignia onchain facilita que otros te apoyen.",
+ "page-collectibles-improve-title": "Mejora ethereum.org",
+ "page-collectibles-index-frequency": "Resultados actualizados una vez al día a las 15:15 UTC",
+ "page-collectibles-instructions-label": "Instrucciones",
+ "page-collectibles-previous-years-badge-count": "{count, plural, =0 {ninguna insignia} =1 {1 insignia} other {# insignias}}",
+ "page-collectibles-previous-years-collectors-count": "{count, plural, =0 {ningún coleccionista} =1 {1 coleccionista} other {# coleccionistas}}",
+ "page-collectibles-previous-years-no-badges": "No se han obtenido insignias",
+ "page-collectibles-previous-years": "Años anteriores",
+ "page-collectibles-social-desc": "Únete a cualquiera de nuestras llamadas de Discord para probar el sitio web antes de los lanzamientos o mantente al día con las noticias de ethereum.org en nuestras llamadas comunitarias mensuales.",
+ "page-collectibles-social-instructions-1": "Únete a nuestro servidor de Discord",
+ "page-collectibles-social-instructions-2": "Ver horario",
+ "page-collectibles-social-instructions-3": "¡Únete!",
+ "page-collectibles-social-title": "Social",
+ "page-collectibles-stats-collectors": "Coleccionistas",
+ "page-collectibles-stats-minted": "Reclamados",
+ "page-collectibles-stats-unique-badges": "Insignias únicas",
+ "page-collectibles-translations-1000": "1,000 palabras",
+ "page-collectibles-translations-10000": "10,000 palabras",
+ "page-collectibles-translations-250": "250 palabras",
+ "page-collectibles-translations-50000": "50,000 palabras",
+ "page-collectibles-translations-badge-desc": "A cualquier idioma.",
+ "page-collectibles-translations-desc": "La mayoría de los usuarios no hablan inglés, por lo que es crucial ayudar a traducir nuestros artículos a otros idiomas, no se necesita experiencia previa.",
+ "page-collectibles-translations-instructions-1": "Regístrate en Crowdin",
+ "page-collectibles-translations-instructions-2": "Selecciona idioma",
+ "page-collectibles-translations-instructions-3": "Comienza a traducir",
+ "page-collectibles-translations-title": "Traducciones"
+}
diff --git a/src/lib/utils/translations.ts b/src/lib/utils/translations.ts
index 7ebca26de51..027a814f7d0 100644
--- a/src/lib/utils/translations.ts
+++ b/src/lib/utils/translations.ts
@@ -70,6 +70,10 @@ const getRequiredNamespacesForPath = (relativePath: string) => {
requiredNamespaces = [...requiredNamespaces, "page-10-year-anniversary"]
}
+ if (path === "/collectibles/") {
+ primaryNamespace = "page-collectibles"
+ }
+
if (path === "/contributing/translation-program/acknowledgements/") {
primaryNamespace = "page-contributing-translation-program-acknowledgements"
}