Skip to content

Add next/nav-link for active-aware navigation links#95922

Draft
aurorascharff wants to merge 9 commits into
canaryfrom
aurorascharff/link-active-navlink
Draft

Add next/nav-link for active-aware navigation links#95922
aurorascharff wants to merge 9 commits into
canaryfrom
aurorascharff/link-active-navlink

Conversation

@aurorascharff

@aurorascharff aurorascharff commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

What?

Adds a NavLink component, similar to React Router's NavLink, to simplify a common task.

import NavLink from 'next/nav-link'

// 1. String className, styled via the data-active variant — no render prop, works from a Server Component
<NavLink href="/dashboard" className="nav-item data-active:font-bold">
  Dashboard
</NavLink>

// 2. Render-prop className — reads isActive AND isPending (Client Component)
<NavLink
  href="/inbox"
  className={({ isActive, isPending }) =>
    cn(isActive && 'text-blue-600', isPending && 'opacity-50')
  }
>
  Inbox
</NavLink>

// 3. Render-prop children — swap content when active (Client Component)
<NavLink href="/profile">
  {({ isActive }) => (isActive ? <ProfileFilled /> : <ProfileOutline />)}
</NavLink>

Why?

There's a lot of gotchas when doing this yourself, which I have documented here, so it would be great if Next.js could have this built in. https://aurorascharff.no/posts/building-an-active-navlink-component-in-nextjs/

How?

  • A <NavLink> for the App Router that knows when it points at the current route. It sets data-active on the active link — including an ancestor matched by prefix — for styling, and aria-current="page" only on the exact page, so an ancestor is never announced as the current page.
  • Style the active link in CSS via the data-active: Tailwind variant (or a [data-active] rule), or take full control by passing className/children as a function of { isActive, isPending }.
  • Matches nested routes by default (/blog is active on /blog/post); add exact for an exact-only match. Matching uses the pathname; for query-string state such as tabs, read useSearchParams() yourself.
  • Active state is worked out on the server, so it's right on first paint and a nav in a static layout stays static under cacheComponents — no extra Suspense.
  • On a route with an unknown dynamic param it can't be resolved at build time, so the active class fills in after hydration (a small flicker); the docs show an inline-script fix.
  • A clear, NavLink-specific error if you use the function form from a Server Component.
  • Ships with a docs page and e2e tests.
A `next/nav-link` entry that reuses `Link`, reads the pathname untracked, and resolves the render props inside the anchor.

Its own module. next/nav-link is a separate entry (like next/form) rather than an overload of next/link. Webpack aliases (create-compiler-aliases.ts) and the Turbopack import map (next_import_map.rs) mirror next/link across the base / app-client / react-server conditions; the react-server variant throws the Server-Component error, and the Pages Router entry throws "App Router only".

Two things a userland wrapper can't do:

  • Stays in the static shell under cacheComponents. The active read uses useUntrackedPathname(), which reads PathnameContext directly and skips the dynamic-API guard that makes a hand-written usePathname() nav hang on fallback-param prerenders. The context is SSR-seeded, so the active class is already in the initial HTML for static routes.
  • isPending reaches className, not just children. Both function props are resolved inside the anchor render, where the optimistic link status lives. A userland wrapper sets className on Link from the outside, so it can only observe pending via useLinkStatus inside children — never in className.

Two attributes, two meanings. data-active is present on any match (exact or prefix) for styling; aria-current="page" is set only on an exact match, so a prefix-matched ancestor gets data-active but not aria-current.

Matching. exactpathname === href; default → pathname === href || pathname.startsWith(href + '/'), with / exact. Trailing slashes are normalized so matching is stable under trailingSlash.

@github-actions

github-actions Bot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Tests Passed

Commit: 2127bb2

@github-actions

github-actions Bot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Stats from current PR

🔴 1 regression, 3 improvements

Metric Canary PR Change Trend
node_modules Size 517 MB 517 MB 🔴 +95.7 kB (+0%) ▁▁▁▁▁
Webpack Build Time (cached) 26.083s 25.374s 🟢 709ms (-3%) ▁▁█▁▁
Webpack Cold (First Request) 3.434s 3.301s 🟢 133ms (-4%) ▁▁█▂▁
Webpack Warm (First Request) 3.469s 3.352s 🟢 117ms (-3%) ▁▁█▁▁
📊 All Metrics
📖 Metrics Glossary

Dev Server Metrics:

  • Listen = TCP port starts accepting connections
  • First Request = HTTP server returns successful response
  • Cold = Fresh build (no cache)
  • Warm = With cached build artifacts

Build Metrics:

  • Fresh = Clean build (no .next directory)
  • Cached = With existing .next directory

Change Thresholds:

  • Time: Changes < 50ms AND < 10%, OR < 2% are insignificant
  • Size: Changes < 1KB AND < 1% are insignificant
  • All other changes are flagged to catch regressions

⚡ Dev Server

Metric Canary PR Change Trend
Cold (Listen) 813ms 814ms ▁▂█▂▂
Cold (Ready in log) 788ms 783ms ▁▁█▂▁
Cold (First Request) 1.316s 1.322s ▁▁█▃▁
Warm (Listen) 813ms 815ms ▁▂▇▂▂
Warm (Ready in log) 784ms 791ms ▁▁█▂▁
Warm (First Request) 1.304s 1.322s ▁▁█▃▁
📦 Dev Server (Webpack) (Legacy)

📦 Dev Server (Webpack)

Metric Canary PR Change Trend
Cold (Listen) 815ms 810ms ▂▂█▂▁
Cold (Ready in log) 797ms 774ms ▂▁█▂▁
Cold (First Request) 3.434s 3.301s 🟢 133ms (-4%) ▁▁█▂▁
Warm (Listen) 814ms 812ms ▂▂█▂▁
Warm (Ready in log) 794ms 775ms ▂▁█▂▁
Warm (First Request) 3.469s 3.352s 🟢 117ms (-3%) ▁▁█▁▁

⚡ Production Builds

Metric Canary PR Change Trend
Fresh Build 5.220s 5.327s ▁▁█▃▁
Cached Build 5.345s 5.412s ▁▁█▄▁
📦 Production Builds (Webpack) (Legacy)

📦 Production Builds (Webpack)

Metric Canary PR Change Trend
Fresh Build 25.947s 25.826s ▁▁█▁▁
Cached Build 26.083s 25.374s 🟢 709ms (-3%) ▁▁█▁▁
node_modules Size 517 MB 517 MB 🔴 +95.7 kB (+0%) ▁▁▁▁▁
📦 Bundle Sizes

Bundle Sizes

⚡ Turbopack

Client

Main Bundles
Canary PR Change
03gmyxr7dukvs.js gzip 10.3 kB N/A -
040t1q17lo593.js gzip 8.77 kB N/A -
0bb0vtp8dwsez.js gzip 450 B N/A -
0bc2qmapf2-xp.js gzip 65.6 kB N/A -
0cz1d0mv5g_q7.js gzip 39.4 kB 39.4 kB
0eitupjbfrykc.js gzip 152 B N/A -
0erxj74x8k6ec.js gzip 168 B N/A -
0gtdybiz8dm6u.js gzip 157 B N/A -
0knlni7gtnkvn.js gzip 157 B N/A -
0l0sr6gau5xjn.js gzip 3.53 kB N/A -
0nxqz3q165m2l.js gzip 220 B N/A -
0qr-1tnb7_hg5.js gzip 5.72 kB N/A -
0ri4somsc4db7.js gzip 157 B N/A -
0uilzvklme4ea.js gzip 8.76 kB N/A -
0xt5c-i2o_3vb.js gzip 157 B N/A -
0z0y83mfx-l-h.js gzip 10 kB N/A -
1_-g_r52k540c.js gzip 7.4 kB N/A -
1292my3koxtzp.js gzip 156 B N/A -
15ok8ydf274z0.js gzip 10.6 kB N/A -
16cqqcigykfea.js gzip 13.6 kB N/A -
17h18zxt1915l.js gzip 1.46 kB N/A -
1elt1qium-r2m.css gzip 115 B 115 B
1fq1h7dxad4cv.js gzip 9.44 kB N/A -
1fym-adbk_69_.js gzip 13.1 kB N/A -
1gav7nfh4y8ln.js gzip 8.76 kB N/A -
1gbsj2syj4hxg.js gzip 155 B N/A -
1hve002w_oi_4.js gzip 162 B N/A -
1o34vh44ndvtu.js gzip 13.2 kB N/A -
2pv--9ujiu0_m.js gzip 162 B N/A -
2rypqffktcxqh.js gzip 8.69 kB N/A -
2uqsizxtehgqf.js gzip 8.79 kB N/A -
2uu-v0yf5py2b.js gzip 152 B N/A -
2vzktdqwbijqc.js gzip 8.74 kB N/A -
329uye84qackw.js gzip 154 B N/A -
36648vv6scsxd.js gzip 156 B N/A -
3c244akvx_-be.js gzip 8.74 kB N/A -
3dmlemitx3ef3.js gzip 2.29 kB N/A -
3vfl1fxa4me-g.js gzip 45.2 kB N/A -
3xj5qsn_k_7op.js gzip 71 kB N/A -
4237vdj6eyslt.js gzip 8.7 kB N/A -
turbopack-06..a61-.js gzip 3.8 kB N/A -
turbopack-0f..q0ul.js gzip 3.8 kB N/A -
turbopack-0j..z5ci.js gzip 3.8 kB N/A -
turbopack-0s..7q--.js gzip 3.8 kB N/A -
turbopack-0s..fq_h.js gzip 3.8 kB N/A -
turbopack-18..bs07.js gzip 3.8 kB N/A -
turbopack-1c..65_4.js gzip 3.8 kB N/A -
turbopack-2l..he8o.js gzip 3.8 kB N/A -
turbopack-2m..eii_.js gzip 3.8 kB N/A -
turbopack-2r..tnn7.js gzip 3.8 kB N/A -
turbopack-2u..7enc.js gzip 3.78 kB N/A -
turbopack-32..48ct.js gzip 3.82 kB N/A -
turbopack-3n..nnos.js gzip 3.8 kB N/A -
turbopack-3u..6j97.js gzip 3.8 kB N/A -
00tc16j5-eos9.js gzip N/A 1.46 kB -
05p6p41p1-nn4.js gzip N/A 156 B -
0anw1-lx1rplr.js gzip N/A 157 B -
0gaw1gmpwuwkn.js gzip N/A 8.8 kB -
0k_p4mfk_qsc2.js gzip N/A 154 B -
0n68kwq6s1xjy.js gzip N/A 156 B -
0nk_trkwu_2tz.js gzip N/A 155 B -
0uhz4zhjb7hwp.js gzip N/A 156 B -
12zyjjmq4oad1.js gzip N/A 5.72 kB -
18j5_52co3scg.js gzip N/A 156 B -
1k9cc4-gpa2cx.js gzip N/A 13.1 kB -
1kfiwrcr725kl.js gzip N/A 13.2 kB -
1n59uogejo81s.js gzip N/A 10.3 kB -
1npei3hlexdv3.js gzip N/A 9.99 kB -
1ssuiwj_rnpc5.js gzip N/A 8.77 kB -
1v9l3xqke-2mc.js gzip N/A 155 B -
2-phc9obd3nyd.js gzip N/A 8.77 kB -
24utq57r3l1cw.js gzip N/A 8.7 kB -
25tly5nztb7d5.js gzip N/A 65.6 kB -
28asog09z62lv.js gzip N/A 155 B -
2fhjq6ek3srmr.js gzip N/A 8.69 kB -
2g0t7upz_v-hf.js gzip N/A 10.6 kB -
2h5nkoal80pda.js gzip N/A 45.2 kB -
2ia9qqy99aie9.js gzip N/A 13.6 kB -
2n5fp99a5xt9s.js gzip N/A 7.4 kB -
2oza28kdqvoay.js gzip N/A 8.74 kB -
2zh8-mmhujy8o.js gzip N/A 2.29 kB -
305y0a1-4hhz6.js gzip N/A 166 B -
30h_m0irj-q6p.js gzip N/A 221 B -
37bp97n04vfcu.js gzip N/A 153 B -
37ejbfx1u9lpo.js gzip N/A 8.75 kB -
38c63ct4i1cy7.js gzip N/A 449 B -
3jimpal3lvz5e.js gzip N/A 9.44 kB -
3su6a4l8jbfth.js gzip N/A 3.53 kB -
3wb4pe4z4-aim.js gzip N/A 8.77 kB -
3wsb05-fi2hd9.js gzip N/A 161 B -
405raob-lmvse.js gzip N/A 160 B -
42a5ce6ht4_fn.js gzip N/A 71 kB -
turbopack-02..ogf1.js gzip N/A 3.8 kB -
turbopack-08..uf5w.js gzip N/A 3.8 kB -
turbopack-10..7r_e.js gzip N/A 3.8 kB -
turbopack-1c..ez2a.js gzip N/A 3.8 kB -
turbopack-1e..rzgu.js gzip N/A 3.8 kB -
turbopack-1e.._44u.js gzip N/A 3.8 kB -
turbopack-1l..7b9n.js gzip N/A 3.8 kB -
turbopack-1q..j8nv.js gzip N/A 3.78 kB -
turbopack-1z..3w23.js gzip N/A 3.81 kB -
turbopack-25..lawv.js gzip N/A 3.8 kB -
turbopack-3c..e361.js gzip N/A 3.8 kB -
turbopack-3d..vk2h.js gzip N/A 3.8 kB -
turbopack-3g..-6fl.js gzip N/A 3.8 kB -
turbopack-44..r27p.js gzip N/A 3.8 kB -
Total 448 kB 448 kB ⚠️ +43 B

Server

Middleware
Canary PR Change
middleware-b..fest.js gzip 781 B 775 B
Total 781 B 775 B ✅ -6 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 430 B 436 B 🔴 +6 B (+1%)
Total 430 B 436 B ⚠️ +6 B

📦 Webpack

Client

Main Bundles
Canary PR Change
2486.HASH.js gzip 169 B N/A -
3146-HASH.js gzip 64.2 kB N/A -
39fcf99b-HASH.js gzip 62.9 kB N/A -
8443-HASH.js gzip 4.68 kB N/A -
9431-HASH.js gzip 5.62 kB N/A -
framework-HASH.js gzip 59.8 kB 59.8 kB
main-app-HASH.js gzip 256 B 253 B 🟢 3 B (-1%)
main-HASH.js gzip 39.7 kB 40.1 kB 🔴 +452 B (+1%)
webpack-HASH.js gzip 1.68 kB 1.68 kB
6105-HASH.js gzip N/A 5.63 kB -
764.HASH.js gzip N/A 169 B -
8898-HASH.js gzip N/A 63.6 kB -
9597-HASH.js gzip N/A 4.65 kB -
e1ccab69-HASH.js gzip N/A 62.9 kB -
Total 239 kB 239 kB ✅ -211 B
Polyfills
Canary PR Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Total 39.4 kB 39.4 kB
Pages
Canary PR Change
_app-HASH.js gzip 194 B 194 B
_error-HASH.js gzip 183 B 182 B
css-HASH.js gzip 335 B 335 B
dynamic-HASH.js gzip 1.8 kB 1.8 kB
edge-ssr-HASH.js gzip 255 B 254 B
head-HASH.js gzip 351 B 349 B
hooks-HASH.js gzip 384 B 384 B
image-HASH.js gzip 580 B 580 B
index-HASH.js gzip 259 B 259 B
link-HASH.js gzip 2.49 kB 2.49 kB
routerDirect..HASH.js gzip 319 B 319 B
script-HASH.js gzip 386 B 386 B
withRouter-HASH.js gzip 315 B 313 B
1afbb74e6ecf..834.css gzip 106 B 106 B
Total 7.96 kB 7.95 kB ✅ -7 B

Server

Edge SSR
Canary PR Change
edge-ssr.js gzip 128 kB 128 kB
page.js gzip 283 kB 285 kB 🔴 +2.11 kB (+1%)
Total 411 kB 413 kB ⚠️ +1.79 kB
Middleware
Canary PR Change
middleware-b..fest.js gzip 618 B 616 B
middleware-r..fest.js gzip 156 B 155 B
middleware.js gzip 45.3 kB 45.3 kB
edge-runtime..pack.js gzip 842 B 842 B
Total 46.9 kB 46.9 kB ⚠️ +34 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 719 B 720 B
Total 719 B 720 B ⚠️ +1 B
Build Cache
Canary PR Change
0.pack gzip 4.82 MB 4.81 MB 🟢 6.95 kB (0%)
index.pack gzip 120 kB 121 kB 🔴 +1.61 kB (+1%)
index.pack.old gzip 119 kB 121 kB 🔴 +2.29 kB (+2%)
Total 5.06 MB 5.05 MB ✅ -3.04 kB

🔄 Shared (bundler-independent)

Runtimes
Canary PR Change
app-page-exp...dev.js gzip 364 kB 364 kB
app-page-exp..prod.js gzip 201 kB 201 kB
app-page-tur...dev.js gzip 364 kB 364 kB
app-page-tur..prod.js gzip 201 kB 201 kB
app-page-tur...dev.js gzip 360 kB 360 kB
app-page-tur..prod.js gzip 199 kB 199 kB
app-page.run...dev.js gzip 361 kB 361 kB
app-page.run..prod.js gzip 199 kB 199 kB
app-route-ex...dev.js gzip 81.5 kB 81.5 kB
app-route-ex..prod.js gzip 55.4 kB 55.4 kB
app-route-tu...dev.js gzip 81.5 kB 81.5 kB
app-route-tu..prod.js gzip 55.4 kB 55.4 kB
app-route-tu...dev.js gzip 81.1 kB 81.1 kB
app-route-tu..prod.js gzip 55.1 kB 55.1 kB
app-route.ru...dev.js gzip 81.1 kB 81.1 kB
app-route.ru..prod.js gzip 55.1 kB 55.1 kB
dist_client_...dev.js gzip 324 B 324 B
dist_client_...dev.js gzip 326 B 326 B
dist_client_...dev.js gzip 318 B 318 B
dist_client_...dev.js gzip 317 B 317 B
pages-api-tu...dev.js gzip 45.2 kB 45.2 kB
pages-api-tu..prod.js gzip 33.9 kB 33.9 kB
pages-api.ru...dev.js gzip 45.2 kB 45.2 kB
pages-api.ru..prod.js gzip 33.9 kB 33.9 kB
pages-turbo....dev.js gzip 54.6 kB 54.6 kB
pages-turbo...prod.js gzip 39.6 kB 39.6 kB
pages.runtim...dev.js gzip 54.6 kB 54.6 kB
pages.runtim..prod.js gzip 39.5 kB 39.5 kB
server.runti..prod.js gzip 67.5 kB 67.5 kB
use-cache-pr...dev.js gzip 71.4 kB 71.4 kB
use-cache-pr...dev.js gzip 71.4 kB 71.4 kB
use-cache-pr...dev.js gzip 69.7 kB 69.7 kB
use-cache-pr...dev.js gzip 69.7 kB 69.7 kB
Total 3.49 MB 3.49 MB ⚠️ +6 B
📝 Changed Files (2 files)

Files with changes:

  • pages-api-tu..ntime.dev.js
  • pages-turbo...ntime.dev.js
View diffs
pages-api-tu..ntime.dev.js

Diff too large to display

pages-turbo...ntime.dev.js

Diff too large to display

📎 Tarball URL
https://vercel-packages.vercel.app/next/commits/2127bb2d57f09cbe428621ad18313e5fd444376c/next

Commit: 2127bb2

Comment thread packages/next/src/client/app-dir/nav-link.tsx
@aurorascharff aurorascharff changed the title Add navlink component Add next/nav-link for active-aware navigation links Jul 18, 2026
@aurorascharff aurorascharff changed the title Add next/nav-link for active-aware navigation links Add next/nav-link for active-aware navigation links Jul 18, 2026
@aurorascharff
aurorascharff marked this pull request as ready for review July 18, 2026 15:26
Copilot AI review requested due to automatic review settings July 18, 2026 15:26
@aurorascharff
aurorascharff marked this pull request as draft July 18, 2026 15:26

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a first-party next/nav-link entrypoint (App Router–only) that extends Link with server-resolved active state (aria-current="page") plus render-prop support for { isActive, isPending }, and documents/tests the new API.

Changes:

  • Introduces NavLink implementations for App Router (client + react-server guard) and a Pages Router stub that throws.
  • Extends the App Router Link implementation to allow NavLink to resolve function className/children inside the anchor (to access pending state).
  • Adds docs references + a new NavLink docs page, and adds an e2e fixture/test suite (including cacheComponents coverage).

Reviewed changes

Copilot reviewed 26 out of 27 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
test/e2e/app-dir/navlink/next.config.js Enables cacheComponents for the NavLink e2e fixture.
test/e2e/app-dir/navlink/navlink.test.ts E2E coverage for SSR active state, prefix vs exact matching, function props, and client navigation updates.
test/e2e/app-dir/navlink/app/page.tsx Fixture home page.
test/e2e/app-dir/navlink/app/nav.tsx Fixture nav rendering multiple NavLink variants.
test/e2e/app-dir/navlink/app/layout.tsx Fixture root layout that renders the nav for all pages.
test/e2e/app-dir/navlink/app/contact/page.tsx Fixture contact route.
test/e2e/app-dir/navlink/app/blog/page.tsx Fixture blog index route.
test/e2e/app-dir/navlink/app/blog/[slug]/page.tsx Fixture nested blog route for prefix-matching coverage.
test/e2e/app-dir/navlink/app/about/page.tsx Fixture about route.
packages/next/src/client/nav-link.tsx Pages Router entry (type surface + runtime error).
packages/next/src/client/app-dir/nav-link.tsx App Router client NavLink implementation (active detection + aria-current).
packages/next/src/client/app-dir/nav-link.react-server.tsx RSC boundary guard with a NavLink-specific error for function props in Server Components.
packages/next/src/client/app-dir/link.tsx Internal Link changes to resolve render-prop className/children for NavLink (and provide isPending).
packages/next/src/build/create-compiler-aliases.ts Adds webpack aliasing for next/nav-link across conditions (including react-server).
packages/next/src/api/nav-link.ts Adds the next/dist/api/nav-link entrypoint for import maps/aliases.
packages/next/package.json Ships nav-link.js and nav-link.d.ts in the published package files list.
packages/next/nav-link.js Adds the CJS subpath entry for next/nav-link.
packages/next/nav-link.d.ts Adds types entry for next/nav-link.
packages/next/errors.json Adds error messages for pages-router usage and RSC function-prop misuse.
docs/01-app/03-api-reference/04-functions/use-selected-layout-segments.mdx Adds related links + guidance pointing to NavLink for link-level active styling.
docs/01-app/03-api-reference/04-functions/use-selected-layout-segment.mdx Adds related links + guidance referencing NavLink.
docs/01-app/03-api-reference/04-functions/use-pathname.mdx Adds related links + guidance recommending NavLink for active link styling.
docs/01-app/03-api-reference/04-functions/use-link-status.mdx Adds NavLink as a related page.
docs/01-app/03-api-reference/02-components/nav-link.mdx New docs page for NavLink API/behavior.
docs/01-app/03-api-reference/02-components/link.mdx Updates “Checking active links” to prefer NavLink and explain benefits.
docs/01-app/01-getting-started/04-linking-and-navigating.mdx Adds NavLink to related links.
crates/next-core/src/next_import_map.rs Adds Turbopack import map aliases for next/nav-link (client/server/edge + RSC).

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread packages/next/src/client/app-dir/link.tsx Outdated
Comment thread packages/next/src/client/app-dir/link.tsx
@stefanprobst

Copy link
Copy Markdown
Contributor

great! two questions:

  • is aria-current=page applied when matching nested routes (i think it should not)
  • how to differentiate /path?tab=one vs. /path?tab=two with exact

@aurorascharff

Copy link
Copy Markdown
Contributor Author

great! two questions:

  • is aria-current=page applied when matching nested routes (i think it should not)
  • how to differentiate /path?tab=one vs. /path?tab=two with exact

Great questions!

  1. Might be good to also do a data-pending rather in addition to aria currentpage 🤔 otherwise we break the css only styling story for non-exact.
  2. This should probably be a custom useSearchParam tab component, ill add a link to an example!

Committed the changes here:
e47a1f2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants