Omkar KhadamkarAll work

Vela · Tabs · 2026 · In progress

A tab should show where your click will land.

Tabs switch between views of one page. In Vela, my open design system, they gave almost no sign of where a click would land, and gave no warning when there were too many. I directed AI agents through the options and made every call.

The problem

Hovering over a tab only darkened its name. With too many tabs, hidden ones gave no sign and the open tab could scroll away.

My decision

A soft mark under the tab you point at, which grows into the underline when you click. Too many tabs get one quiet "6 more" control with a list.

What's built

The Seed is now in the real Tabs component, with fixes for two bugs the prototype found. Released on npm in Vela 0.14. "6 more" is next.

My part

Every call, the name, and spotting what the testing missed. AI agents built, scored and drew the options.

The two strongest ideas for a click, slowed down. They scored a tie; I chose by watching.Vela prototype · grow in place shipped in 0.14
The released Tabs in light mode: Alerts is open with its underline; the pointer rests on Assets, and a short soft bar sits under it.The same tabs in dark mode, with the same short soft bar under Assets.
The Seed as released: point at a tab, here Assets, and a short soft bar shows where the click will land. Light and dark.Vela playground · Tabs
  1. 01Pointing at a tab barely changed anything on screen.The moment
  2. 02Ideas from tailoring, printing and cockpits led to one small mark under the tab.The idea
  3. 03The scores tied, so I chose by watching both at real speed.The call
  4. 04The first test never asked what happens with too many tabs.What testing missed
  5. 05The scores were too close, so I chose the fuller option.The call
  6. 06The tab count made the row taller, so I removed the extra marks.Refining
  7. 07Building the prototype exposed two real bugs in the shipped tabs.What broke

01The moment

Pointing at a tab barely changed anything on screen.

Before a click, the only sign was the tab's name turning slightly darker, a hint that is easy to miss.

Three tabs: Alerts 12, Assets 340 and Audit. Alerts is open, with a teal name and an underline. The pointer rests on Assets, whose name is only slightly darker. Nothing appears under Assets.
12
Today's tabs, with the pointer resting on Assets.Vela decision board 01
  1. 1
    The open tab. A coloured name and an underline.
  2. 2
    The tab you point at. Its name darkens a little. Nothing shows where the click will land.
Go deeper 1 min

The question was rewritten as a job, with no solution in it: show where a click will land, without adding noise for someone who switches tabs all day.

That ruled out anything loud: a hint people see all day has to stay subtle, or it becomes noise.

02The idea

Ideas from tailoring, printing and cockpits led to one small mark under the tab.

The winner is a short, pale line under the tab you rest on; I asked if we could call it the Seed, and the name stuck.

Sketch: a grey pill shape behind the tab Policies, where the pointer rests.

A pill that follows the pointer

Common in apps

Lost: it moves every time the pointer sweeps past.

Sketch: the open tab's underline stretches thinly towards Policies.

The lean

From a sunflower turning to the sun

Lost: ten tabs away, the hint starts at the wrong end of the row.

Sketch: a dashed line under Policies.

The basting stitch

From tailoring: a temporary stitch

Lost: dashes are loud for something seen all day.

Sketch: a thin, pale line across the whole width of Policies.

The faint line

The stitch, made solid and pale

Lost: as long as the real underline, so it can pass for the open tab.

Sketch: two small corner ticks at the ends of Policies.

Crop marks

From printing: where the paper is cut

Lost: the most elegant, and the easiest to miss.

Sketch: faint pointers where it passed Alerts and Assets show nothing; where it stops on Policies, a short soft line appears, labelled the Seed.

Wait until the pointer stops

From cockpit displays: quiet until neededBecame part of the Seed
Side by side: under Alerts, the underline, full width, full strength, square ends. Under Policies, where the pointer rests, the Seed: a third of the tab, lighter, with soft ends.
Shorter, lighter and soft-ended, so it is never mistaken for the open tab, even in black and white.Vela decision board 03
Go deeper 2 min

How the ideas were found

The search looked at how other fields already do this job: sixteen ideas in a first round, three more in a second. AI agents scored each one against a checklist, twice. Six are shown above.

What the Seed is

  • Short like the stitch: a third of the tab, at least 24 pixels.
  • Soft at both ends like the faint line, and lighter than the underline.
  • Only when the pointer stops, as cockpits do: after 80 milliseconds of rest, so sweeping across the row shows nothing.

It led the second round at 90.6%. It sits exactly where the underline will go, like a seed of it.

By hand, and with AI

The name was mine. I pointed at a card on a board and asked if it could be called the Seed; it became the name of the whole idea. The card itself was drawn by an AI agent.

I also caught two board errors: one said an idea came from the first round when it came from the second, and one gave the faint line the wrong origin. And I asked why the pill that follows the pointer seemed missing from the scoring. It had scored 60%, joint 11th of 16, and the boards now quote the scoring's real lines instead of paraphrases.

A slow-motion switch, five times slower, let me judge the motion by eye before anyone argued about it.

03The call

The scores tied, so I chose by watching both at real speed.

On a click, the Seed grows in place into the underline, instead of the underline sliding across the whole row.

  1. Before the clickpointer rests
    Nine tabs, Overview open and underlined. A Seed shows under Sessions, the last tab.
  2. Just after25 ms
    The underline under Overview has shrunk; the mark under Sessions is darker and growing.
  3. Halfway70 ms
    Overview's underline is almost gone; Sessions has a nearly full underline.
  4. Settledabout a quarter second
    Sessions is open with a full underline. Nothing moved across the row.

Clicking a tab eight tabs away, paused at the same moments. A keeps everything where your eye already is. B sweeps the underline across the whole row to get there.

A, B and my Hybrid, at phone width. Slowed five times, then real speed.Vela prototype

Final round, out of 100%

Less than one point apart, and the two scoring passes disagreed on which came first. So the scores could not decide. Watching them side by side at real speed did.

  1. 1
    It keeps its promise. The mark you saw is the line you get.
  2. 2
    Nothing sweeps across the row. However far away you click.
  3. 3
    Same every time. It matters for something used all day.
Go deeper 1 min

My idea that I set aside

The Hybrid was my proposal: slide for nearby tabs, grow in place for far ones. It was built, annotated in the prototype, and set aside, because the same click could look different depending on how far away the tab was. It is the third row in the clip.

Who did what

AI agents built all three behaviours, recorded the clips and scored them. The choice was mine, made by eye. A result this close is reported as a tie.

Not proven yet

The 80 millisecond pause and the 24 pixel minimum come from research, not from watching people. Nobody outside the project has used it.

04What testing missed

The first test never asked what happens with too many tabs.

I noticed the gap: on a phone-sized screen with ten tabs, hidden tabs gave no sign and the open tab could scroll away.

FailedSix tabs hidden, no sign

Tabs Overview, Alerts 12, Assets 340 and a cut-off Identitie. Nothing shows that six more tabs exist.
No arrow, no fade at the edge, and on this screen no scrollbar.

FailedA tab cut off at the edge

The row scrolled slightly: ew, Alerts 12, Assets 340, Identities, and Po cut off at the right edge with the pointer on it.
The pointer rests on Policies, but its mark sits out of view.

FailedThe open tab scrolled away

Tabs Reports, Audit log, Sessions and Integrations. None is marked as open, though the page still shows the Overview panel.
The page still shows Overview, but no tab on screen says so.

It became a rule for every future test. I added a "more than fits" section to my state-coverage-sweep skill, the checklist AI agents run to test every situation a component can be in.

Go deeper 1 min

The sweep had checked that the row of tabs scrolls sideways at phone width, and stopped there. It never asked what the scrolling hides.

Two more failures, not pictured: clicking a half-hidden tab opened it but left it half hidden, and the keyboard could land on a tab with two thirds of it out of view.

Too many tabs became its own piece of work, and later moved inside the Tabs component rather than a separate pattern.

My questions about limits also raised tab names people type themselves, as in custom dashboards. That became a second new section in the same skill, "names people choose". Rules for long names are proposed (a 64 character limit, a 240 pixel cap, the full name on hover) but not decided.

05The call

The scores were too close, so I chose the fuller option.

An AI agent working in the code recommended the simpler row; I chose the one with a list of every tab.

Steady row: Alerts stays at the left edge, the other tabs scroll under it, an arrow on the right, and a pill below says plus 22.
To reach tab 25 of 30, scroll or press the arrow until it shows.Vela decision board 05e
The same steady row with an All tabs button. Its list shows Alerts open, Reports, and Firewall with 1 new and a red dot.
Two clicks to any tab, every full name, and the list says which tab has news.Vela decision board 05e

6.2 points apart. Under 10 points, a score can't decide on its own, so this was a choice. The agent's case: Vela's rule is never to invent a component, and the list needs a new one.

Go deeper 1 min

Five directions were scored. Both leaders share the same base: the open tab sticks to the left edge, every tab stays a real tab in one scrolling row, and nothing moves except by scrolling.

The cost of my choice was real: a small new list component, the Dropdown List, added to Vela as Experimental rather than going without it. Reading the menu library's source, the spec agent found it blocks the rest of the page by default and doesn't move focus to the current item, which became two rules in the spec.

Only the version of Tabs built on Base UI, an open-source behaviour library, gets the list. The version with no dependencies keeps a plain scrolling row.

06Refining

The tab count made the row taller, so I removed the extra marks.

I spotted the pill pushing the row onto two lines; now the count and the news live in one quiet control.

First sketchFour new marks, and a second line

First sketch: a divider beside Alerts, a plus 6, 1 new pill on a second line, an outlined circle arrow, and the line under the tabs broken at the open tab. Four numbered notes.
  1. 1
    A divider at the edge of the open tab.
  2. 2
    A pill on a second line, so the row grew taller.
  3. 3
    An outlined circle for the arrow, a shape no tab uses.
  4. 4
    A broken line under the tabs, so the row looks like two pieces.

RefinedOne line, one rule, the count in words

Refined: Alerts, Assets, Policies, a faded De, then a quiet 6 more control with a small chevron.
Refined, with news: the same control now reads 6 more, 1 new, with 1 new slightly bolder.
The control opened: a list with Alerts marked open, Assets, Policies, and Firewall with a red dot and 1 new.
A soft fade where the row is cut, and a control the same size and colour as a tab.
Go deeper 2 min

Five rules that keep it calm

  • One thin line, unbroken, as it is today.
  • One line high. Nothing sits below the row.
  • No new shapes. No pills, circles or dividers.
  • Edges are fades, not lines, except in high-contrast mode, where fades disappear.
  • Nothing appears until it's needed. When every tab fits, the row is exactly today's.

The arrow buttons went too. The list reaches any tab in two clicks, and swiping, trackpads and the keyboard still scroll the row.

The chevron

It started from my own flying-bird chevron on omkarux.com. An AI agent made six Vela-sized versions, two of them birds, and I chose the calm one over the springy one: one wingbeat in under a quarter of a second. It never points sideways and stays still when opened from the keyboard. It is decided, not built.

What a sketch couldn't show

Rendering the list with Vela's real styles, the AI agent measured two problems in dark mode: the hover colour matched the background exactly, and a link colour was too faint to read as text. Both now have a fix: a new colour token and a rule.

07What broke

Building the prototype exposed two real bugs in the shipped tabs.

A 2-pixel underline was drawing 1 pixel, and high-contrast mode underlined every tab. Both fixes are now merged.

Before1 row of pixels, half the design

Magnified pixels at the end of the Alerts underline: the teal underline is one block thick, sitting on the grey line.

After the fix2 rows, as designed

The same magnified view after the fix: the teal underline is two blocks thick.

BeforeHigh contrast: every tab underlined

Tabs in high-contrast colours: Alerts 12, Assets 340 and Audit all have an underline, so the open tab can't be told apart.

After the fixOnly the open tab is marked

After the fix: only Alerts 12, the open tab, has an underline, in the system highlight colour.

Shown 8 times larger, and in high-contrast mode as Chrome simulates it. A check on real Windows is still to do.

Go deeper 1 min

The thin underline. The row of tabs can scroll sideways, and a scrolling area cuts off anything past its edge. The underline's lower pixel was cut. Nobody noticed because the automatic screenshot checks allow up to 1% of pixels to differ, and one thin row is less than that. A new browser test measures the underline and fails on the old code.

High contrast. Windows has a mode for people who need stronger contrast. It swaps the page's colours for the system's own and makes hidden lines visible, so every tab grew an underline.

Both were found by the AI-run sweep. Both fixes are merged, each with a new browser check that fails on the old code.

Where it stands

Part one is released, in Vela 0.14.

Shipped
  • The Seed in the real Tabs componentReleased in 0.14, merged the night of 30 October
  • The Seed in FigmaPublished as the Tab's hover state on 1 November
  • Fixes for the two bugs
  • The Dropdown List behind "6 more"Experimental, in Figma too
Decided
  • The Seed, growing in place on a click
  • Too many tabs: the steady row with "6 more" and a list
  • The calm bird chevron
In progress
  • The "6 more" control in TabsNext; the list it opens is built
Not built
  • The calm bird chevron
Open
  • Long tab namesRules proposed, not decided
  • Real Windows high contrastOnly simulated so far
  • FirefoxNot checked
  • Real peopleNot tested with anyone yet

Who did what

Me, by handEvery call: grow in place, the fuller option, the calm chevron. The name Seed, the Hybrid idea, and spotting the missed test, the taller row and the board errors.
AI agentsScored the ideas, built the prototype and every option, recorded the clips, drew the boards, and ran the sweep that found two bugs and proposed the fixes.
Nobody yetTesting with real people, in Firefox and in real Windows high-contrast mode.