Changelog
Release history with links to the changes.
2.0.0 (2026-10-09)
⚠ BREAKING CHANGES
- registry: Ticket requires a whole quantity and choices from their lists (
checkDraftgainschoicesandtype,tif, andaccountproblems), drops non-whole quick sizes, and says its status from a region instead of an<output>;TicketLabels,RfqTicketLabels,LimitsLabels,DataGridLabels,AuditTrailLabels(outside),ColumnChooserLabels(ruleWords), andRulesEditorLabels(itemName,ruleWords) gain required words, andLimitsLabels.ticksandbps,AuditTrailLabels.fields, andColumnChooserLabels.hiddenCounttake a function of the count; a filter rule with a problem is skipped and hides nothing; RfqTicket holds only the requested sides and follows a resized inquiry's size; QuoteField's step buttons say "step"; QuotePanel names rows by instrument by default; a row'sgetRowPropsclass lands on its frozen cells. - registry:
RulesEditorLabels.matchesand.showntake a function of the counts as well as a template, andDEFAULT_RULES_EDITOR_LABELSholds functions there, so code that reads them as strings calls them instead. - registry: Watchlist, Positions, and RfqStack name each row by
getRowLabel(the symbol; the instrument; the client, side, size, and instrument) instead of by its cells, and read the focused row's cells once through a polite live region inside the grid. Find a row by that name, pass your owngetRowLabel, or passnullto name rows by their cells and read nothing, as v1 did; an RfqStack row named that way now changes its name as its countdown's digits do. - registry: GridRules treat a rule they can't read as matching no rows, so a filter rule with an unknown op excludes every row, where v1 ignored it alone and threw beside another filter rule. RulesEditor moves a rule with Alt+Up/Down only from the item and its buttons, with no other modifier held; v1 also moved it from inside a select or a text field. RulesEditor's
onRulesChangehands backReadGridRules, where v1 typed itGridRules, so hold the editor's rules in that type.RuleDecoration["data-tone"]widens fromRuleToneto optionalstring.useRulesEditorItem()returns the read types, so a custom control checks a rule's fields before reading them, anduseRulesEditor().problemtakes the rule's kind. - registry: Countdown names its timer with the label and the time left, prints
–for an endless wait, and holds the bar still for a deadline that isn't finite. RfqStack treatsfilterandgetRowPropsas dependencies, sorts values that aren't finite last, prints an unknown side as sent, refuses threshold text that isn't a plain decimal, and describes the active row;useActiveInquiry'ssetActiveignores an ended or missing id. PriceChart holds a focused plot's name and value text through a live feed and keeps an emptied focused plot's tab stop. DepthLadder shows its empty state for a tick that isn't a finite positive number. - registry: Ticket and RfqTicket show a limit block under its field without an alert or a description, hold the actions it stops with
aria-disabledinstead of disabling them, and say the block from their announcer when a press meets it, never as the market or typing changes it; a refused press no longer stores a block's words in its field. A reason added to a standing question makes the next press ask again, and a question whose action leavesallowedActionsis withdrawn. QuoteField ties its error to the input witharia-describedby, andannounceError={false}shows it without an alert or a description. QuotePanel refuses a size whose text carries a fraction, even whereNumberwould round it to a whole number. - registry: A press on the buttons of Ticket, RfqTicket, and QuotePanel counts once: the second click of a double-click and the clicks a held Enter repeats run nothing, so neither answers a
Send anyway?,Quote anyway?, orPull all anyway?question. A ticket'squantityStepthat is not a whole number from 1 toNumber.MAX_SAFE_INTEGERsteps by one, and QuotePanel refuses sizes aboveNumber.MAX_SAFE_INTEGER. - registry: Neither ticket's send key runs a
destructiveaction, even at the defaultcheckedor when it sends a quote; give one its own binding if it needs a key. A ticket'sdefaultDraftprice, and the RFQ ticket'sdefaultDraftlevels and Auto, snap to the quote grid, sorunreceives the level the field shows. QuotePanel's limit confirm needs a fresh Enter on the same value in the same opening of the editor: leaving the editor, Tab, a held Enter, or changing the text no longer sends the asked value; the defaultaskAgaintext reads{message} Press Enter again to send it, or Escape to discard it.; and withlimitson the generated columns, a question line sits above the grid. Avalidatecall without the grid's commit argument never answers a question, where v1's second identical call sent the value. QuotePanel's number fields refuse1e3and0x10, and a negative width is refused. - registry: createActionRegistry no longer replaces an action when the same id is registered again; registrations stack and each unregister removes only what its call added. A consumer that re-registered an action under one id to swap its handler should unregister the old registration first, or register from one owner. The palette shows one row per id and scope and runs the instance whose panel contained the captured focus; give multi-instance panels a within callback so the right one answers. A scoped row's data-row value is now a marked JSON tuple (action!["panel:book","book.cancel"]), and every symbol row spells its key the same way (symbol!["ZN","CBOT"], recent-symbol! alike), so v1 selectors on scoped action rows and on all symbol rows need the new spelling. Action recents persist the scope they ran in and deduplicate by id and scope; v1 id-only entries keep matching, and running a scoped action retires its stale scope-less twin. The editor's capture contract changed: Tab, Shift+Tab, and Option+Tab cancel capture and move on instead of recording, bare Enter and Space are refused until Shift, Ctrl, Meta, or Alt makes them recordable, and the default cancelHint reads Escape cancels, Tab moves on, Backspace unbinds — a v1 end-to-end test that pressed one of these during capture now binds nothing, and bindings on those keys are entered as text.
- registry: QuotePanel's two-way crossing reads the instrument's quote direction. On undeclared yield and discount conventions the refusals flip from v1 — a bid below the ask is the crossed one, since those bases quote inverted by default — so a desk that quotes bid at or below ask on yield or discount declares quoteInverted: false on the convention to keep v1's reading; undeclared price and spread keep it without declaring anything.
- data-grid: DataGrid controls, nested grids and external portals now own their pointer actions; they no longer implicitly select, focus, edit or activate the enclosing row. Pass an explicit row id to custom actions and update controlled selection or focus when needed. Row actions honor child cancellation, and row menus only open from current plain row content. Use ancestor capture handlers to observe rejected React menu and long-press starts, target handlers to suppress native menus, and the documented wrapper for controls styled with pointer-events: none. Closed ShadowRoot hosts must declare control or independent interaction ownership with data-grid-interaction.
- rfq-ticket: checkQuote rejects crossed levels through the instrument's quote direction — yield and discount invert by default, so a rates desk whose yield quotes bid below offer declares quoteInverted: false on the convention, while price and spread keep the v1 reading unless the convention declares quoteInverted: true, as cash credit does; InstrumentConvention gains that field with quoteInvertedOf reading the effective direction. The default crossed message reads The quote is crossed., so update tests matching the old directional text and translated crossed labels that name a direction. checkQuote treats a non-finite level as absent. rfq.tick-up and rfq.tick-down step the side the key event came from rather than comparing focus against the global document. When the control under focus unmounts or disables, focus parks on the ticket root without scrolling - a parent that watched for body to run its own recovery no longer sees it.
- ticket: ticket.send runs the first allowed action that checks the draft, preferring the marked primary — v1 ran the marked primary, else the first allowed action, even one with checked: false, so give an unchecked action its own binding when it needs a key. describeDraft prints the level with formatQuote in the instrument's quote basis instead of formatPrice. The mod+up and mod+down shortcuts step by the quote step instead of convention.tick, their binding descriptions read "Price up one step" and "Price down one step", and reference values are read as quotes: the buttons print with formatQuote and store the snapped value they show, so update tests that match the old reference labels or binding descriptions. When the control under focus unmounts or disables, focus parks on the ticket without scrolling.
- column-chooser: ColumnChooser's collection is one Tab stop with roving focus. ColumnChooserVisibility, ColumnChooserMove, and ColumnChooserResetWidth default to tabIndex={-1}; pass tabIndex={0} to restore a part's own Tab stop. Arrows, Home, and End move focus between presented columns, Space toggles the focused column's visibility, Delete or Backspace resets its width override, and Alt+Home or Alt+End moves it to the edge of its side. useColumnChooserItem adds moveToEdge, useColumnChooserCommand is new and public, and the default dragHint text names the new keys. Space and Delete on an item act only when it renders the matching visibility or reset-width control, run through that control's own click so its vetoes hold, and are cancelled on every handled press so held repeats cannot scroll the page. An item made editable or given an arrow-owning role keeps every native key and owns a Tab stop of its own while navigation skips it. Items advertise their keys through aria-keyshortcuts, each hidden item speaks labels.hidden as its state as well as the count suffix, and the root watches its own subtree so the stop follows hidden, inert, aria-hidden, class, style, and details toggles even when nothing re-renders.
- format:
parsePricesnaps plain decimals typed into a fraction convention onto the printable grid, so every reader of a parsed price moves —onValueChange, ticket drafts and limit checks, RFQ quotes, QuotePanel edits, and saved grid-rule thresholds, which change matches on upgrade when their decimals sit off the grid;describeRuleprints readable string values through a column's rowlessformatwherever it pairs withparse; and values too large to print back in a convention's notation parse as null. - rfq-ticket: RfqTicket shortcuts run from the whole ticket and a disabled ticket runs none; step, suggestion, and quick-size keys act only while an allowed action needs a quote;
rfq.sendruns only a quote-sending action — an explicitprimary: trueon aneedsQuote: falseaction no longer rides the key, and the key caps follow the key;rfq.size-Ndeclares only for the quick sizes passed, soremapof an undeclared size throws;unregisterof an RFQ id does nothing while a ticket holds the default — register the id orremap(id, ""); both level fields say the newlabels.invalidLeveltext; andrfq-ticket.tsxrequires alib/hotkeys.tswithdeclareDefault. - ticket: Ticket shortcuts run from the whole ticket, so keys pressed on the root are consumed where v1 scoped them to the inner box; a disabled ticket runs no shortcuts;
ticket.size-Nis declared only for the quick sizes passed, soremapof an undeclared size throws where v1 succeeded; andunregisterof a ticket id does nothing while a hotkeys-enabled ticket is mounted — register the id orremap(id, "")instead.ticket.tsxrequires alib/hotkeys.tswithdeclareDefault. - row-store: Custom RowStore implementations must provide a pure prepareView factory returning a PreparedRowView with reversible connect/release ownership. Hook-owned views now disconnect on cleanup instead of becoming terminally disposed, so isDisposed is no longer an unmount signal. Use useView with stable options instead of calling createView during render, and let the hook own its connection. Imperative createView and caller-owned RowView interfaces remain available.
- blotter: Blotter Delete and Backspace actions now require focus on the grid itself. Editors, custom controls, header controls, selection checkboxes, nested grids and portaled content retain their keys. Remove editing-only event-prevention workarounds; use action buttons, menu items or useBlotterActions().run for commands elsewhere. Shift+Tab back to the grid preserves selection; a plain cell click can replace it.
- watchlist: Watchlist Delete and Backspace removal shortcuts now require focus on the grid itself. Keys from cell editors, custom controls, header controls, selection checkboxes, nested grids and portaled content no longer request row removal. Remove event-prevention workarounds used solely to protect text editing, return focus to the grid for its shortcuts, and use the public removal controls or commands elsewhere in a layout.
- data-grid: DataGrid shortcuts now run only when the grid itself has focus, instead of also running from nested controls. Return to the grid with Shift+Tab or click a cell without a control before using its shortcuts. Handle application overrides in onKeyDownCapture and call preventDefault(); a parent's bubbling onKeyDown runs after the grid. See the DataGrid section of the v1-to-v2 migration guide.
- session-guard: Replace SessionGuard and SessionGuardProps with SessionGuardProvider and SessionGuardProviderProps, then compose warning, dialog and actions or copy the complete SessionNotice recipe. Provider children now own all markup. Supply a persistent fallbackFocusRef to SessionGuardDialog and caller-owned title/description content. Wrapper classes and phase markers belong to the shared recipe; the primary slot belongs to SessionGuardWarning, and countdown/action selectors move to their new public parts. See the SessionGuard section of the v1-to-v2 migration guide.
- column-chooser: ColumnChooser is now an inline root with required children. Replace ColumnChooserPanel with a composed ColumnChooser, or copy ColumnSettingsPanel from complete Usage. Move open/onOpenChange and dialog content classes to the caller's Dialog; use DialogTrigger for button opening or an explicit installed close-focus target for menu/hotkey opening. Compose items, readings and actions explicitly. Root moves follow presented/search order and root edits compare effective settings, normalize defaults and prune retired keys; use baseState for shared reset defaults. Pure helpers and label exports remain available.
- status-bar: StatusBar now requires children. Replace environment, clocks and user props with StatusBarEnvironmentBadge, StatusBarClocks/StatusBarClockReadout and StatusBarUser; move left/center/right content and the spacer into JSX. Pass custom clock sources to each readout, use group aria-label and reading prefix props for labels, and supply root data-environment and application slot markers where needed. Descriptor types, formatting helpers, tone classes and default labels remain available.
- instrument-search: InstrumentSearch requires caller-owned children. Compose InstrumentSearchContent, InstrumentSearchInput and InstrumentSearchList with InstrumentSearchItem rows; add InstrumentSearchHint where needed. Move autoFocus to Input, omit Hint instead of showHint, and replace renderHit with Item children and useInstrumentSearchState. Keep search, query, callbacks, limits and clearOnSelect on the root. Define search functions at module scope or memoize them with useCallback. See the complete Usage recipe and InstrumentSearch section of the migration guide.
- audit-trail: AuditTrail now requires children. Compose AuditTrailGrid and caller-owned AuditTrailChanges content; move grid options to AuditTrailGrid and onExport to AuditTrailExportButton. Replace pane visibility with conditional composition. Keep store, view, columns, formatters, labels and selection on the root. Use the complete Usage table recipe or a custom changes layout, and omit optional parts when they are unavailable. The formerly ignored selectionMode prop is removed; the grid retains multi-selection.
- blotter: Blotter requires caller-owned children. Move columns, formatters, label, sorting, menu rendering, deletion keys and other grid inputs to BlotterGrid. Keep store, actions, onNew, selection and focus on Blotter. Replace the implicit toolbar and menu with BlotterActionScope, BlotterActionButton, BlotterActionMenuItem, BlotterSelection and BlotterNewButton; supply newLabel as button children. The migration guide and complete ordinary/custom examples show the replacement compositions.
- watchlist: Watchlist now requires children. Compose WatchlistGrid and optional WatchlistAddForm, WatchlistAddInput and WatchlistAddButton; move columns, price, label, menu content and other grid options to WatchlistGrid. Replace addPlaceholder with input placeholder/naming props, and explicitly include watchlistRemoveColumn and WatchlistRemoveMenuItem or your own public removal controls. Keep store, callbacks, normalization, validation, selection and focus on Watchlist. See the complete Watchlist Usage recipe and v1-to-v2 migration guide.
- perf-monitor: PerfMonitor requires children. Replace implicit frame readings and histogram with PerfMonitorValue and PerfMonitorHistogram; replace lanes with caller-owned PerfMonitorLane providers and PerfMonitorLaneValue readings. Render custom readouts directly and omit the histogram for compact layouts. PerfReadout is removed, and PerfMonitorLane is now a provider component rather than a descriptor type. See docs/migrating-v1-to-v2.md#perfmonitor and the complete PerfMonitor Usage example.
- spread-matrix: SpreadMatrix requires children, and root instruments now supplies structure metadata. Move label to SpreadMatrixTable, map instruments/columns and structures into public rows/cells, and supply headings, captions and unit text in JSX. The columns, structures and labels props, SpreadMatrixLabels, and DEFAULT_SPREAD_MATRIX_LABELS are removed. data-mode and header data attributes belong to the caller. See the SpreadMatrix section of the v1-to-v2 migration guide.
- depth-ladder: DepthLadder now requires children. Compose its headers, viewport, virtual rows, cells, and Recenter control explicitly, and move emptyState to DepthLadderEmpty children. Existing book, formatting, virtualization, and staging inputs retain their defaults. See docs/migrating-v1-to-v2.md#depthladder and docs/depth-ladder.md for the replacement composition.
- layout-manager: LayoutManager requires children and no longer renders a default manager. Compose its save/import fields, template items, readings, and actions. Move onExport and onReset to caller-owned controls; use exportTemplate for JSON. Render list semantics, empty states, and action placement in caller JSX. All labels and pure helpers remain available. See docs/migrating-v1-to-v2.md#layoutmanager for the API, marker, and focus mapping.
- hotkey-editor: HotkeyEditor requires children and no longer renders a default settings screen. Compose HotkeyEditorItem readings, editing fields and controls, and render groups from useHotkeyEditor. Move onExport/onImport into caller controls. Supply the removed import, export, resetAll, remapped and empty labels in caller JSX. See docs/migrating-v1-to-v2.md#hotkeyeditor for the complete mapping.
- rules-editor: RulesEditor requires children and no longer renders a default editor. Compose its items, fields, readings, actions, and empty states explicitly. Move columnState and onColumnStateChange to a caller-owned ColumnChooserPanel. Compose installed shadcn Tabs for navigation, moving defaultTab to defaultValue on Tabs or controlled tab state; RulesEditorTab is no longer exported. Update selectors for the moved item markers and removed fixed tab/panel IDs as described in the migration guide. Rule helpers and the remaining root inputs stay available.
- price-chart: PriceChart requires children. Compose PriceChartHeader, PriceChartLast, PriceChartChange, PriceChartReadout and one PriceChartPlot explicitly; place PriceChartEmpty inside the plot when needed. Compose PriceChartLegend rows with PriceChartOverlaySwatch for overlays. All existing root plotting options remain available. See docs/migrating-v1-to-v2.md#pricechart.
- command-palette: CommandPalette now requires children and no longer inserts its dialog, input, list or result markup. Compose CommandPaletteDialog and CommandPaletteContent with the public input/list/item parts, and render groups through CommandPaletteResults or useCommandPalette. Move className to Dialog or Content; replace labels.empty and labels.searching with caller-owned Empty content. Apply the former five-recent display limit in caller JSX. The registry no longer installs Badge. See docs/migrating-v1-to-v2.md for the complete mapping.
- feed-health: FeedHealth requires both
feedsandchildrenand no longer generates its rows, tooltips, controls or announcements. The old self-closing call is a type error. AddFeedHealthListwith a child callback returningFeedHealthItemand your readings; the list supplies keys from stable, unique feed ids. Mount oneFeedHealthAnnouncerto inherit the collection. Direct-item layouts still passfeeds={[feed]}; pass[]and optionally composeFeedHealthEmptywhen the collection is empty. MoveactionsandpendingMsinto per-feeduseFeedActionshooks; replacecompactwith caller styling that retains tier text. Replacelabels,FeedHealthLabelsandDEFAULT_FEED_HEALTH_LABELSwith caller-owned accessible names and pending labels. Move feed selectors to the item div, add action data attributes yourself and apply destructive styling at the call site. Installseparator,dropdown-menuorbuttonseparately when your layout uses them. See the FeedHealth section of the v1-to-v2 migration guide. - alerts: Replace
<Alerts alerts={...} actions={...} />with caller-composed notice parts inside<Alerts><AlertsList>…</AlertsList></Alerts>. Subscribe in each row withuseAlert, supply expiry there, and mountAlertsAnnounceror an announcing toast adapter. ComposeAlertActionButtoninstead of passing the removedAlertAction[]configuration. Move collection limits, timestamps, counts, empty content, clear controls, and overflow dialogs to the caller; slice to three notices and supplyDismiss: {title}names to preserve v1 defaults. RenameAlertListtoAlertHistory. ReplaceAlertsLabelsandDEFAULT_ALERTS_LABELSwith the history-specific exports: maplistTitletotitle, usenoticeTitlefor the formerly hardcoded title-column header, and move strip/dialog labels into caller content. Install shadcn Dialog separately when needed. Seedocs/migrating-v1-to-v2.mdfor every removed prop, label mapping, and changed slot.
Features
- agent-kit: a skill, rules and a review prompt for a coding agent, and a contract check it can run (#245) (808562b)
- data-grid: share column reset defaults (2fa1545)
- registry: steady row names for the grids (#306) (e73d481)
- use-hotkeys: give the registry a defaults layer (#279) (9b2b0e6)
- workspace: compose tab contents and controls (#248) (a82369f)
Bug Fixes
- agent-kit: name every built-in under the floor and the registry's prerequisites (#264) (59a8990)
- alerts: true up the history grid and restore the released anchors (#260) (6b9c138)
- blotter: respect keyboard ownership (#255) (febe437)
- column-chooser: scale keyboard navigation to wide grids (#259) (57dc6d1)
- command-palette: cede the open binding to the consumer's declaration (#266) (d96583d)
- countdown: size the bar from a fresh sample (#284) (88d7fe8)
- countdown: step the bar without Web Animations and keep class clocks bound (#262) (1555ca5)
- data-grid: act once for a held key and keep the keyboard's column in view (#315) (0ce04b1)
- data-grid: arrivals flash on time, the keyboard respects the view, and quiet editors send nothing (#296) (825e265)
- data-grid: bring the focused row into view before Shift+F10 opens its menu (#307) (ca28bdb)
- data-grid: clean up resize gestures and preserve column updates (#257) (effedf0)
- data-grid: keep the focused and edited rows rendered (#305) (1e43467)
- data-grid: respect keyboard ownership and visible columns (#253) (8c9a28c)
- data-grid: respect pointer ownership in custom cells (#258) (1799d47)
- depth-ladder: speak the focused cell and stage only on the ladder (#276) (aa11e08)
- format: a quote whose snap overflows is not a quote (#285) (dc51998)
- format: snap fraction decimals to the printable grid (#273) (fc2893f)
- layout-manager: give the import name field its own name (#269) (22a84d1)
- limits: preserve custom block fields (235f9b0)
- panel: run caller handlers before the drag guards (#267) (3d9e950)
- perf-monitor: call samplers and meta sources through their instances (#263) (8d1d371)
- price-chart: repaint on a system scheme flip and name the triggers (#277) (202edd2)
- quote-field: a non-finite value is no value (#280) (699c9d3)
- registry: a repeated rejection speaks, and the aging tier meets the floor (#291) (9339d75)
- registry: close the alerts certification's findings (#314) (c4016d9)
- registry: close the grid presets' and trading blocks' remaining defects (#317) (5c5be1d)
- registry: close the grid's keyboard, focus, naming, and wording defects (#316) (c0eca8a)
- registry: close the leaves certification's findings (#289) (23da8df)
- registry: close the libs certification's findings (#311) (f42ccfc)
- registry: close the merge wave's banked follow-ups (#290) (97792b2)
- registry: close the shell pages' review findings (#287) (d6fe0fe)
- registry: close the shells certification's findings (#310) (2408da2)
- registry: close the themes certification's findings (#312) (0068b82)
- registry: close the trading pages' review findings (#288) (019c0c3)
- registry: count a press once on the tickets and the quote panel (#300) (dabf46c)
- registry: palette actions answer from the focused panel, and capture refuses Tab (#292) (13d9df1)
- registry: read a comma only between thousands in every number field (#313) (8f24c57)
- registry: say the limits when a press meets them (#301) (46769d6)
- registry: the blocks certification's findings (#299) (832654f)
- registry: the grids certification's rules findings (#304) (a4c5109)
- registry: the grids certification's time and sort findings (#303) (5c128b0)
- registry: the hotkeys certification's findings (#308) (80950c9)
- registry: the trading certification's findings (#302) (975d806)
- registry: the workspace survives hostile layouts, and shells tell the truth (#293) (90db90f)
- rfq-ticket: keep declared bindings through remounts and quote from the whole ticket (#275) (187c76e)
- rfq-ticket: read crossing through the quote direction and step the key's own side (#282) (e9199c6)
- row-store: connect owned views after commit (#256) (4e8b319)
- session-calendar: describe how a repeated local time really resolves (#271) (bce7720)
- session-guard: speak the status through hidden text (#268) (9fcbb18)
- site: pin installation guides to their release (#251) (217340d)
- sparkline: forget the crosshair when the chart stops being live (#309) (84dbf16)
- sparkline: step the crosshair with Up and Down and keep the caller's ref (#261) (054a9aa)
- ticket: run shortcuts from the whole ticket and cede declared bindings (#274) (d2b996d)
- ticket: send checked actions only, step and print in the quote basis (#281) (5b6d808)
- typography: hold the 12 px floor where the source check couldn't see it (#244) (ce030b9)
- use-hotkeys: read the canonical plus form back everywhere it is written (#265) (7a52421)
- watchlist: preset callbacks follow the caller, and the grid pages state their edges (#297) (e8e0937)
- watchlist: respect keyboard ownership (#254) (96c6046)
- window-set: say the owner decides what closing main means (#270) (5e8c2fd)
- workspace: one bad value drops alone, and the shells pages close their review (#298) (0458cff)
Maintenance
- alerts: expose composable notice parts (#221) (b9ffda2)
- audit-trail: expose composable history parts (4fc58c1)
- blotter: expose composable order controls and grid (#239) (9d3eff6)
- column-chooser: expose composable column settings (6d0f46c)
- command-palette: expose composable search results and controls (d23d4a5)
- depth-ladder: expose composable ladder parts (bdb7b42)
- feed-health: expose composable feed readings and actions (#226) (b29043a)
- hotkey-editor: expose composable shortcut fields and controls (#233) (770b5a1)
- instrument-search: expose composable search parts (1e72755)
- layout-manager: expose composable template fields and controls (#234) (8185b86)
- perf-monitor: expose composable frame and lane readings (626f639)
- price-chart: expose composable chart parts (#230) (80d1b3a)
- rules-editor: expose composable rule fields and controls (#232) (315891d)
- session-guard: expose composable session controls (#246) (e6cd393)
- spread-matrix: expose composable spread tables (e9d6593)
- status-bar: expose composable status readings (ccde2e9)
- watchlist: expose composable controls and grid (74a9990)
Documentation
- alerts: start with a single notice (#224) (33d1597)
- command-palette: keep the dialog's focus docs base-agnostic (#229) (80a062b)
- registry: pin the adapter identity, caption ownership, and limits wording (#278) (050a608)
- registry: state the blocks' edit contract and true the ticket demos (#283) (d337ecc)
- registry: state the removal-focus and delta-batch contracts (#286) (0787914)
- registry: the hotkeys pages say what ships (#294) (1e6f1bd)
- registry: true up the readings, tokens, and shell pages (#272) (c053f70)
- typography: the body-color cells read set per theme (#295) (6f413ca)
1.4.13 (2026-09-24)
Documentation
1.4.12 (2026-09-24)
Documentation
- alert-store: simplify the documentation examples (45d30bf)
- audit-trail: make the event history ready to inspect (88fcf5f)
- countdown: make timer examples self-contained (f8095ae)
- format: organize the examples by value type (f9e20bb)
- hotkey-editor: simplify setup and show exported overrides (ac5197e)
- instrument-search: simplify the documentation examples (e89b82b)
- limits: simplify usage and clarify preview outcomes (60f15a0)
- perf-monitor: separate basic monitoring from grid load (12c41ef)
- quote-field: make the comparison easy to copy and inspect (56924a3)
- rules-editor: complete and simplify the example (c795260)
- site: make the color comparison self-contained (9050561)
- typography: make the font specimen self-contained (8d549df)
- window-set: clarify and contain the simulated shell example (62315da)
1.4.11 (2026-09-24)
Documentation
- blotter: simplify the documentation examples (c168f97)
- column-chooser: simplify the documentation examples (aa49ce7)
- session-calendar: simplify the documentation examples (b532b28)
- status-bar: simplify the documentation examples (65f5f0e)
1.4.10 (2026-09-24)
Documentation
- alerts: simplify the documentation examples (7181599)
- flash-cell: simplify the documentation examples (b16198c)
- parameter-grid: simplify the documentation examples (#195) (78462b2)
- session-guard: simplify the documentation examples (0e7d3c7)
1.4.9 (2026-09-24)
Bug Fixes
Documentation
- grid-rules: simplify the documentation examples (#191) (e2fb5e4)
- layout-manager: simplify the documentation examples (#190) (f01b6ad)
- sparkline: simplify the documentation examples (#194) (a8a921f)
1.4.8 (2026-09-24)
Bug Fixes
- limits: a spread distance is in basis points already (#188) (9757cd4)
- ticket: the group carries its status as data-status (#189) (d02900c)
Documentation
1.4.7 (2026-09-24)
Documentation
- depth-ladder: simplify the documentation examples (#179) (e64e854)
- feed-health: simplify the documentation examples (#184) (c9410af)
- panel: simplify the documentation examples (#173) (3e577d9)
- positions: simplify the documentation examples (#182) (c76e60d)
- price-chart: simplify the documentation examples (#183) (d3b22c6)
- rfq-stack: simplify the documentation examples (#176) (65657a4)
- rfq-ticket: simplify the documentation examples (#177) (47497b6)
- row-store: simplify the documentation examples (#178) (2a1e492)
- spread-matrix: simplify the documentation examples (#180) (7133d86)
- ticket: simplify the documentation examples (#185) (6fccaa0)
- use-hotkeys: simplify the documentation examples (#175) (750e6bd)
- watchlist: simplify the documentation examples (#181) (a50f4ff)
1.4.6 (2026-09-23)
Documentation
- command-palette: simplify the documentation examples (#171) (ac59f25)
- workspace: simplify the documentation examples (#169) (eee0a72)
1.4.5 (2026-09-23)
Documentation
1.4.4 (2026-09-23)
Documentation
1.4.3 (2026-09-23)
Documentation
1.4.2 (2026-09-23)
Maintenance
Documentation
1.4.1 (2026-09-23)
Documentation
- alert-store: clarify notice fields and store behavior (#143) (ada2f0e)
- blotter: clarify props and action behavior (#145) (16bd9d8)
- column-chooser: clarify props and column state (#140) (8e5d2da)
- depth-ladder: clarify size and interaction behavior (#151) (2749e28)
- feed-health: clarify feed inputs and lifecycle (#142) (65d4bd4)
- flash-cell: clarify props and flash behavior (#150) (b8e46ca)
- hotkey-editor: clarify shortcut editing reference (#147) (432bd64)
- layout-manager: clarify template workflows and storage (#139) (98f02a3)
- perf-monitor: clarify sampling and report fields (#141) (2fc7c60)
- price-chart: clarify data and update behavior (#152) (c71654e)
- quote-field: clarify props and editing behavior (#146) (b8fcb64)
- repo: clarify color research and theme checks (#156) (c5fc7a4)
- rules-editor: clarify controls and rule behavior (#138) (3cde29c)
- session-guard: clarify phase and reauthentication behavior (#135) (f2a296a)
- sparkline: clarify props and rendering behavior (#148) (59e4619)
- status-bar: clarify props and clock behavior (#149) (5d2d53a)
- tradecn-amber: correct palette and contrast guidance (#153) (a0ef980)
- tradecn-slate-east: clarify palette and color conventions (#155) (1fb449e)
- tradecn-slate: clarify palette and contrast guidance (#154) (e488b5c)
- watchlist: clarify props and add and removal behavior (#144) (8b973c6)
1.4.0 (2026-09-23)
Features
Documentation
1.3.2 (2026-09-23)
Documentation
- quote-panel: clarify editing and custom columns (#131) (de1a0fa)
- window-set: clarify adapter and controller contracts (#128) (f866e38)
1.3.1 (2026-09-23)
Documentation
- countdown: the variants keep running, and say less twice (#123) (b9cd36c)
- repo: correct desktop shell recipes (#124) (7325b05)
1.3.0 (2026-09-23)
Features
- depth-ladder: a price ladder that follows the mid until touched (#106) (5be7272)
- quote-panel: a market maker's two-way panel over the editing contract (#117) (44abf58)
- session-guard: a banner before the end, a wall at it, and nothing underneath unmounts (#119) (06b5cf4)
- spread-matrix: instruments as rows and columns, each cell a signed spread (#115) (5427e81)
- window-set: the windows a desk has, as data and a driver over the shell, with the shells page (#121) (d09a4c5)
Documentation
- alerts: simplify the component reference (#120) (1035ac2)
- audit-trail: simplify the API reference (#111) (8801fe2)
- countdown: each variant gets a block of its own (#116) (f2354d0)
- countdown: name each compact timer for its row (#118) (260f204)
- instrument-search: simplify API reference (#113) (8749105)
- limits: simplify API reference (#114) (b440c75)
- positions: simplify the API reference (#112) (67c6bd0)
- session-calendar: clarify options and calendar behavior (#122) (5b4ff51)
- typography: simplify font setup and guidance (#108) (e59da09)
1.2.1 (2026-09-22)
Maintenance
- site: a version menu, and every release keeps its pages (#94) (15bdd6f)
- site: one desk on the front page, every item on it (#107) (7c7da04)
Documentation
- command-palette: simplify the API reference (#102) (a1a8835)
- format: simplify the API reference (#96) (a799160)
- grid-rules: simplify the API reference (#95) (e625055)
- parameter-grid: simplify the API reference (#100) (b71e999)
- preferences: simplify the API reference (#99) (08f306b)
- registry: an item's page is headed by the name you import (#97) (f2840d8)
- rfq-ticket: simplify the API reference (#90) (407c5b8)
- row-store: simplify the API reference (#104) (dedab9e)
- ticket: simplify the API reference (#93) (3467c4a)
- use-hotkeys: simplify the API reference (#103) (c737ea2)
1.2.0 (2026-09-22)
Features
- audit-trail: the life of an order as events, with a changes pane (#73) (976eba3)
- data-grid: editable cells, and a parameter grid over them (#70) (b3a9faa)
- feed-health: actions the server allows, in each feed's menu (#76) (db63803)
- instrument-search: a field that reads what was typed before it asks the server (#77) (da0e0d0)
- layout-manager: named layouts for a workspace (#74) (cabd5b5)
- positions: a book of positions on the grid (#72) (6f1008c)
- ticket: quick sizes on both tickets, as buttons and mod+1 to mod+9 (#78) (c91f07a)
Maintenance
Documentation
- contract: simplify the item contract (#84) (3b74434)
- countdown: simplify the guide and add a props reference (#75) (85c22f1)
- data-grid: simplify the API reference (#79) (fb13280)
- panel: simplify the API reference (#87) (e73e868)
- rfq-stack: simplify the API reference (#89) (4e29a1e)
- workspace: simplify the API reference (#82) (03616e8)
1.1.0 (2026-09-22)
Features
- alerts: a strip of notices over a store that folds repeats (#63) (6e3adb2)
- column-chooser: a dialog over one grid's columns (#60) (60197ff)
- data-grid: footer totals, a tape preset, and parking in the stack (#69) (2a6a44d)
- grid-rules: rules as data, and a rules prop on the grid (#58) (969a888)
- limits: fat-finger checks as data, and both tickets take them (#66) (716a60f)
- preferences: the envelope a desk's settings travel in (#62) (e3d3e12)
- rules-editor: the editor over one grid's rules (#61) (6889595)
- session-calendar: sessions, holidays, and early closes in the venue's zone (#65) (3f90537)
- status-bar: the strip at the bottom of every terminal (#64) (8f0f7fa)
Bug Fixes
1.0.0 (2026-09-22)
⚠ BREAKING CHANGES
- registry:
tradecn-terminalandtradecn-terminal-classicare removed. A consumer that installed either keeps it as values in its own stylesheet and nothing breaks; to move on,npx shadcn@latest add tradecn/ui/tradecn-amber#v1.0.0 --diff(its successor) ortradecn-slate. The items' default light marks (--up,--down,--stale,--expiring,--panel-sync,--link-1to--link-4) are nowtradecn-slate's light side and the dark--downis its dark vermilion; items never overwrite a variable you already have, so delete the old lines and run the item again to take them. Nothing tradecn draws is under 12 px, so theoption-chainpreset'sfontClassistext-xs. tradecn.dev wearstradecn-amberin both modes.
Features
0.3.0 (2026-09-22)
Features
- registry: three themes with a light side and a dark side from the color research, slate, slate-east, and amber, with a Color page and a rule that direction never rides on hue alone (#52) (63d252d)
- typography: research-grounded font system with consumer overrides (#50) (72b6cb0)
0.2.0 (2026-09-22)
Features
- countdown: time left as digits on one shared clock and a bar on one animation, turning in the last seconds and stopping at zero (#40) (02971af)
- format: a quote basis per instrument, coupons in eighths, maturities, ticks between two prices, and millions as the desk says them (#42) (6714e8d)
- hotkey-editor: the settings screen for the hotkey registry, with three ways to change a shortcut and conflicts said in words (#47) (9f5d8b6)
- panel: a link transport over a shell's own two functions, and one workspace per window for shells whose windows are separate contexts (#48) (360ddef)
- perf-monitor: the frame rate on the screen it measures, a histogram against the budget, and a line per lane from its store (#46) (bc1ceac)
- quote-field: a field that types a quote the way the instrument quotes it, in its basis, and steps by its step (#43) (5642a0e)
- rfq-stack: the stack of open inquiries with a countdown per row, a threshold for the small auto quotes, and the one rule for which inquiry is in the ticket (#45) (f2cf838)
- rfq-ticket: a dealer's ticket for a request for quote, one inquiry each, quoting in the instrument's basis against the market (#44) (d217dee)
0.1.6 (2026-09-21)
Maintenance
- site: item pages in shadcn's shape, one sentence up top and the install spelled out under Command and Manual (#32) (a3353f0)
0.1.5 (2026-09-21)
Maintenance
- site: live previews on every docs page, one demo per item embedded from the playground (#27) (9566f7e)
0.1.4 (2026-09-21)
Maintenance
- registry: point homepage and the README at tradecn.dev (#21) (8c57463)
- repo: New Earth Technologies holds the license, and the logo lands in the repo and on the site (#22) (ff7dcf2)
- repo: pull request titles pick the next tag, checked the way release-please reads them (#24) (9b5441a)
- site: docs pages on tradecn.dev, one per docs/*.md at the tag (#23) (0f90d2a)
- site: take the page's palette from main's registry, not the tag's (#20) (6b58a9c)
0.1.3 (2026-09-21)
Features
- ticket: an order ticket as the registry's first block, typing 99-16+ and stepping by the tick, with buttons the server allowed and a status it said (#19) (4e1f136)
- workspace: panels that dock, tab, float, and pop out, on dockview, each one a hotkey scope, with a layout that carries its own persistence boundaries (#16) (e61d954)
0.1.2 (2026-09-21)
Features
- blotter: the data grid as an order blotter, with the server's status and actions gated by what it allows (#13) (e401f13)
- panel: panel chrome as a hotkey scope, with a symbol tag, link groups across windows, and a popout that keeps state (#9) (9f65030)
- sparkline: a line for a grid cell, colored and worded by direction, with gaps kept and an optional crosshair (#11) (a71463c)
- tradecn-terminal-classic: the terminal theme with green and red (#15) (3fc5854)
- tradecn-terminal: a terminal theme, black and amber with square corners and a monospace stack (#14) (c8cfc2f)
- watchlist: the data grid as a watchlist, with an add field that finds what is already there and three ways to remove (#12) (57c31d1)
0.1.1 (2026-09-21)
Features
- command-palette: palette and go-bar on the consumer's command, with a second action, symbol search, and live shortcuts (#7) (499301a)
- use-hotkeys: hotkey registry with DOM scopes, chords, conflict detection, and remapping (#5) (5bbc872)
0.1.0 (2026-09-20)
Features
- data-grid: virtualized delta-fed grid with flash cells, reorder hold, and presets (4d59736)
- feed-health: per-feed state, age, and staleness tier with lane-specific indicators (c1c5c92)
- flash-cell: direction-colored flash on change with shared memory and the market tokens (656d7d8)
- format: number formatting for trading screens (a335979)
- row-store: per-row subscriptions, views with reorder hold, frame batcher (51b81d3)
Bug Fixes
- feed-health: bring its own tooltip provider so Radix consumers render (8cc9376)
This page is CHANGELOG.md at v2.0.0.