Component Library

Navigation

The wayfinding layer of the broadcast: app shells, rails, tab decks, trails, and pagers. Every element carries the teal-on-navy signature (glowing active states, glass chrome, and condensed uppercase type) so a viewer always knows where they are in the feed.

6-8 UI

App shell

A sticky glass header with the real brand mark, a prop-driven tab deck with a glowing active underline, an optional right slot, and a fixed broadcast scanline overlay. Children render in a centered container.

NavShell

12

Games Live

48

Teams

3.2K

Watching

PropTypeDefaultDescription
tabsNavShellTab[][]Tab deck; the entry flagged active gets the glowing underline.
titleReactNode-Wordmark rendered beside the logo.
logoSrcstring"/brand/68-logo-white.png"Real brand asset for the mark, never a drawn logo.
rightSlotReactNode-Right-aligned slot for status, actions, or an avatar.
contentClassNamestring"max-w-[1200px]"Max-width class for the centered content container.

6-8 UI

Tabs

Radix-powered tab decks with uppercase tracked triggers. A single glowing indicator slides to the active trigger with a spring: an underline in the line variant, a glass pill in the pill variant.

Line

Season at a glance: record, streak, and the next tip-off, all in one broadcast card.

Pill

3 games in progress

PropTypeDefaultDescription
defaultValue / valuestring-Uncontrolled or controlled active tab (Radix-compatible).
onValueChange(v: string) => void-Fires with the next value when the selection changes.
variant"line" | "pill""line"Set on TabsList / TabsTrigger to pick the indicator style.

6-8 UI

Sidebar

A vertical rail with icon-and-label entries, a sliding teal indicator on the active row, badges, and a smooth collapse to an icon-only width. Use the toggle at the base to collapse.

Collapsed
PropTypeDefaultDescription
itemsSidebarItem[]-Entries with label, href, optional icon, active, and badge.
header / footerReactNode-Brand block pinned to the top and content above the toggle.
collapsiblebooleantrueShow the collapse control at the base of the rail.
defaultCollapsed / collapsedboolean-Uncontrolled or controlled collapsed width.

6-8 UI

Breadcrumbs

A compact trail with chevron separators. Ancestor links stay muted and light up on hover; the current page reads in glowing teal.

Trail
PropTypeDefaultDescription
BreadcrumbLinka | asChild-Ancestor link; pass asChild to render a Next Link.
BreadcrumbPagespan-Current page: teal, glowing, aria-current='page'.
BreadcrumbSeparatorli-Chevron by default; pass children to override.

6-8 UI

Pagination

Prev / next controls flanking numbered pages, with pinned first and last pages and ellipsis gaps for long ranges. The active page carries the teal glass glow.

Long range
Compact
PropTypeDefaultDescription
countnumber-Total number of pages.
defaultPage / pagenumber1Uncontrolled or controlled current page (1-indexed).
onPageChange(page: number) => void-Fires with the next page on any change.
siblingCountnumber1Pages shown on each side of the current page.
size"sm" | "md" | "lg""md"Control dimensions.

6-8 UI

Usage

Compose the shell, rail, and tab deck straight from the library.

Copy
import { NavShell } from "@/components/ui/nav-shell";
import { Tabs, TabsList, TabsTrigger, TabsContent } from "@/components/ui/tabs";

export function LeagueCenter() {
  return (
    <NavShell
      title="6-8 League Center"
      tabs={[
        { label: "Scoreboard", href: "/scoreboard", active: true },
        { label: "Standings", href: "/standings" },
        { label: "Teams", href: "/teams" },
      ]}
    >
      <Tabs defaultValue="overview">
        <TabsList>
          <TabsTrigger value="overview">Overview</TabsTrigger>
          <TabsTrigger value="roster">Roster</TabsTrigger>
        </TabsList>
        <TabsContent value="overview">Season at a glance…</TabsContent>
        <TabsContent value="roster">Depth chart…</TabsContent>
      </Tabs>
    </NavShell>
  );
}