Loading video...

Video Failed to Load

Go Home

The new version of React Native Bottom Tabs is out! 🎉 A new highly anticipated feature: Custom JavaScript Tabs! ✨ Provide your custom tab bar while leveraging native navigation underneath 🚀 Here is a demo of it in the 🦋 app! This demonstrates smooth screen transitions using native animations...

35,725 views • 1 year ago •via X (Twitter)

11 Comments

Fabrizio's profile picture
Fabrizio1 year ago

That was the missing piece on the React Native ecosystem, nice to see it working

Weather, Maps and some AI's profile picture
Weather, Maps and some AI2 years ago

Don't you need a new weather widget?

Michał Pierzchała's profile picture
Michał Pierzchała1 year ago

damn that's smooth

DrAriu's profile picture
DrAriu1 year ago

Now the only missing part: Web support

Oskar Kwaśniewski's profile picture
Oskar Kwaśniewski1 year ago

As mentioned in another comment: On web you should use `@⁠react-navigation/bottom-tabs` this can be done conditionally using .web.tsx extensions. I will make sure to add examples of this in the docs.

maxi's profile picture
maxi1 year ago

LFG

Olowoyo's profile picture
Olowoyo1 year ago

What’s the difference between this and expo tab(expo-router/ui) ?

Oskar Kwaśniewski's profile picture
Oskar Kwaśniewski1 year ago

You can read more about the differences here:

Giovanni Padova's profile picture
Giovanni Padova1 year ago

Awesome work ! Now I don't see any reason why not making the default for Expo Router.

DrAriu's profile picture
DrAriu1 year ago

Fantastic!

MONARCH's profile picture
MONARCH1 year ago

Can this be used in tandem with expo router, ie expo router’s components for everything else, then this for a bottom navigator

Related Videos

CSS Trick 🤙 You can create these tab bar controls by using :has() to count the number of tabs ⭐️ .tabs:has(input:nth-of-type(3)){--count: 3;} .tabs:has(:checked:nth-of-type(3)){--active: 200%;} .tabs::after{ translate:var(--active) 0;} Let's break it down in this ! 📼 Couple of CSS :has() tricks here combined with custom properties 😎 First things first, lay out the tabs using display: grid. This gives you a way to create equal-width tabs 🙏 .tabs { display: grid; grid-auto-flow: column; } Then you use :has() to count the number of tabs and store that in a custom property 🤓 .tabs:has(input:nth-of-type(3)) { --count: 3; } .tabs:has(input:nth-of-type(4)) { --count: 4; } Using the cascade, the last valid :has() gives you the number of tabs 🫶 Using the tab count, you can size the tab indicator. For the tab indicator, use the tabs pseudoelement: .tabs::after { content: ""; position: absolute; height: 100%; width: calc(100% / var(--count)); } See how you can use --count to determine its size 📏 Next, use :has() to determine which tab is active or :checked with input [type=radio] .tabs:has(:checked:nth-of-type(2)) { --active: 1; } .tabs:has(:checked:nth-of-type(3)) { --active: 2; } You can use a zero-indexed translation here. If the second input is :checked, set --active: 1, then translate the pseudoelement on the tabs to that position 👉 .tabs::after { translate: calc(var(--active, 0) * 100%) 0; } Or you could set active to the translation: .tabs:has(:checked:nth-of-type(2)) { --active: 100%; } Setting the custom property allows you to use the index elsewhere if you need it 🤙 The final piece is using mix-blend-mode 👀 The tabs have a black background-color, the pseudoelement is white, and the label text is white. When you use mix-blend-mode: difference on the pseudoelement it will give this effect that the text transitions from white to black sliding across 😎 .tabs::after { color: hsl(0 0% 100%); mix-blend-mode: difference; } You can totally mix up the colors here though and go with a different effect. The mechanics of how you can use CSS :has() is the main point here 🙏 As always, any questions, suggestions, etc. let me know CodePen.IO link below! 👇 (There's even a Tailwind CSS play for this one too 👀)

jhey ʕ•ᴥ•ʔ

70,670 views • 2 years ago