07

Components

Every primitive and pattern, grouped by category and rendered live from the manifest.

Primitives

24
Button primitive button

The action primitive. Renders <button> or <a> (when href is set).

proptypedefault
variant"default" | "destructive" | "outline" | "secondary" | "ghost" | "link""default"
size"default" | "sm" | "lg" | "icon""default"
hrefstring
disabledboolean

a11y: Native <button>/<a> semantics; disabled sets aria-disabled and removes href.

Card primitive card

Rounded, bordered surface. Wrap content that should read as one raised block.

A raised surface. Wrap content that reads as one block.
proptypedefault
classstring

a11y: Plain <div>. No implicit semantics.

Badge primitive badge

Small tone-tinted label for status and counts.

neutral primary success warning destructive
proptypedefault
tone"neutral" | "success" | "warning" | "destructive" | "primary""neutral"

a11y: Inline <span>. Decorative; put meaning in the text.

Input primitive input

Single-line text field. Bindable value. Mobile font-size = --text-size-input (17px) to prevent iOS zoom; text-sm at md.

proptypedefault
valuestring
classstring

a11y: Native <input>. Pair with <Label>. 17px mobile size prevents iOS zoom-on-focus.

visual QA: compare against rb-extract/inputs-nav/inputs/ui-input.svelte

Progress primitive progress

Determinate progress bar (0–100).

proptypedefault
valuenumber0
maxnumber100

a11y: role=progressbar with aria-valuemin/max/now.

Dialog primitive dialog

Modal dialog (bits-ui). Namespaced parts.

parts: Root, Trigger, Content, Header, Footer, Title, Description, Close, Overlay

a11y: Focus trap, aria-modal, ESC-to-close from bits-ui.

AlertDialog primitive alert-dialog

Confirm/destructive dialog with explicit action + cancel.

parts: Root, Trigger, Content, Header, Footer, Title, Description, Action, Cancel, Overlay

a11y: role=alertdialog; focus lands on cancel by default.

DropdownMenu primitive dropdown-menu

Contextual action menu with items, groups, checkboxes, radios, submenus.

parts: Root, Trigger, Content, Item, Group, Label, Separator, CheckboxItem, RadioGroup, RadioItem, Sub, SubTrigger, SubContent, Shortcut

a11y: Roving-tabindex menu semantics from bits-ui.

Select primitive select

Single-select listbox.

parts: Root, Trigger, Content, Item, Group, Label, Separator

a11y: Listbox semantics, type-ahead from bits-ui.

Popover primitive popover

Floating panel anchored to a trigger.

parts: Root, Trigger, Content

a11y: Dismissable layer with focus management from bits-ui.

Tooltip primitive tooltip

Hover/focus hint.

parts: Provider, Root, Trigger, Content

a11y: aria-describedby wiring from bits-ui; keep tooltip text short.

Sheet primitive sheet

Edge-anchored drawer (a Dialog variant).

parts: Root, Trigger, Content, Header, Footer, Title, Description, Close, Overlay

a11y: Same modal semantics as Dialog.

Sidebar primitive sidebar

Full app sidebar scaffold (provider, menu, groups, rail, inset). Pair with useSidebar().

Workspace

parts: Provider, Root, Header, Content, Footer, Group, Menu, MenuItem, MenuButton, Rail, Inset, Trigger

a11y: Landmark + collapsible state managed by useSidebar().

Tabs primitive tabs

Tabbed sections.

Overview content.

parts: Root, List, Trigger, Content

a11y: role=tablist with arrow-key navigation from bits-ui.

Table primitive table

Semantic table parts. Wrap in TableCard for the standard bordered shell.

CandidateStars
octocat1.2k
defunkt890

parts: Root, Header, Body, Footer, Row, Head, Cell, Caption

a11y: Real <table> semantics.

Breadcrumb primitive breadcrumb

Hierarchical location trail.

parts: Root, List, Item, Link, Page, Separator, Ellipsis

a11y: nav[aria-label=breadcrumb]; current page marked aria-current.

Avatar primitive avatar

User image with text fallback.

OC
AL

parts: Root, Image, Fallback

a11y: Provide alt on Image; Fallback shows while loading/on error.

Separator primitive separator

Thin divider, horizontal or vertical.

Above Below
proptypedefault
orientation"horizontal" | "vertical""horizontal"

a11y: role=separator.

Label primitive label

Form control label.

proptypedefault
forstring

a11y: Associates via for/id.

Skeleton primitive skeleton

Pulsing placeholder for loading content.

proptypedefault
classstring

a11y: Decorative; hide from AT or pair with an aria-busy region.

Checkbox primitive checkbox

Boolean checkbox (bits-ui).

proptypedefault
checkedboolean

a11y: role=checkbox with aria-checked from bits-ui.

Switch primitive switch

On/off toggle (bits-ui).

proptypedefault
checkedboolean

a11y: role=switch with aria-checked from bits-ui.

ScrollArea primitive scroll-area

Styled custom scrollbar container.

Row 1Row 2Row 3Row 4Row 5Row 6Row 7Row 8Row 9Row 10Row 11Row 12
proptypedefault
classstring

a11y: Keeps native keyboard scrolling.

Command primitive command

Composable command menu (bits-ui Command): filterable list, groups, items, shortcuts, and a dialog wrapper for a ⌘K palette. Ported near-verbatim from recruiter-bot; restyled to tokens.

proptypedefault
valuestring
headingstring
onSelect() => void

a11y: bits-ui Command handles roving focus + aria-selected on items; Command.Dialog traps focus and provides sr-only title/description. Input is text-base below sm (no iOS zoom).

visual QA: compare against recruiter-bot src/lib/components/ui/command/* (bits-ui). Adaptations: import paths ($lib → relative), dropped command-link-item (unused), command-input is text-base sm:text-sm per §11.

Inputs

15
SegmentedControl pattern segmented-control

Pill row of mutually-exclusive options. Controlled: parent owns value.

proptypedefault
options{ value: string; label: string }[]
valuestring
onValueChange(value: string) => void
size"sm" | "md""md"
disabledbooleanfalse

a11y: role=group; each option is a button with aria-pressed.

Composer pattern composer

De-godded one-box input shell: pill row, textarea, submit affordance, busy state, understanding line. Filter/store logic stays app-side and feeds in via bind:value + slots.

React Remote
Looking for React engineers · Remote · Senior
proptypedefault
placeholderstring
valuestring
busybooleanfalse
onsubmit(value: string) => void

a11y: Textarea submits on Enter (Shift+Enter for newline); submit button has aria-label and disables while busy/empty.

visual QA: compare against rb-extract/feedback-chrome/agent-flows/AgentComposer.svelte

SearchField pattern search-field

The product search composer. Two states: editing (live input + clear) and committed (display-only pill that reopens filters). v4: dropped the built-in "+ New Search" button; callers pass a trailing control via the `action` slot.

live — Enter commits to a pill, click the pill to reopen
committed — display-only pill
proptypedefault
valuestring
placeholderstring
state"editing" | "committed""editing"
busybooleanfalse
onsubmitfunction
onclearfunction
onreopenfunction

a11y: role=search wrapper; focus-within ring on the field; clear button has aria-label; Escape clears; aria-busy while busy.

visual QA: compare against rb-extract/inputs-nav/inputs/DeveloperSearch.svelte

Textarea primitive textarea

Multi-line text field. field-sizing-content grows with content; min-h-16.

proptypedefault
valuestring
classstring

a11y: Native <textarea>. Pair with <Label>.

visual QA: compare against rb-extract/inputs-nav/inputs/ui-textarea.svelte

AutosizeTextarea primitive autosize-textarea

Textarea that grows with content via native field-sizing-content (no JS dependency). min-h-[60px], touch-friendly.

proptypedefault
valuestring
classstring

a11y: Native <textarea>.

de-gods: svelte-autosize action → native field-sizing-content (spec's stated removal path)

visual QA: compare against rb-extract/inputs-nav/inputs/AutosizeTextarea.svelte

RangeSlider pattern range-slider

Dual-thumb numeric range on bits-ui Slider. Native keyboard stepping; token-styled track/thumbs; optional compact (12.4k) end labels.

Stars
200 3.8k
proptypedefault
value[number, number]
minnumber0
maxnumber100
stepnumber1
format"number" | "compact""number"
size"sm" | "md" | "lg""md"
disabledbooleanfalse
labelstring
onValueChange(value: [number, number]) => void

a11y: bits-ui Slider gives arrow-key stepping and aria on each thumb; aria-label comes from `label`. Track/thumb use focus-visible ring-ring.

visual QA: compare against recruiter-bot ui/slider/slider.svelte (extended to dual-thumb + labels).

TagCombobox pattern tag-combobox

Multi-select combobox: a bordered trigger holds removable FilterChips, the panel is Command with a text filter and checkbox-style checked items. Controlled.

proptypedefault
items{ value: string; label: string }[]
selectedstring[]
placeholderstring"Select…"
tone"neutral" | "accent" | "success" | "warning" | "destructive" | "info""neutral"
loadingbooleanfalse
disabledbooleanfalse
onSelectedChange(selected: string[]) => void

a11y: Popover trigger is a real button (focus-visible ring, aria-busy while loading); command items are ≥44px tall below sm; chips remove inline with an aria-labelled button.

visual QA: compare against recruiter-bot SearchFiltersModal chip-commit pattern (composed from Popover + Command + FilterChip).

RepoSuggest pattern repo-suggest

Async-shaped repository suggest field. Never fetches — the parent feeds items/loading in response to the bound query. Keyboard-navigable listbox; rows render as RepoCard.

proptypedefault
querystring
items{ owner: string; name: string; description?: string; language?: string; stars?: number }[]
loadingbooleanfalse
placeholderstring"Search repositories"
onselect(item) => void

a11y: role=combobox + aria-expanded/controls on the input wrap; aria-activedescendant tracks the highlighted option; listbox/option roles; ArrowUp/Down + Enter + Escape. Loading renders 3 Skeleton rows (aria-busy via the wrapper).

visual QA: compare against recruiter-bot ProjectsList repo row (row baseline) + hand-rolled listbox.

FormField pattern form-field

Wraps one control with its label, hint, and error, wiring aria-describedby. The control spreads nothing; when it needs the described-by id it takes it from the children snippet param.

Shown to invited members.

Enter a valid email address.

proptypedefault
labelstring
hintstring
errorstring
requiredbooleanfalse
forstring

a11y: Label linked via `for`; hint/error ids surfaced through aria-describedby (on the wrapper and offered to the child).

FileDrop pattern file-drop

Controlled file dropzone: the parent owns the staged `files` list. Drag-over lifts to the pulse ring + primary tint. The `coming-soon` state disables everything and captions 'File storage coming soon'.

ready — staged files
  • resume-ada-chen.pdf 180 KB
  • cover-letter.pdf 41 KB
coming soon

File storage coming soon

proptypedefault
acceptstring
multiplebooleanfalse
state"ready" | "coming-soon""ready"
files{ name: string; size: number }[]
onaddfunction
onremovefunction

a11y: Dropzone is a real button (keyboard-openable); remove buttons labeled per file with 44px hit areas below sm; disabled state is aria-disabled.

SaveBar pattern save-bar

Sticky bottom action bar for unsaved edits (position the parent `relative`). Appears when dirty, saving, or there is a recent save to confirm. Dirty → Save + Discard; clean with savedAt → a quiet 'Saved 2m ago'. Fades in via animate-fade-in-scale; safe-area padded.

proptypedefault
dirtyboolean
savingbooleanfalse
savedAtstring
onsavefunction
ondiscardfunction

a11y: role=status so the saved confirmation is announced; enter animation degrades under reduced motion via .animate-fade-in-scale.

IntakeSection pattern intake-section

One numbered step of a long-form intake: a mono step-number eyebrow, a bold micro-label, a helper line, then its fields in a gap-4 stack.

01 Job description Paste the full role.
proptypedefault
numberstring
labelstring
helperstring

a11y: Renders a <section>; the label is a bold text heading and the number reads as a plain eyebrow. Content order is number, label, helper, fields.

RepeatableListField pattern repeatable-list-field

Collects a list of short strings. Type + Enter (or Add) appends a trimmed non-duplicate value; each value is a removable chip; Backspace in the empty input removes the last item.

Selling points
  • Remote-first
  • Series B, well funded
Enter adds. Backspace in the empty input removes the last.
proptypedefault
labelstring
itemsstring[]
placeholderstring
helperstring

a11y: Input carries aria-label={label}; chips render in a role=list; each chip's remove button is labeled "Remove {item}". Enter adds, Backspace on empty removes last, all keyboard-reachable.

CommitmentCard pattern commitment-card

A single headline commitment: a large value, its unit, and a plain-language detail line, marked by a left accent bar.

50 Emails / day

Once the search launches, Agent Mode emails 50 matching developers every business day until the role is filled.

proptypedefault
valuestring
unitstring
detailstring

a11y: Structural card; value and unit are text, detail is a paragraph. No interactive semantics.

LaunchBar pattern launch-bar

Commit action bar for an irreversible submission: a one-line what-happens-next note, an optional ghost draft action, and the primary launch button (Spinner while busy). Editing surfaces use SaveBar; irreversible submissions use LaunchBar.

Launching starts the GitHub search immediately. Outreach begins within 24 hours.
proptypedefault
labelstring
draftLabelstring
whatHappensstring
onlaunch() => void
ondraft() => void
busybooleanfalse

a11y: Buttons are real <button>s; the primary button disables while busy and shows a Spinner. Pads env(safe-area-inset-bottom) per DESIGN.md §11 for bottom-anchored use.

Navigation

2
LinkMenu pattern link-menu

Dropdown of external profile links (GitHub / LinkedIn / X / website). Rows render the brand lockups (GitHub wordmark, LinkedIn, X, globe wireframe); each row is a real anchor.

proptypedefault
links{ kind: 'github'|'linkedin'|'x'|'website'; href: string; label?: string }[]
labelstring"Links"
align"start" | "center" | "end""end"

a11y: Roving tabindex from DropdownMenu; each link has aria-label and rel=noopener; opens in new tab.

de-gods: SvelteSet toggle-filter state → plain link rows (this is the link-menu case, not the filter toggle)

visual QA: compare against rb-extract/inputs-nav/menus/SocialsDropdown.svelte

ProjectSwitcher pattern project-switcher

Sidebar account/project switcher. Trigger reads like a sidebar menu button and shows the current selection; the menu groups accounts and projects, each row an Avatar + name with a Check on the active id, plus an optional Create project action.

Current: backend-hire

proptypedefault
groups{ label: string; items: { id: string; name: string; kind: 'account'|'project'; avatarUrl?: string }[] }[]
currentIdstring
onselect(id: string) => void
oncreate() => void

a11y: DropdownMenu roving tabindex; trigger is a full-width menu button; menu rows and the trigger meet 44px touch targets below sm; active id marked with a Check.

visual QA: compare against sidebar account/project switcher pattern

Overlays

2
HoverCard primitive hover-card

Rich hover content (bits-ui LinkPreview). Tier 2 overlay: non-critical info shown on hover with standard 250/300ms intent delays.

Hover the mention →

parts: Root, Trigger, Content

a11y: bits-ui manages focus + hover intent. Info must also exist elsewhere (non-critical). Reduced-motion collapses delays to instant.

visual QA: compare against rb-extract/inputs-nav/hover-popovers/hover-card-content.svelte

HoverPopup pattern hover-popup

Perf-tier fixed-position hover popup for dense table rows. ONE component replacing recruiter-bot's 7 copy-pasted fixed/getBoundingClientRect blocks.

table-cell stat →
proptypedefault
openboolean
anchorHTMLElement | DOMRect | null
placement"top" | "bottom" | "right""top"
zIndexnumber60
idstring

a11y: role=tooltip + id for aria-describedby wiring the source copy-pastes lacked. Use only inside table rows / high-frequency hover targets.

de-gods: 7 byte-identical copy-pastes → one component (the dedup IS the improvement)

visual QA: compare against rb-extract/inputs-nav/tables/DeveloperTableRow.svelte (5×) + SequenceTable.svelte (2×)

Data display

9
QuotaBar primitive quota-bar

Labelled usage meter (used / limit) that warns near the cap and shows ∞ for unlimited.

credits 40 / 100
seats 9 / 10
searches 128 / ∞
proptypedefault
labelstring
usednumber
limitnumber

a11y: Visual meter; expose the numeric label in text (it does).

PageHead pattern page-head

Page header: display-font title + optional description, actions slot on the right.

Contacts

Everyone you've reached.

proptypedefault
titlestring
descriptionstring
underlinebooleanfalse

a11y: Renders the page <h1>. One per page.

StatTile pattern stat-tile

Label + big tabular number in a bordered tile. Rows of 3–4 on overview pages.

Credits 1,240
Sent 98
Replies 12
Bounced 3
proptypedefault
labelstring
valuestring
tone"neutral" | "accent" | "success" | "warning" | "destructive""neutral"

a11y: Renders a <div>; label and value are text nodes read in order. No interactive semantics.

DefinitionList pattern definition-list

Grid wrapper for DefinitionRow pairs. One or two columns.

Email
ada@lovelace.dev
Company
Analytical Engines
Status
Active
Plan
Pro
proptypedefault
columns1 | 22

a11y: Renders a <dl>; fill it with DefinitionRow.

DefinitionRow pattern definition-row

One term/value pair inside a DefinitionList. Value is the default slot.

Repository
vamo-ai/recruiter-bot
proptypedefault
termstring

a11y: Renders <dt>/<dd>.

FilterChip pattern filter-chip

Removable filter token. Tone tints the chip.

React Remote Senior
proptypedefault
labelstring
tone"neutral" | "accent" | "success" | "warning" | "destructive" | "info""neutral"
removablebooleanfalse
onRemove() => void

a11y: Remove button has aria-label 'Remove {label}'.

SignalChip pattern signal-chip

The trust-taxonomy chip: color encodes claim provenance identically across app, agent output, PDF, and deck. Green = GitHub-inferred, gold = LinkedIn-confirmed, purple = Vamo-computed score, orange = observed streak/activity.

TypeScript 3 shared repos Confirmed at Stripe Top 3% 14-week shipping streak

Color encodes provenance, identically everywhere: green is read from GitHub, gold is confirmed by LinkedIn, purple is computed by Vamo, orange is observed over time.

proptypedefault
labelstring
trust"github" | "linkedin" | "score" | "streak" | "affinity""github"
titlestring

a11y: Plain text chip; provenance sentence via native title. Wrap in Tooltip for rich hover content.

visual QA: compare against rb AgentResultRow signal/LinkedIn chips (trust colors tokenized)

CountUp pattern count-up

Animated number that eases from the previous value to the new one. Tabular-nums; reduced-motion jumps to the final value.

0
proptypedefault
valuenumber
duration"fast" | "normal""normal"
format"plain" | "compact" | "percent""plain"

a11y: Renders a <span>; the final value is the accessible text once settled.

PercentileTier pattern percentile-tier

Static cohort-percentile badge. Maps a 0–100 percentile to a named tier (Top 1% … Below median) and a filled-block count, rendered as blocks, a provenance-shaped chip, or an ordinal line.

Also a DataGrid cell: type: 'percentile' renders this at sm from a DataGridPercentileValue — live at scale on the Data page.

proptypedefault
valuenumber
variant"blocks" | "chip" | "ordinal""blocks"
size"sm" | "md""md"
cohortLabelstring

a11y: role=img with an aria-label reading the ordinal, tier, and optional cohort; all visual glyphs/text are aria-hidden. Static, no animation.

visual QA: compare against shares the ordinal() helper with PercentileBar (src/lib/ordinal.ts)

Charts

5
DividedBar pattern divided-bar

Proportional single-row stacked bar. Segment widths sum to 100%; colors cycle the --viz-cat palette; optional right/below legend with values.

  • TypeScript 58
  • Rust 24
  • Go 12
  • Python 6
proptypedefault
segments{ label: string; value: number }[]
legend"right" | "below" | "none""below"
showValuesbooleanfalse

a11y: The bar is aria-hidden; the legend (a real <ul>) carries the labels and values as text.

visual QA: compare against new (token viz palette).

Sparkline pattern sparkline

Tiny inline-SVG trend line. Stroke tone from the Tone union; draws itself in once (motion-token timing) and renders the final frame under reduced motion.

Commits
Open issues
proptypedefault
valuesnumber[]
tone"neutral" | "accent" | "success" | "warning" | "destructive" | "info""accent"
widthnumber120
heightnumber32
labelstring

a11y: aria-hidden by default; passing `label` promotes it to role=img with that label. Draw-in animation is disabled under prefers-reduced-motion.

visual QA: compare against new. Note: uses a component-scoped draw keyframe (no shared draw utility exists yet — §12 deviation, documented in-file).

PercentileBar pattern percentile-bar

Cohort-relative percentile with a correct ordinal label (96th, 93rd, 11th) and a marker triangle at the value.

Commit frequency 96th · vs senior TypeScript
Review throughput 82nd · vs senior TypeScript
Issue backlog 11th · lower is better
proptypedefault
valuenumber
labelstring
cohortLabelstring

a11y: Label and ordinal render as text above the track; the marker triangle is aria-hidden. Ordinal handles the 11–13 'th' exception.

visual QA: compare against new (trust taxonomy §9 percentile rendering).

ScatterPlot pattern scatter-plot

Inline-SVG scatter, up to 6 series encoded by both --viz-cat color and shape (circle/diamond/square/triangle). Optional quadrant persona labels; points fade in with a 15ms stagger.

02000400020406080Hidden GemKnown QuantityEarly SignalRising ProfileStarsRecent commits
proptypedefault
points{ x: number; y: number; label?: string; series?: number }[]
xLabelstring
yLabelstring
xDomain[number, number]
yDomain[number, number]
quadrants[string, string, string, string]
widthnumber480
heightnumber320

a11y: role=img with an aria-label summarizing axes + point count. Series read without color via shape encoding. Point fade-in stagger is disabled under reduced motion. viewBox + w-full max-w so it never overflows the page body (§11).

visual QA: compare against new. Note: component-scoped opacity fade keyframe (SVG can't reuse .animate-fade-in-scale cleanly — documented in-file).

TrendSpark pattern trend-spark

A sparkline paired with its signed delta. Line tone and arrow direction follow the sign of `delta` (green up / red down). Delta is an already-computed percentage.

up +12.4%
down -8.1%
proptypedefault
valuesnumber[]
deltanumber
size"sm" | "md""md"

a11y: Sparkline carries an aria-label ('Trend +12.4%'); arrow icons aria-hidden.

Comparison

2
SignalRollup composer signal-rollup

One developer's raw GitHub signals rolled up to the category tier: a badge row, an optional GemScore, and a PercentileBar per capability (velocity, craft, rigor). Detail mode expands each category to its underlying signals. Shows evidence, withholds weights.

Ships compilersRust14-week streak
87 GemScore
code velocity 92nd

Top 9% for code velocity within their cohort.

rigor 84th

Top 16% for rigor within their cohort.

craft 84th

Top 17% for craft within their cohort.

timing 83rd

Top 17% for timing within their cohort.

influence 72nd

Top 28% for influence within their cohort.

hidden gems 66th

Top 34% for hidden gems within their cohort.

proptypedefault
devDevSignals
categoriesSignalCategory[]
disclosure"rollup" | "detail""rollup"
sort"strength" | "canonical""strength"
sentencesbooleantrue
gemScorenumber

a11y: Detail mode uses native <details>/<summary> disclosure (keyboard + SR). PercentileBar carries the ordinal as text; markers are aria-hidden.

visual QA: compare against new (trust taxonomy §9 rollup — the v1 category map lives in category-map.ts).

CompareColumns composer compare-columns

Two or three developers side by side, category by category. Each category row pairs one PercentileBar per developer; the leader gets a viz-cat dot. Mandatory cohort caption whenever the developers sit in different cohorts, since cross-cohort percentiles are not directly comparable.

Same cohort
code velocity
ada 92nd
grace 70th
craft
ada 84th
grace 90th
rigor
ada 84th
grace 82nd
influence
ada 72nd
grace 55th
Different cohorts
code velocity
ada 92nd
linus 85th
craft
ada 84th
linus 68th
rigor
ada 84th
linus 77th
influence
ada 72nd
linus 98th

Percentiles are within each developer's own cohort.

proptypedefault
devsDevSignals[]
categoriesSignalCategory[]
highlight"leader" | "none""leader"
layout"rows" | "columns""rows"

a11y: Leader dot is aria-hidden; each bar is labeled by login/category text. Columns layout stacks to one column below sm (Grid).

visual QA: compare against new (comparison tier over PercentileBar; cohort caption is a §9 correctness rule, not a prop).

Outreach

6
SequenceTimeline composer sequence-timeline

The lifecycle of an outreach sequence as connected nodes (initial → follow-up → breakup), each node showing its status, connectors labeled with the wait between touchpoints. Paused dashes the future connectors and marks them with a pause icon. sm collapses to dots-only for use inside a table row.

Mid-sequence
Initial
Follow-up
Breakup
Paused
Initial
Follow-up
Breakup
proptypedefault
stepsSequenceStep[]
delays{ followUpDays: number; breakupDays: number }
followUpsEnabledbooleantrue
pausedbooleanfalse
orientation"horizontal" | "vertical""horizontal"
size"sm" | "md""md"

a11y: role=list/listitem with an 'Outreach sequence' label; sm nodes carry a title. The scheduled-node ping honors motion-reduce.

visual QA: compare against rb SequenceSettingsTab lifecycle block (touchpoint timing + follow-up toggle).

DraftStatusPill pattern draft-status-pill

The state of one outreach draft. Tone is fixed internally (not a prop) so the palette never drifts per caller. Sent is a quiet primary tint, not a solid green fill; bounced is the one loud destructive state; generating/sending carry a subtle shimmer dot.

Generating Draft Approved Sent Skipped Sending Already contacted Bounced
proptypedefault
status"generating" | "draft" | "approved" | "sent" | "skipped" | "sending" | "already-contacted" | "bounced"
size"sm" | "md""md"

a11y: Text-labeled pill; the busy shimmer dot is decorative and stops under motion-reduce.

visual QA: compare against rb listMemberDraft.status enum (generating|draft|approved|sent|skipped|sending|already-contacted|bounced).

SequenceCard composer sequence-card

Overview card for one outreach sequence: name + lifecycle state (archived > paused > active), provider, member/sent/replied counts, a thin reply-rate DividedBar, and the send schedule.

Staff infra — SF Active
Gmail
42 members
30 sent
6 replied
  • Replied
  • No reply
12 per week, Tuesdays
Senior Rust — Berlin Paused· 7d ago
Outlook
28 members
20 sent
3 replied
  • Replied
  • No reply
Schedule off
proptypedefault
namestring
counts{ members: number; sent: number; replied: number }
schedule{ enabled: boolean; weeklyTarget: number; dayOfWeek: number; vettingThreshold: number } | null
pausedAtstring | null
archivedAtstring | null
provider"gmail" | "outlook"

a11y: Static card; state and schedule render as text. Provider uses a lucide mail glyph, no brand logo.

visual QA: compare against rb developerList (schedule/pausedAt/archivedAt/emailProvider) + SequenceSettingsTab lifecycle.

EmailPreview composer email-preview

Read-only render of an outreach email in its chrome: from-line, subject, body in a reading measure, signature, and a provenance footer. {token} placeholders are highlighted — unresolved ones stay visibly mono/bracketed, resolved ones read as ink with a subtle underline and a title naming their source variable.

Cam Whiteside cam@vamo.app Initial

Loved your work on query-engine

Hi Ada, I came across query-engine and the way you handled backpressure there. We are building something adjacent at {company} and your work is exactly the shape we keep looking for. Would a short call next week be worth your time?
Cam Vamo
via commit email
proptypedefault
from{ name: string; address: string; provider: 'gmail'|'outlook' }
subjectstring
bodystring
variablesRecord<string, string>
highlightVariablesbooleantrue
signaturestring
provenance"work-email" | "commit-email" | "web-enriched" | "none"
touchpoint"initial" | "follow-up" | "breakup""initial"

a11y: Semantic heading for the subject; resolved variables expose their source via title. whitespace-pre-line keeps authored line breaks.

visual QA: compare against rb listMemberDraft (subject/content/opener + template variables) + EmailProvenanceBadge.

InboxRow composer inbox-row

One conversation in the outreach inbox: candidate, subject, an embedded sm SequenceTimeline for touchpoints sent, and the reply state. The whole row is a button (Enter/Space) when onclick is set. Only a replied thread pulses; everything else holds still.

AL
Ada Lovelace @ada
Re: Loved your work on query-engine
3d ago
GH
Grace Hopper @grace
Following up on my note
5d ago
LV
Linus Vale @linus
Re: a quick question
6d ago
DR
Dana Reed @dana
Sequence stopped
2w ago
proptypedefault
candidate{ displayName: string; login: string; avatarUrl? }
subjectstring
lastActivitystring
state"awaiting" | "replied" | "accepted" | "stopped"
provider"gmail" | "outlook"
forwardingbooleanfalse
touchpointsSent"1" | "2" | "3""1"
selectedbooleanfalse
onclickfunction

a11y: role=button + tabindex + Enter/Space when onclick is set (DataGrid row pattern); replied pulse honors motion-reduce; forward/accept icons carry aria-labels.

visual QA: compare against rb userConnection (lastActivity/hasAccepted/shouldForwardReply/emailProvider) + inbox list row.

EmailProvenanceBadge pattern email-provenance-badge

Where a candidate's email address came from, on the trust taxonomy: work-email (gold, confirmed by a second source), commit-email (green, read from code), web-enriched (orange, observed), none (muted 'No email found'). Never says verified, never shows a checkmark.

via work emailvia commit emailfound on the webNo email found
proptypedefault
source"work-email" | "commit-email" | "web-enriched" | "none"
reachableViastring
size"sm" | "md""md"

a11y: Reuses SignalChip (trust color + native title). 'none' renders muted text. No verified language, no check glyph (§7).

visual QA: compare against new (trust taxonomy §9 applied to email discovery source).

Tables

6
TableCard pattern table-card

The standard rounded-border-overflow shell for a Table.Root.

Public repositories, most-starred first.
Repository Stars Status
query-engine 4,812 Active
wasm-linker 3,190 Active
schema-diff 1,204 Maintenance
legacy-orm 642 Archived
edge-cache 118 Active

a11y: Presentational wrapper; the table inside carries semantics.

DataGrid pattern data-grid

Analytics-grade virtualized data grid on @tanstack/table-core: column resize, sort, pinned-left columns, multi-select, density, typed cells (text/number/badge/badges/trust-chip/avatar-name/date/link/percentile — percentile renders PercentileTier from a DataGridPercentileValue), optional per-column wrap, and a `toolbar` slot for composed filters. For heavy interactive data; use Table + TableCard for <100 static rows.

Developer
Rank
Location
Stars
Ada Chen
Top 3%
Berlin
4,812
Grace Okafor
Top 8%
Lagos
3,190
Linus Ivanova
Top 21%
Toronto
1,204

Virtualized, resizable, sortable, pinned columns.

Full 50,000-row showcase →
proptypedefault
columnsDataGridColumn<T>[] ({ id, header, accessor, type?, width?, minWidth?, pin?: 'left', sortable?, align?: 'start'|'end', wrap?: boolean })
dataT[]
getRowId(row: T) => string
density"compact" | "comfortable""comfortable"
selectable"none" | "multi""none"
heightnumber560
loadingbooleanfalse
onRowClickfunction
onSelectionChange(ids: string[]) => void
onSortChange(sort: { id: string; desc: boolean } | null) => void

a11y: role=grid/row/columnheader/gridcell; aria-sort on sorted headers; aria-rowcount/aria-busy; clickable rows are tabbable with Enter/Space activation; sort buttons and resize separators are labelled.

de-gods: server-mode paging, pinned-right, inline edit, grouping, keyboard range selection, garden/sparkline cell types

visual QA: compare against @tanstack/table-core + @tanstack/svelte-virtual (recruiter-bot's data-table adapter, ported verbatim)

TableShell pattern table-shell

Superseded: DataGrid is the table. Static tables use Table + TableCard. THE recruiter-bot table chrome: <colgroup> fixed widths, sticky blurred header, built-in skeleton rows, select-all, and the toolbar-replaces-header swap.

Deprecated · v4

Superseded by DataGrid. DataGrid is the table now; for short static tables in cards and reports, compose Table inside TableCard. TableShell still exports for one minor, then goes.

See DataGrid on /data →
proptypedefault
columns{ key: string; label: string; width?: string }[]
selectablebooleanfalse
allSelectedbooleanfalse
onselectallfunction
loadingbooleanfalse
stickyHeaderbooleantrue
showToolbarbooleanfalse

a11y: <th scope=col>; aria-busy while loading; sticky header carries a bottom border scroll cue.

de-gods: results/pagination/prefetch/bulk-reveal plumbing (parent owns data)

visual QA: compare against rb-extract/inputs-nav/tables/DeveloperSearchTable.svelte

TableSelectionToolbar pattern table-selection-toolbar

The in-<thead> "N selected / Clear / actions" row that swaps in over the column labels when rows are selected.

…rows…
proptypedefault
countnumber
onclearfunction

a11y: role=toolbar + aria-live=polite on the count.

visual QA: compare against rb-extract/inputs-nav/tables/DeveloperSearchTable.svelte

TablePagination pattern table-pagination

Range-based pager ("1–50", not page X of Y) with prev/next chevrons. Range design is deliberate — results stream in the background.

proptypedefault
rangeStartnumber
rangeEndnumber
totalnumber
hasPrevboolean
hasNextboolean
onprevfunction
onnextfunction
disabledbooleanfalse

a11y: <nav aria-label=pagination>; chevrons have aria-labels; disabled at bounds.

de-gods: currentPage/totalPages math → explicit range + hasPrev/hasNext

visual QA: compare against rb-extract/inputs-nav/tables/DeveloperTablePagination.svelte

PageSizeControl pattern page-size-control

Per-page size toggle. Thin wrapper over SegmentedControl.

Per page
proptypedefault
optionsnumber[]
valuenumber
onValueChangefunction
disabledbooleanfalse

a11y: Inherits SegmentedControl's role=group + aria-pressed.

de-gods: SearchPageSize typing + TABLE_PAGE_SIZE_OPTIONS constant → options: number[]

visual QA: compare against rb-extract/inputs-nav/tables/SearchPageSizeControl.svelte

Developer

15
ContributionGraph pattern contribution-graph

GitHub contribution heatmap. Verbatim grid + month/day labels + the exact green thresholds, as corrected --contrib tokens.

3445 contributions this year
Jul
Aug
Sep
Oct
Nov
Dec
Jan
Feb
Mar
Apr
May
Jun
Jul

Hover a cell, or focus the grid and arrow around.

proptypedefault
weeks{ date: string; count: number }[][]
size"sm" | "md""md"
interactivebooleantrue
labelstring"Contribution activity"

a11y: figure+figcaption; role=grid with per-cell aria-label; arrow-key roving focus the tooltip follows.

de-gods: MinimalGitHubUserResult / contributionsCollection plumbing → the weeks prop

visual QA: compare against rb-extract/developer/heatmap/ActivityHeatmap.svelte

DeveloperCard pattern developer-card

The full developer result card/row, composed from ProfileHeader + SocialIconRow + StatPill + LanguageChips + ContributionGraph + facet pills.

AL

Ada Lovelace

@ada

Systems engineer · compilers, distributed data

12k followers
231 following
1.8m total stars

Maintains a widely-used Rust query engine; consistent multi-year contribution cadence across data infra.

Rust
databases
distributed-systems
3617 contributions this year
Jul
Aug
Sep
Oct
Nov
Dec
Jan
Feb
Mar
Apr
May
Jun
Jul

Coding Languages

Rust

TypeScript

Go

Python

C++

Zig

Elixir

Haskell

proptypedefault
developerDeveloperCardData
variant"row" | "card""card"
selectedbooleanfalse
selectablebooleanfalse
revealedbooleantrue
onselectfunction

a11y: row variant is a real <tr> with aria-selected + Space/Enter to toggle; interactive sub-elements stopPropagation.

de-gods: credits/entitlements/revealed-profiles/bulk-reveal stores, FEATURES flags, match-score/developer-filters/developer-level typing, 5 fixed-position hover popups → shared HoverPopup

visual QA: compare against rb-extract/developer/cards/DeveloperTableRow.svelte

ProfileHeader pattern profile-header

Avatar + name + @handle + optional headline, with an optional cracked glow + CrackedBadge.

AL

Ada Lovelace

@ada

Systems · compilers

GH

Grace Hopper

@grace

proptypedefault
namestring
handlestring
headlinestring
avatarUrlstring
crackedbooleanfalse
size"sm" | "md" | "lg""md"

a11y: Avatar fallback shows initials; name is plain text.

de-gods: entitlements store + FEATURES gating, reveal/blur logic, /api/avatar URL builder, user-display-utils → format.ts

visual QA: compare against rb-extract/developer/cards/ProfileHeader.svelte

CrackedBadge primitive cracked-badge

"CRACKED" gradient badge for top-1% developers, with a hover tooltip.

hover for the tooltip
proptypedefault
size"sm" | "md""md"

a11y: role=img with a descriptive aria-label.

de-gods: tier/score shouldShow gating (parent decides whether to render)

visual QA: compare against rb-extract/developer/cards/CrackedBadge.svelte

SocialIconRow pattern social-icon-row

Row of green social badges (GitHub / LinkedIn / X / website) linking out to profiles.

proptypedefault
links{ kind: SocialKind; href: string; label?: string; logoUrl?: string }[]
size"sm" | "md""md"

a11y: each link is aria-label'd + rel=noopener; clicks stopPropagation so a row click still selects.

de-gods: BountyLab/GitHub/LinkedIn typing, reveal/enrichment plumbing, email-copy, inline LinkedIn hover popup, getCompanyLogoUrl → optional logoUrl

visual QA: compare against rb-extract/developer/cards/SocialBadges.svelte

StatPill pattern stat-pill

Vertical list of GitHub stat rows (followers/following/stars…), K/M-abbreviated via format.ts.

12k followers
231 following
1.8m total stars
proptypedefault
stats{ label: string; value: number; icon?: Snippet }[]
size"sm" | "md" | "lg""md"

a11y: Plain text rows; icons are decorative.

de-gods: match-score / developer-level derivation (display formatting only)

visual QA: compare against rb-extract/developer/stat-utils/GitHubStatsCard.svelte

LanguageChips pattern language-chips

Rounded language chips with a +N overflow pill.

TypeScript

Rust

Go

Python

Elixir

Zig

+ 2 more

proptypedefault
languages{ name: string; tone?: Tone }[]
maxnumber

a11y: Plain text chips.

de-gods: isLoading branch, totalRepositoriesCount overflow heuristic → max prop

visual QA: compare against rb-extract/developer/cards/LanguagesList.svelte

GitHubLockup primitive git-hub-lockup

GitHub wordmark lockup SVG.

currentColor · scales with text size
proptypedefault
classstring

a11y: Inline SVG, fill=currentColor. Decorative; label the link that wraps it.

visual QA: compare against rb-extract/developer/icons/GitHubLockup.svelte

LinkedInLogo primitive linked-in-logo

LinkedIn logo SVG.

currentColor · scales with text size
proptypedefault
classstring

a11y: Inline SVG, fill=currentColor. Decorative; label the link that wraps it.

visual QA: compare against rb-extract/developer/icons/LinkedInLogo.svelte

XLogo primitive xlogo

X (Twitter) logo SVG.

currentColor · scales with text size
proptypedefault
classstring

a11y: Inline SVG, fill=currentColor. Decorative; label the link that wraps it.

visual QA: compare against rb-extract/developer/icons/XLogo.svelte

GlobeWireframe primitive globe-wireframe

Wireframe globe icon (website link).

currentColor · scales with text size
proptypedefault
classstring

a11y: Inline SVG, fill=currentColor. Decorative; label the link that wraps it.

visual QA: compare against rb-extract/developer/icons/GlobeWireframe.svelte

BookmarkButton primitive bookmark-button

Toggle bookmark / Add-to-Sequence button. icon or sequence variant.

Deprecated · v4

Superseded by AddToListButton, which toggles a contact across lists and shortlists from one menu instead of a single on/off bookmark.

proptypedefault
pressedbooleanfalse
ontogglefunction
variant"icon" | "sequence""icon"
labelstring

a11y: aria-pressed reflects toggle state; icon variant has aria-label.

de-gods: AddToListDropdown, lists-cache store, optimistic add/remove → pressed prop + ontoggle

visual QA: compare against rb-extract/developer/icons/BookmarkButton.svelte

RevealCard pattern reveal-card

The pitch-a-developer artifact: one portable sheet readable top-to-bottom at 375px with zero interaction. Name and verdict, the contribution garden as hero evidence, GemScore with its percentile line, signal chips in trust order, then provable repo URLs. Flipping reveal true runs the uncover choreography once: garden paints left to right, score counts up, chips settle, one pulse-green ring.

Ada Lovelace

@ada

Ships compilers on weekends

3617 contributions this year
Jul
Aug
Sep
Oct
Nov
Dec
Jan
Feb
Mar
Apr
May
Jun
Jul
0 96th percentile of systems engineers at this stage
RustConfirmed at StripeTop 3%14-week streak
  • Rust query engine, 4.1k stars

    https://github.com/ada/query-engine
proptypedefault
namestring
handlestring
crackedbooleanfalse
verdictstring
weeks{ date: string; count: number }[][]
scorenumber
scoreLinestring
signals{ label: string; trust: 'github' | 'linkedin' | 'score' | 'streak'; title?: string }[]"[]"
repos{ name: string; url: string; description?: string }[]"[]"
revealbooleanfalse

a11y: Renders an <article> labeled with the developer name; the garden is a labeled <figure>; repo links are real anchors. prefers-reduced-motion lands every stage at its final state instantly and the ring becomes a static primary border that fades.

visual QA: compare against new; composes ContributionGraph, CrackedBadge, CountUp, SignalChip

RepoCard pattern repo-card

GitHub-shaped repository summary. Renders as a bordered card or a compact borderless row (for suggest/dropdown lists). Language dot, stars/forks meta, topic badges, optional match line.

An asynchronous runtime for Rust: I/O, networking, scheduling, and timers.

Rust 26k 2.5k
asyncruntimenetworkingscheduler +1
matches your Rust and async filters
rust-lang/rust-analyzer
Rust 14k 1.6k
proptypedefault
namestring
hrefstring
descriptionstring
languagestring
starsnumber
forksnumber
topicsstring[]
matchstring
variant"card" | "row""card"
density"compact" | "comfortable""comfortable"

a11y: Name is a real link (text-info) when href is given; all icons and the language dot are aria-hidden; topics shown as Badge with a +n overflow chip (max 4).

visual QA: compare against recruiter-bot ProjectsList.svelte repo row. Language dot uses a closed --viz-cat mapping, not GitHub hexes (see language-colors.ts).

EventBadge pattern event-badge

A time-sensitive signal about a developer: job change, open-to-work, departure, or activity-spike onset, with a relative suffix. Warm tones (JD orange, LinkedIn gold, primary tint). spike_onset carries a small live pulse, static under reduced motion.

Just changed jobs 1w ago Open to work 2w ago Left their company 1mo ago Heating up 4d ago
proptypedefault
type"job_changed" | "open_to_work" | "left_company" | "spike_onset"
occurredAtstring
size"sm" | "md""md"

a11y: Text-labeled pill; the spike_onset pulse is decorative and stops under motion-reduce.

visual QA: compare against new (developer timing signals; warm-tone counterpart to the trust chips).

Contacts

3
AddToListButton pattern add-to-list-button

Add or remove a contact across lists and shortlists from one dropdown. Trigger shows current membership count; zero reads as a hollow outline. Checkable items, shortlists grouped first.

icon
labeled
proptypedefault
lists{ id: string; name: string; kind: 'shortlist' | 'list'; member: boolean }[]
ontogglefunction
variant"icon" | "labeled""icon"
disabledbooleanfalse

a11y: Trigger has aria-label in icon variant; bits-ui menu gives roving tabindex + ESC; items are checkbox items (aria-checked).

StagePill pattern stage-pill

Pipeline stage of a contact. Static pill by default; pass `onselect` to make it a Select-backed inline stage changer. Distinct quiet tone per stage, reusing existing category/trust/primary token pairs (no new tokens).

SourcedContactedRepliedInterviewingOfferHired
selectable — advance the stage inline
proptypedefault
stage"sourced" | "contacted" | "replied" | "interviewing" | "offer" | "hired"
size"sm" | "md""md"
onselectfunction

a11y: When selectable, bits-ui Select provides the listbox/keyboard semantics; trigger labeled 'Stage'.

DNCBadge pattern dncbadge

Do-not-contact flag. Destructive tone + ban icon so it reads as a hard stop before outreach. Optional `since` date renders in the title.

Do not contact Do not contact Do not contact
proptypedefault
sincestring
size"sm" | "md""md"

a11y: title carries 'Do not contact · since {date}'; icon is aria-hidden.

Account

6
SubscriptionStatusBadge pattern subscription-status-badge

Stripe-shaped subscription state. Fixed tone per status: active = brand green, trialing = info, past_due = warning, canceled/paused = muted.

TrialingActivePast dueCanceledPaused
proptypedefault
status"trialing" | "active" | "past_due" | "canceled" | "paused"
size"sm" | "md""md"

a11y: Static text badge; color is not the sole signal (label states the status).

PlanCard pattern plan-card

Current subscription at a glance: plan, price lockup ($X/mo · N seats), status badge, renews-vs-cancels line and optional next invoice, plus a primary-tint callout for an active service grant.

Team

Active
$49 /mo · 5 seats

Renews on Jul 31, 2026· next invoice $49

Service grant active until Sep 14, 2026
proptypedefault
planNamestring
amountnumber
interval"month" | "year"
quantitynumber
status"trialing" | "active" | "past_due" | "canceled" | "paused"
cancelAtPeriodEndbooleanfalse
renewsAtstring
nextInvoiceAmountnumber
grantExpiresAtstring

a11y: Semantic heading for the plan name; all state stated in text, not color alone.

InvoiceRow pattern invoice-row

One line on the billing history. Paid is quiet (a muted check); open/failed carry a warning/destructive badge; void reads struck-through. Whole row links to the hosted invoice when `href` is set.

May 31, 2026 $49.00 Paid
Apr 30, 2026 $49.00 Failed
Mar 31, 2026 $49.00 Void
proptypedefault
datestring
amountnumber
status"paid" | "open" | "failed" | "void"
hrefstring

a11y: Link opens in a new tab with rel=noopener; status stated in text.

RoleBadge pattern role-badge

A member's permission level. Quiet tones from existing pairs: owner = brand green, admin = domain blue, user/readonly = muted. No new tokens.

OwnerAdminMemberRead-only
proptypedefault
role"owner" | "admin" | "user" | "readonly"
size"sm" | "md""md"

a11y: Static text badge; label carries the role.

MemberRow pattern member-row

One teammate in the members table. Invited members read muted and get a Resend action; active show their role. Remove is opt-in via `removable`.

Ada Chen
ada@vamo.dev
Owner
Grace Okafor
grace@vamo.dev
Admin
Linus Ivanova Invited
linus@vamo.dev
Member
proptypedefault
namestring
emailstring
role"owner" | "admin" | "user" | "readonly"
status"invited" | "active"
onresendfunction
onremovefunction
removablebooleanfalse

a11y: Remove button labeled 'Remove {name}'; Resend is a real button.

FloatingCredits pattern floating-credits

A compact fixed floating chip showing the user's credit balance beside the semi-transparent pineapple credit mascot. Number counts on change; renders as a link when href is set. Reduced motion holds still.

proptypedefault
balancenumber
labelstring"Credit balance"
hrefstring
position"bottom-right" | "bottom-left" | "top-right" | "top-left""bottom-right"
hiddenbooleanfalse

a11y: Renders <a> when href set, else a role=status <div>; aria-label is '{label}: {balance}'. Pineapple is aria-hidden decoration.

Agent

4
SearchResult pattern search-result

Agent-mode structured result card: rank + score + thumbs feedback + bookmark + expandable details. Composes ProfileHeader + SocialIconRow + ContributionGraph.

#1
AL

Ada Lovelace

@ada

Systems engineer · compilers, distributed data

Top 96%

Maintains a widely-used Rust query engine; consistent multi-year contribution cadence across data infra.

3617 contributions this year
Jul
Aug
Sep
Oct
Nov
Dec
Jan
Feb
Mar
Apr
May
Jun
Jul
proptypedefault
resultSearchResultData
expandedbooleanfalse
feedback"up" | "down" | null
onfeedbackfunction
bookmarkedbooleanfalse
onbookmarkfunction

a11y: expand/collapse is a real <button aria-expanded>; thumbs are aria-pressed toggles; entrance honors reduced-motion.

de-gods: agentMode store, AgentCandidate type, live fetchAgentGitHubData/fetchProfessionalSummary, Iconify ~icons/mdi/* → lucide

visual QA: compare against rb-extract/developer/search-results/AgentResultRow.svelte

SearchResultList pattern search-result-list

Codifies the compose → plan → stream flow as one state machine: connecting → plan/skeleton → streaming rows → done/empty.

state: idle
proptypedefault
state"idle" | "connecting" | "planning" | "streaming" | "done" | "empty""idle"

a11y: Delegates to ConnectingState / ResultListSkeleton / EmptyState, each already aria-correct.

visual QA: compare against rb-extract/feedback-chrome/agent-flows/ (agent page flow)

PlanSummary pattern plan-summary

The agent's derived-plan display: grouped filter chips under labeled sections.

Search plan

Languages

RustGo

Domains

databasesdistributed systems

Location

United States
proptypedefault
groups{ label: string; chips: { label: string; tone?: Tone }[] }[]
titlestring"Search plan"

a11y: Plain labeled chip groups.

de-gods: ~1053 lines of filter-model plumbing — only the rendered plan chrome ports

visual QA: compare against rb-extract/feedback-chrome/agent-flows/PlanFilters.svelte

ThinkingIndicator pattern thinking-indicator

Rotating typewriter status line for the agent's "thinking" state. New in v2.

proptypedefault
messagesstring[]
activebooleantrue
speednumber45

a11y: aria-live=polite; prefers-reduced-motion swaps the typewriter for a plain crossfade.

visual QA: compare against rb-extract/feedback-chrome/loaders/typing-animation.ts

Loaders

7
Spinner primitive spinner

Indeterminate loading spinner.

Loading...
proptypedefault
classstring

a11y: Decorative; label the surrounding busy region.

ScanProgress pattern scan-progress

Asymptotic scan bar with rotating status copy and a CSS scan-line. Fills toward a ceiling so it never stalls; snaps to 100 when complete flips true.

Scanning GitHub…

proptypedefault
messagesstring[]
completebooleanfalse
oncomplete() => void
size"sm" | "md""md"

a11y: Visual progress; surface the current status message in text (it does). Scan-line respects prefers-reduced-motion.

ScanStatus pattern scan-status

Live scan line: spinning ring + "Searching… N developers scanned". Pairs with the shared .animate-fade-in-scale result-entrance keyframe.

Searching… 0 developers scanned…

proptypedefault
scannednumber
labelstring"Searching…"
completebooleanfalse

a11y: aria-live=polite on the count; spinner is motion-reduce:animate-none.

de-gods: the 2568-line page state machine (parent drives scanned/complete)

visual QA: compare against rb-extract/feedback-chrome/loaders/developers-legacy-page-SCAN-CHOREOGRAPHY.svelte

ConnectingState pattern connecting-state

"Connecting to search agent" card: a 4×4 GitHub-square grid chasing a green comet.

Connecting to search agent…

proptypedefault
labelstring

a11y: role=status aria-label=Loading; reduced-motion freezes the comet.

de-gods: AnimatedGitHubGrid garden backdrop (Slice 7 decorative dep) omitted

visual QA: compare against rb-extract/feedback-chrome/loaders/SearchConnectingState.svelte

ResultListSkeleton pattern result-list-skeleton

Streamed-search skeleton. phase=plan → centered progress column; phase=results → 5 result-card placeholders. Built on the Skeleton primitive.

proptypedefault
phase"plan" | "results""results"

a11y: aria-busy + aria-hidden wrapper (per the one loading convention).

de-gods: SearchLoadingState illustration dependency omitted

visual QA: compare against rb-extract/feedback-chrome/loaders/SearchLoaderSkeleton.svelte + SearchResultsSkeleton.svelte

SidebarSkeleton pattern sidebar-skeleton

Loading placeholder for a sidebar nav list: `count` rows of icon + jittered-width text bar.

proptypedefault
countnumber5
showIconbooleantrue

a11y: aria-busy + aria-hidden wrapper.

visual QA: compare against rb-extract/feedback-chrome/loaders/sidebar-menu-skeleton.svelte

DeveloperCardSkeleton pattern developer-card-skeleton

Skeleton matching the DeveloperCard, card or row variant. Built on the Skeleton primitive.

proptypedefault
variant"row" | "card""card"

a11y: aria-busy + aria-hidden wrapper.

visual QA: compare against rb-extract/developer/cards/SkeletonDeveloperCard.svelte

Feedback

6
Toaster primitive toaster

Toast host. Mount once in the root layout; fire toasts anywhere with the exported toast().

a11y: svelte-sonner handles live-region announcements.

EmptyState pattern empty-state

Centered zero-state with optional icon and action.

No developers match your filters

Try adjusting your experience or social filters to see more results.

proptypedefault
titlestring
descriptionstring

a11y: Static text region; put any control in the action slot.

visual QA: compare against rb-extract/feedback-chrome/empty-states/SearchEmptyState.svelte

Alert primitive alert

Static inline banner block (not a toast). Root/Title/Description; tone-tinted text on a card surface.

proptypedefault
tone"neutral" | "accent" | "success" | "warning" | "destructive" | "info""neutral"

a11y: role=alert on Root; put meaning in the text, not just the tone.

visual QA: compare against rb-extract/feedback-chrome/toasts-banners/ui-alert/

AppBanner pattern app-banner

Persistent full-width top-of-app banner. Tone-tinted, optional dismiss + actions.

You're on a free trial — 5 days left. Upgrade to keep contacting candidates.
proptypedefault
tone"neutral" | "accent" | "success" | "warning" | "destructive" | "info""accent"
dismissiblebooleanfalse
ondismissfunction

a11y: role=alert for destructive/warning tones, role=status otherwise; dismiss button has aria-label.

de-gods: billing subscription-status fetch, dismissal/session persistence, trial-visibility logic

visual QA: compare against rb-extract/feedback-chrome/toasts-banners/PaymentFailedBanner.svelte + TrialBanner.svelte

StepPill pattern step-pill

Tri-state step pill for multi-stage flows: agent playbook stages, onboarding checklists. Pending is quiet, active carries a live ping dot, done gets a primary check.

Role model Fan-out sweep Ecosystem pass Score and stratify Deliver
proptypedefault
labelstring
state"pending" | "active" | "done""pending"

a11y: Plain text pill; state is also exposed as data-state. The active ping honors reduced motion (motion-reduce:animate-none).

visual QA: compare against rb AgentComposer stepPill treatment, token-clean

Coachmark pattern coachmark

Anchored coach chip for guided workflows: small paper card with a 4px pulse-green accent bar on the edge facing the anchor, an optional step counter, one imperative title, a two-sentence body, and Next / Skip. No dimmed overlay, no spotlight. Pairs with createTour for multi-step flows.

proptypedefault
titlestring
bodystring
stepnumber
totalnumber
side"top" | "bottom" | "left" | "right""bottom"
openbooleanfalse
onNext() => void
onSkip() => void

a11y: bits-ui Popover content anchored to the wrapped element; focus is not trapped so the page stays usable; Escape calls onSkip. Entrance is fade+slide and honors reduced motion via the animation layer.

visual QA: compare against new; createTour (tour.svelte.ts) is the headless runes state: { current, index, total, active, start(), next(), skip(), done }

Backgrounds

4
GradientBackdrop pattern gradient-backdrop

Token-driven radial glow (header/hero/footer × green/purple/dual). Sits behind a relative parent.

Signature glow

header · dual — purple sides, green center

proptypedefault
variant"header" | "hero" | "footer""header"
tone"green" | "purple" | "dual""dual"

a11y: pointer-events-none + aria-hidden; purely decorative.

visual QA: compare against rb-extract/feedback-chrome/backgrounds/changelog-components/HeaderGlow.svelte

AnimatedContribGrid pattern animated-contrib-grid

Decorative randomized contribution grid (marketing motif). Seeded PRNG for SSR-stable render. Fills its container width; cells cap at 18px.

proptypedefault
size"sm" | "md" | "lg""md"
animatedbooleantrue
seednumber1

a11y: aria-hidden; decorative-only. prefers-reduced-motion holds a static state.

visual QA: compare against rb-extract/developer/heatmap/AnimatedGitHubGrid.svelte

GradientWash pattern gradient-wash

Full-bleed ambient gradient wash (mist / meadow / dawn / ink / dusk). Every wash is color-mixed from existing tokens — no raw color. Two radial layers drift slowly; static under reduced motion. Fills whatever positioned parent it sits in.

mist
meadow
dawn
pulse
paper
proptypedefault
variant"mist" | "meadow" | "dawn" | "pulse" | "paper""mist"

a11y: pointer-events-none + aria-hidden; purely decorative. Drift stops under prefers-reduced-motion.

ContribField pattern contrib-field

Full-bleed field of GitHub contribution squares that roll in as an ambient loader background — waves of cells lighting through the contrib ramp. Seeded PRNG keeps the layout deterministic (SSR == client). Fills its positioned parent (viewport or a modal body).

sparse · roll
normal · breathe
dense · static
proptypedefault
density"sparse" | "normal" | "dense""normal"
motion"roll" | "breathe" | "static""roll"
seednumber1

a11y: pointer-events-none + aria-hidden; decorative-only. prefers-reduced-motion holds a static, evenly-lit state.

Onboarding

4
StepModal pattern step-modal

The floating step-flow shell. Built on the Dialog primitive — inherits its focus trap, portal, faded backdrop, escape, and below-sm bottom-sheet treatment. Enters fade+scale; step content slides horizontally (left on next, right on back), a plain fade under reduced motion. While saving is true a compact contrib-field loader plays over the body.

The full step flow: pineapple dots, horizontal slides, skip on the middle steps, a save between each, and a burst on finish.

proptypedefault
openbooleanfalse
labelstring
stepKeystring | number
direction"forward" | "backward""forward"
savingbooleanfalse
onCancelfunction

a11y: Dialog focus trap + escape + backdrop dismiss. label renders as a visually-hidden Dialog title. Cancel (X) top-right. Slide degrades to a fade under prefers-reduced-motion.

PineappleDots pattern pineapple-dots

Step progress rail — one 3D pineapple (brand iconography) per step. Upcoming = grayscale + dimmed; current = full color, larger, gently bobbing; completed/skipped = full color. A completed dot is a button that jumps back to that step (never forward). Real buttons, aria-current on the active step, visually-hidden step labels.

Click a completed pineapple to jump back.

proptypedefault
steps{ label: string; status: StepStatus }[]
currentnumber
onJumpfunction

a11y: Ordered list of buttons; current carries aria-current=step; each button has a visually-hidden "Step N: label". Upcoming dots are disabled; bob stops under prefers-reduced-motion.

WizardFooter pattern wizard-footer

The step controls. Back (ghost, hidden on the first step), Skip (ghost, only when the step is skippable), and the primary Next/Finish. While a save runs everything disables and the primary shows a busy spinner. Targets clear 44px below sm.

First step (skippable)

Middle step, saving

Last step

proptypedefault
showBackbooleanfalse
showSkipbooleanfalse
isLastbooleanfalse
busybooleanfalse
nextLabelstring
onBackfunction
onSkipfunction
onNextfunction

a11y: Real buttons; disabled state while busy. Primary label switches to Finish on the last step.

PineappleConfetti pattern pineapple-confetti

The finish celebration. A radial burst of small 3D pineapples (brand iconography) mixed with green contrib-ramp squares on seeded trajectories, cleaned up after ~2.2s. Deterministic (seeded PRNG, never Math.random). Under prefers-reduced-motion it collapses to one static pineapple with a single pulse-bloom.

The finish burst — seeded pineapples and green squares.

proptypedefault
activebooleanfalse
seednumber7
countnumber26

a11y: pointer-events-none + aria-hidden fixed overlay; celebration only. prefers-reduced-motion replaces the burst with a single pulse-bloom.

Layout

6
Stack pattern stack

Vertical flow: spacing between siblings is gap on the parent, never a child margin.

First
Second
Third
proptypedefault
gap"xs" | "sm" | "md" | "lg" | "xl""md"
align"start" | "center" | "stretch""stretch"

a11y: Renders a <div>. Structural, no interactive semantics.

Split pattern split

Two-column split that collapses to one column below sm. Children arrive as the a and b snippets.

a — two-thirds
b — one-third
proptypedefault
ratio"1:1" | "2:1" | "1:2" | "3:1""1:1"
gap"xs" | "sm" | "md" | "lg" | "xl""md"
collapse"stack" | "reverse""stack"

a11y: Renders a <div>. Structural, no interactive semantics.

Grid pattern grid

Responsive equal-column grid: 1 column below sm, 2 at sm, the declared count at lg.

One
Two
Three
proptypedefault
cols2 | 3 | 43
gap"xs" | "sm" | "md" | "lg" | "xl""md"

a11y: Renders a <div>. Structural, no interactive semantics.

Section pattern section

A labelled content block: the canonical uppercase micro-label above a stack of children.

Evidence

Children stack under the canonical uppercase label.

proptypedefault
labelstring
gap"xs" | "sm" | "md" | "lg" | "xl""md"

a11y: Renders a <section> with an <h2> label read before its children. No interactive semantics.

Figure pattern figure

A graphic with a caption within 16px of it. The card frame gives it the one card surface treatment.

graphic
A graphic with its caption within 16px.
proptypedefault
captionstring
frame"card" | "plain""plain"

a11y: Renders a <figure> with a <figcaption>. Structural, no interactive semantics.

Masthead pattern masthead

Report/export hero header: display title, the one pulse underline bar, optional meta, and a deterministic garden fragment on hero surfaces.

Ada pitch sheet

Systems engineer · 96th percentile

proptypedefault
titlestring
metastring
garden"corner" | "none""none"

a11y: Renders a <header> with the page <h1>. The garden fragment is aria-hidden. No interactive semantics.

Live

3
LiveFeed pattern live-feed

Vertical live-event stream. New rows fade+slide in at the top and never re-animate; timestamps tick on one shared clock. Degrades live → replay → static; reduced motion behaves as static.

proptypedefault
eventsLiveEvent[]
mode"live" | "replay" | "static""static"
maxRows5 | 10 | 2010
density"compact" | "comfortable""comfortable"

a11y: role=feed; rows are role=article with an aria-label sentence. aria-live=polite only in live/replay. Reduced motion renders every mode as static (no slide, instant reveal). Kind icons are aria-hidden.

visual QA: compare against vamo-design original, alive doctrine

ActivityTicker pattern activity-ticker

One-line ambient strip that crossfades through events every --duration-ambient. A live PresenceDot sits left in live mode. Static and reduced motion hold the first event. Events may carry an optional delta, shown as a signed +N%/-N% tick.

Now
ada query-engine +12%
proptypedefault
eventsLiveEvent[]
labelstring
mode"live" | "replay" | "static""static"

a11y: aria-live=polite only off-static; single contained line (h-8) that truncates. Reduced motion shows one event with no rotation. Kind icon is aria-hidden.

visual QA: compare against vamo-design original, alive doctrine

PresenceDot pattern presence-dot

Live-signal presence indicator. live = ping ring over a solid primary dot; recent = solid primary; idle = muted dot.

live recent idle
proptypedefault
state"live" | "recent" | "idle""idle"
size"sm" | "md""md"
labelstring

a11y: role=img with an aria-label (defaults per state: Active now / Recently active / Idle). The ping obeys motion-reduce:animate-none.

visual QA: compare against vamo-design original, alive doctrine