@pond-ts/react 0.43.0 → 0.44.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/CHANGELOG.md +105 -1
  2. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -8,7 +8,9 @@ The `@pond-ts` packages — `pond-ts`, `@pond-ts/react`, `@pond-ts/charts`,
8
8
  tag, so this file covers them all. Pre-1.0: minor bumps may include new features
9
9
  and type-level changes; patch bumps are strictly additive.
10
10
 
11
- [Unreleased]: https://github.com/pjm17971/pond-ts/compare/v0.43.0...HEAD
11
+ [Unreleased]: https://github.com/pjm17971/pond-ts/compare/v0.44.1...HEAD
12
+ [0.44.1]: https://github.com/pjm17971/pond-ts/compare/v0.44.0...v0.44.1
13
+ [0.44.0]: https://github.com/pjm17971/pond-ts/compare/v0.43.0...v0.44.0
12
14
  [0.43.0]: https://github.com/pjm17971/pond-ts/compare/v0.42.0...v0.43.0
13
15
  [0.42.0]: https://github.com/pjm17971/pond-ts/compare/v0.41.0...v0.42.0
14
16
  [0.41.0]: https://github.com/pjm17971/pond-ts/compare/v0.40.0...v0.41.0
@@ -41,6 +43,108 @@ and type-level changes; patch bumps are strictly additive.
41
43
 
42
44
  ## [Unreleased]
43
45
 
46
+ ## [0.44.1] — 2026-07-13
47
+
48
+ A `@pond-ts/charts` patch: fixes trading-time axis tick density. `pond-ts`,
49
+ `@pond-ts/react`, `@pond-ts/fit`, and `@pond-ts/financial` carry no code
50
+ changes — republished in lock-step; their `^0.44.0` peer ranges already
51
+ admit this patch.
52
+
53
+ ### Fixed
54
+
55
+ - **charts:** trading-time axis tick density now derives from plot width
56
+ instead of a fixed count of 5. The trading scale's tick `count` caps how many
57
+ calendar buckets `coarsenCalendar` may keep, so the fixed count coarsened any
58
+ ≳6-month daily view to quarter or year grain — a 1-year daily chart on a
59
+ ~900px plot showed 2 ticks; it now lands on month grain (~12). Continuous
60
+ (non-trading) time and value axes keep the fixed default, unchanged. The
61
+ count is shared through the container frame (`xTickCount`), so axis labels,
62
+ x gridlines, session dividers, and the cursor-time formatter all derive from
63
+ the same instants — previously the label formatter anchored at the scale's
64
+ internal default (10) while ticks used 5, which is why sparse year-grain
65
+ ticks were labelled with dates (`Jun 22`) instead of years. (Tidal friction
66
+ report, charts 0.44.)
67
+
68
+ ## [0.44.0] — 2026-07-11
69
+
70
+ The **value-axis charts** release: cross-sectional data (a volatility smile keyed
71
+ by strike) becomes a first-class charting surface. `ValueSeries.fromColumns` is
72
+ the direct columnar door; `<ScatterChart>` and `<BoxPlot>` join `<LineChart>` on
73
+ the value axis; `<BoxPlot>` gains range-only (bid→ask) marks, `offset` pairing,
74
+ and `capWidth`; and the region cursor works on value axes and snaps to histogram
75
+ bins.
76
+
77
+ ### Added
78
+
79
+ - **`<BoxPlot>` finished for the value axis + range-only marks** (`@pond-ts/charts`).
80
+ Four coordinated changes, driven by the volatility smile's per-strike bid/ask IV
81
+ segments (`docs/notes/vol-smile-followups-2026-07.md` §1):
82
+ - **Accepts a `ValueSeries`** (`series.byValue('strike')` /
83
+ `ValueSeries.fromColumns`) — boxes on a value axis, the same instanceof branch
84
+ as `<LineChart>` / `<ScatterChart>`. The box **width** now comes from neighbour
85
+ spacing for a **point** key (a `ValueSeries`, or a point-keyed `TimeSeries`) —
86
+ like bars/candles — instead of collapsing to the 1px floor; an interval-keyed
87
+ `TimeSeries` still uses its `[begin, end)`.
88
+ - **Optional `q1`/`median`/`q3`** — omit `q1`+`q3` for a **range-only** box: a
89
+ whisker-only `lower→upper` segment, no body (a bid→ask IV mark honestly named,
90
+ not a candlestick abuse). Omitting exactly one of `q1`/`q3` throws.
91
+ - **`offset` prop** (`<BoxPlot>` and `<ScatterChart>`) — a **pixel** shift for
92
+ pairing same-key marks (call/put at one strike) side by side, zoom-stable. On
93
+ the scatter it moves the draw **and** the click hit-test together; on the box
94
+ the readout hit-tests in un-shifted data space (keep the offset small).
95
+ - **`capWidth` prop** (`<BoxPlot>`) — the whisker end-cap width in **pixels**
96
+ (else half the box width). A small fixed cap keeps two `offset`-paired marks'
97
+ T-bars from overlapping when the value-axis slot is wide; clamped to the box
98
+ width, `'whisker'` shape only.
99
+ - **Readout labels** carry the series' `as` identity (`iv upper`, `iv median`)
100
+ when set, instead of bare column names — the `as ?? column` convention
101
+ Line/Scatter already use.
102
+ - **`<ScatterChart>` accepts a `ValueSeries`** (`@pond-ts/charts`) — scatter
103
+ marks on the value axis, the same instanceof-branched adapter as
104
+ `<LineChart>` (the container infers the x kind from the data). The
105
+ data-driven `radius` / `color` encodings work unchanged on a value axis;
106
+ the per-point `label` reads through a new columnar branch (a `ValueSeries`
107
+ has no per-row events) — IV marks keyed by strike with open-interest
108
+ radius is the driving composition (vol smile). New value-axis Storybook
109
+ fan-out (`ValueAxis` / `ValueAxisEncoded` / `ValueAxisSmile` /
110
+ `ValueAxisFlag`) + Linux visual baselines.
111
+
112
+ - **`ValueSeries.fromColumns({ name, schema, columns, sort? })`** (`pond-ts`) —
113
+ the direct columnar door into value-land, for data that is _natively_
114
+ value-keyed (cross-sectional): an options chain keyed by strike, a spectrum
115
+ keyed by frequency. Exact `TimeSeries.fromColumns` contract with the axis in
116
+ place of time — same polymorphic `number[]` / `Float64Array` inputs, same
117
+ zero-copy adoption, same stable opt-in `sort`, same gap rule — the two doors
118
+ share one ingest engine. Previously cross-sectional callers had to launder
119
+ the axis through a fake `time` column (`TimeSeries.fromColumns` +
120
+ `byValue`); that detour is no longer needed.
121
+
122
+ - **The region cursor snaps to a histogram's bins** (`@pond-ts/charts`). On a
123
+ `<BarChart>` histogram, `cursor="region"` now snaps **bar by bar** with no
124
+ `cursorSequence`: hovering highlights the bar under the pointer, a drag extends
125
+ across whole bars, and `onRegionSelect` reports the selected bin range
126
+ `[lo, hi]` at the bar edges. The bar layer publishes its `[begin, end)` spans
127
+ (a new internal `binIntervals` channel) as the region cursor's snap buckets —
128
+ the same machinery a `cursorSequence` drives on a time axis, so it also covers a
129
+ time-axis histogram. Only a **vertical** bar layer on a continuous (time /
130
+ value) x axis publishes bins; a horizontal chart (value on x) and a categorical
131
+ axis stay freeform / excluded. An explicit `cursorSequence` still takes
132
+ precedence. New `HistogramBins` region-cursor story.
133
+
134
+ ### Changed
135
+
136
+ - **BREAKING (`@pond-ts/charts`): the region cursor works on a value x-axis, and
137
+ `onRegionSelect` reports a neutral `[lo, hi]` pair.** The drag-select callback
138
+ fired a `TimeRange`; it now fires `readonly [number, number]` in **axis units** —
139
+ epoch ms on a time axis, the axis value (strike, distance, …) on a value axis —
140
+ mirroring the container's polymorphic `range` input (which never takes the axis
141
+ _kind_ from its value). A time-axis consumer that wants a `TimeRange` builds one
142
+ from the pair (`new TimeRange({ start: lo, end: hi })`). The cursor itself is
143
+ ungated from time-only to any **continuous** x-axis (time **or** value; a
144
+ **category** axis stays excluded — an ordinal-slot select is a different gesture).
145
+ Bucket **snapping** stays time-only (a `cursorSequence` bucket is a time
146
+ interval), so a value axis is always **freeform** (hover line + raw-span drag).
147
+
44
148
  ## [0.43.0] — 2026-07-11
45
149
 
46
150
  The **categorical x-axis** release: a first-class ordinal band scale (ticker /
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pond-ts/react",
3
- "version": "0.43.0",
3
+ "version": "0.44.1",
4
4
  "description": "React hooks for pond-ts live time series",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -33,7 +33,7 @@
33
33
  "test:runtime": "vitest run"
34
34
  },
35
35
  "peerDependencies": {
36
- "pond-ts": "^0.43.0",
36
+ "pond-ts": "^0.44.0",
37
37
  "react": "^18.0.0 || ^19.0.0"
38
38
  },
39
39
  "devDependencies": {