@stealthscale/component-charts 0.2.2 → 0.2.3

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 (123) hide show
  1. package/dist/cyclonedx/bom.json +1 -1
  2. package/dist/index.js +1 -14710
  3. package/dist/pages/area-chart/area-chart.js +1151 -0
  4. package/dist/pages/area-chart/area-chart.props.js +3 -0
  5. package/dist/pages/bar-chart/bar-chart.js +990 -0
  6. package/dist/pages/bar-chart/bar-chart.props.js +3 -0
  7. package/dist/pages/box-plot/box-plot.js +1585 -0
  8. package/dist/pages/box-plot/box-plot.props.js +3 -0
  9. package/dist/pages/bubble-chart/bubble-chart.js +938 -0
  10. package/dist/pages/bubble-chart/bubble-chart.props.js +3 -0
  11. package/dist/pages/burndown-chart/burndown-chart.js +805 -0
  12. package/dist/pages/burndown-chart/burndown-chart.props.js +3 -0
  13. package/dist/pages/candlestick-chart/candlestick-chart.js +853 -0
  14. package/dist/pages/candlestick-chart/candlestick-chart.props.js +3 -0
  15. package/dist/pages/chart/chart.js +1190 -0
  16. package/dist/pages/chart/chart.props.js +3 -0
  17. package/dist/pages/chord-diagram/chord-diagram.js +891 -0
  18. package/dist/pages/chord-diagram/chord-diagram.props.js +3 -0
  19. package/dist/pages/combo-chart/combo-chart.js +873 -0
  20. package/dist/pages/combo-chart/combo-chart.props.js +3 -0
  21. package/dist/pages/distribution-chart/distribution-chart.js +1066 -0
  22. package/dist/pages/distribution-chart/distribution-chart.props.js +3 -0
  23. package/dist/pages/donut-chart/donut-chart.js +726 -0
  24. package/dist/pages/donut-chart/donut-chart.props.js +3 -0
  25. package/dist/pages/funnel-chart/funnel-chart.js +1094 -0
  26. package/dist/pages/funnel-chart/funnel-chart.props.js +3 -0
  27. package/dist/pages/gauge-chart/gauge-chart.js +767 -0
  28. package/dist/pages/gauge-chart/gauge-chart.props.js +3 -0
  29. package/dist/pages/heatmap/heatmap.js +1967 -0
  30. package/dist/pages/heatmap/heatmap.props.js +3 -0
  31. package/dist/pages/histogram-chart/histogram-chart.js +768 -0
  32. package/dist/pages/histogram-chart/histogram-chart.props.js +3 -0
  33. package/dist/pages/horizontal-bar-chart/horizontal-bar-chart.js +701 -0
  34. package/dist/pages/horizontal-bar-chart/horizontal-bar-chart.props.js +3 -0
  35. package/dist/pages/line-chart/line-chart.js +1882 -0
  36. package/dist/pages/line-chart/line-chart.props.js +3 -0
  37. package/dist/pages/pages.json +393 -0
  38. package/dist/pages/pareto-chart/pareto-chart.js +669 -0
  39. package/dist/pages/pareto-chart/pareto-chart.props.js +3 -0
  40. package/dist/pages/percent-stacked-bar/percent-stacked-bar.js +662 -0
  41. package/dist/pages/percent-stacked-bar/percent-stacked-bar.props.js +3 -0
  42. package/dist/pages/pie-chart/pie-chart.js +1007 -0
  43. package/dist/pages/pie-chart/pie-chart.props.js +3 -0
  44. package/dist/pages/polar-area-chart/polar-area-chart.js +812 -0
  45. package/dist/pages/polar-area-chart/polar-area-chart.props.js +3 -0
  46. package/dist/pages/radar-chart/radar-chart.js +1101 -0
  47. package/dist/pages/radar-chart/radar-chart.props.js +3 -0
  48. package/dist/pages/radial-bar-chart/radial-bar-chart.js +766 -0
  49. package/dist/pages/radial-bar-chart/radial-bar-chart.props.js +3 -0
  50. package/dist/pages/range-chart/range-chart.js +914 -0
  51. package/dist/pages/range-chart/range-chart.props.js +3 -0
  52. package/dist/pages/regression-overlay/regression-overlay.js +494 -0
  53. package/dist/pages/regression-overlay/regression-overlay.props.js +3 -0
  54. package/dist/pages/sankey-chart/sankey-chart.js +700 -0
  55. package/dist/pages/sankey-chart/sankey-chart.props.js +3 -0
  56. package/dist/pages/scatter-plot/scatter-plot.js +1248 -0
  57. package/dist/pages/scatter-plot/scatter-plot.props.js +3 -0
  58. package/dist/pages/sparkbar/sparkbar.js +629 -0
  59. package/dist/pages/sparkbar/sparkbar.props.js +3 -0
  60. package/dist/pages/sparkline/sparkline.js +960 -0
  61. package/dist/pages/sparkline/sparkline.props.js +3 -0
  62. package/dist/pages/spend-5xQ76WSj.js +185 -0
  63. package/dist/pages/stacked-area-chart/stacked-area-chart.js +912 -0
  64. package/dist/pages/stacked-area-chart/stacked-area-chart.props.js +3 -0
  65. package/dist/pages/stacked-bar-chart/stacked-bar-chart.js +722 -0
  66. package/dist/pages/stacked-bar-chart/stacked-bar-chart.props.js +3 -0
  67. package/dist/pages/step-line-chart/step-line-chart.js +573 -0
  68. package/dist/pages/step-line-chart/step-line-chart.props.js +3 -0
  69. package/dist/pages/stream-graph/stream-graph.js +1662 -0
  70. package/dist/pages/stream-graph/stream-graph.props.js +3 -0
  71. package/dist/pages/sunburst-chart/sunburst-chart.js +1051 -0
  72. package/dist/pages/sunburst-chart/sunburst-chart.props.js +3 -0
  73. package/dist/pages/timeline-chart/timeline-chart.js +1124 -0
  74. package/dist/pages/timeline-chart/timeline-chart.props.js +3 -0
  75. package/dist/pages/treemap-chart/treemap-chart.js +904 -0
  76. package/dist/pages/treemap-chart/treemap-chart.props.js +3 -0
  77. package/dist/pages/violin-plot/violin-plot.js +1303 -0
  78. package/dist/pages/violin-plot/violin-plot.props.js +3 -0
  79. package/dist/pages/visitors-oFFVcbIZ.js +248 -0
  80. package/dist/pages/waterfall-chart/waterfall-chart.js +1195 -0
  81. package/dist/pages/waterfall-chart/waterfall-chart.props.js +3 -0
  82. package/dist/shared-DVZJ2nST.js +14711 -0
  83. package/dist/theme.js +1 -1
  84. package/locales/en/specimen/area-chart.json +56 -0
  85. package/locales/en/specimen/bar-chart.json +56 -0
  86. package/locales/en/specimen/box-plot.json +65 -0
  87. package/locales/en/specimen/bubble-chart.json +47 -0
  88. package/locales/en/specimen/burndown-chart.json +46 -0
  89. package/locales/en/specimen/candlestick-chart.json +42 -0
  90. package/locales/en/specimen/chart.json +53 -0
  91. package/locales/en/specimen/chord-diagram.json +69 -0
  92. package/locales/en/specimen/combo-chart.json +41 -0
  93. package/locales/en/specimen/distribution-chart.json +47 -0
  94. package/locales/en/specimen/donut-chart.json +63 -0
  95. package/locales/en/specimen/funnel-chart.json +84 -0
  96. package/locales/en/specimen/gauge-chart.json +68 -0
  97. package/locales/en/specimen/heatmap.json +187 -0
  98. package/locales/en/specimen/histogram-chart.json +48 -0
  99. package/locales/en/specimen/horizontal-bar-chart.json +54 -0
  100. package/locales/en/specimen/line-chart.json +106 -0
  101. package/locales/en/specimen/pareto-chart.json +43 -0
  102. package/locales/en/specimen/percent-stacked-bar.json +37 -0
  103. package/locales/en/specimen/pie-chart.json +80 -0
  104. package/locales/en/specimen/polar-area-chart.json +90 -0
  105. package/locales/en/specimen/radar-chart.json +82 -0
  106. package/locales/en/specimen/radial-bar-chart.json +62 -0
  107. package/locales/en/specimen/range-chart.json +42 -0
  108. package/locales/en/specimen/regression-overlay.json +36 -0
  109. package/locales/en/specimen/sankey-chart.json +89 -0
  110. package/locales/en/specimen/scatter-plot.json +88 -0
  111. package/locales/en/specimen/sparkbar.json +51 -0
  112. package/locales/en/specimen/sparkline.json +70 -0
  113. package/locales/en/specimen/stacked-area-chart.json +44 -0
  114. package/locales/en/specimen/stacked-bar-chart.json +34 -0
  115. package/locales/en/specimen/step-line-chart.json +33 -0
  116. package/locales/en/specimen/stream-graph.json +54 -0
  117. package/locales/en/specimen/sunburst-chart.json +110 -0
  118. package/locales/en/specimen/timeline-chart.json +77 -0
  119. package/locales/en/specimen/treemap-chart.json +107 -0
  120. package/locales/en/specimen/violin-plot.json +54 -0
  121. package/locales/en/specimen/waterfall-chart.json +71 -0
  122. package/package.json +8 -7
  123. /package/dist/{recipe-BbGw00ut.js → recipes-BbGw00ut.js} +0 -0
@@ -0,0 +1,914 @@
1
+ import { t as __exportAll } from "../../rolldown-runtime-D7D4PA-g.js";
2
+ import { C as RangeChart } from "../../shared-DVZJ2nST.js";
3
+ import { c } from "react/compiler-runtime";
4
+ import { useState } from "react";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { Room, specimen, useWords } from "@stealthscale/specimen";
7
+ import { RotateCcwIcon } from "lucide-react";
8
+ import { Button } from "@stealthscale/component-actions";
9
+ import { Stack } from "@stealthscale/component-layout";
10
+ //#region src/range-chart/examples/forecast.example.tsx
11
+ var forecast_example_exports = /* @__PURE__ */ __exportAll({
12
+ Forecast: () => Forecast,
13
+ source: () => source$4
14
+ });
15
+ const WEEKS$2 = [
16
+ {
17
+ actual: 12400,
18
+ week: "2026-07-06"
19
+ },
20
+ {
21
+ actual: 12900,
22
+ week: "2026-07-13"
23
+ },
24
+ {
25
+ actual: 13100,
26
+ week: "2026-07-20"
27
+ },
28
+ {
29
+ actual: 13800,
30
+ week: "2026-07-27"
31
+ },
32
+ {
33
+ actual: 14200,
34
+ week: "2026-08-03"
35
+ },
36
+ {
37
+ actual: 14100,
38
+ week: "2026-08-10"
39
+ },
40
+ {
41
+ actual: 14700,
42
+ week: "2026-08-17"
43
+ },
44
+ {
45
+ actual: 15100,
46
+ forecast: 15100,
47
+ high: 15100,
48
+ low: 15100,
49
+ week: "2026-08-24"
50
+ },
51
+ {
52
+ forecast: 15500,
53
+ high: 16100,
54
+ low: 14900,
55
+ week: "2026-08-31"
56
+ },
57
+ {
58
+ forecast: 15900,
59
+ high: 16800,
60
+ low: 15e3,
61
+ week: "2026-09-07"
62
+ },
63
+ {
64
+ forecast: 16300,
65
+ high: 17400,
66
+ low: 15200,
67
+ week: "2026-09-14"
68
+ },
69
+ {
70
+ forecast: 16700,
71
+ high: 18100,
72
+ low: 15300,
73
+ week: "2026-09-21"
74
+ },
75
+ {
76
+ forecast: 17100,
77
+ high: 18800,
78
+ low: 15400,
79
+ week: "2026-09-28"
80
+ },
81
+ {
82
+ forecast: 17500,
83
+ high: 19500,
84
+ low: 15500,
85
+ week: "2026-10-05"
86
+ }
87
+ ];
88
+ function Forecast() {
89
+ const $ = c(29);
90
+ const { t } = useWords("range-chart");
91
+ let t0;
92
+ if ($[0] !== t) {
93
+ t0 = t("forecast.interval");
94
+ $[0] = t;
95
+ $[1] = t0;
96
+ } else t0 = $[1];
97
+ let t1;
98
+ if ($[2] !== t0) {
99
+ t1 = {
100
+ high: "high",
101
+ key: "interval",
102
+ label: t0,
103
+ low: "low"
104
+ };
105
+ $[2] = t0;
106
+ $[3] = t1;
107
+ } else t1 = $[3];
108
+ let t2;
109
+ if ($[4] !== t) {
110
+ t2 = t("forecast.caption");
111
+ $[4] = t;
112
+ $[5] = t2;
113
+ } else t2 = $[5];
114
+ let t3;
115
+ if ($[6] !== t) {
116
+ t3 = t("forecast.label");
117
+ $[6] = t;
118
+ $[7] = t3;
119
+ } else t3 = $[7];
120
+ let t4;
121
+ if ($[8] === Symbol.for("react.memo_cache_sentinel")) {
122
+ t4 = {
123
+ day: "numeric",
124
+ month: "short",
125
+ timeZone: "UTC"
126
+ };
127
+ $[8] = t4;
128
+ } else t4 = $[8];
129
+ let t5;
130
+ if ($[9] !== t) {
131
+ t5 = t("series");
132
+ $[9] = t;
133
+ $[10] = t5;
134
+ } else t5 = $[10];
135
+ let t6;
136
+ if ($[11] !== t) {
137
+ t6 = t("forecast.actual");
138
+ $[11] = t;
139
+ $[12] = t6;
140
+ } else t6 = $[12];
141
+ let t7;
142
+ if ($[13] !== t6) {
143
+ t7 = {
144
+ key: "actual",
145
+ label: t6
146
+ };
147
+ $[13] = t6;
148
+ $[14] = t7;
149
+ } else t7 = $[14];
150
+ let t8;
151
+ if ($[15] !== t) {
152
+ t8 = t("forecast.forecast");
153
+ $[15] = t;
154
+ $[16] = t8;
155
+ } else t8 = $[16];
156
+ let t9;
157
+ if ($[17] !== t8) {
158
+ t9 = {
159
+ dashed: true,
160
+ key: "forecast",
161
+ label: t8
162
+ };
163
+ $[17] = t8;
164
+ $[18] = t9;
165
+ } else t9 = $[18];
166
+ let t10;
167
+ if ($[19] !== t7 || $[20] !== t9) {
168
+ t10 = [t7, t9];
169
+ $[19] = t7;
170
+ $[20] = t9;
171
+ $[21] = t10;
172
+ } else t10 = $[21];
173
+ let t11;
174
+ if ($[22] === Symbol.for("react.memo_cache_sentinel")) {
175
+ t11 = [1e4, 2e4];
176
+ $[22] = t11;
177
+ } else t11 = $[22];
178
+ let t12;
179
+ if ($[23] !== t1 || $[24] !== t10 || $[25] !== t2 || $[26] !== t3 || $[27] !== t5) {
180
+ t12 = /* @__PURE__ */ jsx(RangeChart, {
181
+ band: t1,
182
+ caption: t2,
183
+ categoryKey: "week",
184
+ data: WEEKS$2,
185
+ label: t3,
186
+ labelOptions: t4,
187
+ legendLabel: t5,
188
+ series: t10,
189
+ valueDomain: t11
190
+ });
191
+ $[23] = t1;
192
+ $[24] = t10;
193
+ $[25] = t2;
194
+ $[26] = t3;
195
+ $[27] = t5;
196
+ $[28] = t12;
197
+ } else t12 = $[28];
198
+ return t12;
199
+ }
200
+ const source$4 = "import { type ReactElement } from \"react\";\n\nimport { useWords } from \"@stealthscale/specimen\";\n\nimport { RangeChart } from \"@stealthscale/component-charts\";\n\nconst WEEKS = [\n { actual: 12_400, week: \"2026-07-06\" },\n { actual: 12_900, week: \"2026-07-13\" },\n { actual: 13_100, week: \"2026-07-20\" },\n { actual: 13_800, week: \"2026-07-27\" },\n { actual: 14_200, week: \"2026-08-03\" },\n { actual: 14_100, week: \"2026-08-10\" },\n { actual: 14_700, week: \"2026-08-17\" },\n { actual: 15_100, forecast: 15_100, high: 15_100, low: 15_100, week: \"2026-08-24\" },\n { forecast: 15_500, high: 16_100, low: 14_900, week: \"2026-08-31\" },\n { forecast: 15_900, high: 16_800, low: 15_000, week: \"2026-09-07\" },\n { forecast: 16_300, high: 17_400, low: 15_200, week: \"2026-09-14\" },\n { forecast: 16_700, high: 18_100, low: 15_300, week: \"2026-09-21\" },\n { forecast: 17_100, high: 18_800, low: 15_400, week: \"2026-09-28\" },\n { forecast: 17_500, high: 19_500, low: 15_500, week: \"2026-10-05\" },\n];\n\nexport function Forecast(): ReactElement {\n const { t } = useWords(\"range-chart\");\n\n return (\n <RangeChart\n band={{ high: \"high\", key: \"interval\", label: t(\"forecast.interval\"), low: \"low\" }}\n caption={t(\"forecast.caption\")}\n categoryKey=\"week\"\n data={WEEKS}\n label={t(\"forecast.label\")}\n labelOptions={{ day: \"numeric\", month: \"short\", timeZone: \"UTC\" }}\n legendLabel={t(\"series\")}\n series={[\n { key: \"actual\", label: t(\"forecast.actual\") },\n { dashed: true, key: \"forecast\", label: t(\"forecast.forecast\") },\n ]}\n valueDomain={[10_000, 20_000]}\n />\n );\n}\n";
201
+ //#endregion
202
+ //#region src/range-chart/examples/horizon.example.tsx
203
+ var horizon_example_exports = /* @__PURE__ */ __exportAll({
204
+ Horizon: () => Horizon,
205
+ source: () => source$3
206
+ });
207
+ const WEEKS$1 = [
208
+ {
209
+ actual: 12400,
210
+ week: "2026-07-06"
211
+ },
212
+ {
213
+ actual: 12900,
214
+ week: "2026-07-13"
215
+ },
216
+ {
217
+ actual: 13100,
218
+ week: "2026-07-20"
219
+ },
220
+ {
221
+ actual: 13800,
222
+ week: "2026-07-27"
223
+ },
224
+ {
225
+ actual: 14200,
226
+ week: "2026-08-03"
227
+ },
228
+ {
229
+ actual: 14100,
230
+ week: "2026-08-10"
231
+ },
232
+ {
233
+ actual: 14700,
234
+ week: "2026-08-17"
235
+ },
236
+ {
237
+ actual: 15100,
238
+ forecast: 15100,
239
+ high: 15100,
240
+ low: 15100,
241
+ week: "2026-08-24"
242
+ },
243
+ {
244
+ forecast: 15500,
245
+ high: 16100,
246
+ low: 14900,
247
+ week: "2026-08-31"
248
+ },
249
+ {
250
+ forecast: 15900,
251
+ high: 16800,
252
+ low: 15e3,
253
+ week: "2026-09-07"
254
+ },
255
+ {
256
+ forecast: 16300,
257
+ high: 17400,
258
+ low: 15200,
259
+ week: "2026-09-14"
260
+ },
261
+ {
262
+ forecast: 16700,
263
+ high: 18100,
264
+ low: 15300,
265
+ week: "2026-09-21"
266
+ },
267
+ {
268
+ forecast: 17100,
269
+ high: 18800,
270
+ low: 15400,
271
+ week: "2026-09-28"
272
+ },
273
+ {
274
+ forecast: 17500,
275
+ high: 19500,
276
+ low: 15500,
277
+ week: "2026-10-05"
278
+ }
279
+ ];
280
+ function Horizon() {
281
+ const $ = c(29);
282
+ const { t } = useWords("range-chart");
283
+ let t0;
284
+ if ($[0] !== t) {
285
+ t0 = t("forecast.interval");
286
+ $[0] = t;
287
+ $[1] = t0;
288
+ } else t0 = $[1];
289
+ let t1;
290
+ if ($[2] !== t0) {
291
+ t1 = {
292
+ high: "high",
293
+ key: "interval",
294
+ label: t0,
295
+ low: "low"
296
+ };
297
+ $[2] = t0;
298
+ $[3] = t1;
299
+ } else t1 = $[3];
300
+ let t2;
301
+ if ($[4] !== t) {
302
+ t2 = t("horizon.caption");
303
+ $[4] = t;
304
+ $[5] = t2;
305
+ } else t2 = $[5];
306
+ let t3;
307
+ if ($[6] !== t) {
308
+ t3 = t("forecast.label");
309
+ $[6] = t;
310
+ $[7] = t3;
311
+ } else t3 = $[7];
312
+ let t4;
313
+ if ($[8] === Symbol.for("react.memo_cache_sentinel")) {
314
+ t4 = {
315
+ day: "numeric",
316
+ month: "short",
317
+ timeZone: "UTC"
318
+ };
319
+ $[8] = t4;
320
+ } else t4 = $[8];
321
+ let t5;
322
+ if ($[9] !== t) {
323
+ t5 = t("series");
324
+ $[9] = t;
325
+ $[10] = t5;
326
+ } else t5 = $[10];
327
+ let t6;
328
+ if ($[11] !== t) {
329
+ t6 = t("forecast.actual");
330
+ $[11] = t;
331
+ $[12] = t6;
332
+ } else t6 = $[12];
333
+ let t7;
334
+ if ($[13] !== t6) {
335
+ t7 = {
336
+ key: "actual",
337
+ label: t6
338
+ };
339
+ $[13] = t6;
340
+ $[14] = t7;
341
+ } else t7 = $[14];
342
+ let t8;
343
+ if ($[15] !== t) {
344
+ t8 = t("forecast.forecast");
345
+ $[15] = t;
346
+ $[16] = t8;
347
+ } else t8 = $[16];
348
+ let t9;
349
+ if ($[17] !== t8) {
350
+ t9 = {
351
+ dashed: true,
352
+ key: "forecast",
353
+ label: t8
354
+ };
355
+ $[17] = t8;
356
+ $[18] = t9;
357
+ } else t9 = $[18];
358
+ let t10;
359
+ if ($[19] !== t7 || $[20] !== t9) {
360
+ t10 = [t7, t9];
361
+ $[19] = t7;
362
+ $[20] = t9;
363
+ $[21] = t10;
364
+ } else t10 = $[21];
365
+ let t11;
366
+ if ($[22] === Symbol.for("react.memo_cache_sentinel")) {
367
+ t11 = [1e4, 2e4];
368
+ $[22] = t11;
369
+ } else t11 = $[22];
370
+ let t12;
371
+ if ($[23] !== t1 || $[24] !== t10 || $[25] !== t2 || $[26] !== t3 || $[27] !== t5) {
372
+ t12 = /* @__PURE__ */ jsx(RangeChart, {
373
+ band: t1,
374
+ caption: t2,
375
+ categoryKey: "week",
376
+ data: WEEKS$1,
377
+ defaultIndex: 13,
378
+ label: t3,
379
+ labelOptions: t4,
380
+ legendLabel: t5,
381
+ series: t10,
382
+ valueDomain: t11
383
+ });
384
+ $[23] = t1;
385
+ $[24] = t10;
386
+ $[25] = t2;
387
+ $[26] = t3;
388
+ $[27] = t5;
389
+ $[28] = t12;
390
+ } else t12 = $[28];
391
+ return t12;
392
+ }
393
+ const source$3 = "import { type ReactElement } from \"react\";\n\nimport { useWords } from \"@stealthscale/specimen\";\n\nimport { RangeChart } from \"@stealthscale/component-charts\";\n\nconst WEEKS = [\n { actual: 12_400, week: \"2026-07-06\" },\n { actual: 12_900, week: \"2026-07-13\" },\n { actual: 13_100, week: \"2026-07-20\" },\n { actual: 13_800, week: \"2026-07-27\" },\n { actual: 14_200, week: \"2026-08-03\" },\n { actual: 14_100, week: \"2026-08-10\" },\n { actual: 14_700, week: \"2026-08-17\" },\n { actual: 15_100, forecast: 15_100, high: 15_100, low: 15_100, week: \"2026-08-24\" },\n { forecast: 15_500, high: 16_100, low: 14_900, week: \"2026-08-31\" },\n { forecast: 15_900, high: 16_800, low: 15_000, week: \"2026-09-07\" },\n { forecast: 16_300, high: 17_400, low: 15_200, week: \"2026-09-14\" },\n { forecast: 16_700, high: 18_100, low: 15_300, week: \"2026-09-21\" },\n { forecast: 17_100, high: 18_800, low: 15_400, week: \"2026-09-28\" },\n { forecast: 17_500, high: 19_500, low: 15_500, week: \"2026-10-05\" },\n];\n\nexport function Horizon(): ReactElement {\n const { t } = useWords(\"range-chart\");\n\n return (\n <RangeChart\n band={{ high: \"high\", key: \"interval\", label: t(\"forecast.interval\"), low: \"low\" }}\n caption={t(\"horizon.caption\")}\n categoryKey=\"week\"\n data={WEEKS}\n defaultIndex={13}\n label={t(\"forecast.label\")}\n labelOptions={{ day: \"numeric\", month: \"short\", timeZone: \"UTC\" }}\n legendLabel={t(\"series\")}\n series={[\n { key: \"actual\", label: t(\"forecast.actual\") },\n { dashed: true, key: \"forecast\", label: t(\"forecast.forecast\") },\n ]}\n valueDomain={[10_000, 20_000]}\n />\n );\n}\n";
394
+ //#endregion
395
+ //#region src/range-chart/examples/quiet.example.tsx
396
+ var quiet_example_exports = /* @__PURE__ */ __exportAll({
397
+ Quiet: () => Quiet,
398
+ source: () => source$2
399
+ });
400
+ const WEEKS = [];
401
+ function Quiet() {
402
+ const $ = c(23);
403
+ const { t } = useWords("range-chart");
404
+ let t0;
405
+ if ($[0] !== t) {
406
+ t0 = t("forecast.interval");
407
+ $[0] = t;
408
+ $[1] = t0;
409
+ } else t0 = $[1];
410
+ let t1;
411
+ if ($[2] !== t0) {
412
+ t1 = {
413
+ high: "high",
414
+ key: "interval",
415
+ label: t0,
416
+ low: "low"
417
+ };
418
+ $[2] = t0;
419
+ $[3] = t1;
420
+ } else t1 = $[3];
421
+ let t2;
422
+ if ($[4] !== t) {
423
+ t2 = t("quiet.caption");
424
+ $[4] = t;
425
+ $[5] = t2;
426
+ } else t2 = $[5];
427
+ let t3;
428
+ if ($[6] !== t) {
429
+ t3 = t("quiet.empty");
430
+ $[6] = t;
431
+ $[7] = t3;
432
+ } else t3 = $[7];
433
+ let t4;
434
+ if ($[8] !== t) {
435
+ t4 = t("forecast.label");
436
+ $[8] = t;
437
+ $[9] = t4;
438
+ } else t4 = $[9];
439
+ let t5;
440
+ if ($[10] !== t) {
441
+ t5 = t("series");
442
+ $[10] = t;
443
+ $[11] = t5;
444
+ } else t5 = $[11];
445
+ let t6;
446
+ if ($[12] !== t) {
447
+ t6 = t("forecast.forecast");
448
+ $[12] = t;
449
+ $[13] = t6;
450
+ } else t6 = $[13];
451
+ let t7;
452
+ if ($[14] !== t6) {
453
+ t7 = [{
454
+ dashed: true,
455
+ key: "forecast",
456
+ label: t6
457
+ }];
458
+ $[14] = t6;
459
+ $[15] = t7;
460
+ } else t7 = $[15];
461
+ let t8;
462
+ if ($[16] !== t1 || $[17] !== t2 || $[18] !== t3 || $[19] !== t4 || $[20] !== t5 || $[21] !== t7) {
463
+ t8 = /* @__PURE__ */ jsx(RangeChart, {
464
+ band: t1,
465
+ caption: t2,
466
+ categoryKey: "week",
467
+ data: WEEKS,
468
+ empty: t3,
469
+ label: t4,
470
+ legendLabel: t5,
471
+ series: t7
472
+ });
473
+ $[16] = t1;
474
+ $[17] = t2;
475
+ $[18] = t3;
476
+ $[19] = t4;
477
+ $[20] = t5;
478
+ $[21] = t7;
479
+ $[22] = t8;
480
+ } else t8 = $[22];
481
+ return t8;
482
+ }
483
+ const source$2 = "import { type ReactElement } from \"react\";\n\nimport { useWords } from \"@stealthscale/specimen\";\n\nimport { RangeChart } from \"@stealthscale/component-charts\";\n\nconst WEEKS: Array<{ forecast: number; high: number; low: number; week: string }> = [];\n\nexport function Quiet(): ReactElement {\n const { t } = useWords(\"range-chart\");\n\n return (\n <RangeChart\n band={{ high: \"high\", key: \"interval\", label: t(\"forecast.interval\"), low: \"low\" }}\n caption={t(\"quiet.caption\")}\n categoryKey=\"week\"\n data={WEEKS}\n empty={t(\"quiet.empty\")}\n label={t(\"forecast.label\")}\n legendLabel={t(\"series\")}\n series={[{ dashed: true, key: \"forecast\", label: t(\"forecast.forecast\") }]}\n />\n );\n}\n";
484
+ //#endregion
485
+ //#region src/range-chart/examples/replay.example.tsx
486
+ var replay_example_exports = /* @__PURE__ */ __exportAll({
487
+ Replay: () => Replay,
488
+ source: () => source$1
489
+ });
490
+ const DAYS$1 = [
491
+ {
492
+ average: 15,
493
+ day: "2026-09-21",
494
+ high: 19,
495
+ low: 11
496
+ },
497
+ {
498
+ average: 16,
499
+ day: "2026-09-22",
500
+ high: 21,
501
+ low: 12
502
+ },
503
+ {
504
+ average: 18,
505
+ day: "2026-09-23",
506
+ high: 22,
507
+ low: 14
508
+ },
509
+ {
510
+ average: 15,
511
+ day: "2026-09-24",
512
+ high: 18,
513
+ low: 13
514
+ },
515
+ {
516
+ average: 13,
517
+ day: "2026-09-25",
518
+ high: 16,
519
+ low: 10
520
+ },
521
+ {
522
+ average: 13,
523
+ day: "2026-09-26",
524
+ high: 17,
525
+ low: 9
526
+ },
527
+ {
528
+ average: 15,
529
+ day: "2026-09-27",
530
+ high: 20,
531
+ low: 11
532
+ }
533
+ ];
534
+ function Replay() {
535
+ const $ = c(34);
536
+ const { t } = useWords("range-chart");
537
+ const [run, setRun] = useState(0);
538
+ let t0;
539
+ if ($[0] !== t) {
540
+ t0 = t("temperature.range");
541
+ $[0] = t;
542
+ $[1] = t0;
543
+ } else t0 = $[1];
544
+ let t1;
545
+ if ($[2] !== t0) {
546
+ t1 = {
547
+ high: "high",
548
+ key: "range",
549
+ label: t0,
550
+ low: "low"
551
+ };
552
+ $[2] = t0;
553
+ $[3] = t1;
554
+ } else t1 = $[3];
555
+ let t2;
556
+ if ($[4] !== t) {
557
+ t2 = t("temperature.caption");
558
+ $[4] = t;
559
+ $[5] = t2;
560
+ } else t2 = $[5];
561
+ let t3;
562
+ if ($[6] !== t) {
563
+ t3 = t("temperature.label");
564
+ $[6] = t;
565
+ $[7] = t3;
566
+ } else t3 = $[7];
567
+ let t4;
568
+ if ($[8] === Symbol.for("react.memo_cache_sentinel")) {
569
+ t4 = {
570
+ timeZone: "UTC",
571
+ weekday: "short"
572
+ };
573
+ $[8] = t4;
574
+ } else t4 = $[8];
575
+ let t5;
576
+ if ($[9] !== t) {
577
+ t5 = t("series");
578
+ $[9] = t;
579
+ $[10] = t5;
580
+ } else t5 = $[10];
581
+ let t6;
582
+ if ($[11] !== t) {
583
+ t6 = t("temperature.average");
584
+ $[11] = t;
585
+ $[12] = t6;
586
+ } else t6 = $[12];
587
+ let t7;
588
+ if ($[13] !== t6) {
589
+ t7 = [{
590
+ key: "average",
591
+ label: t6
592
+ }];
593
+ $[13] = t6;
594
+ $[14] = t7;
595
+ } else t7 = $[14];
596
+ let t8;
597
+ if ($[15] === Symbol.for("react.memo_cache_sentinel")) {
598
+ t8 = {
599
+ maximumFractionDigits: 0,
600
+ style: "unit",
601
+ unit: "celsius"
602
+ };
603
+ $[15] = t8;
604
+ } else t8 = $[15];
605
+ let t9;
606
+ if ($[16] !== run || $[17] !== t1 || $[18] !== t2 || $[19] !== t3 || $[20] !== t5 || $[21] !== t7) {
607
+ t9 = /* @__PURE__ */ jsx(RangeChart, {
608
+ animate: true,
609
+ band: t1,
610
+ caption: t2,
611
+ categoryKey: "day",
612
+ data: DAYS$1,
613
+ label: t3,
614
+ labelOptions: t4,
615
+ legendLabel: t5,
616
+ series: t7,
617
+ valueOptions: t8
618
+ }, run);
619
+ $[16] = run;
620
+ $[17] = t1;
621
+ $[18] = t2;
622
+ $[19] = t3;
623
+ $[20] = t5;
624
+ $[21] = t7;
625
+ $[22] = t9;
626
+ } else t9 = $[22];
627
+ let t10;
628
+ if ($[23] !== run) {
629
+ t10 = () => {
630
+ setRun(run + 1);
631
+ };
632
+ $[23] = run;
633
+ $[24] = t10;
634
+ } else t10 = $[24];
635
+ let t11;
636
+ if ($[25] === Symbol.for("react.memo_cache_sentinel")) {
637
+ t11 = /* @__PURE__ */ jsx(RotateCcwIcon, {});
638
+ $[25] = t11;
639
+ } else t11 = $[25];
640
+ let t12;
641
+ if ($[26] !== t) {
642
+ t12 = t("replay.replay");
643
+ $[26] = t;
644
+ $[27] = t12;
645
+ } else t12 = $[27];
646
+ let t13;
647
+ if ($[28] !== t10 || $[29] !== t12) {
648
+ t13 = /* @__PURE__ */ jsxs(Button, {
649
+ onClick: t10,
650
+ size: "sm",
651
+ variant: "outline",
652
+ children: [t11, t12]
653
+ });
654
+ $[28] = t10;
655
+ $[29] = t12;
656
+ $[30] = t13;
657
+ } else t13 = $[30];
658
+ let t14;
659
+ if ($[31] !== t13 || $[32] !== t9) {
660
+ t14 = /* @__PURE__ */ jsxs(Stack, {
661
+ align: "flex-start",
662
+ children: [t9, t13]
663
+ });
664
+ $[31] = t13;
665
+ $[32] = t9;
666
+ $[33] = t14;
667
+ } else t14 = $[33];
668
+ return t14;
669
+ }
670
+ const source$1 = "import { type ReactElement, useState } from \"react\";\n\nimport { RotateCcwIcon } from \"lucide-react\";\n\nimport { Button } from \"@stealthscale/component-actions\";\nimport { Stack } from \"@stealthscale/component-layout\";\nimport { useWords } from \"@stealthscale/specimen\";\n\nimport { RangeChart } from \"@stealthscale/component-charts\";\n\nconst DAYS = [\n { average: 15, day: \"2026-09-21\", high: 19, low: 11 },\n { average: 16, day: \"2026-09-22\", high: 21, low: 12 },\n { average: 18, day: \"2026-09-23\", high: 22, low: 14 },\n { average: 15, day: \"2026-09-24\", high: 18, low: 13 },\n { average: 13, day: \"2026-09-25\", high: 16, low: 10 },\n { average: 13, day: \"2026-09-26\", high: 17, low: 9 },\n { average: 15, day: \"2026-09-27\", high: 20, low: 11 },\n];\n\nexport function Replay(): ReactElement {\n const { t } = useWords(\"range-chart\");\n const [run, setRun] = useState(0);\n\n return (\n <Stack align=\"flex-start\">\n <RangeChart\n animate\n band={{ high: \"high\", key: \"range\", label: t(\"temperature.range\"), low: \"low\" }}\n caption={t(\"temperature.caption\")}\n categoryKey=\"day\"\n data={DAYS}\n key={run}\n label={t(\"temperature.label\")}\n labelOptions={{ timeZone: \"UTC\", weekday: \"short\" }}\n legendLabel={t(\"series\")}\n series={[{ key: \"average\", label: t(\"temperature.average\") }]}\n valueOptions={{ maximumFractionDigits: 0, style: \"unit\", unit: \"celsius\" }}\n />\n <Button\n onClick={() => {\n setRun(run + 1);\n }}\n size=\"sm\"\n variant=\"outline\"\n >\n <RotateCcwIcon />\n {t(\"replay.replay\")}\n </Button>\n </Stack>\n );\n}\n";
671
+ //#endregion
672
+ //#region src/range-chart/examples/temperature.example.tsx
673
+ var temperature_example_exports = /* @__PURE__ */ __exportAll({
674
+ Temperature: () => Temperature,
675
+ source: () => source
676
+ });
677
+ const DAYS = [
678
+ {
679
+ average: 15,
680
+ day: "2026-09-21",
681
+ high: 19,
682
+ low: 11
683
+ },
684
+ {
685
+ average: 16,
686
+ day: "2026-09-22",
687
+ high: 21,
688
+ low: 12
689
+ },
690
+ {
691
+ average: 18,
692
+ day: "2026-09-23",
693
+ high: 22,
694
+ low: 14
695
+ },
696
+ {
697
+ average: 15,
698
+ day: "2026-09-24",
699
+ high: 18,
700
+ low: 13
701
+ },
702
+ {
703
+ average: 13,
704
+ day: "2026-09-25",
705
+ high: 16,
706
+ low: 10
707
+ },
708
+ {
709
+ average: 13,
710
+ day: "2026-09-26",
711
+ high: 17,
712
+ low: 9
713
+ },
714
+ {
715
+ average: 15,
716
+ day: "2026-09-27",
717
+ high: 20,
718
+ low: 11
719
+ }
720
+ ];
721
+ function Temperature() {
722
+ const $ = c(22);
723
+ const { t } = useWords("range-chart");
724
+ let t0;
725
+ if ($[0] !== t) {
726
+ t0 = t("temperature.range");
727
+ $[0] = t;
728
+ $[1] = t0;
729
+ } else t0 = $[1];
730
+ let t1;
731
+ if ($[2] !== t0) {
732
+ t1 = {
733
+ high: "high",
734
+ key: "range",
735
+ label: t0,
736
+ low: "low"
737
+ };
738
+ $[2] = t0;
739
+ $[3] = t1;
740
+ } else t1 = $[3];
741
+ let t2;
742
+ if ($[4] !== t) {
743
+ t2 = t("temperature.caption");
744
+ $[4] = t;
745
+ $[5] = t2;
746
+ } else t2 = $[5];
747
+ let t3;
748
+ if ($[6] !== t) {
749
+ t3 = t("temperature.label");
750
+ $[6] = t;
751
+ $[7] = t3;
752
+ } else t3 = $[7];
753
+ let t4;
754
+ if ($[8] === Symbol.for("react.memo_cache_sentinel")) {
755
+ t4 = {
756
+ timeZone: "UTC",
757
+ weekday: "short"
758
+ };
759
+ $[8] = t4;
760
+ } else t4 = $[8];
761
+ let t5;
762
+ if ($[9] !== t) {
763
+ t5 = t("series");
764
+ $[9] = t;
765
+ $[10] = t5;
766
+ } else t5 = $[10];
767
+ let t6;
768
+ if ($[11] !== t) {
769
+ t6 = t("temperature.average");
770
+ $[11] = t;
771
+ $[12] = t6;
772
+ } else t6 = $[12];
773
+ let t7;
774
+ if ($[13] !== t6) {
775
+ t7 = [{
776
+ key: "average",
777
+ label: t6
778
+ }];
779
+ $[13] = t6;
780
+ $[14] = t7;
781
+ } else t7 = $[14];
782
+ let t8;
783
+ if ($[15] === Symbol.for("react.memo_cache_sentinel")) {
784
+ t8 = {
785
+ maximumFractionDigits: 0,
786
+ style: "unit",
787
+ unit: "celsius"
788
+ };
789
+ $[15] = t8;
790
+ } else t8 = $[15];
791
+ let t9;
792
+ if ($[16] !== t1 || $[17] !== t2 || $[18] !== t3 || $[19] !== t5 || $[20] !== t7) {
793
+ t9 = /* @__PURE__ */ jsx(RangeChart, {
794
+ band: t1,
795
+ caption: t2,
796
+ categoryKey: "day",
797
+ data: DAYS,
798
+ label: t3,
799
+ labelOptions: t4,
800
+ legendLabel: t5,
801
+ series: t7,
802
+ valueOptions: t8
803
+ });
804
+ $[16] = t1;
805
+ $[17] = t2;
806
+ $[18] = t3;
807
+ $[19] = t5;
808
+ $[20] = t7;
809
+ $[21] = t9;
810
+ } else t9 = $[21];
811
+ return t9;
812
+ }
813
+ const source = "import { type ReactElement } from \"react\";\n\nimport { useWords } from \"@stealthscale/specimen\";\n\nimport { RangeChart } from \"@stealthscale/component-charts\";\n\nconst DAYS = [\n { average: 15, day: \"2026-09-21\", high: 19, low: 11 },\n { average: 16, day: \"2026-09-22\", high: 21, low: 12 },\n { average: 18, day: \"2026-09-23\", high: 22, low: 14 },\n { average: 15, day: \"2026-09-24\", high: 18, low: 13 },\n { average: 13, day: \"2026-09-25\", high: 16, low: 10 },\n { average: 13, day: \"2026-09-26\", high: 17, low: 9 },\n { average: 15, day: \"2026-09-27\", high: 20, low: 11 },\n];\n\nexport function Temperature(): ReactElement {\n const { t } = useWords(\"range-chart\");\n\n return (\n <RangeChart\n band={{ high: \"high\", key: \"range\", label: t(\"temperature.range\"), low: \"low\" }}\n caption={t(\"temperature.caption\")}\n categoryKey=\"day\"\n data={DAYS}\n label={t(\"temperature.label\")}\n labelOptions={{ timeZone: \"UTC\", weekday: \"short\" }}\n legendLabel={t(\"series\")}\n series={[{ key: \"average\", label: t(\"temperature.average\") }]}\n valueOptions={{ maximumFractionDigits: 0, style: \"unit\", unit: \"celsius\" }}\n />\n );\n}\n";
814
+ //#endregion
815
+ //#region src/range-chart/range-chart.specimen.tsx
816
+ /**
817
+ * Catalogue page for the range chart.
818
+ *
819
+ * @remarks
820
+ * The range chart has no recipe of its own: the chart's recipe styles its figure, so every scene
821
+ * is hand-written. The scenes render a forecast with its 80% interval, a week of temperature
822
+ * ranges, the tooltip open at the forecast's last week, the band animated in with a replay, the
823
+ * forecast at a phone's width, and a range without rows. Every scene renders a component from
824
+ * `examples/` and shows that file as its source. The words are keys under `range-chart` in
825
+ * `locales/en/specimen/range-chart.json`.
826
+ */
827
+ /**
828
+ * Hand-written scene for a forecast with its interval.
829
+ */
830
+ const interval = {
831
+ about: "range-chart.forecast.about",
832
+ draw: () => /* @__PURE__ */ jsx(Room, {
833
+ size: "lg",
834
+ children: /* @__PURE__ */ jsx(Forecast, {})
835
+ }),
836
+ example: forecast_example_exports,
837
+ title: "range-chart.forecast.title"
838
+ };
839
+ /**
840
+ * Hand-written scene for a daily low and high.
841
+ */
842
+ const daily = {
843
+ about: "range-chart.temperature.about",
844
+ draw: () => /* @__PURE__ */ jsx(Room, {
845
+ size: "lg",
846
+ children: /* @__PURE__ */ jsx(Temperature, {})
847
+ }),
848
+ example: temperature_example_exports,
849
+ title: "range-chart.temperature.title"
850
+ };
851
+ /**
852
+ * Hand-written scene for the tooltip open at a row.
853
+ */
854
+ const tooltip = {
855
+ about: "range-chart.horizon.about",
856
+ draw: () => /* @__PURE__ */ jsx(Room, {
857
+ size: "lg",
858
+ children: /* @__PURE__ */ jsx(Horizon, {})
859
+ }),
860
+ example: horizon_example_exports,
861
+ title: "range-chart.horizon.title"
862
+ };
863
+ /**
864
+ * Hand-written scene for the band animated in, with a replay.
865
+ */
866
+ const animated = {
867
+ about: "range-chart.replay.about",
868
+ draw: () => /* @__PURE__ */ jsx(Room, {
869
+ size: "lg",
870
+ children: /* @__PURE__ */ jsx(Replay, {})
871
+ }),
872
+ example: replay_example_exports,
873
+ title: "range-chart.replay.title"
874
+ };
875
+ /**
876
+ * Hand-written scene for the forecast at a phone's width.
877
+ */
878
+ const narrow = {
879
+ about: "range-chart.narrow.about",
880
+ draw: () => /* @__PURE__ */ jsx(Room, {
881
+ size: "xs",
882
+ children: /* @__PURE__ */ jsx(Forecast, {})
883
+ }),
884
+ example: forecast_example_exports,
885
+ title: "range-chart.narrow.title"
886
+ };
887
+ /**
888
+ * Hand-written scene for a range without rows.
889
+ */
890
+ const empty = {
891
+ about: "range-chart.quiet.about",
892
+ draw: () => /* @__PURE__ */ jsx(Room, {
893
+ size: "md",
894
+ children: /* @__PURE__ */ jsx(Quiet, {})
895
+ }),
896
+ example: quiet_example_exports,
897
+ title: "range-chart.quiet.title"
898
+ };
899
+ var range_chart_specimen_default = specimen({
900
+ about: "range-chart.about",
901
+ id: "components/charts/range-chart",
902
+ imports: "import { RangeChart } from \"@stealthscale/component-charts\";",
903
+ scenes: [
904
+ interval,
905
+ daily,
906
+ tooltip,
907
+ animated,
908
+ narrow,
909
+ empty
910
+ ],
911
+ title: "range-chart.title"
912
+ });
913
+ //#endregion
914
+ export { animated, daily, range_chart_specimen_default as default, empty, interval, narrow, tooltip };