TDACorp's design system

TDACorp's Signal UI Library

TDACorp's Signal UI library - prebuilt, Signal-themed components for TDACorp's own products. Internal use only.

This is not a generic component library. It's TDACorp's own design system, built for TDACorp's own products.

Most component libraries make you install a package and wrap or override it when it doesn't quite fit. Signal works differently: the actual component code is handed to you when you install it, styled to Signal's defaults from the start. Four principles - Open Code (edit the component directly, no wrapping), Composition (every component shares a common, predictable interface), Distribution (a flat-file schema and a CLI install components across every TDACorp project), and Beautiful Defaults (styled to match Signal out of the box, easy to override where a product needs to).

Install

Get the CLI

Add components to any TDACorp Next.js project.

npx @tdacorp/signal@latest add button
init
Initialize configuration and dependencies for a new or existing project.
add
Add components and their dependencies to your project.
apply
Apply a preset to an existing project.
eject
Inline the shared tailwind.css and remove the Signal dependency.

Theming

Theming

Every component reads semantic CSS tokens - override them in your CSS to change the look without rewriting component classes.

background / foreground
The default app background and text color.
card / card-foreground
Elevated surfaces and the content inside them.
popover / popover-foreground
Floating surfaces - Popover, DropdownMenu, ContextMenu.
primary / primary-foreground
High-emphasis actions and brand surfaces.
secondary / secondary-foreground
Lower-emphasis filled actions and supporting surfaces.
muted / muted-foreground
Subtle surfaces and lower-emphasis content.
accent / accent-foreground
Interactive hover, focus, and active surfaces.
destructive
Destructive actions and error emphasis.
border / input / ring
Borders, form control surfaces, and focus rings.
chart-1 ... chart-5
The default chart palette.
sidebar / sidebar-*
The sidebar surface, its accents, borders, and focus rings.
radius
The base corner radius - radius-sm through radius-4xl scale from it.

72 components

Components

Every component Signal ships, live and Signal-themed. Hover a tile to copy its install command.

Forms & Inputs

input

A text input component for forms and user data entry with built-in styling and accessibility features.

input-group

Add addons, buttons, and helper content to inputs.

input-otp

Accessible one-time password component with copy-paste functionality.

textarea

Displays a form textarea or a component that looks like a textarea.

native-select

A styled native HTML select element with consistent design system integration.

select

Displays a list of options for the user to pick from - triggered by a button.

combobox

Autocomplete input with a list of suggestions.

checkbox

A control that allows the user to toggle between checked and not checked.

radio-group

A set of checkable buttons - known as radio buttons - where no more than one of the buttons can be checked at a time.

switch

A control that allows the user to toggle between checked and not checked.

slider

An input where the user selects a value from within a given range.

calendar

A calendar component that allows users to select a date or a range of dates.

date-picker

A date picker component with range and presets.

label

Renders an accessible label associated with controls.

field

Combine labels, controls, and help text to compose accessible form fields and grouped inputs.

form

Building forms with react-hook-form and zod.

button

Displays a button or a component that looks like a button.

button-group

A container that groups related buttons together with consistent styling.

toggle

A two-state button that can be either on or off.

toggle-group

A set of two-state buttons that can be toggled on or off.

Overlays

dialog

A window overlaid on either the primary window or another dialog window, rendering the content underneath inert.

alert-dialog

A modal dialog that interrupts the user with important content and expects a response.

sheet

Extends the Dialog component to display content that complements the main content of the screen.

drawer

A drawer component for React.

popover

Displays rich content in a portal, triggered by a button.

hover-card

For sighted users to preview content available behind a link.

tooltip

A popup that displays information related to an element when the element receives keyboard focus or the mouse hovers over it.

context-menu

Displays a menu of actions triggered by a right click.

command

Command menu for search and quick actions.

Data Display

table

A responsive table component.

data-table

Powerful table and datagrids built using TanStack Table.

card

Displays a card with header, content, and footer.

avatar

An image element with a fallback for representing the user.

badge

Displays a badge or a component that looks like a badge.

kbd

Used to display textual user input from keyboard.

item

A versatile component for displaying content with media, title, description, and actions.

empty

Use the Empty component to display an empty state.

chart

Beautiful charts. Built using Recharts. Copy and paste into your apps.

typography

Styles for headings, paragraphs, lists, etc.

pricing-table

A plan comparison table for pricing pages.

case-study-card

A rich card for portfolio and case-study entries, with tags and a requirements list.

Feedback

alert

Displays a callout for user attention.

progress

Displays an indicator showing the completion progress of a task, typically displayed as a progress bar.

skeleton

Use to show a placeholder while content is loading.

spinner

An indicator that can be used to show a loading state.

sonner

An opinionated toast component for React.

What often gets missed here

The failure case people plan for is the server going down. The one that actually happens is the server staying up while the queue quietly stops draining.

callout

An editorial aside box with a left-rule accent, for notes and caveats inside prose.

Layout

separator

Visually or semantically separates content.

aspect-ratio

Displays content within a desired ratio.

scroll-area

Augments native scroll functionality for custom, cross-browser styling.

resizable

Accessible resizable panel groups and layouts with keyboard support.

collapsible

An interactive component which expands/collapses a panel.

accordion

A vertically stacked set of interactive headings that each reveal a section of content.

No visual preview - this is a provider component.

direction

A provider component that sets the text direction for your application.

cta-band

A full-bleed, inverted call-to-action band closing a page.

steps

A numbered horizontal sequence for a process or workflow.

faq-section

A two-column FAQ section with a category-nav grid and accordion lists.

Conversation

message

Displays a message in a conversation, with optional avatar, header, footer, and alignment.

message-scroller

A chat scroll container that anchors turns, opens saved transcripts, follows streamed responses, loads history without jumping, and jumps to any message.

bubble

Displays conversational content in a message bubble. Supports variants, alignment, grouping, reactions, and collapsible content.

marker

Displays an inline status, system note, bordered row, or labeled separator in a conversation.

attachment

Displays a file or image attachment with media, metadata, upload state, and actions.

questionnaire

A multi-step questionnaire with single-choice, multiple-choice, freeform, and skippable questions.