@leracherry/chartmd 0.1.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.
- package/LICENSE +21 -0
- package/README.md +134 -0
- package/ROADMAP.md +50 -0
- package/dist/chart.d.ts +17 -0
- package/dist/chart.d.ts.map +1 -0
- package/dist/chart.js +116 -0
- package/dist/chart.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/parser.d.ts +3 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +136 -0
- package/dist/parser.js.map +1 -0
- package/dist/remark.d.ts +15 -0
- package/dist/remark.d.ts.map +1 -0
- package/dist/remark.js +27 -0
- package/dist/remark.js.map +1 -0
- package/dist/types.d.ts +19 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/package.json +75 -0
- package/style.css +29 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Valeriia Radchenko
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# chart.md
|
|
2
|
+
|
|
3
|
+
Markdown-native charts for React. Write a chart as a fenced Markdown block and
|
|
4
|
+
render it with `react-markdown`; the chart inherits the text colour of the
|
|
5
|
+
surrounding document.
|
|
6
|
+
|
|
7
|
+
````md
|
|
8
|
+
```chart
|
|
9
|
+
type: bar
|
|
10
|
+
title: Sign-ups
|
|
11
|
+
x: Month
|
|
12
|
+
y: People
|
|
13
|
+
|
|
14
|
+
| Month | Free | Pro |
|
|
15
|
+
| --- | ---: | ---: |
|
|
16
|
+
| Jan | 120 | 32 |
|
|
17
|
+
| Feb | 168 | 48 |
|
|
18
|
+
| Mar | 210 | 67 |
|
|
19
|
+
```
|
|
20
|
+
````
|
|
21
|
+
|
|
22
|
+
## Install
|
|
23
|
+
|
|
24
|
+
```sh
|
|
25
|
+
npm install @leracherry/chartmd react-markdown
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Use with React Markdown
|
|
29
|
+
|
|
30
|
+
```tsx
|
|
31
|
+
import Markdown from 'react-markdown';
|
|
32
|
+
import { chartComponents, remarkChart } from '@leracherry/chartmd';
|
|
33
|
+
import '@leracherry/chartmd/style.css';
|
|
34
|
+
|
|
35
|
+
export function Article({ source }: { source: string }) {
|
|
36
|
+
return (
|
|
37
|
+
<Markdown remarkPlugins={[remarkChart]} components={chartComponents}>
|
|
38
|
+
{source}
|
|
39
|
+
</Markdown>
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
That is the complete integration. `remarkChart` recognizes fenced `chart`
|
|
45
|
+
blocks, validates their contents, and turns them into a chart node.
|
|
46
|
+
`chartComponents` tells `react-markdown` how to render that node.
|
|
47
|
+
|
|
48
|
+
The SVG uses `currentColor`, so a chart automatically follows the Markdown
|
|
49
|
+
container in light mode, dark mode, links, embedded docs, and custom themes:
|
|
50
|
+
|
|
51
|
+
```css
|
|
52
|
+
.markdown-body {
|
|
53
|
+
color: #24292f;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
@media (prefers-color-scheme: dark) {
|
|
57
|
+
.markdown-body {
|
|
58
|
+
color: #f0f6fc;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Multiple series remain one-colour: they are distinguished by opacity and line
|
|
64
|
+
dash patterns. Optional CSS variables provide finer control without requiring a
|
|
65
|
+
chart theme:
|
|
66
|
+
|
|
67
|
+
```css
|
|
68
|
+
.markdown-body {
|
|
69
|
+
--chartmd-color: currentColor;
|
|
70
|
+
--chartmd-grid-opacity: 0.14;
|
|
71
|
+
--chartmd-muted-opacity: 0.68;
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Chart syntax
|
|
76
|
+
|
|
77
|
+
`type` is `bar` or `line`. `title`, `x`, and `y` are optional plain-text
|
|
78
|
+
properties. The first table column supplies labels; every remaining column is a
|
|
79
|
+
numeric series.
|
|
80
|
+
|
|
81
|
+
````md
|
|
82
|
+
```chart
|
|
83
|
+
type: line
|
|
84
|
+
title: Response time
|
|
85
|
+
x: Release
|
|
86
|
+
y: Milliseconds
|
|
87
|
+
|
|
88
|
+
| Release | API | Worker |
|
|
89
|
+
| --- | ---: | ---: |
|
|
90
|
+
| 1.0 | 182 | 240 |
|
|
91
|
+
| 1.1 | 151 | 205 |
|
|
92
|
+
| 1.2 | 127 | 176 |
|
|
93
|
+
```
|
|
94
|
+
````
|
|
95
|
+
|
|
96
|
+
Values may be positive, negative, or zero. Tables require a header, a Markdown
|
|
97
|
+
separator row, and at least one data row. Invalid charts fail during Markdown
|
|
98
|
+
processing with a useful error instead of silently rendering broken output.
|
|
99
|
+
|
|
100
|
+
## Direct component use
|
|
101
|
+
|
|
102
|
+
The parser and component are also public when the Markdown renderer is managed
|
|
103
|
+
elsewhere:
|
|
104
|
+
|
|
105
|
+
```tsx
|
|
106
|
+
import { Chart, parseChart } from '@leracherry/chartmd';
|
|
107
|
+
|
|
108
|
+
const definition = parseChart(chartSource);
|
|
109
|
+
return <Chart definition={definition} />;
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Public exports:
|
|
113
|
+
|
|
114
|
+
- `remarkChart` — Markdown AST plugin.
|
|
115
|
+
- `chartComponents` — component map for `react-markdown`.
|
|
116
|
+
- `Chart` — responsive, accessible React SVG component.
|
|
117
|
+
- `parseChart` — parser for the fenced block body.
|
|
118
|
+
- `ChartDefinition`, `ChartSeries`, and `ChartType` — TypeScript types.
|
|
119
|
+
|
|
120
|
+
The package has no browser charting dependency and does not use a canvas,
|
|
121
|
+
network request, generated image, or client-side effect.
|
|
122
|
+
|
|
123
|
+
## Development and delivery
|
|
124
|
+
|
|
125
|
+
The product direction and release milestones live in [ROADMAP.md](ROADMAP.md).
|
|
126
|
+
|
|
127
|
+
```sh
|
|
128
|
+
pnpm install
|
|
129
|
+
pnpm check
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## License
|
|
133
|
+
|
|
134
|
+
[MIT](LICENSE)
|
package/ROADMAP.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Product roadmap
|
|
2
|
+
|
|
3
|
+
## Product promise
|
|
4
|
+
|
|
5
|
+
Install one package, add one Remark plugin and one component map to a React
|
|
6
|
+
Markdown renderer, then write accessible charts in Markdown. Charts should feel
|
|
7
|
+
native to the document rather than like embedded third-party widgets.
|
|
8
|
+
|
|
9
|
+
## Milestone 1 — React Markdown foundation (implemented)
|
|
10
|
+
|
|
11
|
+
- Fenced `chart` syntax with Markdown tables.
|
|
12
|
+
- Bar and line charts with multiple numeric series.
|
|
13
|
+
- `react-markdown` integration through `remarkChart` and `chartComponents`.
|
|
14
|
+
- Responsive, server-renderable SVG output with accessible titles and data
|
|
15
|
+
descriptions.
|
|
16
|
+
- One-colour rendering based on `currentColor`, with opacity and dash patterns
|
|
17
|
+
for series differentiation.
|
|
18
|
+
- Published TypeScript declarations, focused tests, and npm package metadata.
|
|
19
|
+
|
|
20
|
+
Exit criteria: a consumer can install `@leracherry/chartmd` and
|
|
21
|
+
`react-markdown`, paste the README example, and render a chart without
|
|
22
|
+
configuration or another charting library.
|
|
23
|
+
|
|
24
|
+
## Milestone 2 — Markdown ecosystem coverage
|
|
25
|
+
|
|
26
|
+
- Compatibility fixtures for Unified/Remark pipelines beyond `react-markdown`.
|
|
27
|
+
- Horizontal bars and compact/sparkline presentation.
|
|
28
|
+
- Better diagnostics with source positions for malformed cells.
|
|
29
|
+
- Documented hooks for custom labels and numeric formatting.
|
|
30
|
+
|
|
31
|
+
Exit criteria: the same chart source works consistently in the major
|
|
32
|
+
Remark-based React rendering paths.
|
|
33
|
+
|
|
34
|
+
## Milestone 3 — Custom rendering without theme drift
|
|
35
|
+
|
|
36
|
+
- Component overrides for marks, labels, legends, and tooltips.
|
|
37
|
+
- Locale-aware number formatting.
|
|
38
|
+
- Explicit colour opt-in for teams that need multi-colour series, while keeping
|
|
39
|
+
one-colour inheritance as the default.
|
|
40
|
+
- Visual regression suite for light, dark, narrow, and high-contrast layouts.
|
|
41
|
+
|
|
42
|
+
Exit criteria: applications can customize chart behavior deeply without
|
|
43
|
+
forking the parser or losing Markdown-theme inheritance.
|
|
44
|
+
|
|
45
|
+
## Release policy
|
|
46
|
+
|
|
47
|
+
Patch releases fix parsing, rendering, accessibility, or documentation.
|
|
48
|
+
Minor releases may add syntax and component options without changing existing
|
|
49
|
+
chart meaning. Breaking syntax or React integration changes require a major
|
|
50
|
+
release and a migration guide.
|
package/dist/chart.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type HTMLAttributes, type SVGProps } from 'react';
|
|
2
|
+
import type { ChartDefinition } from './types.js';
|
|
3
|
+
export interface ChartProps extends Omit<SVGProps<SVGSVGElement>, 'children'> {
|
|
4
|
+
definition?: ChartDefinition;
|
|
5
|
+
'data-chart'?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function Chart({ definition: suppliedDefinition, 'data-chart': serializedDefinition, className, style, ...svgProps }: ChartProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
interface ChartContainerProps extends HTMLAttributes<HTMLDivElement> {
|
|
9
|
+
node?: unknown;
|
|
10
|
+
'data-chart'?: string;
|
|
11
|
+
}
|
|
12
|
+
declare function ChartContainer({ node, 'data-chart': serializedDefinition, children, ...props }: ChartContainerProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export declare const chartComponents: {
|
|
14
|
+
div: typeof ChartContainer;
|
|
15
|
+
};
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=chart.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart.d.ts","sourceRoot":"","sources":["../src/chart.tsx"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,QAAQ,EACd,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AASlD,MAAM,WAAW,UAAW,SAAQ,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3E,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAwBD,wBAAgB,KAAK,CAAC,EACpB,UAAU,EAAE,kBAAkB,EAC9B,YAAY,EAAE,oBAAoB,EAClC,SAAS,EACT,KAAK,EACL,GAAG,QAAQ,EACZ,EAAE,UAAU,2CA+MZ;AA+BD,UAAU,mBAAoB,SAAQ,cAAc,CAAC,cAAc,CAAC;IAClE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,iBAAS,cAAc,CAAC,EACtB,IAAI,EACJ,YAAY,EAAE,oBAAoB,EAClC,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,mBAAmB,2CAMrB;AAED,eAAO,MAAM,eAAe;;CAE3B,CAAC"}
|
package/dist/chart.js
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useId, } from 'react';
|
|
3
|
+
const width = 720;
|
|
4
|
+
const height = 420;
|
|
5
|
+
const margin = { top: 54, right: 24, bottom: 76, left: 72 };
|
|
6
|
+
const plotWidth = width - margin.left - margin.right;
|
|
7
|
+
const plotHeight = height - margin.top - margin.bottom;
|
|
8
|
+
const dashPatterns = ['', '8 5', '2 4', '10 4 2 4', '1 4'];
|
|
9
|
+
function formatNumber(value) {
|
|
10
|
+
return new Intl.NumberFormat('en', {
|
|
11
|
+
maximumFractionDigits: 2,
|
|
12
|
+
notation: Math.abs(value) >= 10_000 ? 'compact' : 'standard',
|
|
13
|
+
}).format(value);
|
|
14
|
+
}
|
|
15
|
+
function getDomain(definition) {
|
|
16
|
+
const values = definition.series.flatMap((series) => series.values);
|
|
17
|
+
let minimum = Math.min(0, ...values);
|
|
18
|
+
let maximum = Math.max(0, ...values);
|
|
19
|
+
if (minimum === maximum)
|
|
20
|
+
maximum = minimum + 1;
|
|
21
|
+
const padding = (maximum - minimum) * 0.08;
|
|
22
|
+
if (minimum < 0)
|
|
23
|
+
minimum -= padding;
|
|
24
|
+
if (maximum > 0)
|
|
25
|
+
maximum += padding;
|
|
26
|
+
return [minimum, maximum];
|
|
27
|
+
}
|
|
28
|
+
function seriesOpacity(index) {
|
|
29
|
+
return Math.max(0.38, 0.94 - index * 0.14);
|
|
30
|
+
}
|
|
31
|
+
export function Chart({ definition: suppliedDefinition, 'data-chart': serializedDefinition, className, style, ...svgProps }) {
|
|
32
|
+
const definition = suppliedDefinition ?? parseSerialized(serializedDefinition);
|
|
33
|
+
const titleId = `chartmd-title-${useId().replaceAll(':', '')}`;
|
|
34
|
+
const descriptionId = `${titleId}-description`;
|
|
35
|
+
const [minimum, maximum] = getDomain(definition);
|
|
36
|
+
const y = (value) => {
|
|
37
|
+
return margin.top + ((maximum - value) / (maximum - minimum)) * plotHeight;
|
|
38
|
+
};
|
|
39
|
+
const zeroY = y(0);
|
|
40
|
+
const categoryWidth = plotWidth / definition.labels.length;
|
|
41
|
+
const title = definition.title ?? `${definition.type === 'bar' ? 'Bar' : 'Line'} chart`;
|
|
42
|
+
const description = definition.series
|
|
43
|
+
.map((series) => {
|
|
44
|
+
const values = definition.labels.map((label, index) => `${label}: ${formatNumber(series.values[index] ?? 0)}`);
|
|
45
|
+
return `${series.name}. ${values.join(', ')}`;
|
|
46
|
+
})
|
|
47
|
+
.join('. ');
|
|
48
|
+
const mergedStyle = {
|
|
49
|
+
color: 'var(--chartmd-color, currentColor)',
|
|
50
|
+
...style,
|
|
51
|
+
};
|
|
52
|
+
return (_jsxs("svg", { ...svgProps, className: ['chartmd', className].filter(Boolean).join(' '), style: mergedStyle, viewBox: `0 0 ${width} ${height}`, role: "img", "aria-labelledby": `${titleId} ${descriptionId}`, xmlns: "http://www.w3.org/2000/svg", children: [_jsx("title", { id: titleId, children: title }), _jsx("desc", { id: descriptionId, children: description }), definition.title && (_jsx("text", { className: "chartmd__title", x: margin.left, y: 25, fontSize: 20, children: definition.title })), Array.from({ length: 5 }, (_, index) => {
|
|
53
|
+
const value = minimum + ((maximum - minimum) * index) / 4;
|
|
54
|
+
const gridY = y(value);
|
|
55
|
+
return (_jsxs("g", { children: [_jsx("line", { className: "chartmd__grid", x1: margin.left, x2: width - margin.right, y1: gridY, y2: gridY, stroke: "currentColor" }), _jsx("text", { className: "chartmd__label", x: margin.left - 10, y: gridY + 4, textAnchor: "end", fontSize: 12, children: formatNumber(value) })] }, index));
|
|
56
|
+
}), _jsx("line", { className: "chartmd__axis", x1: margin.left, x2: width - margin.right, y1: zeroY, y2: zeroY, stroke: "currentColor" }), definition.type === 'bar'
|
|
57
|
+
? definition.labels.flatMap((label, labelIndex) => {
|
|
58
|
+
const groupWidth = categoryWidth * 0.72;
|
|
59
|
+
const barWidth = groupWidth / definition.series.length;
|
|
60
|
+
const groupX = margin.left + labelIndex * categoryWidth + categoryWidth * 0.14;
|
|
61
|
+
return definition.series.map((series, seriesIndex) => {
|
|
62
|
+
const value = series.values[labelIndex] ?? 0;
|
|
63
|
+
const valueY = y(value);
|
|
64
|
+
return (_jsx("rect", { x: groupX + seriesIndex * barWidth + 1, y: Math.min(zeroY, valueY), width: Math.max(1, barWidth - 2), height: Math.max(1, Math.abs(zeroY - valueY)), fill: "currentColor", opacity: seriesOpacity(seriesIndex), rx: 2, children: _jsx("title", { children: `${label}, ${series.name}: ${formatNumber(value)}` }) }, `${label}-${series.name}`));
|
|
65
|
+
});
|
|
66
|
+
})
|
|
67
|
+
: definition.series.map((series, seriesIndex) => {
|
|
68
|
+
const points = series.values
|
|
69
|
+
.map((value, index) => {
|
|
70
|
+
const x = margin.left + categoryWidth * (index + 0.5);
|
|
71
|
+
return `${x},${y(value)}`;
|
|
72
|
+
})
|
|
73
|
+
.join(' ');
|
|
74
|
+
return (_jsxs("g", { opacity: seriesOpacity(seriesIndex), children: [_jsx("polyline", { points: points, fill: "none", stroke: "currentColor", strokeWidth: 3, strokeLinejoin: "round", strokeLinecap: "round", strokeDasharray: dashPatterns[seriesIndex % dashPatterns.length] }), series.values.map((value, index) => {
|
|
75
|
+
const label = definition.labels[index] ?? '';
|
|
76
|
+
return (_jsx("circle", { cx: margin.left + categoryWidth * (index + 0.5), cy: y(value), r: 4, fill: "currentColor", children: _jsx("title", { children: `${label}, ${series.name}: ${formatNumber(value)}` }) }, label));
|
|
77
|
+
})] }, series.name));
|
|
78
|
+
}), definition.labels.map((label, index) => (_jsxs("text", { className: "chartmd__label", x: margin.left + categoryWidth * (index + 0.5), y: height - margin.bottom + 22, textAnchor: "middle", fontSize: 12, children: [label.length > 14 ? `${label.slice(0, 13)}…` : label, _jsx("title", { children: label })] }, label))), definition.x && (_jsx("text", { className: "chartmd__label", x: margin.left + plotWidth / 2, y: height - 12, textAnchor: "middle", fontSize: 13, children: definition.x })), definition.y && (_jsx("text", { className: "chartmd__label", transform: `translate(16 ${margin.top + plotHeight / 2}) rotate(-90)`, textAnchor: "middle", fontSize: 13, children: definition.y })), definition.series.length > 1 &&
|
|
79
|
+
definition.series.map((series, index) => (_jsxs("g", { transform: `translate(${margin.left + index * 130} ${height - 34})`, opacity: seriesOpacity(index), children: [definition.type === 'bar' ? (_jsx("rect", { width: 16, height: 10, y: -9, rx: 2, fill: "currentColor" })) : (_jsx("line", { x1: 0, x2: 18, y1: -4, y2: -4, stroke: "currentColor", strokeWidth: 3, strokeDasharray: dashPatterns[index % dashPatterns.length] })), _jsx("text", { className: "chartmd__legend", x: 24, fontSize: 12, children: series.name })] }, series.name)))] }));
|
|
80
|
+
}
|
|
81
|
+
function parseSerialized(value) {
|
|
82
|
+
if (!value)
|
|
83
|
+
throw new Error('Chart requires a definition');
|
|
84
|
+
const parsed = JSON.parse(value);
|
|
85
|
+
if (!isChartDefinition(parsed)) {
|
|
86
|
+
throw new Error('Chart received an invalid definition');
|
|
87
|
+
}
|
|
88
|
+
return parsed;
|
|
89
|
+
}
|
|
90
|
+
function isChartDefinition(value) {
|
|
91
|
+
if (!value || typeof value !== 'object')
|
|
92
|
+
return false;
|
|
93
|
+
const candidate = value;
|
|
94
|
+
return ((candidate.type === 'bar' || candidate.type === 'line') &&
|
|
95
|
+
Array.isArray(candidate.labels) &&
|
|
96
|
+
candidate.labels.every((label) => typeof label === 'string') &&
|
|
97
|
+
Array.isArray(candidate.series) &&
|
|
98
|
+
candidate.series.length > 0 &&
|
|
99
|
+
candidate.series.every((series) => {
|
|
100
|
+
return (typeof series?.name === 'string' &&
|
|
101
|
+
Array.isArray(series.values) &&
|
|
102
|
+
series.values.length === candidate.labels?.length &&
|
|
103
|
+
series.values.every(Number.isFinite));
|
|
104
|
+
}));
|
|
105
|
+
}
|
|
106
|
+
function ChartContainer({ node, 'data-chart': serializedDefinition, children, ...props }) {
|
|
107
|
+
void node;
|
|
108
|
+
if (serializedDefinition) {
|
|
109
|
+
return _jsx(Chart, { "data-chart": serializedDefinition });
|
|
110
|
+
}
|
|
111
|
+
return _jsx("div", { ...props, children: children });
|
|
112
|
+
}
|
|
113
|
+
export const chartComponents = {
|
|
114
|
+
div: ChartContainer,
|
|
115
|
+
};
|
|
116
|
+
//# sourceMappingURL=chart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart.js","sourceRoot":"","sources":["../src/chart.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { Chart, chartComponents, type ChartProps } from './chart.js';
|
|
2
|
+
export { parseChart } from './parser.js';
|
|
3
|
+
export { remarkChart } from './remark.js';
|
|
4
|
+
export { ChartSyntaxError, type ChartDefinition, type ChartSeries, type ChartType, } from './types.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EACL,gBAAgB,EAChB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,SAAS,GACf,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,eAAe,EAAmB,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EACL,gBAAgB,GAIjB,MAAM,YAAY,CAAC"}
|
package/dist/parser.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,eAAe,EAErB,MAAM,YAAY,CAAC;AAiDpB,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,CA4H1D"}
|
package/dist/parser.js
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { ChartSyntaxError, } from './types.js';
|
|
2
|
+
const metadataKeys = new Set(['type', 'title', 'x', 'y']);
|
|
3
|
+
const separatorCell = /^:?-{3,}:?$/;
|
|
4
|
+
function splitRow(row, line) {
|
|
5
|
+
const trimmed = row.trim();
|
|
6
|
+
if (!trimmed.startsWith('|') || !trimmed.endsWith('|')) {
|
|
7
|
+
throw new ChartSyntaxError('table rows must start and end with “|”', line);
|
|
8
|
+
}
|
|
9
|
+
const cells = [];
|
|
10
|
+
let cell = '';
|
|
11
|
+
let escaped = false;
|
|
12
|
+
for (const character of trimmed.slice(1, -1)) {
|
|
13
|
+
if (escaped) {
|
|
14
|
+
cell += character;
|
|
15
|
+
escaped = false;
|
|
16
|
+
}
|
|
17
|
+
else if (character === '\\') {
|
|
18
|
+
escaped = true;
|
|
19
|
+
}
|
|
20
|
+
else if (character === '|') {
|
|
21
|
+
cells.push(cell.trim());
|
|
22
|
+
cell = '';
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
cell += character;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (escaped)
|
|
29
|
+
cell += '\\';
|
|
30
|
+
cells.push(cell.trim());
|
|
31
|
+
return cells;
|
|
32
|
+
}
|
|
33
|
+
function parseNumber(value, line, column) {
|
|
34
|
+
if (value === '') {
|
|
35
|
+
throw new ChartSyntaxError(`column ${column} is missing a number`, line);
|
|
36
|
+
}
|
|
37
|
+
const parsed = Number(value);
|
|
38
|
+
if (!Number.isFinite(parsed)) {
|
|
39
|
+
throw new ChartSyntaxError(`column ${column} must be a finite number; received “${value}”`, line);
|
|
40
|
+
}
|
|
41
|
+
return parsed;
|
|
42
|
+
}
|
|
43
|
+
export function parseChart(source) {
|
|
44
|
+
const lines = source.replaceAll('\r\n', '\n').split('\n');
|
|
45
|
+
const metadata = {};
|
|
46
|
+
let tableStart = -1;
|
|
47
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
48
|
+
const line = lines[index]?.trim() ?? '';
|
|
49
|
+
if (line === '')
|
|
50
|
+
continue;
|
|
51
|
+
if (line.startsWith('|')) {
|
|
52
|
+
tableStart = index;
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
const match = /^([a-z]+):\s*(.*)$/.exec(line);
|
|
56
|
+
if (!match) {
|
|
57
|
+
throw new ChartSyntaxError('expected a property or Markdown table', index + 1);
|
|
58
|
+
}
|
|
59
|
+
const key = match[1] ?? '';
|
|
60
|
+
const value = match[2]?.trim() ?? '';
|
|
61
|
+
if (!metadataKeys.has(key)) {
|
|
62
|
+
throw new ChartSyntaxError(`unknown property “${key}”`, index + 1);
|
|
63
|
+
}
|
|
64
|
+
if (key in metadata) {
|
|
65
|
+
throw new ChartSyntaxError(`duplicate property “${key}”`, index + 1);
|
|
66
|
+
}
|
|
67
|
+
if (value === '') {
|
|
68
|
+
throw new ChartSyntaxError(`property “${key}” cannot be empty`, index + 1);
|
|
69
|
+
}
|
|
70
|
+
metadata[key] = value;
|
|
71
|
+
}
|
|
72
|
+
if (metadata.type !== 'bar' && metadata.type !== 'line') {
|
|
73
|
+
throw new ChartSyntaxError('type must be “bar” or “line”');
|
|
74
|
+
}
|
|
75
|
+
if (tableStart < 0) {
|
|
76
|
+
throw new ChartSyntaxError('a Markdown table is required');
|
|
77
|
+
}
|
|
78
|
+
const nonEmptyRows = lines
|
|
79
|
+
.map((line, index) => ({ line, number: index + 1 }))
|
|
80
|
+
.slice(tableStart)
|
|
81
|
+
.filter(({ line }) => line.trim() !== '');
|
|
82
|
+
if (nonEmptyRows.length < 3) {
|
|
83
|
+
throw new ChartSyntaxError('the table needs a header and at least one data row');
|
|
84
|
+
}
|
|
85
|
+
const headerRow = nonEmptyRows[0];
|
|
86
|
+
const separatorRow = nonEmptyRows[1];
|
|
87
|
+
if (!headerRow || !separatorRow) {
|
|
88
|
+
throw new ChartSyntaxError('the table is incomplete');
|
|
89
|
+
}
|
|
90
|
+
const headers = splitRow(headerRow.line, headerRow.number);
|
|
91
|
+
const separators = splitRow(separatorRow.line, separatorRow.number);
|
|
92
|
+
if (headers.length < 2 || headers.some((header) => header === '')) {
|
|
93
|
+
throw new ChartSyntaxError('the table needs a label column and at least one named series', headerRow.number);
|
|
94
|
+
}
|
|
95
|
+
if (separators.length !== headers.length ||
|
|
96
|
+
separators.some((cell) => !separatorCell.test(cell))) {
|
|
97
|
+
throw new ChartSyntaxError('the separator row must match the header and use at least three dashes', separatorRow.number);
|
|
98
|
+
}
|
|
99
|
+
const duplicate = headers.slice(1).find((name, index, names) => {
|
|
100
|
+
return names.indexOf(name) !== index;
|
|
101
|
+
});
|
|
102
|
+
if (duplicate) {
|
|
103
|
+
throw new ChartSyntaxError(`duplicate series name “${duplicate}”`, headerRow.number);
|
|
104
|
+
}
|
|
105
|
+
const labels = [];
|
|
106
|
+
const series = headers
|
|
107
|
+
.slice(1)
|
|
108
|
+
.map((name) => ({ name, values: [] }));
|
|
109
|
+
for (const row of nonEmptyRows.slice(2)) {
|
|
110
|
+
const cells = splitRow(row.line, row.number);
|
|
111
|
+
if (cells.length !== headers.length) {
|
|
112
|
+
throw new ChartSyntaxError(`expected ${headers.length} columns but found ${cells.length}`, row.number);
|
|
113
|
+
}
|
|
114
|
+
const label = cells[0] ?? '';
|
|
115
|
+
if (label === '') {
|
|
116
|
+
throw new ChartSyntaxError('labels cannot be empty', row.number);
|
|
117
|
+
}
|
|
118
|
+
labels.push(label);
|
|
119
|
+
for (let index = 1; index < cells.length; index += 1) {
|
|
120
|
+
series[index - 1]?.values.push(parseNumber(cells[index] ?? '', row.number, index + 1));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const definition = {
|
|
124
|
+
type: metadata.type,
|
|
125
|
+
labels,
|
|
126
|
+
series,
|
|
127
|
+
};
|
|
128
|
+
if (metadata.title)
|
|
129
|
+
definition.title = metadata.title;
|
|
130
|
+
if (metadata.x)
|
|
131
|
+
definition.x = metadata.x;
|
|
132
|
+
if (metadata.y)
|
|
133
|
+
definition.y = metadata.y;
|
|
134
|
+
return definition;
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
|
package/dist/remark.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
interface AstNode {
|
|
2
|
+
type: string;
|
|
3
|
+
lang?: string | null;
|
|
4
|
+
value?: string;
|
|
5
|
+
children?: AstNode[];
|
|
6
|
+
data?: {
|
|
7
|
+
hName?: string;
|
|
8
|
+
hProperties?: Record<string, unknown>;
|
|
9
|
+
};
|
|
10
|
+
position?: unknown;
|
|
11
|
+
}
|
|
12
|
+
/** Remark plugin that turns fenced `chart` blocks into renderable chart nodes. */
|
|
13
|
+
export declare function remarkChart(): (tree: AstNode) => void;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=remark.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remark.d.ts","sourceRoot":"","sources":["../src/remark.ts"],"names":[],"mappings":"AAEA,UAAU,OAAO;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE;QACL,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACvC,CAAC;IACF,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAwBD,kFAAkF;AAClF,wBAAgB,WAAW,IAAI,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAErD"}
|
package/dist/remark.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { parseChart } from './parser.js';
|
|
2
|
+
function transform(node) {
|
|
3
|
+
if (!node.children)
|
|
4
|
+
return;
|
|
5
|
+
node.children = node.children.map((child) => {
|
|
6
|
+
if (child.type === 'code' && child.lang?.toLowerCase() === 'chart') {
|
|
7
|
+
const definition = parseChart(child.value ?? '');
|
|
8
|
+
return {
|
|
9
|
+
type: 'chartMd',
|
|
10
|
+
data: {
|
|
11
|
+
hName: 'div',
|
|
12
|
+
hProperties: {
|
|
13
|
+
'data-chart': JSON.stringify(definition),
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
position: child.position,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
transform(child);
|
|
20
|
+
return child;
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
/** Remark plugin that turns fenced `chart` blocks into renderable chart nodes. */
|
|
24
|
+
export function remarkChart() {
|
|
25
|
+
return transform;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=remark.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remark.js","sourceRoot":"","sources":["../src/remark.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAczC,SAAS,SAAS,CAAC,IAAa;IAC9B,IAAI,CAAC,IAAI,CAAC,QAAQ;QAAE,OAAO;IAE3B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1C,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,OAAO,EAAE,CAAC;YACnE,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YACjD,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE;oBACJ,KAAK,EAAE,KAAK;oBACZ,WAAW,EAAE;wBACX,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;qBACzC;iBACF;gBACD,QAAQ,EAAE,KAAK,CAAC,QAAQ;aACzB,CAAC;QACJ,CAAC;QACD,SAAS,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,WAAW;IACzB,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type ChartType = 'bar' | 'line';
|
|
2
|
+
export interface ChartSeries {
|
|
3
|
+
name: string;
|
|
4
|
+
values: number[];
|
|
5
|
+
}
|
|
6
|
+
export interface ChartDefinition {
|
|
7
|
+
type: ChartType;
|
|
8
|
+
title?: string;
|
|
9
|
+
x?: string;
|
|
10
|
+
y?: string;
|
|
11
|
+
labels: string[];
|
|
12
|
+
series: ChartSeries[];
|
|
13
|
+
}
|
|
14
|
+
export declare class ChartSyntaxError extends Error {
|
|
15
|
+
readonly line?: number | undefined;
|
|
16
|
+
name: string;
|
|
17
|
+
constructor(message: string, line?: number | undefined);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,CAAC;AAEvC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IAKvC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM;IAJf,IAAI,SAAsB;gBAGjC,OAAO,EAAE,MAAM,EACN,IAAI,CAAC,EAAE,MAAM,YAAA;CAIzB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAgBA,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAK9B;IAJF,IAAI,GAAG,kBAAkB,CAAC;IAEnC,YACE,OAAe,EACN,IAAa;QAEtB,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;QAFxD,SAAI,GAAJ,IAAI,CAAS;IAGxB,CAAC;CACF"}
|
package/package.json
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@leracherry/chartmd",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Markdown-native charts for React, styled by your Markdown theme.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"packageManager": "pnpm@10.17.1",
|
|
7
|
+
"sideEffects": [
|
|
8
|
+
"./style.css"
|
|
9
|
+
],
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"style.css",
|
|
13
|
+
"README.md",
|
|
14
|
+
"ROADMAP.md",
|
|
15
|
+
"LICENSE"
|
|
16
|
+
],
|
|
17
|
+
"exports": {
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"import": "./dist/index.js"
|
|
21
|
+
},
|
|
22
|
+
"./style.css": "./style.css"
|
|
23
|
+
},
|
|
24
|
+
"engines": {
|
|
25
|
+
"node": ">=20"
|
|
26
|
+
},
|
|
27
|
+
"scripts": {
|
|
28
|
+
"build": "tsc -p tsconfig.build.json",
|
|
29
|
+
"test": "vitest run",
|
|
30
|
+
"typecheck": "tsc --noEmit -p tsconfig.test.json",
|
|
31
|
+
"lint": "eslint . --max-warnings 0",
|
|
32
|
+
"format": "prettier --write .",
|
|
33
|
+
"format:check": "prettier --check .",
|
|
34
|
+
"check": "pnpm build && pnpm test && pnpm typecheck && pnpm lint && pnpm format:check",
|
|
35
|
+
"prepublishOnly": "pnpm check"
|
|
36
|
+
},
|
|
37
|
+
"peerDependencies": {
|
|
38
|
+
"react": ">=18"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@eslint/js": "10.0.1",
|
|
42
|
+
"@types/node": "22.20.4",
|
|
43
|
+
"@types/react": "19.2.14",
|
|
44
|
+
"@types/react-dom": "19.2.3",
|
|
45
|
+
"eslint": "10.11.0",
|
|
46
|
+
"prettier": "3.9.9",
|
|
47
|
+
"react": "19.2.4",
|
|
48
|
+
"react-dom": "19.2.4",
|
|
49
|
+
"react-markdown": "10.1.0",
|
|
50
|
+
"typescript": "5.9.3",
|
|
51
|
+
"typescript-eslint": "8.70.1",
|
|
52
|
+
"vitest": "5.0.2"
|
|
53
|
+
},
|
|
54
|
+
"repository": {
|
|
55
|
+
"type": "git",
|
|
56
|
+
"url": "git+https://github.com/leracherry/chart.md.git"
|
|
57
|
+
},
|
|
58
|
+
"homepage": "https://github.com/leracherry/chart.md#readme",
|
|
59
|
+
"bugs": {
|
|
60
|
+
"url": "https://github.com/leracherry/chart.md/issues"
|
|
61
|
+
},
|
|
62
|
+
"keywords": [
|
|
63
|
+
"markdown",
|
|
64
|
+
"react",
|
|
65
|
+
"react-markdown",
|
|
66
|
+
"remark",
|
|
67
|
+
"charts",
|
|
68
|
+
"data-visualization"
|
|
69
|
+
],
|
|
70
|
+
"license": "MIT",
|
|
71
|
+
"publishConfig": {
|
|
72
|
+
"access": "public",
|
|
73
|
+
"registry": "https://registry.npmjs.org/"
|
|
74
|
+
}
|
|
75
|
+
}
|
package/style.css
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
.chartmd {
|
|
2
|
+
display: block;
|
|
3
|
+
inline-size: 100%;
|
|
4
|
+
max-inline-size: 100%;
|
|
5
|
+
block-size: auto;
|
|
6
|
+
overflow: visible;
|
|
7
|
+
color: var(--chartmd-color, currentColor);
|
|
8
|
+
font: inherit;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.chartmd__grid {
|
|
12
|
+
opacity: var(--chartmd-grid-opacity, 0.14);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.chartmd__axis,
|
|
16
|
+
.chartmd__label,
|
|
17
|
+
.chartmd__legend,
|
|
18
|
+
.chartmd__title {
|
|
19
|
+
fill: currentColor;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.chartmd__label,
|
|
23
|
+
.chartmd__legend {
|
|
24
|
+
opacity: var(--chartmd-muted-opacity, 0.68);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.chartmd__title {
|
|
28
|
+
font-weight: 600;
|
|
29
|
+
}
|