Skip to content

Roadmap

Terse UI is building toward a complete pipeline: from atomic behaviors to fully styled, auditable components you own. Here's where we're headed.

Now: Atoms + Protos

The foundation. Atomic host directives that compose into headless UI components via Angular 22's de-duplicated host directives.

LayerStatusDescription
@terse-ui/coreStableUtilities, ID generation, options builder, host helpers
@terse-ui/atomsActiveAtomic host directives (Id, Hover, Anchor, Disabled, OpenClose, Orientation, EscapeKey, ClickOutside, Intersect, Classes)
@terse-ui/protosActiveHeadless components composed from atoms (Button, more coming)

Atoms in progress

  • AtomFocusVisible — keyboard vs mouse focus origin detection
  • AtomPress — pointer/keyboard active state tracking
  • AtomRovingFocus — arrow key navigation for menus, tabs, radio groups
  • AtomFocusTrap — Tab/Shift+Tab containment for modals
  • AtomScrollLock — body scroll prevention for overlays
  • AtomAnimationState — CSS enter/exit transition coordination

Protos in progress

  • ProtoDialog — modal dialog with focus trap, escape dismiss, click-outside
  • ProtoTooltip — anchor-positioned tooltip with hover/focus triggers and delay
  • ProtoMenu — dropdown menu with roving focus and typeahead
  • ProtoAccordion — collapsible panels with keyboard navigation
  • ProtoTabs — tabbed interface with roving tabindex
  • ProtoSelect — custom select with listbox pattern

Next: Theme Packs

Protos expose data-* attributes for every state: data-hover, data-open, data-disabled, data-pressed, data-focus-visible. A "theme" is just a CSS file that targets these attributes. No JavaScript. No Angular code. Just CSS.

css
/* Example: minimal theme for ProtoButton */
[protoButton] {
  padding: 0.5rem 1rem;
  border-radius: 0.375rem;
  background: var(--terse-primary);
  color: var(--terse-on-primary);
  transition: background 150ms ease;
}

[protoButton][data-hover] {
  background: var(--terse-primary-hover);
}

[protoButton][data-pressed] {
  background: var(--terse-primary-active);
}

[protoButton][data-disabled] {
  opacity: 0.5;
  cursor: not-allowed;
}

Theme packs ship as plain CSS targeting the proto data-* contract:

ThemeDescription
@terse-ui/theme-minimalClean, neutral defaults
@terse-ui/theme-tailwindTailwind-native utility classes via AtomClass
@terse-ui/theme-high-contrastWCAG AAA contrast ratios

No component generation. No runtime cost. Swap themes by changing a CSS import.

Then: Forge

The third layer. Not a package — a pipeline.

@terse-ui/forge is a CLI that assembles atoms, protos, theme CSS, tests, and playground pages into components you own. Inspired by shadcn/ui's distribution model: source files copied into your project, not hidden in node_modules.

bash
npx terse forge button --theme=minimal
npx terse forge dialog --theme=tailwind --a11y=strict
npx terse forge menu --theme=high-contrast

What Forge generates

For npx terse forge button --theme=minimal:

src/components/button/
  button.component.ts     # ProtoButton + theme CSS composed
  button.component.css    # Themed styles targeting data-* attributes
  button.component.spec.ts # Tests
  button.stories.ts       # Playground page (Analog)

You own every file. Diff it, modify it, audit it. No black box.

Why this matters for enterprise

Angular in enterprise means auditable, customizable, compliant. The shadcn model — where you own the source and can trace every behavior — is exactly what teams need when leadership asks "can we audit the accessibility of our component library?"

Forge doesn't just copy files. Different flags produce different outputs:

FlagEffect
--theme=<name>Which theme CSS to include
--a11y=strictInclude WCAG compliance annotations in source
--testsGenerate test file with accessibility assertions
--playgroundGenerate Analog playground page with state knobs

Compliance matrix

Each proto maps to its WAI-ARIA pattern, which WCAG criteria it satisfies, and what the consumer is still responsible for. This turns the library from "components" into "auditable accessibility infrastructure."

ProtoWAI-ARIA PatternWCAG SatisfiedConsumer Responsibility
ProtoButtonButton2.1.1, 4.1.2Color contrast, focus-visible styling
ProtoDialogDialog (Modal)2.1.1, 2.1.2, 2.4.3Trigger labeling, dialog content
ProtoMenuMenu2.1.1, 4.1.2Menu item labels, icons
ProtoTabsTabs2.1.1, 4.1.2Tab panel content, focus styling

Component catalog

The library ships a component catalog that runs as an Analog app. Each proto gets a live playground page with:

  • Knobs for every data-* state
  • Inline accessibility audits (aXe integration)
  • A "copy theme CSS" button for each variant
  • Live preview of the component in every theme

Angular-native. Zero config. Built for the headless-to-styled workflow.


Timeline

PhaseTargetStatus
AtomsCore behavioral primitivesIn progress
ProtosHeadless UI componentsIn progress
Theme PacksCSS-only styling contractsPlanned
Forge CLIComponent generation pipelinePlanned
CatalogAnalog-powered component playgroundPlanned
ComplianceWCAG/ARIA mapping per protoPlanned

Released under the MIT License.