@diagrammo/dgmo 0.47.0 → 0.48.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/dist/auto.js +1 -1
- package/dist/auto.mjs +1 -1
- package/dist/element.js +1 -1
- package/dist/element.mjs +1 -1
- package/package.json +19 -70
- package/dist/advanced.cjs +0 -71648
- package/dist/advanced.d.cts +0 -5719
- package/dist/auto.cjs +0 -70648
- package/dist/auto.d.cts +0 -54
- package/dist/block.cjs +0 -70208
- package/dist/block.d.cts +0 -115
- package/dist/editor.cjs +0 -526
- package/dist/editor.d.cts +0 -26
- package/dist/element.cjs +0 -70530
- package/dist/element.d.cts +0 -62
- package/dist/highlight.cjs +0 -852
- package/dist/highlight.d.cts +0 -49
- package/dist/index.cjs +0 -70491
- package/dist/index.d.cts +0 -160
- package/dist/pert.cjs +0 -325
- package/dist/pert.d.cts +0 -559
- package/dist/themes-1-CuKpeH.d.cts +0 -908
- package/src/advanced.ts +0 -873
- package/src/arc/parser.ts +0 -15
- package/src/arc/renderer.ts +0 -633
- package/src/auto/index.ts +0 -621
- package/src/auto/shared.ts +0 -370
- package/src/auto/styles.ts +0 -73
- package/src/block/layout.ts +0 -198
- package/src/block/parser.ts +0 -427
- package/src/block/renderer.ts +0 -484
- package/src/block/types.ts +0 -67
- package/src/boxes-and-lines/collapse.ts +0 -96
- package/src/boxes-and-lines/focus.ts +0 -257
- package/src/boxes-and-lines/label-placement.ts +0 -339
- package/src/boxes-and-lines/layout-grouped.ts +0 -912
- package/src/boxes-and-lines/layout-layered.ts +0 -722
- package/src/boxes-and-lines/layout-search.ts +0 -1678
- package/src/boxes-and-lines/layout.ts +0 -398
- package/src/boxes-and-lines/parser.ts +0 -1181
- package/src/boxes-and-lines/renderer.ts +0 -1465
- package/src/boxes-and-lines/types.ts +0 -66
- package/src/c4/layout.ts +0 -2441
- package/src/c4/parser.ts +0 -1158
- package/src/c4/renderer.ts +0 -2008
- package/src/c4/types.ts +0 -89
- package/src/chart-type-registry.ts +0 -529
- package/src/chart-types.ts +0 -225
- package/src/chart.ts +0 -685
- package/src/charts-d3/bar.ts +0 -338
- package/src/charts-d3/chord.ts +0 -140
- package/src/charts-d3/function.ts +0 -147
- package/src/charts-d3/funnel.ts +0 -104
- package/src/charts-d3/heatmap.ts +0 -145
- package/src/charts-d3/index.ts +0 -337
- package/src/charts-d3/interactions.ts +0 -477
- package/src/charts-d3/line.ts +0 -344
- package/src/charts-d3/mount.ts +0 -151
- package/src/charts-d3/pie.ts +0 -117
- package/src/charts-d3/polar.ts +0 -89
- package/src/charts-d3/radar.ts +0 -0
- package/src/charts-d3/sankey.ts +0 -0
- package/src/charts-d3/scatter.ts +0 -185
- package/src/charts-d3/shared.ts +0 -208
- package/src/class/layout.ts +0 -326
- package/src/class/parser.ts +0 -635
- package/src/class/renderer.ts +0 -793
- package/src/class/types.ts +0 -58
- package/src/cli-banner.ts +0 -106
- package/src/cli.ts +0 -1080
- package/src/colors-diagnostics.ts +0 -35
- package/src/colors.ts +0 -379
- package/src/completion-types.ts +0 -27
- package/src/completion.ts +0 -2668
- package/src/cycle/layout.ts +0 -1026
- package/src/cycle/parser.ts +0 -387
- package/src/cycle/renderer.ts +0 -653
- package/src/cycle/types.ts +0 -101
- package/src/d3.ts +0 -1434
- package/src/data-chart-parser.ts +0 -1007
- package/src/dgmo-router.ts +0 -296
- package/src/diagnostics-registry.ts +0 -108
- package/src/diagnostics.ts +0 -0
- package/src/dimensions.ts +0 -20
- package/src/directives-registry.ts +0 -396
- package/src/editor/dgmo.grammar +0 -76
- package/src/editor/dgmo.grammar.d.ts +0 -2
- package/src/editor/dgmo.grammar.js +0 -18
- package/src/editor/dgmo.grammar.terms.d.ts +0 -5
- package/src/editor/dgmo.grammar.terms.js +0 -35
- package/src/editor/highlight-api.ts +0 -596
- package/src/editor/highlight.ts +0 -36
- package/src/editor/index.ts +0 -27
- package/src/editor/keywords.ts +0 -128
- package/src/editor/tokens.ts +0 -30
- package/src/element/index.ts +0 -432
- package/src/embed/css.ts +0 -312
- package/src/embed/escape.ts +0 -15
- package/src/embed/index.ts +0 -280
- package/src/er/classify.ts +0 -228
- package/src/er/layout.ts +0 -530
- package/src/er/parser.ts +0 -750
- package/src/er/renderer.ts +0 -725
- package/src/er/types.ts +0 -52
- package/src/error-card.ts +0 -269
- package/src/event-line/diagnostics.ts +0 -117
- package/src/event-line/parser.ts +0 -643
- package/src/event-line/renderer.ts +0 -1742
- package/src/event-line/types.ts +0 -74
- package/src/fonts.ts +0 -3
- package/src/gantt/calculator.ts +0 -979
- package/src/gantt/parser.ts +0 -1641
- package/src/gantt/renderer.ts +0 -3787
- package/src/gantt/resolver.ts +0 -172
- package/src/gantt/types.ts +0 -206
- package/src/graph/diagnostics.ts +0 -64
- package/src/graph/edge-spline.ts +0 -29
- package/src/graph/flowchart-parser.ts +0 -759
- package/src/graph/flowchart-renderer.ts +0 -817
- package/src/graph/layout.ts +0 -472
- package/src/graph/notes.ts +0 -21
- package/src/graph/state-collapse.ts +0 -78
- package/src/graph/state-parser.ts +0 -574
- package/src/graph/state-renderer.ts +0 -653
- package/src/graph/types.ts +0 -65
- package/src/index.ts +0 -261
- package/src/infra/compute.ts +0 -1385
- package/src/infra/layout.ts +0 -888
- package/src/infra/parser.ts +0 -1234
- package/src/infra/renderer.ts +0 -2534
- package/src/infra/roles.ts +0 -75
- package/src/infra/types.ts +0 -216
- package/src/infra/validation.ts +0 -201
- package/src/journey-map/layout.ts +0 -490
- package/src/journey-map/parser.ts +0 -557
- package/src/journey-map/renderer.ts +0 -1580
- package/src/journey-map/types.ts +0 -47
- package/src/kanban/mutations.ts +0 -175
- package/src/kanban/parser.ts +0 -509
- package/src/kanban/renderer.ts +0 -1449
- package/src/kanban/types.ts +0 -39
- package/src/label-layout.ts +0 -368
- package/src/map/colorize.ts +0 -54
- package/src/map/completion.ts +0 -316
- package/src/map/context-labels.ts +0 -609
- package/src/map/data/PROVENANCE.json +0 -1
- package/src/map/data/README.md +0 -40
- package/src/map/data/airport-collisions.json +0 -1
- package/src/map/data/airports.json +0 -1
- package/src/map/data/gazetteer.json +0 -1
- package/src/map/data/lakes.json +0 -1
- package/src/map/data/mountain-ranges.json +0 -1
- package/src/map/data/na-lakes.json +0 -1
- package/src/map/data/na-land.json +0 -1
- package/src/map/data/region-names.json +0 -1
- package/src/map/data/rivers.json +0 -1
- package/src/map/data/types.ts +0 -121
- package/src/map/data/us-states.json +0 -1
- package/src/map/data/water-bodies.json +0 -1
- package/src/map/data/world-coarse.json +0 -1
- package/src/map/data/world-detail.json +0 -1
- package/src/map/diagnostics.ts +0 -134
- package/src/map/dimensions.ts +0 -150
- package/src/map/geo-query.ts +0 -295
- package/src/map/geo.ts +0 -438
- package/src/map/invert.ts +0 -111
- package/src/map/layout.ts +0 -5069
- package/src/map/legend-band.ts +0 -127
- package/src/map/load-data.ts +0 -186
- package/src/map/parser.ts +0 -783
- package/src/map/renderer.ts +0 -1445
- package/src/map/resolved-types.ts +0 -160
- package/src/map/resolver.ts +0 -1146
- package/src/map/types.ts +0 -194
- package/src/mindmap/collapse.ts +0 -67
- package/src/mindmap/layout.ts +0 -649
- package/src/mindmap/parser.ts +0 -430
- package/src/mindmap/renderer.ts +0 -637
- package/src/mindmap/text-wrap.ts +0 -218
- package/src/mindmap/types.ts +0 -56
- package/src/org/collapse.ts +0 -151
- package/src/org/layout.ts +0 -1262
- package/src/org/parser.ts +0 -519
- package/src/org/renderer.ts +0 -866
- package/src/org/resolver.ts +0 -636
- package/src/palettes/atlas.ts +0 -77
- package/src/palettes/blueprint.ts +0 -73
- package/src/palettes/catppuccin.ts +0 -84
- package/src/palettes/color-utils.ts +0 -443
- package/src/palettes/index.ts +0 -67
- package/src/palettes/nord.ts +0 -67
- package/src/palettes/registry.ts +0 -114
- package/src/palettes/slate.ts +0 -73
- package/src/palettes/tidewater.ts +0 -73
- package/src/palettes/tokyo-night.ts +0 -86
- package/src/palettes/types.ts +0 -88
- package/src/pert/analyzer.ts +0 -1183
- package/src/pert/diagnostics.ts +0 -110
- package/src/pert/index.ts +0 -43
- package/src/pert/internal.ts +0 -252
- package/src/pert/layout.ts +0 -971
- package/src/pert/monte-carlo.ts +0 -446
- package/src/pert/parser.ts +0 -1606
- package/src/pert/renderer.ts +0 -4009
- package/src/pert/share-normalize.ts +0 -62
- package/src/pert/types.ts +0 -604
- package/src/pyramid/parser.ts +0 -185
- package/src/pyramid/renderer.ts +0 -768
- package/src/pyramid/types.ts +0 -28
- package/src/quadrant/parser.ts +0 -18
- package/src/quadrant/renderer.ts +0 -638
- package/src/raci/diagnostics.ts +0 -213
- package/src/raci/index.ts +0 -23
- package/src/raci/mutations.ts +0 -321
- package/src/raci/parser.ts +0 -699
- package/src/raci/renderer.ts +0 -1627
- package/src/raci/types.ts +0 -82
- package/src/raci/variants.ts +0 -320
- package/src/render.ts +0 -268
- package/src/ring/parser.ts +0 -212
- package/src/ring/renderer.ts +0 -490
- package/src/ring/types.ts +0 -27
- package/src/sequence/collapse.ts +0 -174
- package/src/sequence/parser.ts +0 -1596
- package/src/sequence/participant-inference.ts +0 -152
- package/src/sequence/renderer.ts +0 -3168
- package/src/sequence/tag-resolution.ts +0 -164
- package/src/sharing.ts +0 -211
- package/src/sitemap/collapse.ts +0 -100
- package/src/sitemap/layout.ts +0 -925
- package/src/sitemap/parser.ts +0 -755
- package/src/sitemap/renderer.ts +0 -828
- package/src/sitemap/types.ts +0 -42
- package/src/slope/parser.ts +0 -18
- package/src/slope/renderer.ts +0 -378
- package/src/swimlane/diagnostics.ts +0 -94
- package/src/swimlane/layout.ts +0 -597
- package/src/swimlane/parser.ts +0 -613
- package/src/swimlane/renderer.ts +0 -681
- package/src/swimlane/types.ts +0 -151
- package/src/tech-radar/interactive.ts +0 -1129
- package/src/tech-radar/layout.ts +0 -197
- package/src/tech-radar/parser.ts +0 -436
- package/src/tech-radar/renderer.ts +0 -1239
- package/src/tech-radar/shared.ts +0 -151
- package/src/tech-radar/types.ts +0 -86
- package/src/themes.ts +0 -22
- package/src/timeline/parser.ts +0 -472
- package/src/timeline/renderer.ts +0 -3024
- package/src/timeline/types.ts +0 -33
- package/src/timeline/viz-parser.ts +0 -21
- package/src/treemap/diagnostics.ts +0 -62
- package/src/treemap/layout-radial.ts +0 -233
- package/src/treemap/layout.ts +0 -189
- package/src/treemap/parser.ts +0 -463
- package/src/treemap/renderer-radial.ts +0 -438
- package/src/treemap/renderer.ts +0 -572
- package/src/treemap/treemap-shared.ts +0 -309
- package/src/treemap/types.ts +0 -60
- package/src/utils/arrow-markers.ts +0 -51
- package/src/utils/arrows-diagnostics.ts +0 -62
- package/src/utils/arrows.ts +0 -227
- package/src/utils/brand.ts +0 -61
- package/src/utils/card.ts +0 -183
- package/src/utils/collapse-engine/tree-edges.ts +0 -115
- package/src/utils/collapse-engine/tree.ts +0 -117
- package/src/utils/d3-helpers.ts +0 -219
- package/src/utils/d3-types.ts +0 -9
- package/src/utils/description-helpers.ts +0 -38
- package/src/utils/duration.ts +0 -312
- package/src/utils/export-container.ts +0 -41
- package/src/utils/expr-eval.ts +0 -27
- package/src/utils/fit-canvas.ts +0 -64
- package/src/utils/hover-styles.ts +0 -673
- package/src/utils/inline-markdown.ts +0 -96
- package/src/utils/legend-constants.ts +0 -48
- package/src/utils/legend-d3.ts +0 -618
- package/src/utils/legend-integration.ts +0 -107
- package/src/utils/legend-layout.ts +0 -776
- package/src/utils/legend-svg.ts +0 -214
- package/src/utils/legend-types.ts +0 -272
- package/src/utils/name-normalize.ts +0 -163
- package/src/utils/note-box/constants.ts +0 -25
- package/src/utils/note-box/index.ts +0 -11
- package/src/utils/note-box/metrics.ts +0 -90
- package/src/utils/note-box/svg.ts +0 -331
- package/src/utils/notes/bounds.ts +0 -30
- package/src/utils/notes/build.ts +0 -131
- package/src/utils/notes/index.ts +0 -18
- package/src/utils/notes/model.ts +0 -19
- package/src/utils/notes/parse.ts +0 -131
- package/src/utils/notes/place.ts +0 -177
- package/src/utils/notes/resolve.ts +0 -88
- package/src/utils/number-format.ts +0 -36
- package/src/utils/parsing.ts +0 -953
- package/src/utils/reserved-key-registry.ts +0 -239
- package/src/utils/safe-href.ts +0 -38
- package/src/utils/scaling.ts +0 -97
- package/src/utils/svg-embed.ts +0 -251
- package/src/utils/tag-groups.ts +0 -607
- package/src/utils/text-measure.ts +0 -122
- package/src/utils/time-ticks.ts +0 -253
- package/src/utils/title-constants.ts +0 -24
- package/src/utils/visual-conventions.ts +0 -61
- package/src/utils/wrapped-desc.ts +0 -87
- package/src/venn/parser.ts +0 -18
- package/src/venn/renderer.ts +0 -1047
- package/src/version-control/diagnostics.ts +0 -67
- package/src/version-control/parser.ts +0 -544
- package/src/version-control/renderer.ts +0 -724
- package/src/version-control/types.ts +0 -100
- package/src/visualizations/parse.ts +0 -1560
- package/src/visualizations/types.ts +0 -262
- package/src/wireframe/layout.ts +0 -479
- package/src/wireframe/parser.ts +0 -1114
- package/src/wireframe/renderer.ts +0 -1318
- package/src/wireframe/types.ts +0 -110
- package/src/wordcloud/parser.ts +0 -18
- package/src/wordcloud/renderer.ts +0 -357
package/src/charts-d3/scatter.ts
DELETED
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
// ============================================================
|
|
2
|
-
// Hand-built scatter / bubble renderer — SPIKE (Tier 2).
|
|
3
|
-
// Auto-fit axes (10% pad), per-point or per-category color, bubble sizing,
|
|
4
|
-
// point labels. (Spike uses simple above-point labels, not the full ECharts
|
|
5
|
-
// greedy collision graphic.)
|
|
6
|
-
// ============================================================
|
|
7
|
-
|
|
8
|
-
import { scaleLinear } from 'd3-scale';
|
|
9
|
-
import type { ParsedScatter } from '../data-chart-parser';
|
|
10
|
-
import type { PaletteColors } from '../palettes';
|
|
11
|
-
import { FONT_FAMILY } from '../fonts';
|
|
12
|
-
import { shapeFill } from '../palettes/color-utils';
|
|
13
|
-
import {
|
|
14
|
-
type Svg,
|
|
15
|
-
type Margins,
|
|
16
|
-
TICK_FONT,
|
|
17
|
-
fmtNum,
|
|
18
|
-
computeLeftMargin,
|
|
19
|
-
drawXAxisTitle,
|
|
20
|
-
drawYAxisTitle,
|
|
21
|
-
tagDatum,
|
|
22
|
-
} from './shared';
|
|
23
|
-
|
|
24
|
-
const FILL_OPACITY = 0.65;
|
|
25
|
-
const DEFAULT_SIZE = 15; // diameter
|
|
26
|
-
|
|
27
|
-
export function renderScatter(
|
|
28
|
-
svg: Svg,
|
|
29
|
-
chart: ParsedScatter,
|
|
30
|
-
width: number,
|
|
31
|
-
height: number,
|
|
32
|
-
colors: string[],
|
|
33
|
-
palette: PaletteColors,
|
|
34
|
-
isDark: boolean,
|
|
35
|
-
textColor: string,
|
|
36
|
-
mutedColor: string,
|
|
37
|
-
topInset: number
|
|
38
|
-
): void {
|
|
39
|
-
const points = chart.scatterPoints ?? [];
|
|
40
|
-
if (points.length === 0) return;
|
|
41
|
-
const solid = chart.solidFill === true;
|
|
42
|
-
const hasSize = points.some((p) => p.size !== undefined);
|
|
43
|
-
|
|
44
|
-
const categories = [
|
|
45
|
-
...new Set(points.map((p) => p.category).filter(Boolean)),
|
|
46
|
-
] as string[];
|
|
47
|
-
const catColor = (cat: string, i: number) =>
|
|
48
|
-
chart.categoryColors?.[cat] ?? colors[i % colors.length]!;
|
|
49
|
-
const catIndex = new Map(categories.map((c, i) => [c, i]));
|
|
50
|
-
|
|
51
|
-
const xs = points.map((p) => p.x);
|
|
52
|
-
const ys = points.map((p) => p.y);
|
|
53
|
-
const xMin = Math.min(...xs);
|
|
54
|
-
const xMax = Math.max(...xs);
|
|
55
|
-
const yMin = Math.min(...ys);
|
|
56
|
-
const yMax = Math.max(...ys);
|
|
57
|
-
const xPad = (xMax - xMin) * 0.1 || 1;
|
|
58
|
-
const yPad = (yMax - yMin) * 0.1 || 1;
|
|
59
|
-
|
|
60
|
-
const m: Margins = {
|
|
61
|
-
top: topInset + 8,
|
|
62
|
-
right: 32,
|
|
63
|
-
bottom: 64,
|
|
64
|
-
left: computeLeftMargin(chart.ylabel, [
|
|
65
|
-
fmtNum(Math.ceil(yMax + yPad)),
|
|
66
|
-
fmtNum(Math.floor(yMin - yPad)),
|
|
67
|
-
]),
|
|
68
|
-
};
|
|
69
|
-
const plotW = width - m.left - m.right;
|
|
70
|
-
const plotH = height - m.top - m.bottom;
|
|
71
|
-
|
|
72
|
-
const x = scaleLinear()
|
|
73
|
-
.domain([Math.floor(xMin - xPad), Math.ceil(xMax + xPad)])
|
|
74
|
-
.range([m.left, m.left + plotW]);
|
|
75
|
-
const y = scaleLinear()
|
|
76
|
-
.domain([Math.floor(yMin - yPad), Math.ceil(yMax + yPad)])
|
|
77
|
-
.range([m.top + plotH, m.top]);
|
|
78
|
-
|
|
79
|
-
// Hit/bounds target so the interaction adapter knows axis positions for the
|
|
80
|
-
// dotted leader-line + on-axis value projection.
|
|
81
|
-
svg
|
|
82
|
-
.append('rect')
|
|
83
|
-
.attr('class', 'dgmo-plot-rect')
|
|
84
|
-
.attr('x', m.left)
|
|
85
|
-
.attr('y', m.top)
|
|
86
|
-
.attr('width', plotW)
|
|
87
|
-
.attr('height', plotH)
|
|
88
|
-
.attr('fill', 'transparent')
|
|
89
|
-
.attr('pointer-events', 'none');
|
|
90
|
-
|
|
91
|
-
// gridlines + ticks
|
|
92
|
-
for (const t of y.ticks(6)) {
|
|
93
|
-
const yy = y(t);
|
|
94
|
-
svg
|
|
95
|
-
.append('line')
|
|
96
|
-
.attr('x1', m.left)
|
|
97
|
-
.attr('x2', m.left + plotW)
|
|
98
|
-
.attr('y1', yy)
|
|
99
|
-
.attr('y2', yy)
|
|
100
|
-
.attr('stroke', mutedColor)
|
|
101
|
-
.attr('stroke-opacity', 0.25);
|
|
102
|
-
svg
|
|
103
|
-
.append('text')
|
|
104
|
-
.attr('class', 'dgmo-tick')
|
|
105
|
-
.attr('x', m.left - 10)
|
|
106
|
-
.attr('y', yy + 4)
|
|
107
|
-
.attr('text-anchor', 'end')
|
|
108
|
-
.attr('fill', textColor)
|
|
109
|
-
.attr('font-size', TICK_FONT)
|
|
110
|
-
.attr('font-family', FONT_FAMILY)
|
|
111
|
-
.text(fmtNum(t));
|
|
112
|
-
}
|
|
113
|
-
for (const t of x.ticks(6)) {
|
|
114
|
-
const xx = x(t);
|
|
115
|
-
svg
|
|
116
|
-
.append('line')
|
|
117
|
-
.attr('x1', xx)
|
|
118
|
-
.attr('x2', xx)
|
|
119
|
-
.attr('y1', m.top)
|
|
120
|
-
.attr('y2', m.top + plotH)
|
|
121
|
-
.attr('stroke', mutedColor)
|
|
122
|
-
.attr('stroke-opacity', 0.25);
|
|
123
|
-
svg
|
|
124
|
-
.append('text')
|
|
125
|
-
.attr('class', 'dgmo-tick')
|
|
126
|
-
.attr('x', xx)
|
|
127
|
-
.attr('y', m.top + plotH + 18)
|
|
128
|
-
.attr('text-anchor', 'middle')
|
|
129
|
-
.attr('fill', textColor)
|
|
130
|
-
.attr('font-size', TICK_FONT)
|
|
131
|
-
.attr('font-family', FONT_FAMILY)
|
|
132
|
-
.text(fmtNum(t));
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
// points
|
|
136
|
-
points.forEach((p, i) => {
|
|
137
|
-
const stroke =
|
|
138
|
-
p.color ??
|
|
139
|
-
(p.category
|
|
140
|
-
? catColor(p.category, catIndex.get(p.category) ?? 0)
|
|
141
|
-
: colors[i % colors.length]!);
|
|
142
|
-
const r = (hasSize ? (p.size ?? DEFAULT_SIZE) : DEFAULT_SIZE) / 2;
|
|
143
|
-
const dot = svg
|
|
144
|
-
.append('circle')
|
|
145
|
-
.attr('cx', x(p.x))
|
|
146
|
-
.attr('cy', y(p.y))
|
|
147
|
-
.attr('r', r)
|
|
148
|
-
.attr('fill', solid ? stroke : shapeFill(palette, stroke, isDark))
|
|
149
|
-
.attr('fill-opacity', FILL_OPACITY)
|
|
150
|
-
.attr('stroke', stroke)
|
|
151
|
-
.attr('stroke-width', 2);
|
|
152
|
-
tagDatum(dot, {
|
|
153
|
-
line: p.lineNumber,
|
|
154
|
-
key: p.name,
|
|
155
|
-
name: p.category ? `${p.name} · ${p.category}` : p.name,
|
|
156
|
-
value: `(${fmtNum(p.x)}, ${fmtNum(p.y)})`,
|
|
157
|
-
color: stroke,
|
|
158
|
-
});
|
|
159
|
-
// Per-axis values for the adapter's on-axis projection (no tooltip).
|
|
160
|
-
dot.attr('data-axval-x', fmtNum(p.x)).attr('data-axval-y', fmtNum(p.y));
|
|
161
|
-
// Category key for baked-CSS cross-highlight (hover a point → dim other
|
|
162
|
-
// categories). Only when the point actually declares a category.
|
|
163
|
-
if (p.category) dot.attr('data-category', p.category);
|
|
164
|
-
if (!chart.noName) {
|
|
165
|
-
svg
|
|
166
|
-
.append('text')
|
|
167
|
-
.attr('x', x(p.x))
|
|
168
|
-
.attr('y', y(p.y) - r - 5)
|
|
169
|
-
.attr('text-anchor', 'middle')
|
|
170
|
-
.attr('fill', textColor)
|
|
171
|
-
.attr('font-size', 11)
|
|
172
|
-
.attr('font-family', FONT_FAMILY)
|
|
173
|
-
.text(p.name);
|
|
174
|
-
}
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
drawXAxisTitle(
|
|
178
|
-
svg,
|
|
179
|
-
chart.xlabel,
|
|
180
|
-
m.left + plotW / 2,
|
|
181
|
-
m.top + plotH + 46,
|
|
182
|
-
textColor
|
|
183
|
-
);
|
|
184
|
-
drawYAxisTitle(svg, chart.ylabel, m.top + plotH / 2, 20, textColor);
|
|
185
|
-
}
|
package/src/charts-d3/shared.ts
DELETED
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
// ============================================================
|
|
2
|
-
// Shared helpers for the hand-built (D3) data-chart renderers — SPIKE.
|
|
3
|
-
//
|
|
4
|
-
// These renderers replace the ECharts path for the Tier-1 data-chart types
|
|
5
|
-
// (bar / line / pie families). They draw directly into a d3-selection SVG using
|
|
6
|
-
// d3-scale + d3-shape — both already first-class dependencies — and reuse the
|
|
7
|
-
// same export-container lifecycle, legend, and tint helpers as the rest of the
|
|
8
|
-
// repo so the output matches the ECharts path's house style.
|
|
9
|
-
// ============================================================
|
|
10
|
-
|
|
11
|
-
import type * as d3Selection from 'd3-selection';
|
|
12
|
-
import { FONT_FAMILY } from '../fonts';
|
|
13
|
-
import { measureText } from '../utils/text-measure';
|
|
14
|
-
import type { ParsedChart } from '../chart';
|
|
15
|
-
import type { PaletteColors } from '../palettes';
|
|
16
|
-
import { getSimpleChartLegendGroups } from '../data-chart-parser';
|
|
17
|
-
import { renderLegendSvg } from '../utils/legend-svg';
|
|
18
|
-
import type { LegendGroupData } from '../utils/legend-types';
|
|
19
|
-
|
|
20
|
-
export type Svg = d3Selection.Selection<
|
|
21
|
-
SVGSVGElement,
|
|
22
|
-
unknown,
|
|
23
|
-
null,
|
|
24
|
-
undefined
|
|
25
|
-
>;
|
|
26
|
-
|
|
27
|
-
/** Cartesian plot margins. Top is set by reserveHeader (title + legend). */
|
|
28
|
-
export interface Margins {
|
|
29
|
-
top: number;
|
|
30
|
-
right: number;
|
|
31
|
-
bottom: number;
|
|
32
|
-
left: number;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export const AXIS_LABEL_FONT = 13;
|
|
36
|
-
export const TICK_FONT = 12;
|
|
37
|
-
export const VALUE_FONT = 12;
|
|
38
|
-
|
|
39
|
-
/** Format a numeric tick/value: trim trailing zeros, keep it compact. */
|
|
40
|
-
export function fmtNum(n: number): string {
|
|
41
|
-
if (!isFinite(n)) return '';
|
|
42
|
-
if (Math.abs(n) >= 1000) return n.toLocaleString('en-US');
|
|
43
|
-
return String(Math.round(n * 100) / 100);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Render the standard top-center legend (capsule + pills) for a multi-series
|
|
48
|
-
* chart, mirroring the ECharts path exactly: same `getSimpleChartLegendGroups`
|
|
49
|
-
* input and same `<g transform="translate(0,legendY)">` injection. Returns the
|
|
50
|
-
* y-coordinate where plot content may begin (below title + legend).
|
|
51
|
-
*/
|
|
52
|
-
export function reserveHeader(
|
|
53
|
-
svg: Svg,
|
|
54
|
-
chart: ParsedChart,
|
|
55
|
-
colors: string[],
|
|
56
|
-
palette: PaletteColors,
|
|
57
|
-
isDark: boolean,
|
|
58
|
-
hasTitle: boolean,
|
|
59
|
-
width: number
|
|
60
|
-
): number {
|
|
61
|
-
return injectLegendGroups(
|
|
62
|
-
svg,
|
|
63
|
-
getSimpleChartLegendGroups(chart, colors),
|
|
64
|
-
palette,
|
|
65
|
-
isDark,
|
|
66
|
-
hasTitle,
|
|
67
|
-
width
|
|
68
|
-
);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Inject a top-center capsule legend from pre-built groups (mirrors the
|
|
73
|
-
* ECharts path's `<g transform="translate(0,legendY)">` placement) and return
|
|
74
|
-
* the y where plot content may begin. Empty groups → just clear the title.
|
|
75
|
-
*/
|
|
76
|
-
export function injectLegendGroups(
|
|
77
|
-
svg: Svg,
|
|
78
|
-
groups: LegendGroupData[],
|
|
79
|
-
palette: PaletteColors,
|
|
80
|
-
isDark: boolean,
|
|
81
|
-
hasTitle: boolean,
|
|
82
|
-
width: number
|
|
83
|
-
): number {
|
|
84
|
-
const titleH = hasTitle ? 40 : 0;
|
|
85
|
-
if (groups.length === 0) return hasTitle ? titleH + 12 : 24;
|
|
86
|
-
|
|
87
|
-
const legendY = 8 + titleH;
|
|
88
|
-
const { svg: legendSvg, height: legendH } = renderLegendSvg(groups, {
|
|
89
|
-
palette,
|
|
90
|
-
isDark,
|
|
91
|
-
containerWidth: width,
|
|
92
|
-
activeGroup: groups[0]!.name,
|
|
93
|
-
className: 'chart-legend',
|
|
94
|
-
});
|
|
95
|
-
const node = svg.node();
|
|
96
|
-
if (node && legendSvg) {
|
|
97
|
-
node.insertAdjacentHTML(
|
|
98
|
-
'beforeend',
|
|
99
|
-
`<g transform="translate(0,${legendY})">${legendSvg}</g>`
|
|
100
|
-
);
|
|
101
|
-
}
|
|
102
|
-
return legendY + legendH + 14;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Compute a left margin that fits both the rotated y-axis title (when present)
|
|
107
|
-
* and the widest left-edge label (value ticks for vertical charts, category
|
|
108
|
-
* names for horizontal bars). Fixes axis-title / tick-label collisions.
|
|
109
|
-
*/
|
|
110
|
-
export function computeLeftMargin(
|
|
111
|
-
yLabel: string | undefined,
|
|
112
|
-
leftLabels: string[]
|
|
113
|
-
): number {
|
|
114
|
-
const pad = 16;
|
|
115
|
-
const titleBand = yLabel ? 22 : 0;
|
|
116
|
-
const labelW = leftLabels.length
|
|
117
|
-
? Math.max(...leftLabels.map((t) => measureText(t, TICK_FONT)))
|
|
118
|
-
: 0;
|
|
119
|
-
return Math.max(56, pad + titleBand + labelW + 14);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/** Draw a centered axis title below the x-axis. */
|
|
123
|
-
export function drawXAxisTitle(
|
|
124
|
-
svg: Svg,
|
|
125
|
-
label: string | undefined,
|
|
126
|
-
cx: number,
|
|
127
|
-
y: number,
|
|
128
|
-
textColor: string
|
|
129
|
-
): void {
|
|
130
|
-
if (!label) return;
|
|
131
|
-
svg
|
|
132
|
-
.append('text')
|
|
133
|
-
.attr('x', cx)
|
|
134
|
-
.attr('y', y)
|
|
135
|
-
.attr('text-anchor', 'middle')
|
|
136
|
-
.attr('fill', textColor)
|
|
137
|
-
.attr('font-size', AXIS_LABEL_FONT)
|
|
138
|
-
.attr('font-family', FONT_FAMILY)
|
|
139
|
-
.attr('font-weight', 600)
|
|
140
|
-
.text(label);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/** Draw a rotated axis title to the left of the y-axis. */
|
|
144
|
-
export function drawYAxisTitle(
|
|
145
|
-
svg: Svg,
|
|
146
|
-
label: string | undefined,
|
|
147
|
-
cy: number,
|
|
148
|
-
x: number,
|
|
149
|
-
textColor: string
|
|
150
|
-
): void {
|
|
151
|
-
if (!label) return;
|
|
152
|
-
svg
|
|
153
|
-
.append('text')
|
|
154
|
-
.attr('transform', `translate(${x},${cy}) rotate(-90)`)
|
|
155
|
-
.attr('text-anchor', 'middle')
|
|
156
|
-
.attr('fill', textColor)
|
|
157
|
-
.attr('font-size', AXIS_LABEL_FONT)
|
|
158
|
-
.attr('font-family', FONT_FAMILY)
|
|
159
|
-
.attr('font-weight', 600)
|
|
160
|
-
.text(label);
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
/**
|
|
164
|
-
* Tag a rendered datum element with the shared interaction convention so the
|
|
165
|
-
* framework-agnostic adapter (interactions.ts) and the app's generic
|
|
166
|
-
* data-line-number path can drive it: click-to-source, hover-emphasis/dim,
|
|
167
|
-
* and tooltip content — all from these attributes, no per-type wiring.
|
|
168
|
-
*/
|
|
169
|
-
export function tagDatum<E extends Element>(
|
|
170
|
-
sel: d3Selection.Selection<E, unknown, null, undefined>,
|
|
171
|
-
o: {
|
|
172
|
-
line?: number;
|
|
173
|
-
key?: string;
|
|
174
|
-
name?: string;
|
|
175
|
-
value?: string | number;
|
|
176
|
-
color?: string;
|
|
177
|
-
}
|
|
178
|
-
): d3Selection.Selection<E, unknown, null, undefined> {
|
|
179
|
-
const cls = (sel.attr('class') ?? '').split(/\s+/).filter(Boolean);
|
|
180
|
-
if (!cls.includes('dgmo-datum')) cls.push('dgmo-datum');
|
|
181
|
-
sel.attr('class', cls.join(' '));
|
|
182
|
-
if (o.line != null) sel.attr('data-line-number', o.line);
|
|
183
|
-
if (o.key != null) sel.attr('data-emph-key', o.key);
|
|
184
|
-
if (o.name != null) sel.attr('data-name', o.name);
|
|
185
|
-
if (o.value != null) sel.attr('data-value', String(o.value));
|
|
186
|
-
if (o.color != null) sel.attr('data-color', o.color);
|
|
187
|
-
return sel;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/** Draw a value label (data point / bar) in the given color. */
|
|
191
|
-
export function drawValueLabel(
|
|
192
|
-
svg: Svg,
|
|
193
|
-
text: string,
|
|
194
|
-
x: number,
|
|
195
|
-
y: number,
|
|
196
|
-
color: string,
|
|
197
|
-
anchor: 'middle' | 'start' | 'end' = 'middle'
|
|
198
|
-
): void {
|
|
199
|
-
svg
|
|
200
|
-
.append('text')
|
|
201
|
-
.attr('x', x)
|
|
202
|
-
.attr('y', y)
|
|
203
|
-
.attr('text-anchor', anchor)
|
|
204
|
-
.attr('fill', color)
|
|
205
|
-
.attr('font-size', VALUE_FONT)
|
|
206
|
-
.attr('font-family', FONT_FAMILY)
|
|
207
|
-
.text(text);
|
|
208
|
-
}
|