@adminiumjs/charts 0.1.0-rc.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 (327) hide show
  1. package/LICENSE +661 -0
  2. package/dist/components/AnomalyChart.d.ts +30 -0
  3. package/dist/components/AnomalyChart.d.ts.map +1 -0
  4. package/dist/components/AnomalyChart.js +32 -0
  5. package/dist/components/AnomalyChart.js.map +1 -0
  6. package/dist/components/BarChart.d.ts +33 -0
  7. package/dist/components/BarChart.d.ts.map +1 -0
  8. package/dist/components/BarChart.js +40 -0
  9. package/dist/components/BarChart.js.map +1 -0
  10. package/dist/components/BoxPlotChart.d.ts +23 -0
  11. package/dist/components/BoxPlotChart.d.ts.map +1 -0
  12. package/dist/components/BoxPlotChart.js +24 -0
  13. package/dist/components/BoxPlotChart.js.map +1 -0
  14. package/dist/components/BulletChart.d.ts +27 -0
  15. package/dist/components/BulletChart.d.ts.map +1 -0
  16. package/dist/components/BulletChart.js +24 -0
  17. package/dist/components/BulletChart.js.map +1 -0
  18. package/dist/components/BumpChart.d.ts +27 -0
  19. package/dist/components/BumpChart.d.ts.map +1 -0
  20. package/dist/components/BumpChart.js +17 -0
  21. package/dist/components/BumpChart.js.map +1 -0
  22. package/dist/components/CandlestickChart.d.ts +26 -0
  23. package/dist/components/CandlestickChart.d.ts.map +1 -0
  24. package/dist/components/CandlestickChart.js +22 -0
  25. package/dist/components/CandlestickChart.js.map +1 -0
  26. package/dist/components/ChartSurface.d.ts +52 -0
  27. package/dist/components/ChartSurface.d.ts.map +1 -0
  28. package/dist/components/ChartSurface.js +15 -0
  29. package/dist/components/ChartSurface.js.map +1 -0
  30. package/dist/components/Chord.d.ts +30 -0
  31. package/dist/components/Chord.d.ts.map +1 -0
  32. package/dist/components/Chord.js +14 -0
  33. package/dist/components/Chord.js.map +1 -0
  34. package/dist/components/ChoroplethGridChart.d.ts +32 -0
  35. package/dist/components/ChoroplethGridChart.d.ts.map +1 -0
  36. package/dist/components/ChoroplethGridChart.js +15 -0
  37. package/dist/components/ChoroplethGridChart.js.map +1 -0
  38. package/dist/components/CohortMatrixChart.d.ts +30 -0
  39. package/dist/components/CohortMatrixChart.d.ts.map +1 -0
  40. package/dist/components/CohortMatrixChart.js +13 -0
  41. package/dist/components/CohortMatrixChart.js.map +1 -0
  42. package/dist/components/CorrelationMatrixChart.d.ts +24 -0
  43. package/dist/components/CorrelationMatrixChart.d.ts.map +1 -0
  44. package/dist/components/CorrelationMatrixChart.js +29 -0
  45. package/dist/components/CorrelationMatrixChart.js.map +1 -0
  46. package/dist/components/DonutChart.d.ts +31 -0
  47. package/dist/components/DonutChart.d.ts.map +1 -0
  48. package/dist/components/DonutChart.js +19 -0
  49. package/dist/components/DonutChart.js.map +1 -0
  50. package/dist/components/ForecastChart.d.ts +37 -0
  51. package/dist/components/ForecastChart.d.ts.map +1 -0
  52. package/dist/components/ForecastChart.js +39 -0
  53. package/dist/components/ForecastChart.js.map +1 -0
  54. package/dist/components/Funnel.d.ts +27 -0
  55. package/dist/components/Funnel.d.ts.map +1 -0
  56. package/dist/components/Funnel.js +25 -0
  57. package/dist/components/Funnel.js.map +1 -0
  58. package/dist/components/HeatCalendarChart.d.ts +39 -0
  59. package/dist/components/HeatCalendarChart.d.ts.map +1 -0
  60. package/dist/components/HeatCalendarChart.js +37 -0
  61. package/dist/components/HeatCalendarChart.js.map +1 -0
  62. package/dist/components/HeatMonthChart.d.ts +30 -0
  63. package/dist/components/HeatMonthChart.d.ts.map +1 -0
  64. package/dist/components/HeatMonthChart.js +14 -0
  65. package/dist/components/HeatMonthChart.js.map +1 -0
  66. package/dist/components/HexbinChart.d.ts +22 -0
  67. package/dist/components/HexbinChart.d.ts.map +1 -0
  68. package/dist/components/HexbinChart.js +31 -0
  69. package/dist/components/HexbinChart.js.map +1 -0
  70. package/dist/components/LineAreaChart.d.ts +26 -0
  71. package/dist/components/LineAreaChart.d.ts.map +1 -0
  72. package/dist/components/LineAreaChart.js +62 -0
  73. package/dist/components/LineAreaChart.js.map +1 -0
  74. package/dist/components/MarimekkoChart.d.ts +24 -0
  75. package/dist/components/MarimekkoChart.d.ts.map +1 -0
  76. package/dist/components/MarimekkoChart.js +20 -0
  77. package/dist/components/MarimekkoChart.js.map +1 -0
  78. package/dist/components/MultiLineChart.d.ts +36 -0
  79. package/dist/components/MultiLineChart.d.ts.map +1 -0
  80. package/dist/components/MultiLineChart.js +62 -0
  81. package/dist/components/MultiLineChart.js.map +1 -0
  82. package/dist/components/ParallelCoordinatesChart.d.ts +22 -0
  83. package/dist/components/ParallelCoordinatesChart.d.ts.map +1 -0
  84. package/dist/components/ParallelCoordinatesChart.js +16 -0
  85. package/dist/components/ParallelCoordinatesChart.js.map +1 -0
  86. package/dist/components/ParetoChart.d.ts +26 -0
  87. package/dist/components/ParetoChart.d.ts.map +1 -0
  88. package/dist/components/ParetoChart.js +26 -0
  89. package/dist/components/ParetoChart.js.map +1 -0
  90. package/dist/components/Radar.d.ts +27 -0
  91. package/dist/components/Radar.d.ts.map +1 -0
  92. package/dist/components/Radar.js +19 -0
  93. package/dist/components/Radar.js.map +1 -0
  94. package/dist/components/RadialBar.d.ts +25 -0
  95. package/dist/components/RadialBar.d.ts.map +1 -0
  96. package/dist/components/RadialBar.js +12 -0
  97. package/dist/components/RadialBar.js.map +1 -0
  98. package/dist/components/RankingBars.d.ts +27 -0
  99. package/dist/components/RankingBars.d.ts.map +1 -0
  100. package/dist/components/RankingBars.js +25 -0
  101. package/dist/components/RankingBars.js.map +1 -0
  102. package/dist/components/RidgelineChart.d.ts +23 -0
  103. package/dist/components/RidgelineChart.d.ts.map +1 -0
  104. package/dist/components/RidgelineChart.js +20 -0
  105. package/dist/components/RidgelineChart.js.map +1 -0
  106. package/dist/components/SankeyChart.d.ts +29 -0
  107. package/dist/components/SankeyChart.d.ts.map +1 -0
  108. package/dist/components/SankeyChart.js +21 -0
  109. package/dist/components/SankeyChart.js.map +1 -0
  110. package/dist/components/ScatterBubbleChart.d.ts +26 -0
  111. package/dist/components/ScatterBubbleChart.d.ts.map +1 -0
  112. package/dist/components/ScatterBubbleChart.js +31 -0
  113. package/dist/components/ScatterBubbleChart.js.map +1 -0
  114. package/dist/components/SlopeChart.d.ts +28 -0
  115. package/dist/components/SlopeChart.d.ts.map +1 -0
  116. package/dist/components/SlopeChart.js +18 -0
  117. package/dist/components/SlopeChart.js.map +1 -0
  118. package/dist/components/Sparkline.d.ts +15 -0
  119. package/dist/components/Sparkline.d.ts.map +1 -0
  120. package/dist/components/Sparkline.js +27 -0
  121. package/dist/components/Sparkline.js.map +1 -0
  122. package/dist/components/StackedBar100.d.ts +30 -0
  123. package/dist/components/StackedBar100.d.ts.map +1 -0
  124. package/dist/components/StackedBar100.js +21 -0
  125. package/dist/components/StackedBar100.js.map +1 -0
  126. package/dist/components/StreamChart.d.ts +23 -0
  127. package/dist/components/StreamChart.d.ts.map +1 -0
  128. package/dist/components/StreamChart.js +56 -0
  129. package/dist/components/StreamChart.js.map +1 -0
  130. package/dist/components/Sunburst.d.ts +24 -0
  131. package/dist/components/Sunburst.d.ts.map +1 -0
  132. package/dist/components/Sunburst.js +13 -0
  133. package/dist/components/Sunburst.js.map +1 -0
  134. package/dist/components/TimelineLanesChart.d.ts +25 -0
  135. package/dist/components/TimelineLanesChart.d.ts.map +1 -0
  136. package/dist/components/TimelineLanesChart.js +41 -0
  137. package/dist/components/TimelineLanesChart.js.map +1 -0
  138. package/dist/components/Treemap.d.ts +28 -0
  139. package/dist/components/Treemap.d.ts.map +1 -0
  140. package/dist/components/Treemap.js +22 -0
  141. package/dist/components/Treemap.js.map +1 -0
  142. package/dist/components/ViolinChart.d.ts +22 -0
  143. package/dist/components/ViolinChart.d.ts.map +1 -0
  144. package/dist/components/ViolinChart.js +21 -0
  145. package/dist/components/ViolinChart.js.map +1 -0
  146. package/dist/components/WaterfallChart.d.ts +23 -0
  147. package/dist/components/WaterfallChart.d.ts.map +1 -0
  148. package/dist/components/WaterfallChart.js +29 -0
  149. package/dist/components/WaterfallChart.js.map +1 -0
  150. package/dist/components/WordCloud.d.ts +24 -0
  151. package/dist/components/WordCloud.d.ts.map +1 -0
  152. package/dist/components/WordCloud.js +22 -0
  153. package/dist/components/WordCloud.js.map +1 -0
  154. package/dist/demo/barsRanking.d.ts +26 -0
  155. package/dist/demo/barsRanking.d.ts.map +1 -0
  156. package/dist/demo/barsRanking.js +80 -0
  157. package/dist/demo/barsRanking.js.map +1 -0
  158. package/dist/demo/generators.d.ts +44 -0
  159. package/dist/demo/generators.d.ts.map +1 -0
  160. package/dist/demo/generators.js +72 -0
  161. package/dist/demo/generators.js.map +1 -0
  162. package/dist/demo/mulberry32.d.ts +10 -0
  163. package/dist/demo/mulberry32.d.ts.map +1 -0
  164. package/dist/demo/mulberry32.js +26 -0
  165. package/dist/demo/mulberry32.js.map +1 -0
  166. package/dist/geometry/anomaly.d.ts +22 -0
  167. package/dist/geometry/anomaly.d.ts.map +1 -0
  168. package/dist/geometry/anomaly.js +52 -0
  169. package/dist/geometry/anomaly.js.map +1 -0
  170. package/dist/geometry/bars.d.ts +46 -0
  171. package/dist/geometry/bars.d.ts.map +1 -0
  172. package/dist/geometry/bars.js +68 -0
  173. package/dist/geometry/bars.js.map +1 -0
  174. package/dist/geometry/bullet.d.ts +53 -0
  175. package/dist/geometry/bullet.d.ts.map +1 -0
  176. package/dist/geometry/bullet.js +67 -0
  177. package/dist/geometry/bullet.js.map +1 -0
  178. package/dist/geometry/bump.d.ts +42 -0
  179. package/dist/geometry/bump.d.ts.map +1 -0
  180. package/dist/geometry/bump.js +29 -0
  181. package/dist/geometry/bump.js.map +1 -0
  182. package/dist/geometry/candles.d.ts +39 -0
  183. package/dist/geometry/candles.d.ts.map +1 -0
  184. package/dist/geometry/candles.js +42 -0
  185. package/dist/geometry/candles.js.map +1 -0
  186. package/dist/geometry/chord.d.ts +53 -0
  187. package/dist/geometry/chord.d.ts.map +1 -0
  188. package/dist/geometry/chord.js +111 -0
  189. package/dist/geometry/chord.js.map +1 -0
  190. package/dist/geometry/choropleth.d.ts +58 -0
  191. package/dist/geometry/choropleth.d.ts.map +1 -0
  192. package/dist/geometry/choropleth.js +101 -0
  193. package/dist/geometry/choropleth.js.map +1 -0
  194. package/dist/geometry/cohort.d.ts +54 -0
  195. package/dist/geometry/cohort.d.ts.map +1 -0
  196. package/dist/geometry/cohort.js +70 -0
  197. package/dist/geometry/cohort.js.map +1 -0
  198. package/dist/geometry/correlation.d.ts +138 -0
  199. package/dist/geometry/correlation.d.ts.map +1 -0
  200. package/dist/geometry/correlation.js +161 -0
  201. package/dist/geometry/correlation.js.map +1 -0
  202. package/dist/geometry/distribution.d.ts +115 -0
  203. package/dist/geometry/distribution.d.ts.map +1 -0
  204. package/dist/geometry/distribution.js +131 -0
  205. package/dist/geometry/distribution.js.map +1 -0
  206. package/dist/geometry/donut.d.ts +37 -0
  207. package/dist/geometry/donut.d.ts.map +1 -0
  208. package/dist/geometry/donut.js +46 -0
  209. package/dist/geometry/donut.js.map +1 -0
  210. package/dist/geometry/forecast.d.ts +30 -0
  211. package/dist/geometry/forecast.d.ts.map +1 -0
  212. package/dist/geometry/forecast.js +75 -0
  213. package/dist/geometry/forecast.js.map +1 -0
  214. package/dist/geometry/funnel.d.ts +37 -0
  215. package/dist/geometry/funnel.d.ts.map +1 -0
  216. package/dist/geometry/funnel.js +42 -0
  217. package/dist/geometry/funnel.js.map +1 -0
  218. package/dist/geometry/heat.d.ts +34 -0
  219. package/dist/geometry/heat.d.ts.map +1 -0
  220. package/dist/geometry/heat.js +50 -0
  221. package/dist/geometry/heat.js.map +1 -0
  222. package/dist/geometry/heatCalendar.d.ts +43 -0
  223. package/dist/geometry/heatCalendar.d.ts.map +1 -0
  224. package/dist/geometry/heatCalendar.js +82 -0
  225. package/dist/geometry/heatCalendar.js.map +1 -0
  226. package/dist/geometry/heatMonth.d.ts +47 -0
  227. package/dist/geometry/heatMonth.d.ts.map +1 -0
  228. package/dist/geometry/heatMonth.js +72 -0
  229. package/dist/geometry/heatMonth.js.map +1 -0
  230. package/dist/geometry/lineArea.d.ts +17 -0
  231. package/dist/geometry/lineArea.d.ts.map +1 -0
  232. package/dist/geometry/lineArea.js +37 -0
  233. package/dist/geometry/lineArea.js.map +1 -0
  234. package/dist/geometry/marimekko.d.ts +43 -0
  235. package/dist/geometry/marimekko.d.ts.map +1 -0
  236. package/dist/geometry/marimekko.js +45 -0
  237. package/dist/geometry/marimekko.js.map +1 -0
  238. package/dist/geometry/multiLine.d.ts +19 -0
  239. package/dist/geometry/multiLine.d.ts.map +1 -0
  240. package/dist/geometry/multiLine.js +25 -0
  241. package/dist/geometry/multiLine.js.map +1 -0
  242. package/dist/geometry/pareto.d.ts +44 -0
  243. package/dist/geometry/pareto.d.ts.map +1 -0
  244. package/dist/geometry/pareto.js +65 -0
  245. package/dist/geometry/pareto.js.map +1 -0
  246. package/dist/geometry/radar.d.ts +60 -0
  247. package/dist/geometry/radar.d.ts.map +1 -0
  248. package/dist/geometry/radar.js +67 -0
  249. package/dist/geometry/radar.js.map +1 -0
  250. package/dist/geometry/radialBar.d.ts +31 -0
  251. package/dist/geometry/radialBar.d.ts.map +1 -0
  252. package/dist/geometry/radialBar.js +53 -0
  253. package/dist/geometry/radialBar.js.map +1 -0
  254. package/dist/geometry/ranking.d.ts +48 -0
  255. package/dist/geometry/ranking.d.ts.map +1 -0
  256. package/dist/geometry/ranking.js +42 -0
  257. package/dist/geometry/ranking.js.map +1 -0
  258. package/dist/geometry/sankey.d.ts +60 -0
  259. package/dist/geometry/sankey.d.ts.map +1 -0
  260. package/dist/geometry/sankey.js +130 -0
  261. package/dist/geometry/sankey.js.map +1 -0
  262. package/dist/geometry/scales.d.ts +14 -0
  263. package/dist/geometry/scales.d.ts.map +1 -0
  264. package/dist/geometry/scales.js +33 -0
  265. package/dist/geometry/scales.js.map +1 -0
  266. package/dist/geometry/slope.d.ts +34 -0
  267. package/dist/geometry/slope.d.ts.map +1 -0
  268. package/dist/geometry/slope.js +44 -0
  269. package/dist/geometry/slope.js.map +1 -0
  270. package/dist/geometry/sparkline.d.ts +20 -0
  271. package/dist/geometry/sparkline.d.ts.map +1 -0
  272. package/dist/geometry/sparkline.js +43 -0
  273. package/dist/geometry/sparkline.js.map +1 -0
  274. package/dist/geometry/stacked100.d.ts +33 -0
  275. package/dist/geometry/stacked100.d.ts.map +1 -0
  276. package/dist/geometry/stacked100.js +34 -0
  277. package/dist/geometry/stacked100.js.map +1 -0
  278. package/dist/geometry/streamStack.d.ts +32 -0
  279. package/dist/geometry/streamStack.d.ts.map +1 -0
  280. package/dist/geometry/streamStack.js +56 -0
  281. package/dist/geometry/streamStack.js.map +1 -0
  282. package/dist/geometry/sunburst.d.ts +37 -0
  283. package/dist/geometry/sunburst.d.ts.map +1 -0
  284. package/dist/geometry/sunburst.js +84 -0
  285. package/dist/geometry/sunburst.js.map +1 -0
  286. package/dist/geometry/timelineLanes.d.ts +46 -0
  287. package/dist/geometry/timelineLanes.d.ts.map +1 -0
  288. package/dist/geometry/timelineLanes.js +52 -0
  289. package/dist/geometry/timelineLanes.js.map +1 -0
  290. package/dist/geometry/treemap.d.ts +42 -0
  291. package/dist/geometry/treemap.d.ts.map +1 -0
  292. package/dist/geometry/treemap.js +134 -0
  293. package/dist/geometry/treemap.js.map +1 -0
  294. package/dist/geometry/waterfall.d.ts +40 -0
  295. package/dist/geometry/waterfall.d.ts.map +1 -0
  296. package/dist/geometry/waterfall.js +80 -0
  297. package/dist/geometry/waterfall.js.map +1 -0
  298. package/dist/geometry/wordcloud.d.ts +46 -0
  299. package/dist/geometry/wordcloud.d.ts.map +1 -0
  300. package/dist/geometry/wordcloud.js +79 -0
  301. package/dist/geometry/wordcloud.js.map +1 -0
  302. package/dist/hooks/useChartSize.d.ts +6 -0
  303. package/dist/hooks/useChartSize.d.ts.map +1 -0
  304. package/dist/hooks/useChartSize.js +32 -0
  305. package/dist/hooks/useChartSize.js.map +1 -0
  306. package/dist/hooks/useMountAnimation.d.ts +4 -0
  307. package/dist/hooks/useMountAnimation.d.ts.map +1 -0
  308. package/dist/hooks/useMountAnimation.js +40 -0
  309. package/dist/hooks/useMountAnimation.js.map +1 -0
  310. package/dist/hooks/useRtl.d.ts +7 -0
  311. package/dist/hooks/useRtl.d.ts.map +1 -0
  312. package/dist/hooks/useRtl.js +18 -0
  313. package/dist/hooks/useRtl.js.map +1 -0
  314. package/dist/index.d.ts +110 -0
  315. package/dist/index.d.ts.map +1 -0
  316. package/dist/index.js +79 -0
  317. package/dist/index.js.map +1 -0
  318. package/dist/utils/format.d.ts +5 -0
  319. package/dist/utils/format.d.ts.map +1 -0
  320. package/dist/utils/format.js +24 -0
  321. package/dist/utils/format.js.map +1 -0
  322. package/dist/utils/stats.d.ts +23 -0
  323. package/dist/utils/stats.d.ts.map +1 -0
  324. package/dist/utils/stats.js +82 -0
  325. package/dist/utils/stats.js.map +1 -0
  326. package/package.json +36 -0
  327. package/src/styles.css +205 -0
@@ -0,0 +1,44 @@
1
+ /** Fixed anchor so demo timeseries are reproducible (last point lands here). */
2
+ export declare const DEMO_EPOCH_MS: number;
3
+ export interface DemoTimeseriesOptions {
4
+ /** Number of points (default 30 — one month of dailies). */
5
+ points?: number;
6
+ /** Baseline magnitude (default 1200). */
7
+ base?: number;
8
+ /** Additive drift per step as a fraction of base (default +0.6%). */
9
+ drift?: number;
10
+ /** Random-walk volatility as a fraction of base (default 12%). */
11
+ volatility?: number;
12
+ /** Timestamp of the LAST point (default DEMO_EPOCH_MS). */
13
+ endMs?: number;
14
+ /** Milliseconds between points (default one day). */
15
+ stepMs?: number;
16
+ }
17
+ export interface DemoPoint {
18
+ x: Date;
19
+ y: number;
20
+ }
21
+ /** Random-walk daily series with weekday seasonality. */
22
+ export declare function demoTimeseries(seed: number, options?: DemoTimeseriesOptions): DemoPoint[];
23
+ /** Prior-period comparison for a series: same shape, dampened and offset. */
24
+ export declare function demoComparisonSeries(series: readonly DemoPoint[], seed: number): DemoPoint[];
25
+ export interface DemoCategory {
26
+ label: string;
27
+ value: number;
28
+ }
29
+ /** Categorical values in a plausible 40–140 band. */
30
+ export declare function demoCategorical(seed: number, categories?: readonly string[]): DemoCategory[];
31
+ export interface DemoGroupedBars {
32
+ categories: string[];
33
+ series: {
34
+ name: string;
35
+ values: number[];
36
+ }[];
37
+ }
38
+ /** Two-series grouped bars (this period vs prior, prior slightly lower). */
39
+ export declare function demoGroupedBars(seed: number, categories?: readonly string[]): DemoGroupedBars;
40
+ /** Part-to-whole slices with descending plausible weights. */
41
+ export declare function demoDonut(seed: number, labels?: readonly string[]): DemoCategory[];
42
+ /** 6–12 point micro-series for sparklines. */
43
+ export declare function demoSparkline(seed: number, points?: number): number[];
44
+ //# sourceMappingURL=generators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generators.d.ts","sourceRoot":"","sources":["../../src/demo/generators.ts"],"names":[],"mappings":"AAQA,gFAAgF;AAChF,eAAO,MAAM,aAAa,QAAwB,CAAC;AAMnD,MAAM,WAAW,qBAAqB;IACpC,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,CAAC,EAAE,IAAI,CAAC;IACR,CAAC,EAAE,MAAM,CAAC;CACX;AAED,yDAAyD;AACzD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,SAAS,EAAE,CAmB7F;AAED,6EAA6E;AAC7E,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,CAI5F;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAID,qDAAqD;AACrD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,GAAE,SAAS,MAAM,EAAuB,GAAG,YAAY,EAAE,CAGhH;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;CAC9C;AAED,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,GAAE,SAAS,MAAM,EAAuB,GAAG,eAAe,CAWjH;AAID,8DAA8D;AAC9D,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,SAAS,MAAM,EAAe,GAAG,YAAY,EAAE,CAQ9F;AAED,8CAA8C;AAC9C,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,MAAM,EAAE,CAOhE"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Deterministic demo-data generators (workplan/04-widget-registry.md §7.7).
3
+ * Same seed → identical payload, across processes and reloads: the time base
4
+ * is a fixed epoch, never `Date.now()`. Plausible ranges + weekday
5
+ * seasonality for timeseries.
6
+ */
7
+ import { mulberry32 } from './mulberry32.js';
8
+ /** Fixed anchor so demo timeseries are reproducible (last point lands here). */
9
+ export const DEMO_EPOCH_MS = Date.UTC(2026, 5, 30); // 2026-06-30T00:00:00Z
10
+ const DAY_MS = 86_400_000;
11
+ /** Sun..Sat traffic multipliers — weekend dip, midweek peak. */
12
+ const WEEKDAY_FACTOR = [0.62, 1.0, 1.06, 1.1, 1.08, 1.02, 0.7];
13
+ /** Random-walk daily series with weekday seasonality. */
14
+ export function demoTimeseries(seed, options = {}) {
15
+ const { points = 30, base = 1200, drift = 0.006, volatility = 0.12, endMs = DEMO_EPOCH_MS, stepMs = DAY_MS, } = options;
16
+ const random = mulberry32(seed);
17
+ const out = [];
18
+ let level = base;
19
+ for (let i = 0; i < points; i += 1) {
20
+ const date = new Date(endMs - (points - 1 - i) * stepMs);
21
+ level = Math.max(base * 0.15, level + (random() - 0.5) * 2 * volatility * base + drift * base);
22
+ const factor = stepMs === DAY_MS ? (WEEKDAY_FACTOR[date.getUTCDay()] ?? 1) : 1;
23
+ out.push({ x: date, y: Math.round(level * factor) });
24
+ }
25
+ return out;
26
+ }
27
+ /** Prior-period comparison for a series: same shape, dampened and offset. */
28
+ export function demoComparisonSeries(series, seed) {
29
+ const random = mulberry32(seed ^ 0x9e3779b9);
30
+ const scale = 0.72 + random() * 0.18;
31
+ return series.map((p) => ({ x: p.x, y: Math.round(p.y * scale * (0.9 + random() * 0.2)) }));
32
+ }
33
+ const DEFAULT_CATEGORIES = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'];
34
+ /** Categorical values in a plausible 40–140 band. */
35
+ export function demoCategorical(seed, categories = DEFAULT_CATEGORIES) {
36
+ const random = mulberry32(seed);
37
+ return categories.map((label) => ({ label, value: Math.round(40 + random() * 100) }));
38
+ }
39
+ /** Two-series grouped bars (this period vs prior, prior slightly lower). */
40
+ export function demoGroupedBars(seed, categories = DEFAULT_CATEGORIES) {
41
+ const random = mulberry32(seed);
42
+ const current = categories.map(() => Math.round(60 + random() * 90));
43
+ const previous = current.map((v) => Math.round(v * (0.62 + random() * 0.3)));
44
+ return {
45
+ categories: [...categories],
46
+ series: [
47
+ { name: 'Current', values: current },
48
+ { name: 'Previous', values: previous },
49
+ ],
50
+ };
51
+ }
52
+ const DEMO_PLANS = ['Free', 'Pro', 'Business', 'Enterprise'];
53
+ /** Part-to-whole slices with descending plausible weights. */
54
+ export function demoDonut(seed, labels = DEMO_PLANS) {
55
+ const random = mulberry32(seed);
56
+ let weight = 400 + random() * 300;
57
+ return labels.map((label) => {
58
+ const value = Math.round(weight);
59
+ weight *= 0.45 + random() * 0.25;
60
+ return { label, value };
61
+ });
62
+ }
63
+ /** 6–12 point micro-series for sparklines. */
64
+ export function demoSparkline(seed, points = 8) {
65
+ const random = mulberry32(seed);
66
+ let level = 40 + random() * 30;
67
+ return Array.from({ length: points }, () => {
68
+ level = Math.min(100, Math.max(8, level + (random() - 0.45) * 22));
69
+ return Math.round(level);
70
+ });
71
+ }
72
+ //# sourceMappingURL=generators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generators.js","sourceRoot":"","sources":["../../src/demo/generators.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Deterministic seeded PRNG + hash per workplan/04-widget-registry.md §7.7:
3
+ * seed = FNV-1a hash of the widget instance id → previews are stable across
4
+ * reloads and screenshot tests are reproducible.
5
+ */
6
+ /** Mulberry32 — tiny, fast, deterministic PRNG. Returns floats in [0, 1). */
7
+ export declare function mulberry32(seed: number): () => number;
8
+ /** FNV-1a 32-bit hash — maps widget instance ids to PRNG seeds. */
9
+ export declare function fnv1a(input: string): number;
10
+ //# sourceMappingURL=mulberry32.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mulberry32.d.ts","sourceRoot":"","sources":["../../src/demo/mulberry32.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,6EAA6E;AAC7E,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,MAAM,CASrD;AAED,mEAAmE;AACnE,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO3C"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Deterministic seeded PRNG + hash per workplan/04-widget-registry.md §7.7:
3
+ * seed = FNV-1a hash of the widget instance id → previews are stable across
4
+ * reloads and screenshot tests are reproducible.
5
+ */
6
+ /** Mulberry32 — tiny, fast, deterministic PRNG. Returns floats in [0, 1). */
7
+ export function mulberry32(seed) {
8
+ let a = seed >>> 0;
9
+ return () => {
10
+ a = (a + 0x6d2b79f5) >>> 0;
11
+ let t = a;
12
+ t = Math.imul(t ^ (t >>> 15), t | 1);
13
+ t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
14
+ return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
15
+ };
16
+ }
17
+ /** FNV-1a 32-bit hash — maps widget instance ids to PRNG seeds. */
18
+ export function fnv1a(input) {
19
+ let hash = 0x811c9dc5;
20
+ for (let i = 0; i < input.length; i += 1) {
21
+ hash ^= input.charCodeAt(i);
22
+ hash = Math.imul(hash, 0x01000193);
23
+ }
24
+ return hash >>> 0;
25
+ }
26
+ //# sourceMappingURL=mulberry32.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mulberry32.js","sourceRoot":"","sources":["../../src/demo/mulberry32.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,6EAA6E;AAC7E,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC;IACnB,OAAO,GAAG,EAAE;QACV,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACrC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC;IAC/C,CAAC,CAAC;AACJ,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,KAAK,CAAC,KAAa;IACjC,IAAI,IAAI,GAAG,UAAU,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,IAAI,KAAK,CAAC,CAAC;AACpB,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Anomaly-detection geometry (`chart-anomaly`, research/widget-registry.md §2):
3
+ * a centered moving-average "expected" line, a symmetric expected-range band
4
+ * from the residual spread, and z-score anomaly flags. Pure + DOM-free and
5
+ * fully deterministic (04 §7.1); `sensitivity` is the z-threshold.
6
+ */
7
+ export interface AnomalyModel {
8
+ /** Expected (smoothed) value per index. */
9
+ mid: number[];
10
+ /** Lower / upper expected-range edges (`mid ∓ sensitivity·σ`). */
11
+ lo: number[];
12
+ hi: number[];
13
+ /** Indices whose value lies outside the expected range. */
14
+ anomalies: number[];
15
+ }
16
+ /**
17
+ * `mid` = centered moving average (window `window`, default 7). σ = standard
18
+ * deviation of the residuals `value − mid`. A point is anomalous when its
19
+ * absolute residual exceeds `sensitivity·σ`.
20
+ */
21
+ export declare function anomalyModel(values: readonly number[], sensitivity?: number, window?: number): AnomalyModel;
22
+ //# sourceMappingURL=anomaly.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anomaly.d.ts","sourceRoot":"","sources":["../../src/geometry/anomaly.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,YAAY;IAC3B,2CAA2C;IAC3C,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,kEAAkE;IAClE,EAAE,EAAE,MAAM,EAAE,CAAC;IACb,EAAE,EAAE,MAAM,EAAE,CAAC;IACb,2DAA2D;IAC3D,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAmBD;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,WAAW,SAAI,EACf,MAAM,SAAI,GACT,YAAY,CAuBd"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Anomaly-detection geometry (`chart-anomaly`, research/widget-registry.md §2):
3
+ * a centered moving-average "expected" line, a symmetric expected-range band
4
+ * from the residual spread, and z-score anomaly flags. Pure + DOM-free and
5
+ * fully deterministic (04 §7.1); `sensitivity` is the z-threshold.
6
+ */
7
+ /** Centered moving average with a clamped window at the series ends. */
8
+ function centeredMovingAverage(values, window) {
9
+ const n = values.length;
10
+ const half = Math.floor(window / 2);
11
+ const out = [];
12
+ for (let i = 0; i < n; i += 1) {
13
+ let sum = 0;
14
+ let count = 0;
15
+ for (let j = Math.max(0, i - half); j <= Math.min(n - 1, i + half); j += 1) {
16
+ sum += values[j] ?? 0;
17
+ count += 1;
18
+ }
19
+ out.push(count === 0 ? 0 : sum / count);
20
+ }
21
+ return out;
22
+ }
23
+ /**
24
+ * `mid` = centered moving average (window `window`, default 7). σ = standard
25
+ * deviation of the residuals `value − mid`. A point is anomalous when its
26
+ * absolute residual exceeds `sensitivity·σ`.
27
+ */
28
+ export function anomalyModel(values, sensitivity = 2, window = 7) {
29
+ const n = values.length;
30
+ if (n === 0)
31
+ return { mid: [], lo: [], hi: [], anomalies: [] };
32
+ const mid = centeredMovingAverage(values, window);
33
+ let sse = 0;
34
+ for (let i = 0; i < n; i += 1) {
35
+ const residual = (values[i] ?? 0) - (mid[i] ?? 0);
36
+ sse += residual * residual;
37
+ }
38
+ const sigma = Math.sqrt(sse / n);
39
+ const spread = sensitivity * sigma;
40
+ const lo = [];
41
+ const hi = [];
42
+ const anomalies = [];
43
+ for (let i = 0; i < n; i += 1) {
44
+ const m = mid[i] ?? 0;
45
+ lo.push(m - spread);
46
+ hi.push(m + spread);
47
+ if (sigma > 0 && Math.abs((values[i] ?? 0) - m) > spread)
48
+ anomalies.push(i);
49
+ }
50
+ return { mid, lo, hi, anomalies };
51
+ }
52
+ //# sourceMappingURL=anomaly.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anomaly.js","sourceRoot":"","sources":["../../src/geometry/anomaly.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ export interface BarRect {
2
+ x: number;
3
+ y: number;
4
+ width: number;
5
+ height: number;
6
+ categoryIndex: number;
7
+ seriesIndex: number;
8
+ value: number;
9
+ }
10
+ export interface CategoryCenter {
11
+ label: string;
12
+ x: number;
13
+ }
14
+ export interface BarLayout {
15
+ bars: BarRect[];
16
+ categoryCenters: CategoryCenter[];
17
+ /** Nice y tick values (ascending). */
18
+ yTicks: number[];
19
+ /** Pixel y for a value (for gridlines/labels). */
20
+ yFor: (value: number) => number;
21
+ /** Pixel y of the zero baseline. */
22
+ baselineY: number;
23
+ }
24
+ export interface BarLayoutOptions {
25
+ categories: readonly string[];
26
+ /** One series = plain columns; two = grouped mode. */
27
+ series: readonly (readonly number[])[];
28
+ width: number;
29
+ height: number;
30
+ rtl: boolean;
31
+ paddingInner?: number;
32
+ paddingOuter?: number;
33
+ /** Gap between grouped bars within a category, px (default 3). */
34
+ groupGap?: number;
35
+ tickCount?: number;
36
+ }
37
+ /**
38
+ * Categorical column layout. In RTL the category order mirrors (first
39
+ * category at inline-start) via the band-scale range flip; grouped series
40
+ * order also mirrors inside each band so series[0] stays at inline-start.
41
+ */
42
+ export declare function layoutBars(options: BarLayoutOptions): BarLayout;
43
+ export type HighlightMode = 'max' | 'current' | 'none';
44
+ /** Index of the highlighted category: max value, last bucket, or none (-1). */
45
+ export declare function highlightIndex(values: readonly number[], mode: HighlightMode): number;
46
+ //# sourceMappingURL=bars.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bars.d.ts","sourceRoot":"","sources":["../../src/geometry/bars.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,OAAO;IACtB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,sCAAsC;IACtC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,kDAAkD;IAClD,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAChC,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,sDAAsD;IACtD,MAAM,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CA0D/D;AAED,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,SAAS,GAAG,MAAM,CAAC;AAEvD,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,CAQrF"}
@@ -0,0 +1,68 @@
1
+ /** Pure bar/column layout — no DOM, reusable by server-side report rendering. */
2
+ import { categoricalBandScale } from './scales.js';
3
+ import { extent, niceTicks } from '../utils/stats.js';
4
+ /**
5
+ * Categorical column layout. In RTL the category order mirrors (first
6
+ * category at inline-start) via the band-scale range flip; grouped series
7
+ * order also mirrors inside each band so series[0] stays at inline-start.
8
+ */
9
+ export function layoutBars(options) {
10
+ const { categories, series, width, height, rtl, paddingInner = 0.3, paddingOuter = 0.15, groupGap = 3, tickCount = 3, } = options;
11
+ const all = series.flatMap((s) => [...s]);
12
+ const [minValue, maxValue] = extent(all) ?? [0, 1];
13
+ const lo = Math.min(0, minValue);
14
+ const hi = Math.max(0, maxValue);
15
+ const yTicks = lo === hi ? [lo, lo + 1] : niceTicks(lo, hi, tickCount);
16
+ const domainLo = yTicks[0] ?? lo;
17
+ const domainHi = yTicks.at(-1) ?? hi;
18
+ const span = domainHi - domainLo || 1;
19
+ const yFor = (value) => height - ((value - domainLo) / span) * height;
20
+ const baselineY = yFor(0);
21
+ const band = categoricalBandScale(categories, width, rtl, { paddingInner, paddingOuter });
22
+ const bandwidth = band.bandwidth();
23
+ const seriesCount = Math.max(1, series.length);
24
+ const slotWidth = seriesCount === 1 ? bandwidth : (bandwidth - groupGap * (seriesCount - 1)) / seriesCount;
25
+ const bars = [];
26
+ categories.forEach((category, categoryIndex) => {
27
+ const bandStart = band(category);
28
+ if (bandStart === undefined)
29
+ return;
30
+ series.forEach((values, seriesIndex) => {
31
+ const value = values[categoryIndex];
32
+ if (value === undefined)
33
+ return;
34
+ // Mirror series order inside the group in RTL so series[0] stays at inline-start.
35
+ const slot = rtl ? seriesCount - 1 - seriesIndex : seriesIndex;
36
+ const x = bandStart + slot * (slotWidth + groupGap);
37
+ const yValue = yFor(value);
38
+ bars.push({
39
+ x,
40
+ y: Math.min(yValue, baselineY),
41
+ width: Math.max(0, slotWidth),
42
+ height: Math.abs(yValue - baselineY),
43
+ categoryIndex,
44
+ seriesIndex,
45
+ value,
46
+ });
47
+ });
48
+ });
49
+ const categoryCenters = categories.map((label) => ({
50
+ label,
51
+ x: (band(label) ?? 0) + bandwidth / 2,
52
+ }));
53
+ return { bars, categoryCenters, yTicks, yFor, baselineY };
54
+ }
55
+ /** Index of the highlighted category: max value, last bucket, or none (-1). */
56
+ export function highlightIndex(values, mode) {
57
+ if (mode === 'none' || values.length === 0)
58
+ return -1;
59
+ if (mode === 'current')
60
+ return values.length - 1;
61
+ let best = 0;
62
+ values.forEach((v, i) => {
63
+ if (v > (values[best] ?? -Infinity))
64
+ best = i;
65
+ });
66
+ return best;
67
+ }
68
+ //# sourceMappingURL=bars.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bars.js","sourceRoot":"","sources":["../../src/geometry/bars.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Pure bullet-graph layout (`chart-bullet`, research/widget-registry.md §2):
3
+ * per row a stack of qualitative bands + a measure bar + a target tick. DOM-free.
4
+ * The horizontal value axis mirrors in RTL (annex §7.4): bands/measure anchor at
5
+ * inline-start (the right edge under `rtl`) and grow toward inline-end.
6
+ */
7
+ export interface BulletInput {
8
+ label: string;
9
+ measure: number;
10
+ target: number;
11
+ /** Axis maximum; defaults to the largest of measure/target/cutoffs. */
12
+ max?: number;
13
+ /** Ascending band boundaries in value units, e.g. [40, 75] → 3 zones. */
14
+ bandCutoffs?: readonly number[];
15
+ }
16
+ export interface BulletBand {
17
+ index: number;
18
+ /** Band inline-start x. */
19
+ x: number;
20
+ width: number;
21
+ /** 0..1 intensity, lightest → strongest. */
22
+ level: number;
23
+ }
24
+ export interface BulletRow {
25
+ index: number;
26
+ label: string;
27
+ measure: number;
28
+ target: number;
29
+ max: number;
30
+ rowY: number;
31
+ /** Track (bands) rect. */
32
+ trackY: number;
33
+ trackHeight: number;
34
+ bands: BulletBand[];
35
+ /** Measure bar (inline-start anchored). */
36
+ measureX: number;
37
+ measureWidth: number;
38
+ measureY: number;
39
+ measureHeight: number;
40
+ /** Target tick x. */
41
+ targetX: number;
42
+ }
43
+ export interface BulletLayout {
44
+ rows: BulletRow[];
45
+ rowHeight: number;
46
+ }
47
+ export interface BulletLayoutOptions {
48
+ width: number;
49
+ height: number;
50
+ rtl: boolean;
51
+ }
52
+ export declare function layoutBullet(items: readonly BulletInput[], options: BulletLayoutOptions): BulletLayout;
53
+ //# sourceMappingURL=bullet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bullet.d.ts","sourceRoot":"","sources":["../../src/geometry/bullet.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;CACd;AAcD,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,OAAO,EAAE,mBAAmB,GAAG,YAAY,CAoDtG"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Pure bullet-graph layout (`chart-bullet`, research/widget-registry.md §2):
3
+ * per row a stack of qualitative bands + a measure bar + a target tick. DOM-free.
4
+ * The horizontal value axis mirrors in RTL (annex §7.4): bands/measure anchor at
5
+ * inline-start (the right edge under `rtl`) and grow toward inline-end.
6
+ */
7
+ /** Map a value in [0, max] to an inline-start-anchored pixel length. */
8
+ function lengthFor(value, max, width) {
9
+ if (max <= 0)
10
+ return 0;
11
+ return (Math.max(0, Math.min(value, max)) / max) * width;
12
+ }
13
+ /** Map a value to a pixel x honoring the RTL axis flip. */
14
+ function xFor(value, max, width, rtl) {
15
+ const len = lengthFor(value, max, width);
16
+ return rtl ? width - len : len;
17
+ }
18
+ export function layoutBullet(items, options) {
19
+ const { width, height, rtl } = options;
20
+ const n = items.length;
21
+ if (n === 0 || width <= 0 || height <= 0)
22
+ return { rows: [], rowHeight: 0 };
23
+ const rowHeight = height / n;
24
+ const trackHeight = Math.max(6, rowHeight * 0.55);
25
+ const measureHeight = Math.max(3, trackHeight * 0.34);
26
+ const rows = items.map((item, index) => {
27
+ const cutoffs = [...(item.bandCutoffs ?? [])].filter((c) => c > 0).sort((a, b) => a - b);
28
+ const max = item.max ?? Math.max(item.measure, item.target, cutoffs.at(-1) ?? 0, 1);
29
+ const rowY = index * rowHeight;
30
+ const trackY = rowY + (rowHeight - trackHeight) / 2;
31
+ // Band edges: 0, ...cutoffs, max → contiguous zones.
32
+ const edges = [0, ...cutoffs.filter((c) => c < max), max];
33
+ const zoneCount = edges.length - 1;
34
+ const bands = [];
35
+ for (let i = 0; i < zoneCount; i += 1) {
36
+ const lo = edges[i] ?? 0;
37
+ const hi = edges[i + 1] ?? max;
38
+ const xLo = xFor(lo, max, width, rtl);
39
+ const xHi = xFor(hi, max, width, rtl);
40
+ bands.push({
41
+ index: i,
42
+ x: Math.min(xLo, xHi),
43
+ width: Math.abs(xHi - xLo),
44
+ level: zoneCount <= 1 ? 1 : i / (zoneCount - 1),
45
+ });
46
+ }
47
+ const measureLen = lengthFor(item.measure, max, width);
48
+ return {
49
+ index,
50
+ label: item.label,
51
+ measure: item.measure,
52
+ target: item.target,
53
+ max,
54
+ rowY,
55
+ trackY,
56
+ trackHeight,
57
+ bands,
58
+ measureX: rtl ? width - measureLen : 0,
59
+ measureWidth: measureLen,
60
+ measureY: rowY + (rowHeight - measureHeight) / 2,
61
+ measureHeight,
62
+ targetX: xFor(item.target, max, width, rtl),
63
+ };
64
+ });
65
+ return { rows, rowHeight };
66
+ }
67
+ //# sourceMappingURL=bullet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bullet.js","sourceRoot":"","sources":["../../src/geometry/bullet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Bump-chart geometry (`chart-bump`, research/widget-registry.md §2): rank
3
+ * over ordered periods, rank 1 pinned to the top. Ranks are a discrete
4
+ * categorical/ordinal axis, so the period axis MIRRORS in RTL (04 §7.4 —
5
+ * "rankings mirror"). Pure + DOM-free.
6
+ */
7
+ import type { XYPoint } from './lineArea.js';
8
+ export interface BumpSeries {
9
+ key: string;
10
+ label: string;
11
+ /** Rank per period (1 = best). `null` = the entity is absent that period. */
12
+ ranks: readonly (number | null)[];
13
+ }
14
+ export interface BumpLine {
15
+ key: string;
16
+ label: string;
17
+ /** Plotted points (null ranks skipped). */
18
+ points: XYPoint[];
19
+ /** First / last present points — anchors for start/end labels + dots. */
20
+ start: (XYPoint & {
21
+ rank: number;
22
+ }) | null;
23
+ end: (XYPoint & {
24
+ rank: number;
25
+ }) | null;
26
+ }
27
+ export interface BumpLayout {
28
+ lines: BumpLine[];
29
+ /** Period index → pixel x (mirrored in RTL). */
30
+ xForPeriod: (index: number) => number;
31
+ /** Rank → pixel y (rank 1 at top). */
32
+ yForRank: (rank: number) => number;
33
+ periods: number;
34
+ maxRank: number;
35
+ }
36
+ /**
37
+ * Lay out one polyline per entity. `periods` and `maxRank` fix the axes so
38
+ * every series shares a grid even when some are absent in a period. In RTL the
39
+ * period axis reverses (period 0 at inline-start / the right edge).
40
+ */
41
+ export declare function layoutBump(series: readonly BumpSeries[], periods: number, maxRank: number, width: number, height: number, rtl: boolean): BumpLayout;
42
+ //# sourceMappingURL=bump.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bump.d.ts","sourceRoot":"","sources":["../../src/geometry/bump.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,KAAK,EAAE,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,yEAAyE;IACzE,KAAK,EAAE,CAAC,OAAO,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IAC3C,GAAG,EAAE,CAAC,OAAO,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;CAC1C;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,gDAAgD;IAChD,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACtC,sCAAsC;IACtC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,SAAS,UAAU,EAAE,EAC7B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,OAAO,GACX,UAAU,CAuBZ"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Lay out one polyline per entity. `periods` and `maxRank` fix the axes so
3
+ * every series shares a grid even when some are absent in a period. In RTL the
4
+ * period axis reverses (period 0 at inline-start / the right edge).
5
+ */
6
+ export function layoutBump(series, periods, maxRank, width, height, rtl) {
7
+ const step = periods > 1 ? width / (periods - 1) : 0;
8
+ const xForPeriod = (index) => (rtl ? width - index * step : index * step);
9
+ // Rank 1 → top row center; rank maxRank → bottom row center (band per rank).
10
+ const rowHeight = maxRank > 0 ? height / maxRank : height;
11
+ const yForRank = (rank) => (rank - 0.5) * rowHeight;
12
+ const lines = series.map((entity) => {
13
+ const points = [];
14
+ entity.ranks.forEach((rank, index) => {
15
+ if (rank === null || index >= periods)
16
+ return;
17
+ points.push({ x: xForPeriod(index), y: yForRank(rank), rank });
18
+ });
19
+ return {
20
+ key: entity.key,
21
+ label: entity.label,
22
+ points: points.map(({ x, y }) => ({ x, y })),
23
+ start: points[0] ?? null,
24
+ end: points.at(-1) ?? null,
25
+ };
26
+ });
27
+ return { lines, xForPeriod, yForRank, periods, maxRank };
28
+ }
29
+ //# sourceMappingURL=bump.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bump.js","sourceRoot":"","sources":["../../src/geometry/bump.ts"],"names":[],"mappings":"AAmCA;;;;GAIG;AACH,MAAM,UAAU,UAAU,CACxB,MAA6B,EAC7B,OAAe,EACf,OAAe,EACf,KAAa,EACb,MAAc,EACd,GAAY;IAEZ,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAClF,6EAA6E;IAC7E,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1D,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,SAAS,CAAC;IAE5D,MAAM,KAAK,GAAe,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QAC9C,MAAM,MAAM,GAAmC,EAAE,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACnC,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,OAAO;gBAAE,OAAO;YAC9C,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QACH,OAAO;YACL,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5C,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI;YACxB,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI;SAC3B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC3D,CAAC"}