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.