diff --git a/app/[locale]/page.tsx b/app/[locale]/page.tsx index ec1513556dd..4968c3a2a0a 100644 --- a/app/[locale]/page.tsx +++ b/app/[locale]/page.tsx @@ -14,6 +14,7 @@ import { CodeExample } from "@/lib/interfaces" import ActivityStats from "@/components/ActivityStats" import FusakaBanner from "@/components/Banners/FusakaBanner" import { ChevronNext } from "@/components/Chevron" +import EthPriceSimple from "@/components/EthPriceSimple" import HomeHero from "@/components/Hero/HomeHero" import BentoCard from "@/components/Homepage/BentoCard" import CodeExamples from "@/components/Homepage/CodeExamples" @@ -22,8 +23,6 @@ import { getBentoBoxItems } from "@/components/Homepage/utils" import ValuesMarqueeFallback from "@/components/Homepage/ValuesMarquee/Fallback" import BlockHeap from "@/components/icons/block-heap.svg" import BuildAppsIcon from "@/components/icons/build-apps.svg" -import Calendar from "@/components/icons/calendar.svg" -import CalendarAdd from "@/components/icons/calendar-add.svg" import Discord from "@/components/icons/discord.svg" import EthGlyphIcon from "@/components/icons/eth-glyph.svg" import EthTokenIcon from "@/components/icons/eth-token.svg" @@ -58,7 +57,6 @@ import { SectionTag, } from "@/components/ui/section" import { Skeleton, SkeletonCardGrid } from "@/components/ui/skeleton" -import WindowBox from "@/components/WindowBox" import { parseAppsOfTheWeek } from "@/lib/utils/apps" import { cn } from "@/lib/utils/cn" @@ -75,7 +73,6 @@ import { BASE_TIME_UNIT, BLOG_FEEDS, BLOGS_WITHOUT_FEED, - CALENDAR_DISPLAY_COUNT, DEFAULT_LOCALE, GITHUB_REPO_URL, LOCALES_CODES, @@ -87,7 +84,6 @@ import IndexPageJsonLD from "./page-jsonld" import { getActivity, getUpcomingEvents } from "./utils" import { routing } from "@/i18n/routing" -import { fetchCommunityEvents } from "@/lib/api/calendarEvents" import { fetchApps } from "@/lib/api/fetchApps" import { fetchBeaconchainEpoch } from "@/lib/api/fetchBeaconchainEpoch" import { fetchEthPrice } from "@/lib/api/fetchEthPrice" @@ -146,7 +142,6 @@ const loadData = dataLoader( ["beaconchainEpoch", fetchBeaconchainEpoch], ["totalValueLocked", fetchTotalValueLocked], ["growThePieData", fetchGrowThePie], - ["communityEvents", fetchCommunityEvents], ["attestantPosts", fetchAttestantPosts], ["rssData", fetchXmlBlogFeeds], ["appsData", fetchApps], @@ -170,7 +165,6 @@ const Page = async ({ params }: { params: PageParams }) => { { totalEthStaked }, totalValueLocked, growThePieData, - communityEvents, attestantPosts, xmlBlogs, appsData, @@ -415,14 +409,6 @@ const Page = async ({ params }: { params: PageParams }) => { } const metrics = await getActivity(metricResults, locale) - const calendar = communityEvents.upcomingEventData - .sort((a, b) => { - const dateA = isValidDate(a.date) ? new Date(a.date).getTime() : -Infinity - const dateB = isValidDate(b.date) ? new Date(b.date).getTime() : -Infinity - return dateA - dateB - }) - .slice(0, CALENDAR_DISPLAY_COUNT) - // RSS feed items const polishedRssItems = polishRSSList([attestantPosts, ...xmlBlogs], locale) const rssItems = polishedRssItems.slice(0, RSS_DISPLAY_COUNT) @@ -440,7 +426,7 @@ const Page = async ({ params }: { params: PageParams }) => {
-
+
{subHeroCTAs.map( ({ label, description, href, className, Svg }, idx) => { const Link = ( @@ -479,6 +465,72 @@ const Page = async ({ params }: { params: PageParams }) => { )}
+ {/* What is Ethereum */} +
+ + + + + + {t("page-index-network-tag")} + + {t("page-index-what-is-ethereum-title")} + +
+

{t("page-index-what-is-ethereum-description-1")}

+

{t("page-index-what-is-ethereum-description-2")}

+
+
+ + {t("page-index-what-is-ethereum-action")} + +
+ + {/* Popular topics */} +
+

+ {t("page-index-popular-topics-header")} +

+
+ {popularTopics + .filter((topic) => topic.href !== "/what-is-ethereum/") + .map(({ label, Svg, href, eventName, className }) => ( + :first-child]:flex-row", + className + )} + customEventOptions={{ + eventCategory, + eventAction: "popular topics", + eventName, + }} + > +

+ {label} +

+
+ ))} +
+
+
+
+ {/* Use Cases - A new way to use the internet */}
{ )} >
{t("page-index-use-cases-tag")} @@ -518,6 +567,38 @@ const Page = async ({ params }: { params: PageParams }) => { ))}
+ {/* What is ETH */} +
+ + + + + + {t("page-index-token-tag")} + + {t("page-index-what-is-ether-title")} + + +
+

{t("page-index-what-is-ether-description-1")}

+

{t("page-index-what-is-ether-description-2")}

+
+
+ + {t("page-index-what-is-ether-action")} + +
+
+
+ {/* Apps of the week - Discover the best apps on Ethereum */} {/* // TODO: Remove locale restriction after translation */} {locale === DEFAULT_LOCALE && ( @@ -542,7 +623,11 @@ const Page = async ({ params }: { params: PageParams }) => { )} {/* Activity - The strongest ecosystem */} -
+
@@ -550,20 +635,23 @@ const Page = async ({ params }: { params: PageParams }) => { {t("page-index-activity-tag")} {t("page-index-activity-header")} -
-

+

+

{t("page-index-activity-description")}

+

+ {t("page-index-activity-subtitle")} +

{t("page-index-activity-action-primary")} @@ -586,70 +674,6 @@ const Page = async ({ params }: { params: PageParams }) => {
- {/* Learn - Understand Ethereum */} -
- - - - - - {t("page-index-learn-tag")} - {t("page-index-learn-header")} -
-

{t("page-index-learn-description")}

-
-

- {t("page-index-popular-topics-header")} -

-
- {popularTopics.map( - ({ label, Svg, href, eventName, className }) => ( - :first-child]:flex-row", - className - )} - customEventOptions={{ - eventCategory, - eventAction: "popular topics", - eventName, - }} - > -

- {label} -

-
- ) - )} -
-
- - {t("page-index-popular-topics-action")} - -
-
-
-
-
- {/* Values - The Internet Is Changing */}
@@ -722,126 +746,6 @@ const Page = async ({ params }: { params: PageParams }) => {
- {/* Ethereum.org community - Built by the community */} -
- - - - - - {t("page-index-community-tag")} - {t("page-index-community-header")} -
-

{t("page-index-community-description-1")}

-

{t("page-index-community-description-2")}

-

{t("page-index-community-description-3")}

-
-
- - {t("page-index-community-action")} - -
- - - - - - -
-
-
- - {calendar.length > 0 ? ( - calendar.map(({ date, title, calendarLink }) => { - const customEventOptions = { - eventCategory, - eventAction: "Community Events Widget", - eventName: "upcoming", - } - return ( -
-
- - {title} - -

- {new Intl.DateTimeFormat(locale, { - month: "long", - day: "2-digit", - year: "numeric", - hour: "numeric", - minute: "numeric", - }).format(new Date(date))} -

-
- - {t("page-index-calendar-add")} - -
- ) - }) - ) : ( -
- {t("page-index-calendar-fallback")} -
- )} -
-
-
-
- {/* Recent posts */}

@@ -994,6 +898,19 @@ const Page = async ({ params }: { params: PageParams }) => { ) )}

+
+ + {t("page-index-join-action-hub")} + +
diff --git a/redirects.config.js b/redirects.config.js index 23300bb091b..8b4aff91e3a 100644 --- a/redirects.config.js +++ b/redirects.config.js @@ -95,7 +95,8 @@ module.exports = [ "/guides/how-to-create-an-ethereum-account/", ], ["/deprecated-software", "/apps/"], - ["/enterprise/private-ethereum", "/enterprise/"], + ["/enterprise", "https://institutions.ethereum.org/"], + ["/enterprise/private-ethereum", "https://institutions.ethereum.org/"], ["/dashboards", "/resources"], ["/tds", "/trillion-dollar-security"], ["/10-years", "/10years"], diff --git a/src/components/ActivityStats/index.tsx b/src/components/ActivityStats/index.tsx index 92b94db6702..69c7fdbb1dd 100644 --- a/src/components/ActivityStats/index.tsx +++ b/src/components/ActivityStats/index.tsx @@ -16,7 +16,16 @@ const ActivityStats = async ({ metrics, className }: ActivityStatsProps) => { "xl:ps-8", ] return ( -
+
+ + {metrics.map(({ label, apiProvider, apiUrl, state }, idx) => ( {value ? ( <> -
+
{value}
- {children} + {children} {sourceName && sourceUrl && ( <>   diff --git a/src/components/EthPriceSimple.tsx b/src/components/EthPriceSimple.tsx new file mode 100644 index 00000000000..1f9d4a35434 --- /dev/null +++ b/src/components/EthPriceSimple.tsx @@ -0,0 +1,56 @@ +import { Info } from "lucide-react" +import { getLocale, getTranslations } from "next-intl/server" + +import type { MetricReturnData } from "@/lib/types" + +import Tooltip from "@/components/Tooltip" +import InlineLink from "@/components/ui/Link" + +import { cn } from "@/lib/utils/cn" +import { formatPriceUSD } from "@/lib/utils/numbers" + +interface EthPriceSimpleProps extends React.HTMLAttributes { + ethPrice: MetricReturnData +} + +const EthPriceSimple = async ({ + ethPrice, + className, + ...props +}: EthPriceSimpleProps) => { + const locale = await getLocale() + const t = await getTranslations({ locale, namespace: "common" }) + + const hasError = "error" in ethPrice + + const price = hasError + ? t("loading-error-refresh") + : formatPriceUSD(ethPrice.value, locale) + + const tooltipContent = ( +
+ {t("data-provided-by")}{" "} + + coingecko.com + +
+ ) + + return ( +
+
+ {price} +
+
+ {t("eth-current-price")} + + + +
+
+ ) +} + +export default EthPriceSimple diff --git a/src/components/Homepage/HomepageSectionImage.tsx b/src/components/Homepage/HomepageSectionImage.tsx index 875d1cc4a3e..e5a6a945139 100644 --- a/src/components/Homepage/HomepageSectionImage.tsx +++ b/src/components/Homepage/HomepageSectionImage.tsx @@ -21,6 +21,14 @@ const imageMap: Record< desktop: StaticImageData } > = { + "what-is-ethereum": { + mobile: learnHubHero, + desktop: learnHubHeroPortrait, + }, + "what-is-ether": { + mobile: quizzesHubHero, + desktop: quizzesHubHeroPortrait, + }, activity: { mobile: layerTwoHubHero, desktop: layerTwoHubHeroPortrait, diff --git a/src/components/Homepage/utils.ts b/src/components/Homepage/utils.ts index 30ea54550c2..94b1c181c43 100644 --- a/src/components/Homepage/utils.ts +++ b/src/components/Homepage/utils.ts @@ -86,11 +86,11 @@ const stylesByPosition: Record = { cn("lg:col-span-6 lg:row-start-4", flow.lg.down), ], xl: [ - cn("xl:col-span-7 xl:col-start-5 xl:row-start-1", flow.xl.right), - cn("xl:col-span-4 xl:col-start-2 xl:row-start-2", flow.xl.up), - cn("xl:col-span-3 xl:col-start-6 xl:row-start-2", flow.xl.down), - cn("xl:col-span-3 xl:col-start-9 xl:row-span-2 xl:row-start-2", flow.xl.up), - cn("xl:col-span-7 xl:col-start-2 xl:row-start-3", flow.xl.right), + cn("xl:col-span-8 xl:col-start-5 xl:row-start-1", flow.xl.right), + cn("xl:col-span-4 xl:row-start-2", flow.xl.up), + cn("xl:col-span-4 xl:col-start-5 xl:row-start-2", flow.xl.down), + cn("xl:col-span-4 xl:col-start-9 xl:row-span-2 xl:row-start-2", flow.xl.up), + cn("xl:col-span-8 xl:row-start-3", flow.xl.right), ], } diff --git a/src/components/Nav/Menu/SubMenu.tsx b/src/components/Nav/Menu/SubMenu.tsx index 72e4c543da1..eeaaacb9425 100644 --- a/src/components/Nav/Menu/SubMenu.tsx +++ b/src/components/Nav/Menu/SubMenu.tsx @@ -59,7 +59,7 @@ const SubMenu = ({ lvl, items, activeSection, onClose }: LvlContentProps) => { {items.map((item) => { - const { label, icon: Icon, ...action } = item + const { label, ...action } = item const subItems = action.items || [] const isLink = "href" in action const isActivePage = isLink && cleanPath(asPath) === action.href @@ -86,10 +86,6 @@ const SubMenu = ({ lvl, items, activeSection, onClose }: LvlContentProps) => { asChild > - {lvl === 1 && Icon ? ( - - ) : null} - @@ -98,10 +94,6 @@ const SubMenu = ({ lvl, items, activeSection, onClose }: LvlContentProps) => { <> diff --git a/src/components/Nav/useNavigation.ts b/src/components/Nav/useNavigation.ts index 40aff11cad8..ec8294f27ea 100644 --- a/src/components/Nav/useNavigation.ts +++ b/src/components/Nav/useNavigation.ts @@ -1,23 +1,4 @@ -import BookIcon from "@/components/icons/book.svg" -import BuildingsIcon from "@/components/icons/buildings.svg" -import CodeSquareIcon from "@/components/icons/code-square.svg" -import CompassIcon from "@/components/icons/compass.svg" -import EthereumIcon from "@/components/icons/ethereum-icon.svg" -import FlagIcon from "@/components/icons/flag.svg" -import Flask from "@/components/icons/flask.svg" -import JournalCodeIcon from "@/components/icons/journal-code.svg" -import LayersIcon from "@/components/icons/layers.svg" -import LightbulbIcon from "@/components/icons/lightbulb.svg" -import MegaphoneIcon from "@/components/icons/megaphone.svg" -import MortarboardIcon from "@/components/icons/mortarboard.svg" -import PinAngleIcon from "@/components/icons/pin-angle.svg" -import SafeIcon from "@/components/icons/safe.svg" -import SignpostIcon from "@/components/icons/signpost.svg" -import SlidersHorizontalCircles from "@/components/icons/sliders-horizontal-circles.svg" -import UiChecksGridIcon from "@/components/icons/ui-checks-grid.svg" -import UsersFourLight from "@/components/icons/users-four-light.svg" - -import type { NavItem, NavSections } from "./types" +import type { NavSections } from "./types" import useTranslation from "@/hooks/useTranslation" import { buildNavigation } from "@/lib/nav/buildNavigation" @@ -27,62 +8,5 @@ export const useNavigation = () => { const linkSections: NavSections = buildNavigation(t) - const iconById: Record = { - "learn/overview": CompassIcon, - "learn/basics": UiChecksGridIcon, - "learn/advanced": SlidersHorizontalCircles, - "learn/quizzes": MortarboardIcon, - "use/get-started": PinAngleIcon, - "use/use-cases": LightbulbIcon, - "use/stake": SafeIcon, - "use/networks": LayersIcon, - "build/home": CodeSquareIcon, - "build/get-started": FlagIcon, - "build/docs": JournalCodeIcon, - "build/business": BuildingsIcon, - "participate/community-hub": UsersFourLight, - "participate/events": MegaphoneIcon, - "participate/ethereum-org": EthereumIcon, - "research/whitepaper": BookIcon, - "research/roadmap": SignpostIcon, - "research/research": Flask, - } - - const applyIconsToItems = (items: NavItem[]): NavItem[] => - items.map((item) => { - const icon = item.id ? iconById[item.id] : undefined - if ("items" in item && item.items) { - return { - ...item, - ...(icon ? { icon } : {}), - items: applyIconsToItems(item.items), - } - } - return { ...item, ...(icon ? { icon } : {}) } as NavItem - }) - - const linkSectionsWithIcons: NavSections = { - learn: { - ...linkSections.learn, - items: applyIconsToItems(linkSections.learn.items), - }, - use: { - ...linkSections.use, - items: applyIconsToItems(linkSections.use.items), - }, - build: { - ...linkSections.build, - items: applyIconsToItems(linkSections.build.items), - }, - participate: { - ...linkSections.participate, - items: applyIconsToItems(linkSections.participate.items), - }, - research: { - ...linkSections.research, - items: applyIconsToItems(linkSections.research.items), - }, - } - - return { linkSections: linkSectionsWithIcons } + return { linkSections } } diff --git a/src/intl/en/page-index.json b/src/intl/en/page-index.json index 6a39822795c..664db018280 100644 --- a/src/intl/en/page-index.json +++ b/src/intl/en/page-index.json @@ -1,26 +1,27 @@ { - "page-index-activity-description": "Activity from all Ethereum networks", + "page-index-activity-description": "Ethereum is the leading platform for issuing, managing, and settling digital assets. From tokenized money and financial instruments to real-world assets and emerging markets, Ethereum provides a secure, neutral foundation for the digital economy.", + "page-index-activity-subtitle": "Activity on Ethereum Mainnet and Layer 2 networks", "page-index-activity-tag": "Activity", "page-index-activity-header": "The strongest ecosystem", "page-index-activity-action": "More ecosystem resources", - "page-index-activity-action-primary": "Enterprise Ethereum", + "page-index-activity-action-primary": "Ethereum for institutions", "page-index-bento-header": "A new way to use the internet", "page-index-bento-assets-action": "More on NFTs", - "page-index-bento-assets-content": "Art, certificates or even real estate can be tokenized. Anything can be a tradable token. Ownership is public and verifiable.", + "page-index-bento-assets-content": "From art to real estate to stocks, any asset can be tokenized on Ethereum to prove and verify ownership digitally. Buy, sell, trade, and create assets and collectibles—anytime, anywhere.", "page-index-bento-assets-title": "The internet of assets", "page-index-bento-dapps-action": "Browse apps", - "page-index-bento-dapps-content": "Ethereum apps work without selling your data. Protect your privacy.", - "page-index-bento-dapps-title": "Innovative apps", + "page-index-bento-dapps-content": "Apps built on Ethereum work without selling your data. From social media to gaming to work, use the same account for every innovative app while maintaining privacy and access.", + "page-index-bento-dapps-title": "Apps that respect your privacy", "page-index-bento-defi-action": "Explore DeFi", - "page-index-bento-defi-content": "Billions can't open bank accounts or freely use their money. Ethereum's financial system is always open and unbiased.", - "page-index-bento-defi-title": "A fairer financial system", - "page-index-bento-networks-action": "Explore benefits", - "page-index-bento-networks-content": "Ethereum is the hub for blockchain innovation. The best projects are built on Ethereum.", + "page-index-bento-defi-content": "Borrow, lend, earn interest, and more, without a bank account. Ethereum's decentralized financial system is open 24/7 to anyone with an internet connection.", + "page-index-bento-defi-title": "A financial system open to all", + "page-index-bento-networks-action": "Discover Layer 2s", + "page-index-bento-networks-content": "Hundreds of Layer 2 networks are built on Ethereum. Enjoy low fees and near-instant transactions while benefiting from Ethereum's proven security.", "page-index-bento-networks-title": "The network of networks", "page-index-bento-stablecoins-action": "Discover stablecoins", - "page-index-bento-stablecoins-content": "Stablecoins are currencies that maintain stable value. Their price matches the U.S. dollar or other steady assets.", - "page-index-bento-stablecoins-title": "Crypto without volatility", - "page-index-builders-action-primary": "Builder's Portal", + "page-index-bento-stablecoins-content": "Stablecoins are currencies that maintain a stable price, matched to steady assets like the U.S. dollar. Access global payments instantly or store value in digital dollars on Ethereum.", + "page-index-bento-stablecoins-title": "Digital cash for everyday use", + "page-index-builders-action-primary": "Builder's portal", "page-index-builders-action-secondary": "Documentation", "page-index-builders-description": "Ethereum is home to Web3's largest and most vibrant developer ecosystem. Use JavaScript and Python, or learn a smart contract language like Solidity or Vyper to write your own app.", "page-index-builders-tag": "Builders", @@ -53,7 +54,7 @@ "page-index-developers-code-example-title-3": "An open, permissionless DNS", "page-index-developers-code-examples": "Code examples", "page-index-events-action": "See all events", - "page-index-events-header": "Events", + "page-index-events-header": "Ethereum events", "page-index-events-subtitle": "Ethereum communities host events all around the globe, all year long", "page-index-hero-image-alt": "An illustration of a futuristic city, representing the Ethereum ecosystem.", "page-index-join-action-contribute-description": "Find out all the different ways you can help ethereum.org grow and be better.", @@ -61,10 +62,21 @@ "page-index-join-action-discord-description": "To ask questions, coordinate contribution and join community calls.", "page-index-join-action-github-description": "Contribute to code, design, articles, etc.", "page-index-join-action-twitter-description": "To keep up with our updates and important news.", - "page-index-join-description": "This website is open source with hundreds of community contributors. You can propose edits to any of the content on this site.", + "page-index-join-description": "The ethereum.org website is built and maintained by thousands of translators, coders, designers, copywriters, and community members. You can propose edits to any of the content on this open source site.", "page-index-join-header": "Join ethereum.org", - "page-index-learn-description": "Crypto can feel overwhelming. Don't worry, these materials are designed to help you understand Ethereum in just a few minutes.", + "page-index-join-action-hub": "ethereum.org contributor hub", + "page-index-learn-description": "Ethereum is a decentralized blockchain network and software development platform, powered by the cryptocurrency ether (ETH). These resources are your gateway to confidently navigate, understand, and use Ethereum.", + "page-index-what-is-ethereum-title": "What is Ethereum?", + "page-index-what-is-ethereum-description-1": "Ethereum is a decentralized, open source blockchain network and software development platform, powered by the cryptocurrency ether (ETH). Ethereum is the secure, global foundation for a new generation of unstoppable applications.", + "page-index-what-is-ethereum-description-2": "The Ethereum network is open to everyone: no permission is required. It has no owner, and is built and maintained by thousands of people, organizations, and users around the world.", + "page-index-what-is-ethereum-action": "Learn about Ethereum", + "page-index-what-is-ether-title": "What is ETH?", + "page-index-what-is-ether-description-1": "Ether (ETH) is the native cryptocurrency that powers the Ethereum network, used to pay transaction fees and secure the blockchain through staking.", + "page-index-what-is-ether-description-2": "Beyond its technical role, ETH is open, programmable digital money. It is used for global payments, as collateral for loans, and as a store of value that doesn't rely on any central entity.", + "page-index-what-is-ether-action": "Learn more about ether", "page-index-learn-tag": "Learn", + "page-index-network-tag": "Network", + "page-index-token-tag": "Token", "page-index-learn-header": "Understand Ethereum", "page-index-meta-description": "Ethereum is a global, decentralized platform for money and new kinds of applications. On Ethereum, you can write code that controls money, and build applications accessible anywhere in the world.", "page-index-meta-title": "Ethereum.org: The complete guide to Ethereum", @@ -75,13 +87,13 @@ "page-index-network-stats-total-value-held": "Total value held on Ethereum", "page-index-popular-topics-ethereum": "What is Ethereum?", "page-index-popular-topics-header": "Popular topics", - "page-index-popular-topics-action": "Other topics", + "page-index-popular-topics-action": "More guides in Ethereum Learn Hub", "page-index-popular-topics-roadmap": "Ethereum roadmap", - "page-index-popular-topics-start": "How to start, step by step", + "page-index-popular-topics-start": "Step-by-step Ethereum guides", "page-index-popular-topics-wallets": "What are crypto wallets?", "page-index-popular-topics-whitepaper": "Ethereum Whitepaper", "page-index-posts-action": "Read more on these websites", - "page-index-posts-header": "Recent posts", + "page-index-posts-header": "Ethereum news", "page-index-posts-subtitle": "The latest blog posts and updates from the community", "page-index-title": "Welcome to Ethereum", "page-index-use-cases-tag": "Use cases", diff --git a/src/lib/utils/numbers.ts b/src/lib/utils/numbers.ts index 3c325f99e15..ac48d4f33c5 100644 --- a/src/lib/utils/numbers.ts +++ b/src/lib/utils/numbers.ts @@ -25,3 +25,12 @@ export const formatLargeNumber = (value: number, locale: string): string => { maximumSignificantDigits: 4, }).format(value) } + +export const formatPriceUSD = (value: number, locale: string): string => { + return new Intl.NumberFormat(locale, { + style: "currency", + currency: "USD", + minimumFractionDigits: 2, + maximumFractionDigits: 2, + }).format(value) +} diff --git a/tailwind.config.ts b/tailwind.config.ts index 8e6e4cef472..6dd66724aea 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -329,7 +329,7 @@ const config = { "4xl": "2rem" /* 32px */, }, gridTemplateColumns: { - bento: "2rem repeat(10, 1fr) 2rem", + bento: "repeat(12, 1fr)", }, textUnderlineOffset: { 3: "3px",