Ora Components
RxJS native · TypeScript · Material 3

Components for
Financial Applications

Pass an RxJS stream to any prop. No framework, no Shadow DOM, no wrappers — your observable in, reactive DOM out.

Cent-perfect multi-currency money fields
60 fps on 10k-row ledgers
Zero runtime dependencies
Operating Cashflow — Trailing 12 mo · €k
JanAprAugNov02114236348451057
Inflow
Outflow
Net
Cash on Hand+0.4% today
2,481,902.14
live · reconciled to the cent
AR Aging ↑ 1.2 pp
92.4 % < 30d
0–30
31–60
61–90
90+
Journal Entries — Live posting · auto-balanced
Date
Account
Memo
Debit
Credit
2026-06-03
1100 · Cash
Customer payment · INV-10000
€ 6,888.37
2026-06-03
1200 · Accounts Receivable
Invoice issued · INV-10001
$ 8,009.90
2026-06-03
4000 · Revenue
Service revenue · SO-10002
€ 2,078.27
2026-06-03
2100 · Accounts Payable
Vendor bill · BIL-10003
£ 3,657.64
2026-06-03
6500 · Operating Expense
SaaS subscription · 10004
$ 9,379.35
Totals
Dr€ 18,345.99
Cr€ 11,667.54
⚠ out of balance
Sound familiar?

Building reactive UIs in vanilla TypeScript used to mean accepting trade-offs.

Every component library forces a choice: bring a framework, fight Shadow DOM, or write adapters between your observables and the UI.

Every project

Reinventing state adapters

Your observable holds the data. The component wants a string. So you write glue. Again.

Every override

Fighting Shadow DOM boundaries

Your design tokens stop at the component edge. You reach for ::part() and pray it works in Safari.

150KB+

Shipping a framework to use 3 components

You needed a button, a dropdown, and a table. You got React, a virtual DOM, and a reconciler.

Ora Components was built to eliminate all three.

What makes it different

Not a framework wrapper.
Not a Web Component.

Builder-pattern APIs, RxJS-native props, full Tailwind styling — and the DOM is yours. No encapsulation, no workarounds.

No Shadow DOM

Your CSS works. Every time.

Direct DOM elements. No ::part(), no shadow-root, no encapsulation barriers. Your design tokens, your Tailwind classes, your overrides — they just reach in and work.

RxJS Reactive

Every component speaks RxJS natively. Declarative state streams, real-time updates, zero unnecessary re-renders.

Tailwind CSS

Utility-first styling that scales with your project. Full Tailwind v3 support with custom Material 3 tokens baked in.

Material 3

Adheres to Google's latest design language. Dynamic color, expressive motion, and accessible typography built in.

Type Safe

Fully typed with strict TypeScript. Builder pattern APIs that are impossible to misuse. IDE autocomplete everywhere.

Zero Bundle Bloat

Tree-shakeable exports. Import only what you use. Each component is self-contained with minimal runtime overhead.

Interactive

See it in action

Four mini scenarios. Every input is a stream, every output is derived — no setup required.

Trade Ticket Buy or sell — quantity, limit, and live order value.
Live Preview
$
Estimated total $1,854.00
FX Converter Multi-currency input, derived conversion, one stream.
Live Preview
You send
They receive
1 USD = 0.9245 EUR · indicative mid-market
USD/EUR Last 6 months
Dec 10Jan 7Feb 11Mar 11Apr 15May 13-4.8%-2.9%-1.0%+1.0%+2.9%+4.8%
Payment Calculator Pure derived state — change any input, watch the total.
Live Preview
$
%
yrs
Monthly payment $1,580.17 Total interest: $318,861.22
Transaction Filter Pick a date range — the grid filters live.
Live Preview
From
To
Date
Counterparty
Amount
Status
Jun 2, 2026
Stripe payout
$4,250.00
Settled
Jun 1, 2026
AWS
-$312.40
Pending
May 31, 2026
Notion subscription
-$16.00
Settled
May 28, 2026
Wire — Acme Corp
$12,800.00
Settled
May 25, 2026
Payroll
-$8,420.55
Settled
May 20, 2026
Refund — Linear
$48.00
Settled
May 16, 2026
Office lease
-$3,200.00
Settled
May 9, 2026
Wire — Globex
$5,600.00
Pending
Quick Start

Try it in 60 seconds

One install. Pass your first observable to a component. That's it.

0 deps
Runtime deps (RxJS is a peer)
~60 kb
Gzipped — lighter than a single icon font
100 %
TypeScript — strict, no any
$ npm install @tdq/ora-components rxjs

# or with yarn
$ yarn add @tdq/ora-components rxjs

# or with pnpm
$ pnpm add @tdq/ora-components rxjs

npm install @tdq/ora-components rxjs
— and you're done.

No config. No boilerplate. Pass your first observable to a component and watch it react.