Skip to main content

Filigran Design System

Shared component foundation for OpenCTI, OpenAEV, XTM CRQ, XTM One, and XTM Hub. Every component ships with a machine-readable contract, executable accessibility gates, and generated documentation.

About this library

What this is

  • Shared component library for OpenCTI, OpenAEV, XTM CRQ, XTM One, and XTM Hub — one implementation instead of five.
  • AI-first: every component ships a machine-readable contract (.meta.ts) — description, props, variants, accessibility notes — read by both agents and this docs site.
  • Accessibility-first: WCAG 2.1 AA is a blocking CI gate, not a best-effort goal. No verified pass, no export, no stable status.

How it's built

  • Radix UI primitives + Tailwind v4, styled entirely through design tokens — no hardcoded colors, spacing, or typography.
  • Tokens come exclusively from the Figma export pipeline. Never hand-edited in theme.css; every change must pass the token-diff gate.
  • CI gates are executable, not declared: contrast, WCAG/508, and generated-artifact drift are all checked by scripts, not taken on trust.

Why

  • Replace MUI progressively across the products — this library becomes the single source of truth for UI.
  • Target: 80–90% perceived visual coherence between products — tracked on /status, not assumed.
  • One component to build and audit, instead of a separate one per product.

How this works for you

  • Phase 1 requires no change to your components — your theme.palette.* calls keep working, only the values behind them change.
  • Currently underway: wiring each product's MUI theme palette to the tokens — OpenCTI #17115 (opens in new tab), OpenAEV #6684 (opens in new tab).
  • Phase 2, next: progressive, component-by-component replacement in each product.
  • Real-time status: /status. Full machine-readable context for agents: llms-full.txt.

Components

Every published component, straight from the generated registry.

Alertbeta

Inline feedback banner: an elevation surface with a severity-coloured left rule, a severity glyph, the message and an optional trailing action slot.

WCAG passv0.1.0
Avatarbeta

A person, or an entity identified by its name: a round disc holding two initials or a photo, optionally followed by the person's name and a one-line description.

WCAG passv0.1.0
Badgebeta

Notification marker attached to another element: a small count, or a dot when the count itself does not matter.

WCAG passv0.1.0
Bannerbeta

Application-level message strip: full width, a gradient fill per variant, one message with an optional leading icon, an optional action and an optional close control.

WCAG passv0.1.0
Breadcrumbsbeta

Hierarchical path to the current page: its ancestors, separated by a slash, the last entry marked as the page you are on.

WCAG passv0.1.0
Buttonbeta

Primary interaction control for actions such as submit, confirm, cancel, and destructive operations.

WCAG passv0.2.0
ButtonGroupbeta

Segmented control: a run of icon-only buttons sharing one selected value, for switching between mutually exclusive views of the same data (cards / lines / graph).

WCAG failv0.1.0
Cardbeta

A composed surface built on Paper: header, title, subtitle, content, footer and a metadata strip, every part optional and combinable.

WCAG passv0.1.0
Checkboxbeta

Binary and tri-state selection control built on @radix-ui/react-checkbox.

WCAG passv0.1.0
Chipbeta

Compact status/tag/filter token.

WCAG failv0.3.0
ColorPickerbeta

A single colour field with a popover panel: an editable hex trigger with an inline swatch, and a panel offering a saturation/brightness area, hue slider, optional alpha slider, an eyedropper, a format selector (HEX/RGB/HSL/HSB), value inputs, and an optional preset-swatch grid.

WCAG passv0.1.0
Comboboxbeta

Filterable selection field: the user narrows a list by typing directly in the field, with `multiple` as a prop rather than a second component.

WCAG passv0.4.0
CustomizePanelbeta

Panel that lets a user choose which items of a collection they see, in what order, and which stay in the main area — table columns (pin mode: Pinned / Scrollable) or toolbar actions and tab bar tabs (show mode: Shown / More).

WCAG passv0.1.0
DatePickerbeta

Date field for forms and filters: an editable text field wearing the Input shell (same label, required marker, helper and error rows, same hover/focus/disabled/error states), a calendar button in its end slot, and a popover calendar that follows the WAI-ARIA date picker dialog pattern (grid, roving focus, arrows by day and week, PageUp/PageDown by month, Home/End, Escape).

WCAG passv0.1.0
Dialogbeta

Modal overlay that interrupts the current context to request confirmation, collect input, or surface focused content.

WCAG passv0.1.0
Drawerbeta

Modal side panel anchored to the right edge, used to create, edit or inspect one object while the page stays in view behind it.

WCAG passv0.1.0
FileSelectbeta

Inline file-collection form field.

WCAG passv0.1.0
Headerbeta

The application top bar: a structural container that owns the banner landmark, the 68px height, the shared background gradient at Figma's 94% opacity over a 4px backdrop blur, the bottom hairline and the start/middle/end distribution — and nothing else.

WCAG passv0.1.0
Herobeta

A page-level introduction surface built on Paper: an elevation-1 panel with two blurred brand accents, a header row and a body separated by a rule.

WCAG passv0.1.0
HeroStatbeta

A figure: 24px icon, value and label in a bordered pill, in a host row.

WCAG passv0.1.0
Iconstable

Single entry point for icon rendering in the design system.

WCAG passv0.1.0
IconButtonstable

Square button that renders a single icon with no text label.

WCAG passv0.1.0
Inputbeta

Base single-line text field for forms.

WCAG passv0.1.0
MarkdownFieldbeta

Markdown text field for forms whose value is markdown displayed RENDERED elsewhere (descriptions, reports, notes, comments) — plain multi-line text that is never rendered is a Textarea, one line is an Input, and code, JSON or queries are never edited here (RULE-01).

WCAG failv0.1.0
Menubeta

Dropdown menu of actions triggered by a button.

WCAG passv0.1.0
Navbarstable

The primary structural navigation container of every Filigran product: a vertical, collapsible sidebar hosting a header slot (typically ProductSwitcher), a scrollable list of NavbarItem/NavbarSubmenu rows (separated into groups by NavbarSeparator, optionally labelled by NavbarTitle), an optional footer slot, and a built-in collapse toggle.

WCAG passv0.2.0
Paperbeta

Neutral, non-interactive surface/container with 4 elevation depths (0-3) mapped onto theme.

WCAG passv0.1.0
ProgressBarbeta

Determinate linear progress: how far along a known quantity of work is.

WCAG passv0.1.0
Radiobeta

Single-choice control built on @radix-ui/react-radio-group.

WCAG passv0.1.0
RichTextFieldbeta

HTML rich text field for content displayed as HTML, exported to PDF or sent as email (reports, templates, email bodies, remediation texts); markdown content is a MarkdownField and plain text — AI prompts included — is a Textarea (RULE-02).

WCAG passv0.1.0
SearchFieldstable

Specialized text input for search and filtering.

WCAG passv0.2.0
Selectbeta

Single-value dropdown selector for choosing one option from a predefined list.

WCAG passv0.1.0
Skeletonbeta

Decorative placeholder for content that is loading: a block or circle in the elevation highlight colour, crossed by a wave once per second.

WCAG passv0.1.0
Sliderbeta

Numeric value selection along a track, built on @radix-ui/react-slider.

WCAG passv0.1.0
Snackbarbeta

Transient feedback message: a severity-tinted surface with a matching left rule, a severity glyph, the message, an action slot and a close control.

WCAG passv0.1.0
Spinnerbeta

Indeterminate busy indicator: says something is happening when how much is left is unknown.

WCAG passv0.1.0
Switchbeta

Boolean on/off toggle built on @radix-ui/react-switch.

WCAG failv0.1.0
Tabsstable

Compound tab navigation component.

WCAG passv0.1.0
Textstable

The design system's typography primitive.

WCAG passv0.1.0
Textareabeta

Multi-line text field for forms.

WCAG passv0.1.0
Thumbnailbeta

A 48px framed slot for a glyph or a small image.

WCAG passv0.1.0
TimePickerbeta

Time-of-day field for forms: an editable text field wearing the Input shell (same label, required marker, helper and error rows, same hover/focus/disabled/error states), a clock button in its end slot, and a popover holding the clock row DatePicker's withTime already ships — hours, minutes, seconds when the pattern carries `ss`, AM/PM when it carries `a` — plus an OK button.

WCAG passv0.1.0
Tooltipstable

Contextual popup that displays informational text when a trigger element is hovered or focused.

WCAG passv0.1.0