Skip to content

component library · work in progress

Bigface UI

This page is the library the site itself is built from: every colour, font and component below is the production one, rendered live.

01 — colour

Colour tokens

The 20 palette colours, each with where it comes from and the contrast its ink reaches. The 16 ANSI slots are aliases of those, never new colours.

Terminal (ANSI) aliases

Semantic tokens

What shadcn's components paint with, read from tailwind.css. Each one is a palette variable and nothing else.

TokenPalette
--background bf-bg
--foreground bf-fg
--card bf-cursor-line
--card-foreground bf-fg
--popover bf-cursor-line
--popover-foreground bf-fg
--primary bf-blue
--primary-foreground ink-on-bright
--secondary bf-border-muted
--secondary-foreground bf-fg
--muted bf-border-muted
--muted-foreground bf-fg-dim
--accent bf-border-muted
--accent-foreground bf-fg
--destructive bf-burnt-orange
--border bf-border
--input bf-border
--ring bf-blue
--chart-1 bf-blue
--chart-2 bf-lime
--chart-3 bf-yellow
--chart-4 bf-burnt-orange
--chart-5 bf-purple
--sidebar bf-cursor-line
--sidebar-foreground bf-fg
--sidebar-primary bf-blue
--sidebar-primary-foreground ink-on-bright
--sidebar-accent bf-border-muted
--sidebar-accent-foreground bf-fg
--sidebar-border bf-border
--sidebar-ring bf-blue

02 — type

Type

One family, Recursive, loaded once. The display and sans stacks differ only in fallbacks; the mono face is the same file with the MONO axis on.

Displayfont-display

Bigface 2018 { } 0123

"Recursive", "Helvetica Neue", system-ui, sans-serif

headings, the brand, stats

Sansfont-sans

Bigface 2018 { } 0123

"Recursive", system-ui, -apple-system, "Segoe UI", sans-serif

body copy and controls

Monofont-code

Bigface 2018 { } 0123

"Recursive", ui-monospace, "SF Mono", Menlo, monospace + "MONO" 1 axis

code, commands, kickers, chips

Scale in use

Every font-size class used under site/src/, smallest first, each line set in its own size. Headings without a class use the element defaults: h1clamp(2.6rem, 6vw, 4rem), h2 clamp(1.7rem, 3.2vw, 2.4rem),h3 1.1rem.

Bigface palettetext-[0.6rem]
Bigface palettetext-[0.625rem]
Bigface palettetext-[0.64rem]
Bigface palettetext-[0.66rem]
Bigface palettetext-[0.68rem]
Bigface palettetext-[0.7rem]
Bigface palettetext-[0.72rem]
Bigface palettetext-[0.75rem]
Bigface palettetext-xs
Bigface palettetext-[0.78rem]
Bigface palettetext-[0.79rem]
Bigface palettetext-[0.8rem]
Bigface palettetext-[0.82rem]
Bigface palettetext-[0.84rem]
Bigface palettetext-[0.85rem]
Bigface palettetext-[0.87rem]
Bigface palettetext-sm
Bigface palettetext-[0.88rem]
Bigface palettetext-[0.9rem]
Bigface palettetext-[0.94rem]
Bigface palettetext-[0.95rem]
Bigface palettetext-[1rem]
Bigface palettetext-base
Bigface palettetext-[1.1rem]
Bigface palettetext-[1.22rem]
Bigface palettetext-[1.9rem]
Bigface palettetext-[clamp(1.35rem,2.4vw,1.8rem)]
Bigface palettetext-[clamp(2.3rem,5.2vw,3.6rem)]
Bigface palettetext-[clamp(2.6rem,6vw,4.4rem)]
Bigface palettetext-[clamp(3.4rem,8.5vw,6.2rem)]

03 — native

Native components

Everything in components/ui/, exactly as the shadcn CLI wrote it — all 63 components the registry ships. The four below are documented in depth; the rest follow with their exports and the variant keys read from their own source.

Button

native · shadcn
import
import { Button } from "@/components/ui/button";

Every variant × size. Icon sizes carry an icon instead of a label.

defaultxssmlgiconicon-xsicon-smicon-lg
default
outline
secondary
ghost
destructive
link

States per variant. Hover and focus are live: point at or tab to any button above.

defaultdisabledaria-invalid
default
outline
secondary
ghost
destructive
link

Badge

native · shadcn
import
import { Badge } from "@/components/ui/badge";

Every variant; Badge has no size. Not interactive, so no hover or disabled state.

defaultdefaultsecondarysecondarydestructivedestructiveoutlineoutlineghostghostlinklink

Card

native · shadcn
import
import {
  Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle,
} from "@/components/ui/card";

Both sizes with every slot filled. Static, so no states.

Card · size=default
Header, title, description and an action.
The content slot. Spacing follows the size.
Card · size=sm
Header, title, description and an action.
The content slot. Spacing follows the size.

Tabs

native · shadcn
import
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";

Every list variant × orientation, live (one island each). The third trigger is disabled; focus and arrow keys work.

variant=default · horizontal

First panel.

variant=default · vertical

First panel.

variant=line · horizontal

First panel.

variant=line · vertical

First panel.

The full set — 63 components

native · shadcn

Every component the CLI ships, installed and upgrade-clean (ui:drift). The four above are documented in depth; the rest are registered with how many parts each exports and the variant keys its own source declares.

accordion

4 exports

alert

4 exports

variant: default · destructive

alert-dialog

12 exports

aspect-ratio

1 exports

attachment

9 exports

variant: icon · image

size: default · sm · xs

avatar

6 exports

breadcrumb

7 exports

bubble

4 exports

variant: default · secondary · muted · tinted · outline · ghost · destructive

button-group

4 exports

calendar

2 exports

carousel

7 exports

chart

6 exports

checkbox

1 exports

code-block

8 exports

variant: default · destructive

collapsible

3 exports

combobox

16 exports

command

9 exports

context-menu

15 exports

dialog

10 exports

direction

2 exports

drawer

10 exports

dropdown-menu

15 exports

empty

6 exports

variant: default · icon

field

10 exports

hover-card

3 exports

input

1 exports

input-group

6 exports

size: xs · sm · icon-xs · icon-sm

input-otp

4 exports

item

10 exports

variant: default · outline · muted

size: default · sm · xs

kbd

2 exports

label

1 exports

marker

4 exports

variant: default · separator · border

menubar

16 exports

message

6 exports

message-scroller

9 exports

native-select

3 exports

navigation-menu

9 exports

pagination

7 exports

popover

7 exports

progress

1 exports

questionnaire

15 exports

radio-group

2 exports

resizable

3 exports

scroll-area

2 exports

select

10 exports

separator

1 exports

sheet

8 exports

sidebar

24 exports

variant: default · outline

size: default · sm · lg

skeleton

1 exports

slider

1 exports

sonner

1 exports

spinner

1 exports

switch

1 exports

table

8 exports

textarea

1 exports

toggle

2 exports

variant: default · outline

size: default · sm · lg

toggle-group

2 exports

tooltip

4 exports

trace

8 exports

04 — bg

BG components

Everything in components/bg/: the Bigface layer. Wrappers add variants over a native component without touching it; composite blocks are built from utilities and other BG parts. Props are shown straight from each file.

31 entries · 4 wrappers · 8 with props not finalised.

BGButton

wrapper · over Button

Bigface tones (glow, ghost, copy, nav, chip) layered on the shadcn Button; href renders a link.

nav (href)
components/bg/button.tsx
export type BGButtonProps = Omit<ButtonProps, "asChild"> &
  VariantProps<typeof bgButtonVariants> & {
    /** Render as a link (shadcn's asChild + <a>), so .astro pages can pass plain text children. */
    href?: string;

BGBadge

wrapper · over Badge

Mono uppercase pill, tinted by how far a theme was checked.

pilltoolschemaformat
components/bg/badge.tsx
export type BGBadgeProps = React.ComponentProps<typeof Badge> &
  VariantProps<typeof bgBadgeVariants>;

BGCard

wrapper · over Card

The deep translucent plate with a hairline border; glow adds the blue→lime rim.

tone="plate"
tone="plate" glow
components/bg/card.tsx
export type BGCardProps = React.ComponentProps<typeof Card> & VariantProps<typeof bgCardVariants>;

BGInstallTabs

wrapper · over Tabsprops not finalised

Install / uninstall command switcher: shadcn Tabs in one island, panels force-mounted.

Not final: item shape (bar, command, note) is ad hoc to the install section.

sh — install
curl -fsSL https://bigface.qqntt.com/install.sh | sh -s -- pi
With a terminal bar (home).
curl -fsSL https://bigface.qqntt.com/install.sh | sh -s -- --uninstall pi
Without one (app pages).
components/bg/install-tabs.tsx
export interface BGInstallTab {
  id: string;
  label: string;
  /** Title in the fake terminal bar, e.g. "sh — install". Omit for no bar. */
  bar?: string;
  command: string;
  note: string;
}

BGInstallTabs({ items }: { items: BGInstallTab[] })

BGEyebrow

composite block

Small mono kicker above a heading, with the blue dot.

a kicker

components/bg/eyebrow.astro
interface Props {
  class?: string;
}

BGSectionHead

composite block

Numbered section heading: kicker, title, lead.

00 — demo

A section heading

The lead paragraph sits under it.

components/bg/section-head.astro
interface Props {
  eyebrow: string;
  title: string;
}

BGDivider

composite block

Section break: a hairline fading out at both ends.


components/bg/divider.astro
(no props)

BGCopyButton

composite blockprops not finalised

The small copy pill wired to the page's copy handler (data-copy).

Not final: aria-label is passed as a raw string prop.

components/bg/copy-button.astro
interface Props {
  value: string;
  label?: string;
  swap?: "on" | "off";
  "aria-label"?: string;
  class?: string;
}

BGCommandLine

composite block

Pill-shaped one-line command with a prompt sigil and a copy button.

❯curl -fsSL https://bigface.qqntt.com/install.sh | sh
components/bg/command-line.astro
interface Props {
  command: string;
  copyLabel?: string;
}

BGStat

composite block

Big gradient number over a short label.

13ports
2018first release
components/bg/stat.astro
interface Props {
  value: string | number;
  label: string;
}

BGSwatchChip

composite block

One colour of the home strip: grows on hover, copies its hex.

components/bg/swatch-chip.astro
interface Props {
  name: string;
  hex: string;
}

BGSwatch

composite block

Palette card: colour plate with its contrast ratio, name and source.

components/bg/swatch.astro
interface Props {
  name: string;
  color: Color;
}

BGMarquee

composite block

Endless strip of names, pauses on hover.

components/bg/marquee.astro
interface Props {
  items: string[];
}

BGSyntaxPreview

composite block

Fake editor window painted with the syntax roles, optional terminal strip.

main.ts
// main.ts — colours, not a screenshot.import { greet } from "./hello"; type User = { id: number; name: string }; const ENDPOINT = "https://api.example.com/users"; export async function main(ids: number[]): Promise<void> {  const res = await fetch(ENDPOINT);  if (!res.ok) throw new Error(`users: ${res.status}`);  const all: User[] = await res.json();  const picked = all.filter((u) => ids.includes(u.id));  picked.forEach((u) => greet(u.name));}
jun ~/code ❯ git status
On branch main
components/bg/syntax-preview.astro
interface Props {
  terminal?: boolean;
}

BGContrastTable

composite block

Every palette colour's contrast on the background, with its WCAG band.

ColourHexRatio on backgroundWCAG
fg#d9d9d410.4 : 1AAA
comment#75715e3.0 : 1large text
fgDim#6e6b682.8 : 1below 3
blue#00b0ff6.1 : 1AA
lightBlue#40c4ff7.4 : 1AAA
paleBlue#b3e5fc10.9 : 1AAA
cyan#66d9ef9.0 : 1AAA
green#00c8536.6 : 1AA
lime#c6ff0012.4 : 1AAA
yellow#e5e50010.9 : 1AAA
brightYellow#ffeb3b12.1 : 1AAA
burntOrange#fc5d234.7 : 1AA
purple#ae81ff5.2 : 1AA
ansi.black#4948481.6 : 1below 3
ansi.red#fc5d234.7 : 1AA
ansi.green#00c8536.6 : 1AA
ansi.yellow#e5e50010.9 : 1AAA
ansi.blue#00b0ff6.1 : 1AA
ansi.magenta#ae81ff5.2 : 1AA
ansi.cyan#66d9ef9.0 : 1AAA
ansi.white#d9d9d410.4 : 1AAA
ansi.brightBlack#6e6b682.8 : 1below 3
ansi.brightRed#fc5d234.7 : 1AA
ansi.brightGreen#c6ff0012.4 : 1AAA
ansi.brightYellow#ffeb3b12.1 : 1AAA
ansi.brightBlue#40c4ff7.4 : 1AAA
ansi.brightMagenta#ae81ff5.2 : 1AA
ansi.brightCyan#b3e5fc10.9 : 1AAA
ansi.brightWhite#f8f8f013.8 : 1AAA
components/bg/contrast-table.astro
(no props)

BGPaletteGroup

composite block

A palette-page section: heading with a count, then its content.

A palette group 3

Its content goes here.

components/bg/palette-group.astro
interface Props {
  id: string;
  title: string;
  count?: number;
}

BGFilterChips

composite block

App grid filter: chips that hide cards by data-card-kind.

Filters the BGAppCard grid in the next entry.

components/bg/filter-chips.astro
interface Props {
  kinds: string[];
}

BGAppCard

composite blockprops not finalised

One app in the home grid, with its check level and the pointer glow.

Not final: takes the raw Target record from data/targets.ts.

components/bg/app-card.astro
interface Props {
  target: Target;
  index: number;
  base: string;
}

BGSplit

composite block

Media beside its instructions from 1024px, stacked below; the media stays first in the DOM.

media (left from 1024px)

Instructions

The aside: at least 340px wide, or the layout stacks.

components/bg/split.astro
interface Props {
  split?: boolean;
  class?: string;
}

BGBreadcrumbs

composite block

Bigface / Apps / name trail.

components/bg/breadcrumbs.astro
interface Props {
  base: string;
  name: string;
}

BGMarketCard

composite blockprops not finalised

“Published” strip for targets listed in their app's own gallery.

Not final: label / url / name mirror the Target.market fields one by one.

published

JetBrains MarketplaceJetBrains IDEs installs and updates it from its own gallery.
Open listing
components/bg/market-card.astro
interface Props {
  label: string;
  url: string;
  name: string;
}

BGDownloadCard

composite block

A download link styled as a small card.

components/bg/download-card.astro
interface Props {
  href: string;
  label: string;
  detail: string;
  class?: string;
}

BGManualSteps

composite block

“Do it by hand” fold with numbered steps.

Or do it by hand
  1. Copy bigface.json to ~/.pi/agent/themes/.
  2. Run pi --use-theme bigface for one session, or pick it under /settings → Theme.
components/bg/manual-steps.astro
interface Props {
  steps: string[];
}

BGCodeCard

composite block

A block of code with its path and a copy button.

example.ts
const palette = "bigface";
components/bg/code-card.astro
interface Props {
  path: string;
  code: string;
  truncated: boolean;
}

BGNextCard

composite block

Link card to the next page in a sequence.

components/bg/next-card.astro
interface Props {
  href: string;
  name: string;
}

BGHero

composite blockprops not finalised

Home hero: pitch, actions, install line and the parallax stage.

Not final: page-specific props (base, repo, ports, command).

Page-level block, shown live in place on /.

components/bg/hero.astro
interface Props {
  base: string;
  repo: string;
  ports: number;
  command: string;
}

BGAppHero

composite blockprops not finalised

App page header: kind, port number, name, tagline, check level.

Not final: takes the raw Target plus a pre-computed label string.

Page-level block, shown live in place on /apps/pi/.

components/bg/app-hero.astro
interface Props {
  target: Target;
  index: number;
  total: number;
  levelLabel: string;
}

BGSiteHeader

composite blockprops not finalised

Sticky site header: skip link, brand, main nav.

Not final: base / repo are passed as plain strings on every page.

Rendered once per page by Base.astro: the live one is this page's own.

components/bg/site-header.astro
interface Props {
  base: string;
  repo: string;
}

BGSiteFooter

composite blockprops not finalised

Site footer: the mark, a one-line pitch, the footer nav.

Not final: base / repo / ports are passed as plain strings.

Rendered once per page by Base.astro: the live one is this page's own.

components/bg/site-footer.astro
interface Props {
  base: string;
  repo: string;
  ports: number;
}

BGToast

composite block

The copy confirmation (one per page, #toast).

Rendered once per page by Base.astro: the live one is this page's own.

components/bg/toast.astro
(no props)

bgTextClass

helper · not a component

Literal text-bf-* class per palette colour, so Tailwind's scanner sees every one.

bgfgfgDimborderborderMutedselectioncursorLinebraceMatchbluelightBluepaleBluecyangreenlimeyellowbrightYellowburntOrangepurplecommentcaret

components/bg/palette-classes.ts
// Literal Tailwind class names per palette colour. They are spelled out (not built from strings) so
// Tailwind's scanner sees every one; anything that colours text by palette name goes through here.
export const bgTextClass: Record<string, string> = {
  bg: "text-bf-bg",
  fg: "text-bf-fg",
  fgDim: "text-bf-fg-dim",
  border: "text-bf-border",
  borderMuted: "text-bf-border-muted",
  selection: "text-bf-selection",
  cursorLine: "text-bf-cursor-line",
  braceMatch: "text-bf-brace-match",
  blue: "text-bf-blue",
  lightBlue: "text-bf-light-blue",
  paleBlue: "text-bf-pale-blue",
  cyan: "text-bf-cyan",
  green: "text-bf-green",
  lime: "text-bf-lime",
  yellow: "text-bf-yellow",
  brightYellow: "text-bf-bright-yellow",
  burntOrange: "text-bf-burnt-orange",
  purple: "text-bf-purple",
  comment: "text-bf-comment",
  caret: "text-bf-caret",
};

05 — not yet

Not covered yet

This is a working catalogue, not a finished design system. Deliberately missing for now:

  • Live demos for the rest of the native set. All 63 components the CLI ships are installed and upgrade-clean, and every one is registered above with its exports and variant keys; the ones outside the four deep entries have no live demo yet, and say nothing rather than pretending.
  • Two system colours the registry paints with. Overlay scrims ask forbg-black/10 and the slider thumb for bg-white. Tailwind's default colour scale is cleared here (bigface is palette-only), so both classes generate no CSS and the scrim stays invisible; fixing that means adding a colour to the palette, which is a design decision, not a component one.
  • Pinned hover and focus states. They are live (point or tab) rather than frozen side by side: forcing them would mean editing the shadcn classes.
  • Final props for 8 BG components: BGInstallTabs, BGCopyButton, BGAppCard, BGMarketCard, BGHero, BGAppHero, BGSiteHeader, BGSiteFooter. They take page data (a raw Target, base and repo strings) instead of design types.
  • A light theme. Bigface is dark only, by design.
  • Usage guidance. No do/don't notes or spacing rules yet; this page shows what exists, not how to compose it.