Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
3944be9
refactor: grid-cols auto-fill/fit custom tw classes
wackerow Jan 18, 2026
806303c
feat(ui): reusable TagsInlineText component
wackerow Jan 18, 2026
3437817
feat: add developer apps data fetching
wackerow Jan 19, 2026
eb3f80d
feat(i18n): add developer apps page namespace strings
wackerow Jan 19, 2026
4440b81
feat: add developer apps directory pages
wackerow Jan 19, 2026
538ee79
fix: page params, set request locale
wackerow Jan 19, 2026
36c33fc
feat(data): add fetch repos stargazers/lastupdated
wackerow Jan 19, 2026
1f2046b
Merge branch 'dev' into page-developer-apps
wackerow Jan 19, 2026
b8dd323
patch: string capitalization
wackerow Jan 19, 2026
c4e9fe9
feat: add other categories section
wackerow Jan 19, 2026
1611bcc
feat: client-side app modal wrapper
wackerow Jan 19, 2026
23b449e
feat: init app modal, refactor data fetching
wackerow Jan 19, 2026
17d802e
fix: DYNAMIC_SERVER_USAGE
wackerow Jan 19, 2026
a7800f5
refactor: ui/dialog-modal variants
wackerow Jan 20, 2026
4215702
feat: add AppModalContents
wackerow Jan 20, 2026
a29d6d9
refactor: TruncatedText
wackerow Jan 20, 2026
500ff27
Merge branch 'dev' into page-developer-apps
wackerow Jan 20, 2026
f7283e7
chore: adjust i18n key names for consistency
wackerow Jan 20, 2026
bddba5e
feat: fetch download count for npmjs repos
wackerow Jan 20, 2026
148ecea
patch: overflow scroll long descriptions
wackerow Jan 20, 2026
5b42181
fix(ui): star/download count render
wackerow Jan 20, 2026
c26512b
fix: highlight tags/title colors, i18n category
wackerow Jan 20, 2026
65f7581
feat: implement dev tooling data-layer
wackerow Jan 20, 2026
529bbe8
fix: add sleep and retry to avoid rate limiting
wackerow Jan 20, 2026
d98982b
patch: modal close button styling
wackerow Jan 20, 2026
e2f2811
feat: add TagFilter
wackerow Jan 21, 2026
584a24a
fix: searchParam handling
wackerow Jan 21, 2026
87898a6
feat: HighlightsSection abstraction
wackerow Jan 21, 2026
ddf527c
feat: pseudo-randomize highlight cards
wackerow Jan 21, 2026
94f0c1a
patch: clean up tasks
wackerow Jan 21, 2026
1359c57
patch: highlight card banner image sizing
wackerow Jan 21, 2026
977bbd4
update: site developers navigation
wackerow Jan 21, 2026
e3f8540
feat(seo): add JSON-LD to developer apps pages
wackerow Jan 21, 2026
f7898ff
patch: modal banner height and aspect ratio
wackerow Jan 21, 2026
eeb5124
feat: add date and time helper functions
wackerow Jan 21, 2026
562706e
feat: randomize category card apps daily
wackerow Jan 21, 2026
d9905be
fix/refactor: tag colors; extract reusable helper
wackerow Jan 21, 2026
32bfd83
feat: add simple markdown parser
wackerow Jan 21, 2026
d05c5a3
feat: parse descriptions for markdown in app modal
wackerow Jan 21, 2026
a65cebf
feat: add stripMarkdown helper util
wackerow Jan 21, 2026
657fbd5
feat: use stripMarkdown on app card descriptions
wackerow Jan 21, 2026
23428d5
feat(ui): Add "lg" modal content size variant
wackerow Jan 21, 2026
789a19d
update(ui): use modal size=lg
wackerow Jan 21, 2026
604bfaf
patch: banner image height with blur bg
wackerow Jan 21, 2026
5ebb70a
Merge branch 'dev' into page-developer-apps
wackerow Jan 21, 2026
f564b7b
refactor: generateStaticParams without locale
wackerow Jan 21, 2026
e93b716
Merge branch 'page-developer-apps' into simple-markdown
wackerow Jan 21, 2026
552275a
Merge branch 'page-developer-apps' into page-developer-apps-images
wackerow Jan 21, 2026
4014054
patch: modal rounded corners
wackerow Jan 21, 2026
b1d66c8
deprecate: dev local-environment, learning-tools
wackerow Jan 22, 2026
9ada785
patch: use original cardbanner height
wackerow Jan 22, 2026
f589f4d
patch: reorder dev nav links
wackerow Jan 22, 2026
b966fd0
Merge pull request #17134 from ethereum/page-developer-apps-images
wackerow Jan 23, 2026
6c73782
chore: remove todos, custom events
wackerow Jan 23, 2026
05389a6
chore: trim mock data
wackerow Jan 23, 2026
4949865
patch: apply regex pattern filter pre-query
wackerow Jan 23, 2026
fced7b9
refactor: reuse htmlElements in renderSimpleMarkdown
wackerow Jan 26, 2026
f7a4781
Merge branch 'dev' into page-developer-apps
wackerow Jan 26, 2026
c1fbd7a
Merge branch 'page-developer-apps' into simple-markdown
wackerow Jan 26, 2026
d91ed58
patch: type cast
wackerow Jan 27, 2026
f1879e1
feat(ui): add fit variant to CardBanner
wackerow Jan 27, 2026
f3562e0
feat: add reusable AppCard component
wackerow Jan 27, 2026
1cfe39f
refactor: migrate /apps section to new AppCard component
wackerow Jan 27, 2026
a2247fb
feat(AppCard): add named groups and default icon
wackerow Jan 27, 2026
1c56ac9
refactor(developers/apps): migrate to AppCard
wackerow Jan 27, 2026
d262850
patch: named group-hover, fixes hover on category app stack
wackerow Jan 27, 2026
715951e
feat(ui): add reusable FilterBar component
wackerow Jan 27, 2026
766f54e
refactor(apps): migrate AppsTable to use FilterBar component
wackerow Jan 27, 2026
85d255d
feat: pre-compute developer apps selections in data layer
wackerow Jan 27, 2026
2e8f009
refactor(developers/apps): migrate category pages to FilterBar
wackerow Jan 27, 2026
cda4d15
fix: tag types
wackerow Jan 27, 2026
ad30ec7
refactor: isolate developer-tools module in data layer
pettinarip Feb 2, 2026
c48a80e
Merge pull request #17131 from ethereum/simple-markdown
wackerow Feb 3, 2026
ddbbdd9
Merge pull request #17181 from ethereum/refactor-filter-bar
wackerow Feb 3, 2026
c82c928
Merge branch 'dev' into page-developer-apps
wackerow Feb 3, 2026
7066655
Merge branch 'page-developer-apps' into refactor-app-card
wackerow Feb 3, 2026
9b51e01
refactor: use AppCard
wackerow Feb 3, 2026
74c392e
Merge pull request #17178 from ethereum/refactor-app-card
wackerow Feb 3, 2026
835d5a6
Merge pull request #17213 from ethereum/refactor/data-layer-developer…
wackerow Feb 3, 2026
18bc8ef
Merge branch 'page-developer-apps' into unstable-cache
wackerow Feb 3, 2026
4d8400f
Merge pull request #17180 from ethereum/unstable-cache
wackerow Feb 3, 2026
5990531
content: developer -> builder, apps -> tools
wackerow Feb 3, 2026
3f1b3e6
refactor: dev apps namespace to "tools"
wackerow Feb 3, 2026
b4e5a13
refactor: dev "apps" to "tools"
wackerow Feb 3, 2026
68844ea
Merge branch 'page-developer-apps' into page-developer-apps-deprecate…
wackerow Feb 3, 2026
c78caa0
Merge pull request #17137 from ethereum/page-developer-apps-deprecate…
wackerow Feb 3, 2026
23207e0
refactor(code): dev "app(s)" -> "tool(s)"
wackerow Feb 3, 2026
14e01f4
refactor: use internal Image component
wackerow Feb 4, 2026
f1228c9
bump(deps): @trigger.dev/sdk v4.3.3
wackerow Feb 4, 2026
49bdd4b
fix: add allowed next image domains for dev-tools
wackerow Feb 4, 2026
8ed089e
patch: update redirects to /developers/tools/*
wackerow Feb 5, 2026
108f825
fix: dynamicParams false for dev-tools category pages
wackerow Feb 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 22 additions & 8 deletions app/[locale]/apps/[application]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {

import type { ChainName, CommitHistory, Lang, PageParams } from "@/lib/types"

import AppCard from "@/components/AppCard"
import ChainImages from "@/components/ChainImages"
import { ChevronNext } from "@/components/Chevron"
import I18nProvider from "@/components/I18nProvider"
Expand Down Expand Up @@ -41,8 +42,6 @@ import {
import { slugify } from "@/lib/utils/url"
import { formatStringList } from "@/lib/utils/wallets"

import AppCard from "../_components/AppCard"

import ScreenshotSwiper from "./_components/ScreenshotSwiper"
import AppsAppJsonLD from "./page-jsonld"

Expand Down Expand Up @@ -366,12 +365,27 @@ const Page = async ({
className="flex-1 lg:w-1/3 lg:flex-none"
>
<AppCard
app={relatedApp}
imageSize={24}
showDescription
hoverClassName="hover:bg-background-highlight/50"
matomoCategory="detail"
matomoAction="more_apps"
name={relatedApp.name}
description={relatedApp.description}
thumbnail={relatedApp.image}
category={relatedApp.category}
categoryTagStatus={
APP_TAG_VARIANTS[relatedApp.category]
}
tags={relatedApp.subCategory}
href={`/apps/${slugify(relatedApp.name)}`}
imageSize="large"
className="hover:bg-background-highlight/50"
customEventOptions={{
eventCategory: "detail",
eventAction: "more_apps",
eventName: `app name ${relatedApp.name}`,
}}
descriptionTracking={{
eventCategory: "detail",
eventAction: "more_apps_show_more",
eventName: `app description ${relatedApp.name}`,
}}
/>
</div>
))}
Expand Down
114 changes: 0 additions & 114 deletions app/[locale]/apps/_components/AppCard.tsx

This file was deleted.

15 changes: 9 additions & 6 deletions app/[locale]/apps/_components/AppsHighlight.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import { AppData } from "@/lib/types"

import AppCard from "@/components/AppCard"
import { Image } from "@/components/Image"
import { LinkBox, LinkOverlay } from "@/components/ui/link-box"
import TruncatedText from "@/components/ui/TruncatedText"

import { APP_TAG_VARIANTS } from "@/lib/utils/apps"
import { slugify } from "@/lib/utils/url"

import AppCard from "./AppCard"
import AppsSwiper from "./AppsSwiper"

interface AppsHighlightProps {
Expand Down Expand Up @@ -49,11 +50,13 @@ const AppsHighlight = ({ apps, matomoCategory }: AppsHighlightProps) => {
</TruncatedText>
</div>
<AppCard
app={app}
imageSize={16}
disableLink
matomoCategory={matomoCategory}
matomoAction="highlights"
name={app.name}
thumbnail={app.image}
category={app.category}
categoryTagStatus={APP_TAG_VARIANTS[app.category]}
tags={app.subCategory}
layout="horizontal"
imageSize="medium"
/>
</LinkOverlay>
</LinkBox>
Expand Down
102 changes: 33 additions & 69 deletions app/[locale]/apps/_components/AppsTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,13 @@ import { useMemo, useState } from "react"

import { AppData } from "@/lib/types"

import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select"
import AppCard from "@/components/AppCard"
import FilterBar from "@/components/FilterBar"

import { trackCustomEvent } from "@/lib/utils/matomo"

import AppCard from "./AppCard"

import useTranslation from "@/hooks/useTranslation"
import { slugify } from "@/lib/utils/url"

const AppsTable = ({ apps }: { apps: AppData[] }) => {
const { t } = useTranslation("page-apps")
const [filterBy, setFilterBy] = useState("All")
const [filterBy, setFilterBy] = useState<string>()

const subCategories = useMemo(
() => [...new Set(apps.flatMap((app) => app.subCategory))],
Expand All @@ -34,72 +24,46 @@ const AppsTable = ({ apps }: { apps: AppData[] }) => {
const filteredApps = useMemo(
() =>
apps.filter((app) => {
if (filterBy === "All") return true
if (!filterBy) return true
return app.subCategory.includes(filterBy)
}),
[apps, filterBy]
)

const filterItems = subCategories.map((subCategory) => ({
value: subCategory,
label: `${subCategory} (${getSubCategoryCount(subCategory)})`,
}))

return (
<div className="flex flex-col gap-7">
<div className="flex flex-row items-end justify-between border-b pb-2 sm:items-center">
<div className="flex flex-col items-start gap-2 sm:flex-row sm:items-center">
<p className="whitespace-nowrap">{t("page-apps-filter-by")}</p>
<Select
value={filterBy}
onValueChange={(value) => {
setFilterBy(value)
trackCustomEvent({
eventCategory: "category_page",
eventAction: "filter_by",
eventName: `subcategory name ${value}`,
})
}}
>
<SelectTrigger className="min-w-28">
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectItem
value="All"
className="cursor-pointer hover:bg-primary-low-contrast"
>
{t("page-apps-filter-all")}
</SelectItem>
{subCategories.map((subCategory) => (
<SelectItem
key={subCategory}
value={subCategory}
className="cursor-pointer hover:bg-primary-low-contrast"
>
{subCategory} ({getSubCategoryCount(subCategory)})
</SelectItem>
))}
</SelectContent>
</Select>
</div>
<div>
<p className="text-body-medium">
{t("page-apps-showing")}{" "}
<span className="text-body">
(
{filteredApps.length === apps.length
? apps.length
: `${filteredApps.length}/${apps.length}`}
)
</span>
</p>
</div>
</div>
<FilterBar
items={filterItems}
value={filterBy}
onValueChange={setFilterBy}
count={filteredApps.length}
totalCount={apps.length}
matomoEvent={{
eventCategory: "category_page",
eventAction: "filter_by",
eventName: "",
}}
/>
<div className="grid grid-cols-1 gap-8 sm:grid-cols-2 lg:grid-cols-3">
{filteredApps.map((app) => (
<div key={app.name}>
<AppCard
app={app}
imageSize={14}
hideTag
matomoCategory="category_page"
matomoAction="apps"
name={app.name}
thumbnail={app.image}
tags={app.subCategory}
href={`/apps/${slugify(app.name)}`}
layout="horizontal"
imageSize="thumbnail"
customEventOptions={{
eventCategory: "category_page",
eventAction: "apps",
eventName: `app name ${app.name}`,
}}
/>
</div>
))}
Expand Down
Loading