Tab Navigation logo

Tab Navigation

Organization
dembrandt
tab-navigation

Tabs swap views under a shared context. Use when designing tabbed layouts, settings pages, detail views or dashboards with several data views.

Overview

Publisherdembrandt
Repositorydembrandt-skills
Skill nametab-navigation
Stars
169
Forks
21
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by dembrandt on GitHub. Read the source before you install it.

Installation

Install the Tab Navigation AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/dembrandt/dembrandt-skills/tree/main/skills/tab-navigation
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/dembrandt/dembrandt-skills.git /tmp/dembrandt-skills
mkdir -p .claude/skills
cp -r /tmp/dembrandt-skills/skills/tab-navigation .claude/skills/tab-navigation
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Tab Navigation in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Tab Navigation on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Tab Navigation is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Tab Navigation

Tabs organise related content under a shared context. The tab strip communicates the full set of available views; switching tabs swaps the content panel without a page navigation. They work best when all views share a heading, a primary action, or a common subject — tabs that have nothing to do with each other belong in separate pages.


When to Use Tabs — and When Not To

Use tabs when…Use something else when…
2–7 views share a common context (same record, same settings section)There are more than 7–8 tabs — use a sidebar or section nav instead
Users switch between views frequently during a sessionThe content is sequential (use a stepper/wizard instead)
All tabs are equally valid entry pointsOne view is clearly primary — put the rest in a secondary nav or overflow
The views share a header or set of page-level actionsEach "tab" requires a different header and layout — use separate pages

Tab Types

Choose the visual style that fits the layout context.

Underline / Indicator Tabs

A horizontal strip with a sliding underline or bottom border on the active tab. The lightest treatment — appropriate for page-level tabs where the tab strip sits inside the content area.

Overview  |  Activity  |  Settings
──────────

Contained / Boxed Tabs

Each tab is a distinct box; the active tab appears connected to the panel below. Higher visual weight — appropriate for prominent tab groups near the top of a screen or within a card.

Pill / Button Tabs

Rounded capsules that toggle between states. Lower emphasis — appropriate for secondary content switches within a section (not page-level). Often used for view toggles (e.g. "List / Grid / Map").


Anatomy

┌─────────────────────────────────────────────────┐
│  Tab A  │  Tab B  │  Tab C  │                   │  ← Tab strip (role="tablist")
├─────────┴─────────────────────────────────────────┤
│                                                   │
│   Tab panel content                               │  ← Tab panel (role="tabpanel")
│                                                   │
└───────────────────────────────────────────────────┘
  • Tab strip: Fixed height (typically 40–48px). Does not scroll with the page — consider making it sticky when the page is long.
  • Tab panel: Fills the remaining available height. The panel, not the tab strip, scrolls when content overflows.
  • Active indicator: A 2–3px bottom border in --color-primary for underline tabs; filled background for contained/pill tabs.

States

StateVisual treatment
ActivePrimary colour indicator; label in --color-text-primary or primary
InactiveMuted label (--color-text-secondary); no indicator
HoverSubtle background shift (--color-grey-50); label slightly darkens
FocusVisible focus ring (outline: 2px solid --color-primary; outline-offset: 2px)
DisabledReduced opacity (0.4); cursor: not-allowed; never the active tab

Never disable the active tab. If content is unavailable, show it inside the panel with an explanation rather than disabling the tab.


Tab Overflow

When the tab strip is wider than its container, do not wrap tabs onto multiple lines; it destroys the strip metaphor. Three ways out, in order of preference.

Select fallback

Measure the strip; when its content is wider than its container, render a native <select> with the same options. Every option stays reachable at one glance and at any width, with nothing hidden off the edge, and the platform already gives touch users its picker.

Scrollable strip

The strip scrolls horizontally with a fade at the right edge to signal overflow. The platform convention on mobile, and fine when the user knows the set of tabs; it hides options from a first-time reader.

css
.tab-strip {
  display: flex;
  overflow-x: auto;
  scrollbar-width: none; /* hide scrollbar visually on desktop */
}
.tab-strip::after {
  content: '';
  position: absolute; right: 0;
  background: linear-gradient(to left, var(--color-surface), transparent);
  pointer-events: none;
}

"More" overflow menu

Show as many tabs as fit, then collapse the rest into a More ▾ dropdown. Update the "More" label when an overflowed tab is active: Settings ▾ (showing the active hidden tab name).

Whichever is used, mark the selected tab with an underline on that tab only; a rule under the whole strip competes with it. For desktop dashboards with many views, prefer a sidebar nav over overflow tabs.


Vertical Tabs

Use when there are 5+ tabs and the layout has a left sidebar. Vertical tabs allow longer labels without overflow issues and scale more gracefully.

  • Fixed width sidebar (typically 200–240px) with tab labels stacked vertically
  • Active tab: left border accent (3px solid --color-primary) + subtle background
  • The main content area fills the remaining width

Keyboard Navigation

Tabs follow the ARIA "roving tabindex" pattern for within-strip navigation.

KeyAction
TabMove focus to the tab strip (then into the active panel)
← / →Move between tabs (horizontal strip); activate immediately or on Enter depending on content cost
↑ / ↓Move between tabs (vertical strip)
HomeJump to first tab
EndJump to last tab
Enter / SpaceActivate focused tab (if not already auto-activating on arrow key)

Auto-activate vs. manual activate: If switching tabs triggers a network request, use manual activation (arrow keys move focus, Enter activates) to avoid unnecessary fetches. If content is already loaded or cheap, auto-activation on arrow key is acceptable.


ARIA

html
<div role="tablist" aria-label="Product sections">
  <button
    role="tab"
    id="tab-overview"
    aria-selected="true"
    aria-controls="panel-overview"
    tabindex="0"
  >Overview</button>
  <button
    role="tab"
    id="tab-activity"
    aria-selected="false"
    aria-controls="panel-activity"
    tabindex="-1"
  >Activity</button>
</div>

<div
  role="tabpanel"
  id="panel-overview"
  aria-labelledby="tab-overview"
>…</div>

<div
  role="tabpanel"
  id="panel-activity"
  aria-labelledby="tab-activity"
  hidden
>…</div>
  • aria-selected="true" on the active tab, false on all others
  • tabindex="0" on the active tab, -1 on all others (roving tabindex)
  • hidden attribute (or display: none) on inactive panels — screen readers skip hidden panels
  • aria-label on the tablist when the heading above doesn't sufficiently describe the group

State Persistence

Remember the active tab across page loads and navigations:

  • URL fragment or query param: ?tab=activity — the most robust approach; supports deep linking and browser back/forward
  • localStorage: Acceptable for preferences (e.g. a preferred dashboard view) that don't need to be shareable
  • Do not use sessionStorage — tabs closing lose the state unexpectedly

When the URL contains a tab param, jump to that tab on load even if it's not the first tab.


Nested Tabs

Avoid tabs within tabs. Nested tabbing creates confusion about scope — a user editing content in "Tab A › Sub-tab 2" has no clear mental model of what the outer tab means.

If you find yourself nesting tabs, reconsider the information architecture:

  • Can the inner tabs become a secondary nav (pills, a sidebar within the panel)?
  • Can the outer tabs become a top-level page nav instead?

One level of tabs maximum in the primary content area.


Review Checklist

  • Are there 2–7 tabs, each sharing a common subject or context?
  • Is the tab strip not wrapping to multiple lines on any target viewport?
  • Is the active tab clearly distinguished by colour and/or indicator?
  • Do hover and focus states meet contrast requirements?
  • Are disabled tabs avoided (showing unavailability inside the panel instead)?
  • Does keyboard navigation follow roving tabindex (←/→ between tabs, Tab into panel)?
  • Is role="tablist", role="tab", role="tabpanel", and aria-selected set correctly?
  • Are inactive panels hidden from the accessibility tree (hidden attribute)?
  • Is the active tab persisted in the URL (for deep-linkable views) or localStorage?
  • Are nested tabs avoided?
  • Does tab overflow use a select, a scrollable strip or a "More" menu, never wrapping?
  • Is the selected tab marked by an underline on that tab only, with no rule under the whole strip?

Frequently asked questions

What does the Tab Navigation AI skill do?

Tabs swap views under a shared context. Use when designing tabbed layouts, settings pages, detail views or dashboards with several data views.

Why use Tab Navigation on TypingMind?

Because you install it once and use it with any model. Tab Navigation is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Tab Navigation in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/dembrandt/dembrandt-skills/tree/main/skills/tab-navigation. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Tab Navigation?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Tab Navigation?

As many as you like. As long as a model supports skills, you can use Tab Navigation with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Tab Navigation AI skill free?

Yes. It is published on GitHub by dembrandt under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇