@misoto22/design 0.5.0 → 0.6.0

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 (214) hide show
  1. package/README.md +124 -0
  2. package/bin/misoto22-design.mjs +205 -0
  3. package/dist/agent/Accordion.md +41 -0
  4. package/dist/agent/Alert.md +42 -0
  5. package/dist/agent/AppShell.md +40 -0
  6. package/dist/agent/AreaChart.md +68 -0
  7. package/dist/agent/Article.md +41 -0
  8. package/dist/agent/Avatar.md +32 -0
  9. package/dist/agent/Badge.md +40 -0
  10. package/dist/agent/BarChart.md +65 -0
  11. package/dist/agent/BarList.md +40 -0
  12. package/dist/agent/BigNumber.md +45 -0
  13. package/dist/agent/BoxPlot.md +58 -0
  14. package/dist/agent/Breadcrumb.md +32 -0
  15. package/dist/agent/BulletChart.md +48 -0
  16. package/dist/agent/Button.md +56 -0
  17. package/dist/agent/Calendar.md +42 -0
  18. package/dist/agent/Card.md +49 -0
  19. package/dist/agent/Checkbox.md +35 -0
  20. package/dist/agent/Collapsible.md +46 -0
  21. package/dist/agent/Combobox.md +50 -0
  22. package/dist/agent/Command.md +93 -0
  23. package/dist/agent/ComposedChart.md +57 -0
  24. package/dist/agent/ContextMenu.md +59 -0
  25. package/dist/agent/DatePicker.md +75 -0
  26. package/dist/agent/Diagram.md +46 -0
  27. package/dist/agent/Dialog.md +52 -0
  28. package/dist/agent/DropdownMenu.md +70 -0
  29. package/dist/agent/EmptyState.md +37 -0
  30. package/dist/agent/ErrorState.md +41 -0
  31. package/dist/agent/Facet.md +82 -0
  32. package/dist/agent/Field.md +37 -0
  33. package/dist/agent/FigureBand.md +37 -0
  34. package/dist/agent/FloatingIconButton.md +38 -0
  35. package/dist/agent/FunnelChart.md +52 -0
  36. package/dist/agent/Heatmap.md +53 -0
  37. package/dist/agent/Histogram.md +63 -0
  38. package/dist/agent/Input.md +30 -0
  39. package/dist/agent/Kbd.md +29 -0
  40. package/dist/agent/LineChart.md +60 -0
  41. package/dist/agent/LinkArrow.md +29 -0
  42. package/dist/agent/NativeSelect.md +40 -0
  43. package/dist/agent/NavItem.md +35 -0
  44. package/dist/agent/Pagination.md +43 -0
  45. package/dist/agent/PieChart.md +55 -0
  46. package/dist/agent/Popover.md +57 -0
  47. package/dist/agent/Progress.md +33 -0
  48. package/dist/agent/RadarChart.md +54 -0
  49. package/dist/agent/RadialChart.md +57 -0
  50. package/dist/agent/RadioGroup.md +44 -0
  51. package/dist/agent/SankeyChart.md +61 -0
  52. package/dist/agent/ScatterChart.md +54 -0
  53. package/dist/agent/ScrollArea.md +40 -0
  54. package/dist/agent/SearchableMenu.md +46 -0
  55. package/dist/agent/Select.md +75 -0
  56. package/dist/agent/Separator.md +35 -0
  57. package/dist/agent/Sheet.md +57 -0
  58. package/dist/agent/Skeleton.md +73 -0
  59. package/dist/agent/Slider.md +39 -0
  60. package/dist/agent/Sparkline.md +45 -0
  61. package/dist/agent/Spinner.md +39 -0
  62. package/dist/agent/StatusDot.md +36 -0
  63. package/dist/agent/StatusPill.md +28 -0
  64. package/dist/agent/Steps.md +44 -0
  65. package/dist/agent/Switch.md +29 -0
  66. package/dist/agent/Table.md +85 -0
  67. package/dist/agent/Tabs.md +48 -0
  68. package/dist/agent/Tag.md +35 -0
  69. package/dist/agent/Textarea.md +26 -0
  70. package/dist/agent/Toast.md +26 -0
  71. package/dist/agent/ToggleGroup.md +44 -0
  72. package/dist/agent/Tooltip.md +51 -0
  73. package/dist/agent/TreemapChart.md +52 -0
  74. package/dist/agent/WaterfallChart.md +62 -0
  75. package/dist/agent/catalog.json +1791 -0
  76. package/dist/agent/index.md +131 -0
  77. package/dist/charts/AreaChart/AreaChart.d.ts +191 -0
  78. package/dist/charts/AreaChart/AreaChart.js +480 -0
  79. package/dist/charts/AreaChart/AreaChart.js.map +1 -0
  80. package/dist/charts/BarChart/BarChart.d.ts +179 -0
  81. package/dist/charts/BarChart/BarChart.js +591 -0
  82. package/dist/charts/BarChart/BarChart.js.map +1 -0
  83. package/dist/charts/BarList/BarList.d.ts +57 -0
  84. package/dist/charts/BarList/BarList.js +71 -0
  85. package/dist/charts/BarList/BarList.js.map +1 -0
  86. package/dist/charts/BigNumber/BigNumber.d.ts +56 -0
  87. package/dist/charts/BigNumber/BigNumber.js +31 -0
  88. package/dist/charts/BigNumber/BigNumber.js.map +1 -0
  89. package/dist/charts/BoxPlot/BoxPlot.d.ts +177 -0
  90. package/dist/charts/BoxPlot/BoxPlot.js +495 -0
  91. package/dist/charts/BoxPlot/BoxPlot.js.map +1 -0
  92. package/dist/charts/BulletChart/BulletChart.d.ts +100 -0
  93. package/dist/charts/BulletChart/BulletChart.js +162 -0
  94. package/dist/charts/BulletChart/BulletChart.js.map +1 -0
  95. package/dist/charts/ComposedChart/ComposedChart.d.ts +171 -0
  96. package/dist/charts/ComposedChart/ComposedChart.js +667 -0
  97. package/dist/charts/ComposedChart/ComposedChart.js.map +1 -0
  98. package/dist/charts/Facet/Facet.d.ts +240 -0
  99. package/dist/charts/Facet/Facet.js +133 -0
  100. package/dist/charts/Facet/Facet.js.map +1 -0
  101. package/dist/charts/Facet/panels.d.ts +187 -0
  102. package/dist/charts/Facet/panels.js +203 -0
  103. package/dist/charts/Facet/panels.js.map +1 -0
  104. package/dist/charts/FunnelChart/FunnelChart.d.ts +101 -0
  105. package/dist/charts/FunnelChart/FunnelChart.js +147 -0
  106. package/dist/charts/FunnelChart/FunnelChart.js.map +1 -0
  107. package/dist/charts/Heatmap/Heatmap.d.ts +78 -0
  108. package/dist/charts/Heatmap/Heatmap.js +108 -0
  109. package/dist/charts/Heatmap/Heatmap.js.map +1 -0
  110. package/dist/charts/Histogram/Histogram.d.ts +165 -0
  111. package/dist/charts/Histogram/Histogram.js +350 -0
  112. package/dist/charts/Histogram/Histogram.js.map +1 -0
  113. package/dist/charts/LineChart/LineChart.d.ts +167 -0
  114. package/dist/charts/LineChart/LineChart.js +486 -0
  115. package/dist/charts/LineChart/LineChart.js.map +1 -0
  116. package/dist/charts/PieChart/PieChart.d.ts +128 -0
  117. package/dist/charts/PieChart/PieChart.js +309 -0
  118. package/dist/charts/PieChart/PieChart.js.map +1 -0
  119. package/dist/charts/RadarChart/RadarChart.d.ts +123 -0
  120. package/dist/charts/RadarChart/RadarChart.js +299 -0
  121. package/dist/charts/RadarChart/RadarChart.js.map +1 -0
  122. package/dist/charts/RadialChart/RadialChart.d.ts +124 -0
  123. package/dist/charts/RadialChart/RadialChart.js +257 -0
  124. package/dist/charts/RadialChart/RadialChart.js.map +1 -0
  125. package/dist/charts/SankeyChart/SankeyChart.d.ts +137 -0
  126. package/dist/charts/SankeyChart/SankeyChart.js +501 -0
  127. package/dist/charts/SankeyChart/SankeyChart.js.map +1 -0
  128. package/dist/charts/ScatterChart/ScatterChart.d.ts +128 -0
  129. package/dist/charts/ScatterChart/ScatterChart.js +269 -0
  130. package/dist/charts/ScatterChart/ScatterChart.js.map +1 -0
  131. package/dist/charts/Sparkline/Sparkline.d.ts +53 -0
  132. package/dist/charts/Sparkline/Sparkline.js +93 -0
  133. package/dist/charts/Sparkline/Sparkline.js.map +1 -0
  134. package/dist/charts/TreemapChart/TreemapChart.d.ts +93 -0
  135. package/dist/charts/TreemapChart/TreemapChart.js +118 -0
  136. package/dist/charts/TreemapChart/TreemapChart.js.map +1 -0
  137. package/dist/charts/WaterfallChart/WaterfallChart.d.ts +164 -0
  138. package/dist/charts/WaterfallChart/WaterfallChart.js +319 -0
  139. package/dist/charts/WaterfallChart/WaterfallChart.js.map +1 -0
  140. package/dist/charts/index.d.ts +41 -0
  141. package/dist/charts/index.js +128 -0
  142. package/dist/charts/index.js.map +1 -0
  143. package/dist/charts/lib/annotations.d.ts +103 -0
  144. package/dist/charts/lib/annotations.js +99 -0
  145. package/dist/charts/lib/annotations.js.map +1 -0
  146. package/dist/charts/lib/axis.d.ts +18 -0
  147. package/dist/charts/lib/axis.js +21 -0
  148. package/dist/charts/lib/axis.js.map +1 -0
  149. package/dist/charts/lib/background.d.ts +33 -0
  150. package/dist/charts/lib/background.js +173 -0
  151. package/dist/charts/lib/background.js.map +1 -0
  152. package/dist/charts/lib/brush.d.ts +94 -0
  153. package/dist/charts/lib/brush.js +535 -0
  154. package/dist/charts/lib/brush.js.map +1 -0
  155. package/dist/charts/lib/chart.d.ts +94 -0
  156. package/dist/charts/lib/chart.js +134 -0
  157. package/dist/charts/lib/chart.js.map +1 -0
  158. package/dist/charts/lib/dot.d.ts +29 -0
  159. package/dist/charts/lib/dot.js +78 -0
  160. package/dist/charts/lib/dot.js.map +1 -0
  161. package/dist/charts/lib/empty.d.ts +31 -0
  162. package/dist/charts/lib/empty.js +13 -0
  163. package/dist/charts/lib/empty.js.map +1 -0
  164. package/dist/charts/lib/export.d.ts +103 -0
  165. package/dist/charts/lib/export.js +204 -0
  166. package/dist/charts/lib/export.js.map +1 -0
  167. package/dist/charts/lib/figure.d.ts +61 -0
  168. package/dist/charts/lib/figure.js +59 -0
  169. package/dist/charts/lib/figure.js.map +1 -0
  170. package/dist/charts/lib/format.d.ts +46 -0
  171. package/dist/charts/lib/format.js +56 -0
  172. package/dist/charts/lib/format.js.map +1 -0
  173. package/dist/charts/lib/legend.d.ts +45 -0
  174. package/dist/charts/lib/legend.js +117 -0
  175. package/dist/charts/lib/legend.js.map +1 -0
  176. package/dist/charts/lib/loading.d.ts +48 -0
  177. package/dist/charts/lib/loading.js +105 -0
  178. package/dist/charts/lib/loading.js.map +1 -0
  179. package/dist/charts/lib/paint.d.ts +154 -0
  180. package/dist/charts/lib/paint.js +551 -0
  181. package/dist/charts/lib/paint.js.map +1 -0
  182. package/dist/charts/lib/sonify-control.d.ts +163 -0
  183. package/dist/charts/lib/sonify-control.js +172 -0
  184. package/dist/charts/lib/sonify-control.js.map +1 -0
  185. package/dist/charts/lib/sonify.d.ts +248 -0
  186. package/dist/charts/lib/sonify.js +262 -0
  187. package/dist/charts/lib/sonify.js.map +1 -0
  188. package/dist/charts/lib/toolbar.d.ts +143 -0
  189. package/dist/charts/lib/toolbar.js +156 -0
  190. package/dist/charts/lib/toolbar.js.map +1 -0
  191. package/dist/charts/lib/tooltip.d.ts +59 -0
  192. package/dist/charts/lib/tooltip.js +135 -0
  193. package/dist/charts/lib/tooltip.js.map +1 -0
  194. package/dist/charts/lib/values.d.ts +56 -0
  195. package/dist/charts/lib/values.js +71 -0
  196. package/dist/charts/lib/values.js.map +1 -0
  197. package/dist/charts/lib/zoom.d.ts +139 -0
  198. package/dist/charts/lib/zoom.js +314 -0
  199. package/dist/charts/lib/zoom.js.map +1 -0
  200. package/dist/semantic.css +19 -0
  201. package/dist/styles.css +1 -1
  202. package/dist/themes.css +50 -0
  203. package/dist/tokens.css +118 -0
  204. package/dist/tokens.d.ts +17 -0
  205. package/dist/tokens.js +101 -0
  206. package/dist/tokens.json +101 -0
  207. package/package.json +26 -4
  208. package/skills/misoto22-design/SKILL.md +171 -0
  209. package/skills/misoto22-design/evals/claims.json +95 -0
  210. package/skills/misoto22-design/rules/a11y.md +115 -0
  211. package/skills/misoto22-design/rules/composition.md +108 -0
  212. package/skills/misoto22-design/rules/forms.md +128 -0
  213. package/skills/misoto22-design/rules/naming.md +155 -0
  214. package/skills/misoto22-design/rules/tokens.md +131 -0
@@ -0,0 +1,480 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import {
4
+ Children,
5
+ createContext,
6
+ isValidElement,
7
+ useCallback,
8
+ useContext,
9
+ useId,
10
+ useMemo,
11
+ useState
12
+ } from "react";
13
+ import {
14
+ Area as RechartsArea,
15
+ AreaChart as RechartsAreaChart,
16
+ CartesianGrid,
17
+ XAxis as RechartsXAxis,
18
+ YAxis as RechartsYAxis
19
+ } from "recharts";
20
+ import { useReducedMotion } from "motion/react";
21
+ import { ChartContainer, percentTick } from "../lib/chart.js";
22
+ import { ChartFigure } from "../lib/figure.js";
23
+ import { ChartEmpty } from "../lib/empty.js";
24
+ import { axisLabel } from "../lib/axis.js";
25
+ import { defaultTick } from "../lib/format.js";
26
+ import { Annotation, ReferenceBand, ReferenceLine } from "../lib/annotations.js";
27
+ import { Values, findSlot, resolveValues } from "../lib/values.js";
28
+ import {
29
+ ChartSonifyButton,
30
+ Sonify,
31
+ useChartSonifySeries
32
+ } from "../lib/sonify-control.js";
33
+ import { ChartBackground } from "../lib/background.js";
34
+ import { ChartDot } from "../lib/dot.js";
35
+ import {
36
+ ChartLegend,
37
+ ChartLegendContent
38
+ } from "../lib/legend.js";
39
+ import {
40
+ ChartTooltip,
41
+ ChartTooltipContent
42
+ } from "../lib/tooltip.js";
43
+ import { Brush, ChartBrush } from "../lib/brush.js";
44
+ import { ChartControls, Toolbar } from "../lib/toolbar.js";
45
+ import { useChartZoom } from "../lib/zoom.js";
46
+ import { LoadingIndicator, LoadingShimmer, LOADING_KEY, useLoadingRows } from "../lib/loading.js";
47
+ import {
48
+ AnimatedDashedStroke,
49
+ AreaDottedFill,
50
+ AreaGradientFill,
51
+ AreaGradientReverseFill,
52
+ AreaHatchedFill,
53
+ AreaLinesFill,
54
+ AreaSolidFill,
55
+ RevealMask,
56
+ SeriesGradient,
57
+ UnselectedFill
58
+ } from "../lib/paint.js";
59
+ const STROKE_WIDTH = 0.8;
60
+ const STACK_ID = "m22-area-stack";
61
+ const CHART_MARGIN = { top: 8, right: 12, bottom: 0, left: 12 };
62
+ const AreaChartContext = createContext(null);
63
+ function useAreaChart() {
64
+ const context = useContext(AreaChartContext);
65
+ if (!context) throw new Error("An area chart part must be rendered inside <AreaChart>");
66
+ return context;
67
+ }
68
+ function AreaChart({
69
+ config,
70
+ data,
71
+ title,
72
+ showTitle,
73
+ description,
74
+ children,
75
+ className,
76
+ chartProps,
77
+ curveType = "linear",
78
+ animationType = "forward",
79
+ stackType = "default",
80
+ defaultSelectedDataKey = null,
81
+ onSelectionChange,
82
+ isLoading = false,
83
+ loadingPoints,
84
+ xDataKey,
85
+ hideDataTable = false,
86
+ empty
87
+ }) {
88
+ const chartId = useId().replace(/:/g, "");
89
+ const [selectedDataKey, setSelectedDataKey] = useState(defaultSelectedDataKey);
90
+ const { rows: loadingData, onShimmerExit } = useLoadingRows(isLoading, loadingPoints);
91
+ const zoom = useChartZoom({ data, xDataKey });
92
+ const { brushSlot, toolbarSlot, sonifySlot, chartChildren } = useMemo(() => {
93
+ const parts = Children.toArray(children);
94
+ const element = parts.find((child) => isValidElement(child) && child.type === Brush);
95
+ const props = isValidElement(element) ? element.props : {};
96
+ return {
97
+ brushSlot: { present: isValidElement(element), ...props },
98
+ toolbarSlot: findSlot(parts, Toolbar),
99
+ sonifySlot: findSlot(parts, Sonify),
100
+ chartChildren: parts.filter(
101
+ (child) => !(isValidElement(child) && (child.type === Brush || child.type === Toolbar || child.type === Sonify))
102
+ )
103
+ };
104
+ }, [children]);
105
+ const columns = useMemo(
106
+ () => Object.entries(config).map(([key, series]) => ({ key, label: series.label })),
107
+ [config]
108
+ );
109
+ const isExpanded = stackType === "expanded";
110
+ const isStacked = stackType === "stacked" || isExpanded;
111
+ const showBrush = brushSlot.present && !isLoading;
112
+ const showToolbar = toolbarSlot !== null && !isLoading;
113
+ const isEmpty = !isLoading && empty !== false && data.length === 0;
114
+ const displayData = isLoading ? loadingData : showBrush || showToolbar ? zoom.visibleData : data;
115
+ const sonifySeries = useChartSonifySeries(
116
+ sonifySlot,
117
+ displayData,
118
+ config,
119
+ xDataKey
120
+ );
121
+ const selectDataKey = useCallback(
122
+ (next) => {
123
+ setSelectedDataKey(next);
124
+ onSelectionChange?.(next);
125
+ },
126
+ [onSelectionChange]
127
+ );
128
+ const context = useMemo(
129
+ () => ({
130
+ config,
131
+ rows: displayData,
132
+ curveType,
133
+ animationType,
134
+ isStacked,
135
+ isExpanded,
136
+ isLoading,
137
+ selectedDataKey,
138
+ selectDataKey
139
+ }),
140
+ [
141
+ animationType,
142
+ config,
143
+ curveType,
144
+ displayData,
145
+ isExpanded,
146
+ isLoading,
147
+ isStacked,
148
+ selectDataKey,
149
+ selectedDataKey
150
+ ]
151
+ );
152
+ return /* @__PURE__ */ jsx(AreaChartContext.Provider, { value: context, children: /* @__PURE__ */ jsxs(
153
+ ChartFigure,
154
+ {
155
+ title,
156
+ showTitle,
157
+ description,
158
+ className,
159
+ table: hideDataTable ? false : { rows: data, rowKey: xDataKey, columns },
160
+ children: [
161
+ sonifySlot && /* @__PURE__ */ jsx(ChartSonifyButton, { ...sonifySlot, title, series: sonifySeries }),
162
+ isEmpty ? /* @__PURE__ */ jsx(ChartEmpty, { ...empty || {} }) : /* @__PURE__ */ jsx(
163
+ ChartControls,
164
+ {
165
+ toolbar: showToolbar ? toolbarSlot : null,
166
+ zoom,
167
+ title,
168
+ rows: data,
169
+ columns,
170
+ rowKey: xDataKey,
171
+ children: /* @__PURE__ */ jsx(
172
+ ChartContainer,
173
+ {
174
+ config,
175
+ footer: showBrush && /* @__PURE__ */ jsx(
176
+ ChartBrush,
177
+ {
178
+ data,
179
+ config,
180
+ xDataKey,
181
+ variant: "area",
182
+ curveType,
183
+ height: brushSlot.height,
184
+ formatLabel: brushSlot.formatLabel,
185
+ stacked: isStacked,
186
+ className: "mt-1",
187
+ ...zoom.brushProps,
188
+ onChange: (range) => {
189
+ zoom.brushProps.onChange(range);
190
+ brushSlot.onChange?.(range);
191
+ }
192
+ }
193
+ ),
194
+ children: /* @__PURE__ */ jsxs(
195
+ RechartsAreaChart,
196
+ {
197
+ id: chartId,
198
+ accessibilityLayer: true,
199
+ margin: CHART_MARGIN,
200
+ stackOffset: isExpanded ? "expand" : void 0,
201
+ data: displayData,
202
+ ...chartProps,
203
+ children: [
204
+ chartChildren,
205
+ isLoading && /* @__PURE__ */ jsx(LoadingArea, { chartId, curveType, onShimmerExit })
206
+ ]
207
+ }
208
+ )
209
+ }
210
+ )
211
+ }
212
+ ),
213
+ /* @__PURE__ */ jsx(LoadingIndicator, { isLoading })
214
+ ]
215
+ }
216
+ ) });
217
+ }
218
+ function Area({
219
+ dataKey,
220
+ variant = "gradient",
221
+ strokeVariant = "dashed",
222
+ strokeWidth = STROKE_WIDTH,
223
+ curveType,
224
+ animationType,
225
+ connectNulls = false,
226
+ isClickable = false,
227
+ children,
228
+ areaProps
229
+ }) {
230
+ const {
231
+ config,
232
+ curveType: defaultCurve,
233
+ animationType: defaultAnimation,
234
+ isStacked,
235
+ isExpanded,
236
+ isLoading,
237
+ rows,
238
+ selectedDataKey,
239
+ selectDataKey
240
+ } = useAreaChart();
241
+ const id = useId().replace(/:/g, "");
242
+ const reduceMotion = useReducedMotion();
243
+ if (isLoading) return null;
244
+ const reveal = reduceMotion ? "none" : animationType ?? defaultAnimation;
245
+ const maskId = reveal === "none" ? void 0 : `${id}-reveal-mask`;
246
+ const isSelected = selectedDataKey === dataKey;
247
+ const hasSelection = selectedDataKey !== null;
248
+ const dimmed = hasSelection && !isSelected;
249
+ const opacity = dimmed ? { fill: 0.25, stroke: 0.3, dot: 0.3 } : { fill: 1, stroke: 1, dot: 1 };
250
+ const { dot, activeDot } = resolveDots(children, id, dataKey, opacity.dot, maskId);
251
+ const labels = resolveValues(
252
+ findSlot(children, Values),
253
+ rows.map((row) => Number(row[dataKey])).filter(Number.isFinite)
254
+ );
255
+ const animateDash = strokeVariant === "animated-dashed" && !hasSelection && !reduceMotion;
256
+ const isDashed = strokeVariant !== "solid";
257
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
258
+ /* @__PURE__ */ jsxs(
259
+ RechartsArea,
260
+ {
261
+ type: curveType ?? defaultCurve,
262
+ dataKey,
263
+ connectNulls,
264
+ fillOpacity: opacity.fill,
265
+ strokeOpacity: opacity.stroke,
266
+ fill: `url(#${id}-${dimmed ? "unselected" : variant}-${dataKey})`,
267
+ stroke: `url(#${id}-colors-${dataKey})`,
268
+ stackId: isStacked ? STACK_ID : void 0,
269
+ dot,
270
+ activeDot,
271
+ strokeWidth,
272
+ strokeDasharray: isDashed ? "3 3" : void 0,
273
+ isAnimationActive: false,
274
+ style: {
275
+ ...maskId ? { mask: `url(#${maskId})` } : {},
276
+ ...isClickable ? { cursor: "pointer" } : {}
277
+ },
278
+ onClick: () => {
279
+ if (!isClickable) return;
280
+ selectDataKey(isSelected ? null : dataKey);
281
+ },
282
+ ...areaProps,
283
+ children: [
284
+ animateDash && /* @__PURE__ */ jsx(AnimatedDashedStroke, {}),
285
+ labels
286
+ ]
287
+ }
288
+ ),
289
+ /* @__PURE__ */ jsxs("defs", { children: [
290
+ reveal !== "none" && /* @__PURE__ */ jsx(RevealMask, { id, type: reveal }),
291
+ /* @__PURE__ */ jsx(
292
+ SeriesGradient,
293
+ {
294
+ id,
295
+ dataKey,
296
+ config,
297
+ gradientUnits: isExpanded ? "userSpaceOnUse" : "objectBoundingBox"
298
+ }
299
+ ),
300
+ variant === "gradient" && /* @__PURE__ */ jsx(AreaGradientFill, { id, dataKey }),
301
+ variant === "gradient-reverse" && /* @__PURE__ */ jsx(AreaGradientReverseFill, { id, dataKey }),
302
+ variant === "solid" && /* @__PURE__ */ jsx(AreaSolidFill, { id, dataKey }),
303
+ variant === "dotted" && /* @__PURE__ */ jsx(AreaDottedFill, { id, dataKey }),
304
+ variant === "lines" && /* @__PURE__ */ jsx(AreaLinesFill, { id, dataKey }),
305
+ variant === "hatched" && /* @__PURE__ */ jsx(AreaHatchedFill, { id, dataKey }),
306
+ dimmed && /* @__PURE__ */ jsx(UnselectedFill, { id, dataKey })
307
+ ] })
308
+ ] });
309
+ }
310
+ const Dot = () => null;
311
+ const ActiveDot = () => null;
312
+ function resolveDots(children, id, dataKey, dotOpacity, maskId) {
313
+ let dot = false;
314
+ let activeDot = false;
315
+ Children.forEach(children, (child) => {
316
+ if (!isValidElement(child)) return;
317
+ const { variant } = child.props;
318
+ if (child.type === Dot) {
319
+ dot = /* @__PURE__ */ jsx(
320
+ ChartDot,
321
+ {
322
+ variant,
323
+ dataKey,
324
+ chartId: id,
325
+ fillOpacity: dotOpacity,
326
+ maskId
327
+ }
328
+ );
329
+ }
330
+ if (child.type === ActiveDot) {
331
+ activeDot = /* @__PURE__ */ jsx(ChartDot, { variant, dataKey, chartId: id, fillOpacity: dotOpacity });
332
+ }
333
+ });
334
+ return { dot, activeDot };
335
+ }
336
+ function XAxis({
337
+ tickLine = false,
338
+ axisLine = false,
339
+ tickMargin = 8,
340
+ minTickGap = 8,
341
+ label,
342
+ ...rest
343
+ }) {
344
+ const { isLoading } = useAreaChart();
345
+ if (isLoading) return null;
346
+ return /* @__PURE__ */ jsx(
347
+ RechartsXAxis,
348
+ {
349
+ tickLine,
350
+ axisLine,
351
+ tickMargin,
352
+ minTickGap,
353
+ ...rest,
354
+ children: axisLabel(label, "x")
355
+ }
356
+ );
357
+ }
358
+ function YAxis({
359
+ tickLine = false,
360
+ axisLine = false,
361
+ tickMargin = 8,
362
+ minTickGap = 8,
363
+ width = "auto",
364
+ tickFormatter,
365
+ label,
366
+ ...rest
367
+ }) {
368
+ const { isLoading, isExpanded } = useAreaChart();
369
+ if (isLoading) return null;
370
+ return /* @__PURE__ */ jsx(
371
+ RechartsYAxis,
372
+ {
373
+ tickLine,
374
+ axisLine,
375
+ tickMargin,
376
+ minTickGap,
377
+ width,
378
+ tickFormatter: isExpanded ? percentTick : tickFormatter ?? defaultTick,
379
+ ...rest,
380
+ children: axisLabel(label, "y")
381
+ }
382
+ );
383
+ }
384
+ function Grid({
385
+ vertical = false,
386
+ strokeDasharray = "3 3",
387
+ ...rest
388
+ }) {
389
+ return /* @__PURE__ */ jsx(CartesianGrid, { vertical, strokeDasharray, ...rest });
390
+ }
391
+ function Tooltip({ variant, roundness, defaultIndex, cursor = true }) {
392
+ const { isLoading, selectedDataKey } = useAreaChart();
393
+ if (isLoading) return null;
394
+ return /* @__PURE__ */ jsx(
395
+ ChartTooltip,
396
+ {
397
+ defaultIndex,
398
+ cursor: cursor ? { strokeDasharray: "3 3", strokeWidth: STROKE_WIDTH } : false,
399
+ content: /* @__PURE__ */ jsx(ChartTooltipContent, { selected: selectedDataKey, roundness, variant })
400
+ }
401
+ );
402
+ }
403
+ function Legend({
404
+ variant,
405
+ align = "right",
406
+ verticalAlign = "top",
407
+ isClickable = false
408
+ }) {
409
+ const { selectedDataKey, selectDataKey } = useAreaChart();
410
+ return /* @__PURE__ */ jsx(
411
+ ChartLegend,
412
+ {
413
+ verticalAlign,
414
+ align,
415
+ content: /* @__PURE__ */ jsx(
416
+ ChartLegendContent,
417
+ {
418
+ selected: selectedDataKey,
419
+ onSelectChange: selectDataKey,
420
+ isClickable,
421
+ variant
422
+ }
423
+ )
424
+ }
425
+ );
426
+ }
427
+ function Background({ variant }) {
428
+ const { isLoading } = useAreaChart();
429
+ if (isLoading) return null;
430
+ return /* @__PURE__ */ jsx(ChartBackground, { variant });
431
+ }
432
+ function LoadingArea({
433
+ chartId,
434
+ curveType,
435
+ onShimmerExit
436
+ }) {
437
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
438
+ /* @__PURE__ */ jsx(
439
+ RechartsArea,
440
+ {
441
+ type: curveType,
442
+ dataKey: LOADING_KEY,
443
+ fillOpacity: 0.05,
444
+ fill: "currentColor",
445
+ stroke: "currentColor",
446
+ strokeOpacity: 0.5,
447
+ isAnimationActive: false,
448
+ legendType: "none",
449
+ tooltipType: "none",
450
+ activeDot: false,
451
+ dot: false,
452
+ className: "text-(--ink)",
453
+ style: { mask: `url(#${chartId}-loading-mask)` }
454
+ }
455
+ ),
456
+ /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsx(LoadingShimmer, { id: chartId, onShimmerExit }) })
457
+ ] });
458
+ }
459
+ AreaChart.Area = Area;
460
+ AreaChart.Dot = Dot;
461
+ AreaChart.ActiveDot = ActiveDot;
462
+ AreaChart.XAxis = XAxis;
463
+ AreaChart.YAxis = YAxis;
464
+ AreaChart.Grid = Grid;
465
+ AreaChart.Tooltip = Tooltip;
466
+ AreaChart.Legend = Legend;
467
+ AreaChart.Background = Background;
468
+ AreaChart.ReferenceLine = ReferenceLine;
469
+ AreaChart.ReferenceBand = ReferenceBand;
470
+ AreaChart.Annotation = Annotation;
471
+ AreaChart.Values = Values;
472
+ AreaChart.Brush = Brush;
473
+ AreaChart.Toolbar = Toolbar;
474
+ AreaChart.Sonify = Sonify;
475
+ var AreaChart_default = AreaChart;
476
+ export {
477
+ AreaChart,
478
+ AreaChart_default as default
479
+ };
480
+ //# sourceMappingURL=AreaChart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/charts/AreaChart/AreaChart.tsx"],"sourcesContent":["'use client'\n\nimport {\n Children,\n createContext,\n isValidElement,\n useCallback,\n useContext,\n useId,\n useMemo,\n useState,\n type ComponentProps,\n type FC,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport {\n Area as RechartsArea,\n AreaChart as RechartsAreaChart,\n CartesianGrid,\n XAxis as RechartsXAxis,\n YAxis as RechartsYAxis,\n} from 'recharts'\nimport { useReducedMotion } from 'motion/react'\nimport { ChartContainer, percentTick, type ChartConfig } from '../lib/chart'\nimport { ChartFigure } from '../lib/figure'\nimport { ChartEmpty, type ChartEmptyProps } from '../lib/empty'\nimport { axisLabel } from '../lib/axis'\nimport { defaultTick } from '../lib/format'\nimport { Annotation, ReferenceBand, ReferenceLine } from '../lib/annotations'\nimport { Values, findSlot, resolveValues, type ValuesProps } from '../lib/values'\nimport {\n ChartSonifyButton,\n Sonify,\n useChartSonifySeries,\n type SonifyProps,\n} from '../lib/sonify-control'\n\n/**\n * The axis props, with `label` narrowed to a string.\n *\n * Recharts' own `label` accepts a render function and a config object, neither\n * of which a call site should be reaching for to name an axis — and both of\n * which would let a consumer opt out of the system's own axis type styling\n * without noticing.\n */\nexport type ChartXAxisProps = Omit<ComponentProps<typeof RechartsXAxis>, 'label'> & {\n /** What this axis measures. Say the unit here or in the series label, once. */\n label?: string\n}\n\nexport type ChartYAxisProps = Omit<ComponentProps<typeof RechartsYAxis>, 'label'> & {\n /** What this axis measures. Say the unit here or in the series label, once. */\n label?: string\n}\n\nimport { ChartBackground, type ChartBackgroundVariant } from '../lib/background'\nimport { ChartDot, type ChartDotVariant } from '../lib/dot'\nimport {\n ChartLegend,\n ChartLegendContent,\n type ChartLegendAlign,\n type ChartLegendVariant,\n} from '../lib/legend'\nimport {\n ChartTooltip,\n ChartTooltipContent,\n type ChartTooltipRoundness,\n type ChartTooltipVariant,\n} from '../lib/tooltip'\nimport { Brush, ChartBrush, type BrushProps, type ChartBrushRange } from '../lib/brush'\nimport { ChartControls, Toolbar, type ToolbarProps } from '../lib/toolbar'\nimport { useChartZoom } from '../lib/zoom'\nimport { LoadingIndicator, LoadingShimmer, LOADING_KEY, useLoadingRows } from '../lib/loading'\nimport {\n AnimatedDashedStroke,\n AreaDottedFill,\n AreaGradientFill,\n AreaGradientReverseFill,\n AreaHatchedFill,\n AreaLinesFill,\n AreaSolidFill,\n RevealMask,\n SeriesGradient,\n UnselectedFill,\n type ChartRevealType,\n} from '../lib/paint'\n\n/** The series stroke, in pixels. Thin by default — law 1 is a thin mark. */\nconst STROKE_WIDTH = 0.8\n\n/** Every stacked area shares one id, which is what makes them stack. */\nconst STACK_ID = 'm22-area-stack'\n\n/**\n * Room around the plot, so the first and last tick labels are not sliced by the\n * container's edge. Recharts' own default is 5px on every side, which is not\n * enough for a label centred on the axis's first point.\n */\nconst CHART_MARGIN = { top: 8, right: 12, bottom: 0, left: 12 }\n\n/** How an area's curve is interpolated between points. */\nexport type ChartCurveType = ComponentProps<typeof RechartsArea>['type']\n\n/**\n * How an area meets the plot.\n *\n * In the monochrome default this is the PRIMARY way two series are told apart\n * — the ramp is the second encoding — so a chart with more than one area\n * should vary this before it varies anything else.\n */\nexport type AreaVariant = 'gradient' | 'gradient-reverse' | 'solid' | 'dotted' | 'lines' | 'hatched'\n\n/** How the line on top of an area is drawn. */\nexport type AreaStrokeVariant = 'solid' | 'dashed' | 'animated-dashed'\n\n/** How several areas combine: side by side, stacked, or normalised to 100%. */\nexport type AreaStackType = 'default' | 'stacked' | 'expanded'\n\ninterface AreaChartContextValue {\n config: ChartConfig\n /** The rows on screen, so a mark can label its own extremes. */\n rows: Record<string, unknown>[]\n curveType: ChartCurveType\n animationType: ChartRevealType\n isStacked: boolean\n isExpanded: boolean\n isLoading: boolean\n selectedDataKey: string | null\n selectDataKey: (dataKey: string | null) => void\n}\n\nconst AreaChartContext = createContext<AreaChartContextValue | null>(null)\n\nfunction useAreaChart(): AreaChartContextValue {\n const context = useContext(AreaChartContext)\n if (!context) throw new Error('An area chart part must be rendered inside <AreaChart>')\n return context\n}\n\n/** Fails the build when a config names a series the rows do not have. */\ntype ValidateKeys<TData, TConfig> = {\n [K in keyof TConfig]: K extends keyof TData ? ChartConfig[string] : never\n}\n\nexport interface AreaChartProps<\n TData extends Record<string, unknown>,\n TConfig extends Record<string, ChartConfig[string]>,\n> {\n /** Series keys → their label and paint. Declaration order is ramp order. */\n config: TConfig & ValidateKeys<TData, TConfig>\n /** The rows the chart draws. One entry per point, bar or category. */\n data: TData[]\n /**\n * What the chart shows, in a sentence a reader could act on. Required, and\n * announced to a screen reader even when it is not printed.\n */\n title: string\n /** Prints the title above the plot instead of hiding it from sight. */\n showTitle?: boolean\n /** A line under the title — the unit, the window, the caveat. */\n description?: ReactNode\n /**\n * The composed parts — axes, grid, tooltip, legend, and the marks\n * themselves.\n */\n children: ReactNode\n /** Merged onto the figure, last, so a call site can size or space it. */\n className?: string\n /** Escape hatch onto the raw Recharts chart element. */\n chartProps?: ComponentProps<typeof RechartsAreaChart>\n /** The curve every `<AreaChart.Area>` inherits. */\n curveType?: ChartCurveType\n /** The intro wipe every `<AreaChart.Area>` inherits. */\n animationType?: ChartRevealType\n /** How several marks combine: side by side, stacked, or normalised to 100%. */\n stackType?: AreaStackType\n /** The series lit on first render. Selection dims every other series. */\n defaultSelectedDataKey?: string | null\n /** Fires when the selection changes, and with null when it is cleared. */\n onSelectionChange?: (selectedDataKey: string | null) => void\n /**\n * Swaps the marks for an animated skeleton, keeping the measured height so\n * the page does not jump when the data lands.\n */\n isLoading?: boolean\n /** How many points the skeleton draws. */\n loadingPoints?: number\n /**\n * The row field on the category axis. Needed by the brush and by the table\n * view.\n */\n xDataKey?: keyof TData & string\n /**\n * Drops the hidden table view. Only correct when the page prints the data\n * itself.\n */\n hideDataTable?: boolean\n /**\n * What the chart shows when it has nothing to draw.\n *\n * Rendered instead of the plot whenever `data` is empty and the chart is not\n * loading — the state a real dashboard reaches within a week, and the one an\n * empty pair of axes is indistinguishable from a failed load. `false` keeps\n * the axes, for a chart whose emptiness is itself the reading.\n */\n empty?: ChartEmptyProps | false\n}\n\n/**\n * A filled series over a category axis — the shape for a magnitude that is\n * continuous, where the area under the line means something.\n *\n * Composed rather than configured: axes, grid, tooltip, legend and the areas\n * themselves are children, so a chart renders exactly the parts it asked for\n * and nothing is switched on by a prop nobody can see.\n *\n * Reach for `<LineChart>` instead when the reader is comparing several series\n * against each other rather than reading one total, and for `<BarChart>` when\n * the categories are discrete.\n *\n * @example\n * <AreaChart title=\"Visitors per month\" config={config} data={data} xDataKey=\"month\">\n * <AreaChart.Grid />\n * <AreaChart.XAxis dataKey=\"month\" />\n * <AreaChart.Tooltip />\n * <AreaChart.Area dataKey=\"desktop\" variant=\"gradient\" />\n * </AreaChart>\n */\nexport function AreaChart<\n TData extends Record<string, unknown>,\n TConfig extends Record<string, ChartConfig[string]>,\n>({\n config,\n data,\n title,\n showTitle,\n description,\n children,\n className,\n chartProps,\n curveType = 'linear',\n animationType = 'forward',\n stackType = 'default',\n defaultSelectedDataKey = null,\n onSelectionChange,\n isLoading = false,\n loadingPoints,\n xDataKey,\n hideDataTable = false,\n empty,\n}: AreaChartProps<TData, TConfig>) {\n const chartId = useId().replace(/:/g, '')\n const [selectedDataKey, setSelectedDataKey] = useState<string | null>(defaultSelectedDataKey)\n const { rows: loadingData, onShimmerExit } = useLoadingRows(isLoading, loadingPoints)\n // One window, two views of it: the brush strip below the plot and the\n // toolbar above it both read and write this. See `useChartZoom` for why they\n // are not two separate windows.\n const zoom = useChartZoom({ data, xDataKey })\n\n // The brush, the toolbar and the sonify control are declared as children but\n // never rendered into the Recharts tree — they live in the figure, outside\n // the SVG.\n const { brushSlot, toolbarSlot, sonifySlot, chartChildren } = useMemo(() => {\n const parts = Children.toArray(children)\n const element = parts.find((child) => isValidElement(child) && child.type === Brush)\n const props = (isValidElement(element) ? element.props : {}) as BrushProps\n return {\n brushSlot: { present: isValidElement(element), ...props },\n toolbarSlot: findSlot<ToolbarProps>(parts, Toolbar),\n sonifySlot: findSlot<SonifyProps>(parts, Sonify),\n chartChildren: parts.filter(\n (child) =>\n !(\n isValidElement(child) &&\n (child.type === Brush || child.type === Toolbar || child.type === Sonify)\n ),\n ),\n }\n }, [children])\n\n const columns = useMemo(\n () => Object.entries(config).map(([key, series]) => ({ key, label: series.label })),\n [config],\n )\n\n const isExpanded = stackType === 'expanded'\n const isStacked = stackType === 'stacked' || isExpanded\n const showBrush = brushSlot.present && !isLoading\n const showToolbar = toolbarSlot !== null && !isLoading\n // `empty === false` keeps the axes, for a chart whose emptiness is the\n // reading — a monitoring panel that should show a flat, silent range rather\n // than a message.\n const isEmpty = !isLoading && empty !== false && data.length === 0\n const displayData =\n isLoading ? loadingData : showBrush || showToolbar ? zoom.visibleData : data\n\n // The rows on screen, so a brushed range sounds like what it looks like. A\n // skeleton or an empty chart yields no finite value, which is what leaves the\n // control disabled rather than playing silence.\n const sonifySeries = useChartSonifySeries(\n sonifySlot,\n displayData as Record<string, unknown>[],\n config,\n xDataKey,\n )\n\n const selectDataKey = useCallback(\n (next: string | null) => {\n setSelectedDataKey(next)\n onSelectionChange?.(next)\n },\n [onSelectionChange],\n )\n\n const context = useMemo<AreaChartContextValue>(\n () => ({\n config,\n rows: displayData as Record<string, unknown>[],\n curveType,\n animationType,\n isStacked,\n isExpanded,\n isLoading,\n selectedDataKey,\n selectDataKey,\n }),\n [\n animationType,\n config,\n curveType,\n displayData,\n isExpanded,\n isLoading,\n isStacked,\n selectDataKey,\n selectedDataKey,\n ],\n )\n\n return (\n <AreaChartContext.Provider value={context}>\n <ChartFigure\n title={title}\n showTitle={showTitle}\n description={description}\n className={className}\n table={\n hideDataTable\n ? false\n : { rows: data, rowKey: xDataKey, columns }\n }\n >\n {sonifySlot && (\n <ChartSonifyButton {...sonifySlot} title={title} series={sonifySeries} />\n )}\n {isEmpty ? (\n <ChartEmpty {...(empty || {})} />\n ) : (\n <ChartControls\n toolbar={showToolbar ? toolbarSlot : null}\n zoom={zoom}\n title={title}\n rows={data}\n columns={columns}\n rowKey={xDataKey}\n >\n <ChartContainer\n config={config}\n footer={\n showBrush && (\n <ChartBrush\n data={data}\n config={config}\n xDataKey={xDataKey}\n variant=\"area\"\n curveType={curveType}\n height={brushSlot.height}\n formatLabel={brushSlot.formatLabel}\n stacked={isStacked}\n className=\"mt-1\"\n {...zoom.brushProps}\n onChange={(range: ChartBrushRange) => {\n zoom.brushProps.onChange(range)\n brushSlot.onChange?.(range)\n }}\n />\n )\n }\n >\n <RechartsAreaChart\n id={chartId}\n accessibilityLayer\n margin={CHART_MARGIN}\n stackOffset={isExpanded ? 'expand' : undefined}\n data={displayData}\n {...chartProps}\n >\n {chartChildren}\n {isLoading && (\n <LoadingArea chartId={chartId} curveType={curveType} onShimmerExit={onShimmerExit} />\n )}\n </RechartsAreaChart>\n </ChartContainer>\n </ChartControls>\n )}\n <LoadingIndicator isLoading={isLoading} />\n </ChartFigure>\n </AreaChartContext.Provider>\n )\n}\n\nexport interface AreaProps {\n /** The series to draw. Must exist on both the rows and the config. */\n dataKey: string\n variant?: AreaVariant\n strokeVariant?: AreaStrokeVariant\n strokeWidth?: number\n curveType?: ChartCurveType\n animationType?: ChartRevealType\n connectNulls?: boolean\n /** Lets a click on this area select it, dimming the rest. */\n isClickable?: boolean\n /** `<AreaChart.Dot>`, `<AreaChart.ActiveDot>` and `<AreaChart.Values>`. */\n children?: ReactNode\n areaProps?: ComponentProps<typeof RechartsArea>\n}\n\n/**\n * One filled series.\n *\n * Every area scopes its own gradients and patterns under a unique id, so any\n * number of them — each with its own variant, stroke and clickability — can\n * share a chart without one overwriting another's definitions.\n */\nfunction Area({\n dataKey,\n variant = 'gradient',\n strokeVariant = 'dashed',\n strokeWidth = STROKE_WIDTH,\n curveType,\n animationType,\n connectNulls = false,\n isClickable = false,\n children,\n areaProps,\n}: AreaProps) {\n const {\n config,\n curveType: defaultCurve,\n animationType: defaultAnimation,\n isStacked,\n isExpanded,\n isLoading,\n rows,\n selectedDataKey,\n selectDataKey,\n } = useAreaChart()\n const id = useId().replace(/:/g, '')\n const reduceMotion = useReducedMotion()\n\n if (isLoading) return null\n\n const reveal: ChartRevealType = reduceMotion ? 'none' : (animationType ?? defaultAnimation)\n const maskId = reveal === 'none' ? undefined : `${id}-reveal-mask`\n\n const isSelected = selectedDataKey === dataKey\n const hasSelection = selectedDataKey !== null\n const dimmed = hasSelection && !isSelected\n // The variant's own mask carries the fill strength now (`--chart-fill`), so\n // a base multiplier here would darken paper and erase ink a second time.\n // What is left is the SELECTION dim, which is a multiplier by definition.\n const opacity = dimmed\n ? { fill: 0.25, stroke: 0.3, dot: 0.3 }\n : { fill: 1, stroke: 1, dot: 1 }\n\n const { dot, activeDot } = resolveDots(children, id, dataKey, opacity.dot, maskId)\n const labels = resolveValues(\n findSlot<ValuesProps>(children, Values),\n rows.map((row) => Number(row[dataKey])).filter(Number.isFinite),\n )\n\n // An animated dash is a SMIL loop, which `keyframes.css` cannot reach — so it\n // is gated here rather than in CSS. It is also dropped while another series\n // is selected: a crawling dash on a dimmed line reads as the live one.\n const animateDash = strokeVariant === 'animated-dashed' && !hasSelection && !reduceMotion\n const isDashed = strokeVariant !== 'solid'\n\n return (\n <>\n <RechartsArea\n type={curveType ?? defaultCurve}\n dataKey={dataKey}\n connectNulls={connectNulls}\n fillOpacity={opacity.fill}\n strokeOpacity={opacity.stroke}\n fill={`url(#${id}-${dimmed ? 'unselected' : variant}-${dataKey})`}\n stroke={`url(#${id}-colors-${dataKey})`}\n stackId={isStacked ? STACK_ID : undefined}\n dot={dot}\n activeDot={activeDot}\n strokeWidth={strokeWidth}\n strokeDasharray={isDashed ? '3 3' : undefined}\n // Recharts' own area animation draws the fill and the dots on separate\n // clocks, so the markers arrive before the line reaches them. The mask\n // below wipes fill, stroke and dots in together instead.\n isAnimationActive={false}\n style={{\n ...(maskId ? { mask: `url(#${maskId})` } : {}),\n ...(isClickable ? { cursor: 'pointer' } : {}),\n }}\n onClick={() => {\n if (!isClickable) return\n selectDataKey(isSelected ? null : dataKey)\n }}\n {...areaProps}\n >\n {animateDash && <AnimatedDashedStroke />}\n {labels}\n </RechartsArea>\n <defs>\n {reveal !== 'none' && <RevealMask id={id} type={reveal} />}\n <SeriesGradient\n id={id}\n dataKey={dataKey}\n config={config}\n gradientUnits={isExpanded ? 'userSpaceOnUse' : 'objectBoundingBox'}\n />\n {variant === 'gradient' && <AreaGradientFill id={id} dataKey={dataKey} />}\n {variant === 'gradient-reverse' && <AreaGradientReverseFill id={id} dataKey={dataKey} />}\n {variant === 'solid' && <AreaSolidFill id={id} dataKey={dataKey} />}\n {variant === 'dotted' && <AreaDottedFill id={id} dataKey={dataKey} />}\n {variant === 'lines' && <AreaLinesFill id={id} dataKey={dataKey} />}\n {variant === 'hatched' && <AreaHatchedFill id={id} dataKey={dataKey} />}\n {dimmed && <UnselectedFill id={id} dataKey={dataKey} />}\n </defs>\n </>\n )\n}\n\nexport interface DotProps {\n variant?: ChartDotVariant\n}\n\n/**\n * The resting point marker for the area it is composed inside. A slot: it\n * renders nothing, and the parent reads its variant.\n */\nconst Dot: FC<DotProps> = () => null\n\n/** The marker under the pointer. Same slot shape as `<Dot>`. */\nconst ActiveDot: FC<DotProps> = () => null\n\n/** Lifts `<Dot>` and `<ActiveDot>` out of an area's children. */\nfunction resolveDots(\n children: ReactNode,\n id: string,\n dataKey: string,\n dotOpacity: number,\n maskId: string | undefined,\n) {\n let dot: ComponentProps<typeof RechartsArea>['dot'] = false\n let activeDot: ComponentProps<typeof RechartsArea>['activeDot'] = false\n\n Children.forEach(children, (child) => {\n if (!isValidElement(child)) return\n const { variant } = (child as ReactElement<DotProps>).props\n\n if (child.type === Dot) {\n // The resting dot shares the intro wipe so it appears with its own line.\n dot = (\n <ChartDot\n variant={variant}\n dataKey={dataKey}\n chartId={id}\n fillOpacity={dotOpacity}\n maskId={maskId}\n />\n )\n }\n if (child.type === ActiveDot) {\n // The active dot is never masked: it only exists on hover, long after\n // the intro has finished, and a stale mask would hide it entirely.\n activeDot = (\n <ChartDot variant={variant} dataKey={dataKey} chartId={id} fillOpacity={dotOpacity} />\n )\n }\n })\n\n return { dot, activeDot }\n}\n\n/** The category axis. Flat by default; every Recharts prop passes through. */\nfunction XAxis({\n tickLine = false,\n axisLine = false,\n tickMargin = 8,\n minTickGap = 8,\n label,\n ...rest\n}: ChartXAxisProps) {\n const { isLoading } = useAreaChart()\n if (isLoading) return null\n return (\n <RechartsXAxis\n tickLine={tickLine}\n axisLine={axisLine}\n tickMargin={tickMargin}\n minTickGap={minTickGap}\n {...rest}\n >\n {axisLabel(label, 'x')}\n </RechartsXAxis>\n )\n}\n\n/** The value axis. Formats as a percentage on its own when the stack is expanded. */\nfunction YAxis({\n tickLine = false,\n axisLine = false,\n tickMargin = 8,\n minTickGap = 8,\n width = 'auto',\n tickFormatter,\n label,\n ...rest\n}: ChartYAxisProps) {\n const { isLoading, isExpanded } = useAreaChart()\n if (isLoading) return null\n return (\n <RechartsYAxis\n tickLine={tickLine}\n axisLine={axisLine}\n tickMargin={tickMargin}\n minTickGap={minTickGap}\n width={width}\n tickFormatter={isExpanded ? percentTick : (tickFormatter ?? defaultTick)}\n {...rest}\n >\n {axisLabel(label, 'y')}\n </RechartsYAxis>\n )\n}\n\n/** Horizontal dashed rules. Vertical ones are off — they rarely earn their ink. */\nfunction Grid({\n vertical = false,\n strokeDasharray = '3 3',\n ...rest\n}: ComponentProps<typeof CartesianGrid>) {\n return <CartesianGrid vertical={vertical} strokeDasharray={strokeDasharray} {...rest} />\n}\n\nexport interface ChartTooltipSlotProps {\n variant?: ChartTooltipVariant\n roundness?: ChartTooltipRoundness\n /** Shows the tooltip at this row before anything is hovered. */\n defaultIndex?: number\n /** The crosshair that follows the pointer along the axis. */\n cursor?: boolean\n}\n\n/** The hover panel. Dims with the plot when a series is selected. */\nfunction Tooltip({ variant, roundness, defaultIndex, cursor = true }: ChartTooltipSlotProps) {\n const { isLoading, selectedDataKey } = useAreaChart()\n if (isLoading) return null\n\n return (\n <ChartTooltip\n defaultIndex={defaultIndex}\n cursor={cursor ? { strokeDasharray: '3 3', strokeWidth: STROKE_WIDTH } : false}\n content={\n <ChartTooltipContent selected={selectedDataKey} roundness={roundness} variant={variant} />\n }\n />\n )\n}\n\nexport interface ChartLegendSlotProps {\n variant?: ChartLegendVariant\n align?: ChartLegendAlign\n verticalAlign?: 'top' | 'middle' | 'bottom'\n /** Makes each entry a button that selects its series. */\n isClickable?: boolean\n}\n\n/**\n * The key. Required above one series: with the monochrome ramp two areas differ\n * by a step of grey and a texture, and neither names itself.\n */\nfunction Legend({\n variant,\n align = 'right',\n verticalAlign = 'top',\n isClickable = false,\n}: ChartLegendSlotProps) {\n const { selectedDataKey, selectDataKey } = useAreaChart()\n\n return (\n <ChartLegend\n verticalAlign={verticalAlign}\n align={align}\n content={\n <ChartLegendContent\n selected={selectedDataKey}\n onSelectChange={selectDataKey}\n isClickable={isClickable}\n variant={variant}\n />\n }\n />\n )\n}\n\n/** The decorative plate behind the plot. */\nfunction Background({ variant }: { variant: ChartBackgroundVariant }) {\n const { isLoading } = useAreaChart()\n if (isLoading) return null\n return <ChartBackground variant={variant} />\n}\n\n/** The skeleton drawn in place of the real areas while data is in flight. */\nfunction LoadingArea({\n chartId,\n curveType,\n onShimmerExit,\n}: {\n chartId: string\n curveType: ChartCurveType\n onShimmerExit: () => void\n}) {\n return (\n <>\n <RechartsArea\n type={curveType}\n dataKey={LOADING_KEY}\n fillOpacity={0.05}\n fill=\"currentColor\"\n stroke=\"currentColor\"\n strokeOpacity={0.5}\n isAnimationActive={false}\n legendType=\"none\"\n tooltipType=\"none\"\n activeDot={false}\n dot={false}\n className=\"text-(--ink)\"\n style={{ mask: `url(#${chartId}-loading-mask)` }}\n />\n <defs>\n <LoadingShimmer id={chartId} onShimmerExit={onShimmerExit} />\n </defs>\n </>\n )\n}\n\n// Every part hangs off the root, so one import brings the whole vocabulary and\n// no two charts collide over a name like `Tooltip`.\nAreaChart.Area = Area\nAreaChart.Dot = Dot\nAreaChart.ActiveDot = ActiveDot\nAreaChart.XAxis = XAxis\nAreaChart.YAxis = YAxis\nAreaChart.Grid = Grid\nAreaChart.Tooltip = Tooltip\nAreaChart.Legend = Legend\nAreaChart.Background = Background\nAreaChart.ReferenceLine = ReferenceLine\nAreaChart.ReferenceBand = ReferenceBand\nAreaChart.Annotation = Annotation\nAreaChart.Values = Values\nAreaChart.Brush = Brush\nAreaChart.Toolbar = Toolbar\nAreaChart.Sonify = Sonify\n\nexport default AreaChart\n"],"mappings":"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","names":[]}