@thilakbhat/heatmap-ui 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 +471 -0
- package/dist/calendar.d.ts +40 -0
- package/dist/calendar.d.ts.map +1 -0
- package/dist/calendar.js +136 -0
- package/dist/calendar.js.map +1 -0
- package/dist/colors.d.ts +112 -0
- package/dist/colors.d.ts.map +1 -0
- package/dist/colors.js +186 -0
- package/dist/colors.js.map +1 -0
- package/dist/grid.d.ts +26 -0
- package/dist/grid.d.ts.map +1 -0
- package/dist/grid.js +102 -0
- package/dist/grid.js.map +1 -0
- package/dist/heatmap.d.ts +4 -0
- package/dist/heatmap.d.ts.map +1 -0
- package/dist/heatmap.js +134 -0
- package/dist/heatmap.js.map +1 -0
- package/dist/heatmap3d-patterns.d.ts +19 -0
- package/dist/heatmap3d-patterns.d.ts.map +1 -0
- package/dist/heatmap3d-patterns.js +57 -0
- package/dist/heatmap3d-patterns.js.map +1 -0
- package/dist/heatmap3d-scene.d.ts +49 -0
- package/dist/heatmap3d-scene.d.ts.map +1 -0
- package/dist/heatmap3d-scene.js +104 -0
- package/dist/heatmap3d-scene.js.map +1 -0
- package/dist/heatmap3d-visuals.d.ts +30 -0
- package/dist/heatmap3d-visuals.d.ts.map +1 -0
- package/dist/heatmap3d-visuals.js +50 -0
- package/dist/heatmap3d-visuals.js.map +1 -0
- package/dist/heatmap3d.d.ts +6 -0
- package/dist/heatmap3d.d.ts.map +1 -0
- package/dist/heatmap3d.js +268 -0
- package/dist/heatmap3d.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/projection3d.d.ts +29 -0
- package/dist/projection3d.d.ts.map +1 -0
- package/dist/projection3d.js +55 -0
- package/dist/projection3d.js.map +1 -0
- package/dist/scale.d.ts +21 -0
- package/dist/scale.d.ts.map +1 -0
- package/dist/scale.js +61 -0
- package/dist/scale.js.map +1 -0
- package/dist/shapes.d.ts +13 -0
- package/dist/shapes.d.ts.map +1 -0
- package/dist/shapes.js +63 -0
- package/dist/shapes.js.map +1 -0
- package/dist/static-svg.d.ts +45 -0
- package/dist/static-svg.d.ts.map +1 -0
- package/dist/static-svg.js +177 -0
- package/dist/static-svg.js.map +1 -0
- package/dist/types.d.ts +151 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/docs/cover.png +0 -0
- package/docs/playground-2d.png +0 -0
- package/docs/playground-3d.png +0 -0
- package/package.json +61 -0
- package/src/styles.css +385 -0
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useId, useMemo, useRef, useState } from "react";
|
|
4
|
+
import { buildCells } from "./grid.js";
|
|
5
|
+
import { resolve3DTheme } from "./colors.js";
|
|
6
|
+
import { clamp, DEFAULT_CAMERA, normalizeCamera, polygonPath, projectPoint, resolveHeightDomain } from "./projection3d.js";
|
|
7
|
+
import { buildHeatmap3DScene, cameraDirection, point, rectangle } from "./heatmap3d-scene.js";
|
|
8
|
+
import { patternPath } from "./heatmap3d-patterns.js";
|
|
9
|
+
import { heatmap3DLegendColors, resolveHeatmap3DPattern, resolveHeatmap3DVisual } from "./heatmap3d-visuals.js";
|
|
10
|
+
const keyFor = (cell) => `${cell.row}:${cell.column}`;
|
|
11
|
+
const finitePositive = (value, fallback) => Number.isFinite(value) ? Math.max(0, value) : fallback;
|
|
12
|
+
function Surface({ face, camera, color, patternId }) {
|
|
13
|
+
const path = polygonPath(face.points, camera);
|
|
14
|
+
return _jsxs("g", { children: [patternId ? _jsx("path", { d: path, fill: color, className: "heatmap3d__surface heatmap3d__surface-base", "data-face": face.face, pointerEvents: "none" }) : null, _jsx("path", { d: path, fill: patternId ? `url(#${patternId})` : color, className: "heatmap3d__surface", "data-face": face.face, "data-material": patternId ? "pattern" : "solid" }), _jsx("path", { d: path, fill: face.shade >= 0 ? "#fff" : "#071b19", opacity: Math.abs(face.shade), pointerEvents: "none" }), face.windows?.map((window, index) => _jsx("path", { d: polygonPath(window, camera), className: "heatmap3d__window", opacity: index % 5 === 0 ? 0.2 : index % 3 === 0 ? 0.65 : 0.42, pointerEvents: "none" }, index))] });
|
|
15
|
+
}
|
|
16
|
+
/** An SVG city of values. Every tower's highest point is its numerical height;
|
|
17
|
+
* detail never adds an unmeasured storey, and unknowns never become buildings. */
|
|
18
|
+
export function Heatmap3D({ rows, columns, values, scale = "linear", levels: levelsProp, thresholds, shape = "rectangle", blockStyle = "solid", cellSize = 13, gap = 3, theme: themeProp, material = "solid", patterns, faceColor, animation = "none", colors: colorsProp, emptyColor: emptyColorProp, unknownOpacity = 0.5, maxHeight: maxHeightProp = 100, heightDomain, yaw, pitch, zoom, onCameraChange, interactive = true, showControls = true, rowLabels, columnLabels, tooltip, cellLabel, onCellClick, isSlotHidden, showLegend = false, legendLabels, ariaLabel, className, style, ...rest }) {
|
|
19
|
+
const instanceId = useId().replace(/:/g, "");
|
|
20
|
+
const tooltipId = `heatmap3d-tooltip-${instanceId}`;
|
|
21
|
+
const instructionsId = `heatmap3d-instructions-${instanceId}`;
|
|
22
|
+
const containerRef = useRef(null);
|
|
23
|
+
const cellRefs = useRef(new Map());
|
|
24
|
+
const [localCamera, setLocalCamera] = useState(() => normalizeCamera({ yaw, pitch, zoom }));
|
|
25
|
+
const camera = normalizeCamera({ yaw: yaw ?? localCamera.yaw, pitch: pitch ?? localCamera.pitch, zoom: zoom ?? localCamera.zoom });
|
|
26
|
+
const cameraRef = useRef(camera);
|
|
27
|
+
cameraRef.current = camera;
|
|
28
|
+
const [dragging, setDragging] = useState(false);
|
|
29
|
+
const drag = useRef(null);
|
|
30
|
+
const suppressClick = useRef(false);
|
|
31
|
+
const cameraFrame = useRef(null);
|
|
32
|
+
const pendingCamera = useRef(null);
|
|
33
|
+
const [activeKey, setActiveKey] = useState(null);
|
|
34
|
+
const [focusedKey, setFocusedKey] = useState(null);
|
|
35
|
+
const [tooltipPosition, setTooltipPosition] = useState({ x: 0, y: 0, align: "center" });
|
|
36
|
+
const size = Math.max(1, finitePositive(cellSize, 13));
|
|
37
|
+
const gutter = finitePositive(gap, 3);
|
|
38
|
+
const maxHeight = finitePositive(maxHeightProp, 100);
|
|
39
|
+
const theme = themeProp ?? "color";
|
|
40
|
+
const levels = Math.max(1, levelsProp ?? colorsProp?.length ?? 4);
|
|
41
|
+
const emptyColor = emptyColorProp ?? resolve3DTheme(theme).emptyColor;
|
|
42
|
+
const visualOptions = {
|
|
43
|
+
theme,
|
|
44
|
+
material,
|
|
45
|
+
colors: colorsProp,
|
|
46
|
+
emptyColor,
|
|
47
|
+
patterns,
|
|
48
|
+
faceColor,
|
|
49
|
+
levels,
|
|
50
|
+
columns,
|
|
51
|
+
patternPrefix: `heatmap3d-pattern-${instanceId}`,
|
|
52
|
+
};
|
|
53
|
+
const legendColors = heatmap3DLegendColors(visualOptions);
|
|
54
|
+
const patternDefinitions = material === "pattern"
|
|
55
|
+
? ["top", "left", "right"].flatMap(face => Array.from({ length: levels }, (_, index) => {
|
|
56
|
+
const pattern = resolveHeatmap3DPattern({ face, level: index + 1, options: visualOptions });
|
|
57
|
+
return { face, level: index + 1, pattern };
|
|
58
|
+
}))
|
|
59
|
+
: [];
|
|
60
|
+
const { cells, total, unknownCount } = useMemo(() => buildCells({ rows, columns, values, scale, levels, thresholds, isSlotHidden }), [rows, columns, values, scale, levels, thresholds, isSlotHidden]);
|
|
61
|
+
const domain = useMemo(() => resolveHeightDomain(cells, heightDomain), [cells, heightDomain]);
|
|
62
|
+
const step = size + gutter;
|
|
63
|
+
const width = Math.max(size, columns * step - gutter);
|
|
64
|
+
const depth = Math.max(size, rows * step - gutter);
|
|
65
|
+
const facing = cameraDirection(camera);
|
|
66
|
+
const rowEdge = facing.x > 0.001 ? 1 : -1;
|
|
67
|
+
const columnEdge = facing.y >= 0 ? 1 : -1;
|
|
68
|
+
const rowOutward = rowEdge * Math.cos(camera.yaw * Math.PI / 180);
|
|
69
|
+
const rowAnchor = Math.abs(rowOutward) < 0.3 ? "middle" : rowOutward > 0 ? "start" : "end";
|
|
70
|
+
const rowLabelPosition = (index) => projectPoint(point(rowEdge * (width / 2 + size), index * step + size / 2 - depth / 2, 0), camera);
|
|
71
|
+
const columnLabelPosition = (column) => projectPoint(point(column * step + size / 2 - width / 2, columnEdge * (depth / 2 + size), 0), camera);
|
|
72
|
+
// Keep the numeric ruler at the screen-left corner, clear of the towers.
|
|
73
|
+
const axisCorner = point((Math.cos(camera.yaw * Math.PI / 180) >= 0 ? -1 : 1) * (width / 2 + size), (facing.x >= 0 ? 1 : -1) * (depth / 2 + size), 0);
|
|
74
|
+
const geometry = useMemo(() => buildHeatmap3DScene({
|
|
75
|
+
cells, cellSize: size, gap: gutter, width, depth, domain,
|
|
76
|
+
maxHeight, shape, blockStyle, camera,
|
|
77
|
+
}), [cells, size, gutter, width, depth, domain, maxHeight, shape, blockStyle, camera.yaw, camera.pitch]);
|
|
78
|
+
// Fit the drawn scene rather than an orbit-sized sphere. Long grids deserve
|
|
79
|
+
// the same generous canvas occupancy as square grids; every orientation is
|
|
80
|
+
// fitted before zoom so the camera never clips a tower at its default zoom.
|
|
81
|
+
const bounds = useMemo(() => {
|
|
82
|
+
const points = rectangle(0, 0, width + size, depth + size, -5);
|
|
83
|
+
for (const entry of geometry) {
|
|
84
|
+
for (const p of entry.geometry.footprint)
|
|
85
|
+
points.push({ ...p, z: entry.height });
|
|
86
|
+
}
|
|
87
|
+
points.push(axisCorner, { ...axisCorner, z: maxHeight });
|
|
88
|
+
const projected = points.map(p => projectPoint(p, camera));
|
|
89
|
+
if (rowLabels?.length) {
|
|
90
|
+
rowLabels.slice(0, rows).forEach((text, index) => {
|
|
91
|
+
const p = rowLabelPosition(index);
|
|
92
|
+
const labelWidth = typeof text === "string" ? Math.max(24, text.length * 4.5) : 24;
|
|
93
|
+
projected.push({ ...p, x: p.x + (rowAnchor === "end" ? -labelWidth : labelWidth), y: p.y + 10 });
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
if (columnLabels?.length) {
|
|
97
|
+
columnLabels.forEach(entry => {
|
|
98
|
+
if (entry.column < 0 || entry.column >= columns)
|
|
99
|
+
return;
|
|
100
|
+
const p = columnLabelPosition(entry.column);
|
|
101
|
+
const halfWidth = typeof entry.text === "string" ? Math.max(15, entry.text.length * 2.25) : 15;
|
|
102
|
+
projected.push({ ...p, x: p.x - halfWidth, y: p.y + 16 }, { ...p, x: p.x + halfWidth, y: p.y + 16 });
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
const extents = projected.reduce((range, p) => ({ minX: Math.min(range.minX, p.x), maxX: Math.max(range.maxX, p.x), minY: Math.min(range.minY, p.y), maxY: Math.max(range.maxY, p.y) }), { minX: Infinity, maxX: -Infinity, minY: Infinity, maxY: -Infinity });
|
|
106
|
+
const minX = extents.minX - 20;
|
|
107
|
+
const maxX = extents.maxX + 12;
|
|
108
|
+
const minY = extents.minY - 15;
|
|
109
|
+
const maxY = extents.maxY + 15;
|
|
110
|
+
return { x: minX, y: minY, width: Math.max(1, maxX - minX), height: Math.max(1, maxY - minY) };
|
|
111
|
+
}, [geometry, width, depth, size, maxHeight, rowLabels, columnLabels, rows, columns, step, camera.yaw, camera.pitch]);
|
|
112
|
+
const sceneCenterX = bounds.x + bounds.width / 2;
|
|
113
|
+
const sceneCenterY = bounds.y + bounds.height / 2;
|
|
114
|
+
const active = activeKey === null ? undefined : geometry.find(entry => keyFor(entry.cell) === activeKey);
|
|
115
|
+
const content = active ? tooltip ? tooltip(active.cell) : _jsxs(_Fragment, { children: [_jsxs("span", { className: "heatmap3d__tooltip-label", children: ["Row ", active.cell.row + 1, " \u00B7 Column ", active.cell.column + 1] }), _jsx("strong", { children: active.cell.known ? active.cell.value.toLocaleString() : "No data" })] }) : null;
|
|
116
|
+
const label = ariaLabel ?? `3D heatmap, ${rows} by ${columns}, height represents value${unknownCount > 0 ? `, ${unknownCount} slots with no data` : ""}`;
|
|
117
|
+
const focusableKey = focusedKey && cells.some(cell => keyFor(cell) === focusedKey) ? focusedKey : cells[0] ? keyFor(cells[0]) : null;
|
|
118
|
+
useEffect(() => () => {
|
|
119
|
+
if (cameraFrame.current !== null)
|
|
120
|
+
window.cancelAnimationFrame(cameraFrame.current);
|
|
121
|
+
}, []);
|
|
122
|
+
function changeCamera(next) {
|
|
123
|
+
const resolved = normalizeCamera({ ...cameraRef.current, ...next });
|
|
124
|
+
cameraRef.current = resolved;
|
|
125
|
+
setLocalCamera(resolved);
|
|
126
|
+
setActiveKey(null);
|
|
127
|
+
onCameraChange?.(resolved);
|
|
128
|
+
}
|
|
129
|
+
function showCell(cell, target, pointer) {
|
|
130
|
+
if (drag.current?.moved)
|
|
131
|
+
return;
|
|
132
|
+
const rect = containerRef.current?.getBoundingClientRect();
|
|
133
|
+
if (!rect)
|
|
134
|
+
return;
|
|
135
|
+
const box = target.getBoundingClientRect();
|
|
136
|
+
const x = clamp((pointer?.clientX ?? (box.left + box.width / 2)) - rect.left, 16, rect.width - 16);
|
|
137
|
+
const y = clamp((pointer?.clientY ?? box.top) - rect.top, 40, rect.height - 8);
|
|
138
|
+
setTooltipPosition({ x, y, align: x < 120 ? "start" : x > rect.width - 120 ? "end" : "center" });
|
|
139
|
+
setActiveKey(keyFor(cell));
|
|
140
|
+
}
|
|
141
|
+
function pointerDown(event) {
|
|
142
|
+
if (!interactive || !event.isPrimary || event.button !== 0)
|
|
143
|
+
return;
|
|
144
|
+
suppressClick.current = false;
|
|
145
|
+
drag.current = { id: event.pointerId, x: event.clientX, y: event.clientY, camera: cameraRef.current, moved: false };
|
|
146
|
+
}
|
|
147
|
+
function pointerMove(event) {
|
|
148
|
+
const start = drag.current;
|
|
149
|
+
if (!start || event.pointerId !== start.id)
|
|
150
|
+
return;
|
|
151
|
+
// A release outside the SVG before pointer capture must not start a new
|
|
152
|
+
// orbit when the pointer later re-enters the chart.
|
|
153
|
+
if (event.pointerType !== "touch" && (event.buttons & 1) === 0) {
|
|
154
|
+
pointerEnd(event);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
const dx = event.clientX - start.x;
|
|
158
|
+
const dy = event.clientY - start.y;
|
|
159
|
+
if (!start.moved && Math.hypot(dx, dy) < 4)
|
|
160
|
+
return;
|
|
161
|
+
if (!start.moved) {
|
|
162
|
+
start.moved = true;
|
|
163
|
+
event.currentTarget.setPointerCapture(event.pointerId);
|
|
164
|
+
setDragging(true);
|
|
165
|
+
}
|
|
166
|
+
pendingCamera.current = { yaw: start.camera.yaw - dx * 0.35, pitch: start.camera.pitch + dy * 0.25 };
|
|
167
|
+
if (cameraFrame.current === null) {
|
|
168
|
+
cameraFrame.current = window.requestAnimationFrame(() => {
|
|
169
|
+
cameraFrame.current = null;
|
|
170
|
+
if (pendingCamera.current)
|
|
171
|
+
changeCamera(pendingCamera.current);
|
|
172
|
+
pendingCamera.current = null;
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
function pointerEnd(event) {
|
|
177
|
+
if (!drag.current || event.pointerId !== drag.current.id)
|
|
178
|
+
return;
|
|
179
|
+
if (cameraFrame.current !== null)
|
|
180
|
+
window.cancelAnimationFrame(cameraFrame.current);
|
|
181
|
+
cameraFrame.current = null;
|
|
182
|
+
if (pendingCamera.current)
|
|
183
|
+
changeCamera(pendingCamera.current);
|
|
184
|
+
pendingCamera.current = null;
|
|
185
|
+
suppressClick.current = drag.current.moved;
|
|
186
|
+
drag.current = null;
|
|
187
|
+
setDragging(false);
|
|
188
|
+
if (event.currentTarget.hasPointerCapture(event.pointerId))
|
|
189
|
+
event.currentTarget.releasePointerCapture(event.pointerId);
|
|
190
|
+
}
|
|
191
|
+
function cameraKey(event) {
|
|
192
|
+
if (!interactive || event.target !== event.currentTarget)
|
|
193
|
+
return;
|
|
194
|
+
const directions = {
|
|
195
|
+
ArrowLeft: { yaw: camera.yaw - 10 }, ArrowRight: { yaw: camera.yaw + 10 },
|
|
196
|
+
ArrowUp: { pitch: camera.pitch + 5 }, ArrowDown: { pitch: camera.pitch - 5 },
|
|
197
|
+
"+": { zoom: camera.zoom + 0.1 }, "=": { zoom: camera.zoom + 0.1 }, "-": { zoom: camera.zoom - 0.1 },
|
|
198
|
+
Home: DEFAULT_CAMERA, "0": DEFAULT_CAMERA,
|
|
199
|
+
};
|
|
200
|
+
if (directions[event.key]) {
|
|
201
|
+
event.preventDefault();
|
|
202
|
+
changeCamera(directions[event.key]);
|
|
203
|
+
}
|
|
204
|
+
if (event.key === "Escape")
|
|
205
|
+
setActiveKey(null);
|
|
206
|
+
}
|
|
207
|
+
function cellKey(event, cell) {
|
|
208
|
+
if (event.key === "Escape") {
|
|
209
|
+
setActiveKey(null);
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
if (onCellClick && (event.key === "Enter" || event.key === " ")) {
|
|
213
|
+
event.preventDefault();
|
|
214
|
+
onCellClick(cell);
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
const direction = { ArrowLeft: [0, -1], ArrowRight: [0, 1], ArrowUp: [-1, 0], ArrowDown: [1, 0] }[event.key];
|
|
218
|
+
if (!direction)
|
|
219
|
+
return;
|
|
220
|
+
event.preventDefault();
|
|
221
|
+
let row = cell.row + direction[0];
|
|
222
|
+
let column = cell.column + direction[1];
|
|
223
|
+
while (row >= 0 && row < rows && column >= 0 && column < columns) {
|
|
224
|
+
const target = cellRefs.current.get(`${row}:${column}`);
|
|
225
|
+
if (target) {
|
|
226
|
+
target.focus();
|
|
227
|
+
break;
|
|
228
|
+
}
|
|
229
|
+
row += direction[0];
|
|
230
|
+
column += direction[1];
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
const floor = rectangle(0, 0, width + size, depth + size, -1);
|
|
234
|
+
const axisBottom = projectPoint(axisCorner, camera);
|
|
235
|
+
const axisTop = projectPoint({ ...axisCorner, z: maxHeight }, camera);
|
|
236
|
+
const gridPath = (a, b) => {
|
|
237
|
+
const start = projectPoint(a, camera);
|
|
238
|
+
const end = projectPoint(b, camera);
|
|
239
|
+
return `M${start.x},${start.y} L${end.x},${end.y}`;
|
|
240
|
+
};
|
|
241
|
+
return _jsxs("div", { className: ["heatmap", "heatmap3d", className].filter(Boolean).join(" "), ref: containerRef, role: "group", "aria-label": label, "data-total": total, "data-shape": shape, "data-block-style": blockStyle, "data-heatmap3d-theme": theme, "data-material": material, "data-animation": animation, style: style, ...rest, children: [_jsxs("span", { id: instructionsId, className: "heatmap3d__sr-only", children: ["Height shows the numerical value; colour shows its shade band. Zero and negative values are flat. Outlined tiles have no data. ", interactive ? "Drag to orbit. Focus the chart and use arrow keys to rotate, plus or minus to zoom, and Home to reset. Tab to enter the grid, then use arrow keys to inspect adjacent cells." : "Tab to enter the grid, then use arrow keys to inspect adjacent cells."] }), _jsxs("svg", { className: "heatmap3d__scene", viewBox: `${bounds.x} ${bounds.y} ${bounds.width} ${bounds.height}`, role: "group", "aria-label": "3D chart", "aria-describedby": instructionsId, tabIndex: interactive ? 0 : undefined, "data-interactive": interactive, "data-dragging": dragging, onPointerDown: pointerDown, onPointerMove: pointerMove, onPointerUp: pointerEnd, onPointerCancel: pointerEnd, onLostPointerCapture: pointerEnd, onKeyDown: cameraKey, children: [patternDefinitions.length > 0 ? _jsx("defs", { children: patternDefinitions.map(({ face, level, pattern }) => _jsxs("pattern", { id: `${visualOptions.patternPrefix}-${face}-${level}`, patternUnits: "userSpaceOnUse", patternContentUnits: "userSpaceOnUse", width: pattern.width, height: pattern.bitmap.length, children: [_jsx("rect", { width: pattern.width, height: pattern.bitmap.length, fill: pattern.background }), _jsx("path", { d: patternPath(pattern), fill: pattern.foreground })] }, `${face}-${level}`)) }) : null, _jsxs("g", { transform: `translate(${sceneCenterX} ${sceneCenterY}) scale(${camera.zoom}) translate(${-sceneCenterX} ${-sceneCenterY})`, children: [_jsxs("g", { className: "heatmap3d__floor", "aria-hidden": "true", children: [_jsx("path", { d: polygonPath(floor.map(p => ({ ...p, z: -5 })), camera), className: "heatmap3d__floor-edge" }), _jsx("path", { d: polygonPath(floor, camera), className: "heatmap3d__floor-surface" }), Array.from({ length: Math.max(0, columns + 1) }, (_, index) => _jsx("path", { d: gridPath(point(index * step - width / 2 - gutter / 2, -depth / 2 - size / 2, -0.5), point(index * step - width / 2 - gutter / 2, depth / 2 + size / 2, -0.5)), className: "heatmap3d__grid-line" }, `c${index}`)), Array.from({ length: Math.max(0, rows + 1) }, (_, index) => _jsx("path", { d: gridPath(point(-width / 2 - size / 2, index * step - depth / 2 - gutter / 2, -0.5), point(width / 2 + size / 2, index * step - depth / 2 - gutter / 2, -0.5)), className: "heatmap3d__grid-line" }, `r${index}`)), geometry.filter(entry => entry.height > 0).map(entry => _jsx("path", { d: polygonPath(entry.geometry.footprint.map(p => ({ ...p, x: p.x + size * 0.13, y: p.y + size * 0.13, z: -0.1 })), camera), className: "heatmap3d__contact-shadow" }, keyFor(entry.cell)))] }), _jsxs("g", { className: "heatmap3d__axis", "aria-hidden": "true", children: [_jsx("line", { x1: axisBottom.x, y1: axisBottom.y, x2: axisTop.x, y2: axisTop.y }), [0, 0.5, 1].map(fraction => {
|
|
242
|
+
const tick = projectPoint({ ...axisCorner, z: maxHeight * fraction }, camera);
|
|
243
|
+
const value = domain[0] + (domain[1] - domain[0]) * fraction;
|
|
244
|
+
return _jsxs("g", { children: [_jsx("line", { x1: tick.x - 3, x2: tick.x + 3, y1: tick.y, y2: tick.y }), _jsx("text", { x: tick.x - 7, y: tick.y + 3, textAnchor: "end", children: new Intl.NumberFormat(undefined, { notation: Math.abs(value) >= 10000 ? "compact" : "standard", maximumFractionDigits: 1 }).format(value) })] }, fraction);
|
|
245
|
+
})] }), geometry.map((entry, motionIndex) => {
|
|
246
|
+
const { cell, geometry: mesh, height } = entry;
|
|
247
|
+
const key = keyFor(cell);
|
|
248
|
+
const visual = resolveHeatmap3DVisual({ cell, options: visualOptions });
|
|
249
|
+
const name = cellLabel?.(cell) ?? `Row ${cell.row + 1}, column ${cell.column + 1}: ${cell.known ? cell.value : "no data"}`;
|
|
250
|
+
return _jsxs("g", { ref: node => { if (node)
|
|
251
|
+
cellRefs.current.set(key, node);
|
|
252
|
+
else
|
|
253
|
+
cellRefs.current.delete(key); }, className: "heatmap3d__cell", "data-row": cell.row, "data-column": cell.column, "data-known": cell.known ? "true" : "false", "data-value": cell.value, "data-height": height, "data-level": cell.level, "data-active": activeKey === key, "data-material": material, style: { "--heatmap3d-index": motionIndex }, role: onCellClick ? "button" : "img", "aria-label": name, "aria-describedby": activeKey === key && content ? tooltipId : undefined, tabIndex: focusableKey === key ? 0 : -1, onPointerEnter: event => showCell(cell, event.currentTarget, event), onPointerLeave: () => setActiveKey(current => current === key ? null : current), onFocus: event => { setFocusedKey(key); showCell(cell, event.currentTarget); }, onBlur: () => setActiveKey(current => current === key ? null : current), onKeyDown: event => cellKey(event, cell), onClick: onCellClick ? () => { if (!suppressClick.current)
|
|
254
|
+
onCellClick(cell); } : undefined, children: [_jsx("title", { children: name }), !cell.known ? _jsx("path", { d: polygonPath(mesh.footprint, camera), fill: "transparent", className: "heatmap3d__unknown", opacity: unknownOpacity }) : _jsxs(_Fragment, { children: [mesh.faces.map((face, index) => _jsx(Surface, { face: face, camera: camera, color: visual.faceColor(face.face), patternId: visual.patternId(face.face) }, index)), mesh.roof ? _jsx("path", { d: polygonPath(mesh.roof, camera), className: "heatmap3d__roof" }) : null, mesh.studs.map((faces, index) => _jsx("g", { children: faces.map((face, faceIndex) => _jsx(Surface, { face: face, camera: camera, color: visual.faceColor(face.face), patternId: visual.patternId(face.face) }, faceIndex)) }, index))] })] }, key);
|
|
255
|
+
}), _jsxs("g", { className: "heatmap3d__labels", "aria-hidden": "true", children: [rowLabels?.map((text, index) => {
|
|
256
|
+
if (index >= rows)
|
|
257
|
+
return null;
|
|
258
|
+
const position = rowLabelPosition(index);
|
|
259
|
+
return _jsx("text", { x: position.x, y: position.y + 3, textAnchor: rowAnchor, children: text }, index);
|
|
260
|
+
}), columnLabels?.map((entry, index) => {
|
|
261
|
+
if (entry.column < 0 || entry.column >= columns)
|
|
262
|
+
return null;
|
|
263
|
+
const position = columnLabelPosition(entry.column);
|
|
264
|
+
return _jsx("text", { x: position.x, y: position.y + 10, textAnchor: "middle", children: entry.text }, index);
|
|
265
|
+
})] })] })] }), active && content ? _jsx("div", { id: tooltipId, role: "tooltip", className: "heatmap__tooltip heatmap3d__tooltip", "data-align": tooltipPosition.align, style: { left: tooltipPosition.x, top: tooltipPosition.y }, children: content }) : null, showControls && interactive ? _jsxs("div", { className: "heatmap3d__controls", "aria-label": "Chart camera controls", children: [_jsx("button", { type: "button", "aria-label": "Zoom out", disabled: camera.zoom <= 0.55, onClick: () => changeCamera({ zoom: camera.zoom - 0.15 }), children: "\u2212" }), _jsx("button", { type: "button", className: "heatmap3d__reset", "aria-label": "Reset 3D view", onClick: () => changeCamera(DEFAULT_CAMERA), children: _jsx("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: _jsx("path", { d: "M2.5 6A5.5 5.5 0 1 1 2.7 10M2.5 2.5V6H6" }) }) }), _jsx("button", { type: "button", "aria-label": "Zoom in", disabled: camera.zoom >= 2, onClick: () => changeCamera({ zoom: camera.zoom + 0.15 }), children: "+" })] }) : null, showLegend ? _jsxs("div", { className: "heatmap__legend heatmap3d__legend", children: [_jsx("span", { children: legendLabels?.less ?? "less" }), _jsx("span", { className: "heatmap__legend-swatch", style: { background: emptyColor } }), legendColors.map((color, index) => _jsx("span", { className: "heatmap__legend-swatch", style: { background: color } }, index)), _jsx("span", { children: legendLabels?.more ?? "more" }), unknownCount > 0 ? _jsxs(_Fragment, { children: [_jsx("span", { className: "heatmap__legend-unknown", children: legendLabels?.unknown ?? "no data" }), _jsx("span", { className: "heatmap3d__legend-unknown-swatch" })] }) : null] }) : null] });
|
|
266
|
+
}
|
|
267
|
+
export default Heatmap3D;
|
|
268
|
+
//# sourceMappingURL=heatmap3d.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heatmap3d.js","sourceRoot":"","sources":["../src/heatmap3d.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { Heatmap } from "./heatmap.js";
|
|
2
|
+
export { Heatmap3D } from "./heatmap3d.js";
|
|
3
|
+
export { renderHeatmap3DSvg, type Heatmap3DSvgLabel, type Heatmap3DSvgOptions } from "./static-svg.js";
|
|
4
|
+
export { CalendarHeatmap, CalendarHeatmap3D, type CalendarCell, type CalendarDay, type CalendarHeatmapProps, type CalendarHeatmap3DProps } from "./calendar.js";
|
|
5
|
+
export { normalizeCamera, resolveHeightDomain, valueToHeight, projectPoint, projectionBounds, type Point3D, type ProjectedPoint } from "./projection3d.js";
|
|
6
|
+
export { buildCells, normalizeValues, resolveThresholds } from "./grid.js";
|
|
7
|
+
export { levelForValue, linearThresholds, logThresholds, quantileThresholds, } from "./scale.js";
|
|
8
|
+
export { fillStyle, rowOffset, rowSpacing, shapeStyle } from "./shapes.js";
|
|
9
|
+
export { deriveRamp, HEATMAP_3D_THEMES, luminance, mixHex, parseHex, resolve3DColors, resolve3DFaceColor, resolve3DTheme, type Heatmap3DThemePreset, type RampOptions, } from "./colors.js";
|
|
10
|
+
export type { HeatmapCell, Heatmap3DProps, Heatmap3DShape, Heatmap3DBlockStyle, Heatmap3DCamera, Heatmap3DFace, Heatmap3DFaceColor, Heatmap3DFaceColorArgs, Heatmap3DThemeName, Heatmap3DMaterial, Heatmap3DPattern, Heatmap3DAnimation, HeatmapEncoding, HeatmapLegendLabels, HeatmapMatrix, HeatmapProps, HeatmapScale, HeatmapShape, HeatmapValues, ResolvedCell, } from "./types.js";
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACvG,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,oBAAoB,EAAE,KAAK,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAChK,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,KAAK,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC3J,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC3E,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,SAAS,EACT,MAAM,EACN,QAAQ,EACR,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,KAAK,oBAAoB,EACzB,KAAK,WAAW,GACjB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,WAAW,EACX,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,YAAY,GACb,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
export { Heatmap } from "./heatmap.js";
|
|
3
|
+
export { Heatmap3D } from "./heatmap3d.js";
|
|
4
|
+
export { renderHeatmap3DSvg } from "./static-svg.js";
|
|
5
|
+
export { CalendarHeatmap, CalendarHeatmap3D } from "./calendar.js";
|
|
6
|
+
export { normalizeCamera, resolveHeightDomain, valueToHeight, projectPoint, projectionBounds } from "./projection3d.js";
|
|
7
|
+
export { buildCells, normalizeValues, resolveThresholds } from "./grid.js";
|
|
8
|
+
export { levelForValue, linearThresholds, logThresholds, quantileThresholds, } from "./scale.js";
|
|
9
|
+
export { fillStyle, rowOffset, rowSpacing, shapeStyle } from "./shapes.js";
|
|
10
|
+
export { deriveRamp, HEATMAP_3D_THEMES, luminance, mixHex, parseHex, resolve3DColors, resolve3DFaceColor, resolve3DTheme, } from "./colors.js";
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAoD,MAAM,iBAAiB,CAAC;AACvG,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAA+F,MAAM,eAAe,CAAC;AAChK,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAqC,MAAM,mBAAmB,CAAC;AAC3J,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC3E,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,SAAS,EACT,MAAM,EACN,QAAQ,EACR,eAAe,EACf,kBAAkB,EAClB,cAAc,GAGf,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Heatmap3DCamera, ResolvedCell } from "./types.js";
|
|
2
|
+
export type Point3D = {
|
|
3
|
+
x: number;
|
|
4
|
+
y: number;
|
|
5
|
+
z: number;
|
|
6
|
+
};
|
|
7
|
+
export type ProjectedPoint = {
|
|
8
|
+
x: number;
|
|
9
|
+
y: number;
|
|
10
|
+
depth: number;
|
|
11
|
+
};
|
|
12
|
+
export declare const DEFAULT_CAMERA: Heatmap3DCamera;
|
|
13
|
+
export declare const clamp: (value: number, min: number, max: number) => number;
|
|
14
|
+
export declare function normalizeCamera(camera: Partial<Heatmap3DCamera>): Heatmap3DCamera;
|
|
15
|
+
export declare function resolveHeightDomain(cells: readonly Pick<ResolvedCell, "known" | "value">[], explicit?: readonly [number, number]): [number, number];
|
|
16
|
+
export declare function valueToHeight(value: number, domain: readonly [number, number], maxHeight: number): number;
|
|
17
|
+
/** Orthographic projection; increasing depth is nearer the camera. Zoom is
|
|
18
|
+
* applied to the scene, not geometry, so orbit and depth sorting stay stable. */
|
|
19
|
+
export declare function projectPoint(point: Point3D, camera: Heatmap3DCamera): ProjectedPoint;
|
|
20
|
+
/** A camera-independent fit prevents the grid from breathing while orbiting.
|
|
21
|
+
* Bounds contain the entire data volume at every supported camera angle. */
|
|
22
|
+
export declare function projectionBounds(width: number, depth: number, maxHeight: number): {
|
|
23
|
+
x: number;
|
|
24
|
+
y: number;
|
|
25
|
+
width: number;
|
|
26
|
+
height: number;
|
|
27
|
+
};
|
|
28
|
+
export declare function polygonPath(points: readonly Point3D[], camera: Heatmap3DCamera): string;
|
|
29
|
+
//# sourceMappingURL=projection3d.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection3d.d.ts","sourceRoot":"","sources":["../src/projection3d.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,MAAM,OAAO,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAC1D,MAAM,MAAM,cAAc,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AACrE,eAAO,MAAM,cAAc,EAAE,eAAkD,CAAC;AAGhF,eAAO,MAAM,KAAK,GAAI,OAAO,MAAM,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,WAAwC,CAAC;AAEtG,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAOjF;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,SAAS,IAAI,CAAC,YAAY,EAAE,OAAO,GAAG,OAAO,CAAC,EAAE,EACvD,QAAQ,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,CAAC,MAAM,EAAE,MAAM,CAAC,CAMlB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAKzG;AAED;iFACiF;AACjF,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,GAAG,cAAc,CASpF;AAED;4EAC4E;AAC5E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;;;;;EAM/E;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,EAAE,MAAM,EAAE,eAAe,GAAG,MAAM,CAKvF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export const DEFAULT_CAMERA = { yaw: -35, pitch: 38, zoom: 1 };
|
|
2
|
+
const radians = Math.PI / 180;
|
|
3
|
+
const finite = (value, fallback) => Number.isFinite(value) ? value : fallback;
|
|
4
|
+
export const clamp = (value, min, max) => Math.min(max, Math.max(min, value));
|
|
5
|
+
export function normalizeCamera(camera) {
|
|
6
|
+
const yaw = finite(camera.yaw, DEFAULT_CAMERA.yaw);
|
|
7
|
+
return {
|
|
8
|
+
yaw: ((yaw + 180) % 360 + 360) % 360 - 180,
|
|
9
|
+
pitch: clamp(finite(camera.pitch, DEFAULT_CAMERA.pitch), 15, 75),
|
|
10
|
+
zoom: clamp(finite(camera.zoom, DEFAULT_CAMERA.zoom), 0.55, 2),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export function resolveHeightDomain(cells, explicit) {
|
|
14
|
+
if (explicit && explicit.every(Number.isFinite) && explicit[1] > explicit[0]) {
|
|
15
|
+
return [explicit[0], explicit[1]];
|
|
16
|
+
}
|
|
17
|
+
const maximum = cells.reduce((max, cell) => cell.known && Number.isFinite(cell.value) ? Math.max(max, cell.value) : max, 0);
|
|
18
|
+
return [0, maximum || 1];
|
|
19
|
+
}
|
|
20
|
+
export function valueToHeight(value, domain, maxHeight) {
|
|
21
|
+
if (!Number.isFinite(value) || value <= 0)
|
|
22
|
+
return 0;
|
|
23
|
+
const span = domain[1] - domain[0];
|
|
24
|
+
if (!Number.isFinite(span) || span <= 0)
|
|
25
|
+
return 0;
|
|
26
|
+
return clamp((value - domain[0]) / span, 0, 1) * Math.max(0, finite(maxHeight, 100));
|
|
27
|
+
}
|
|
28
|
+
/** Orthographic projection; increasing depth is nearer the camera. Zoom is
|
|
29
|
+
* applied to the scene, not geometry, so orbit and depth sorting stay stable. */
|
|
30
|
+
export function projectPoint(point, camera) {
|
|
31
|
+
const yaw = camera.yaw * radians;
|
|
32
|
+
const pitch = camera.pitch * radians;
|
|
33
|
+
const groundDepth = point.x * Math.sin(yaw) + point.y * Math.cos(yaw);
|
|
34
|
+
return {
|
|
35
|
+
x: point.x * Math.cos(yaw) - point.y * Math.sin(yaw),
|
|
36
|
+
y: groundDepth * Math.sin(pitch) - point.z * Math.cos(pitch),
|
|
37
|
+
depth: groundDepth * Math.cos(pitch) + point.z * Math.sin(pitch),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** A camera-independent fit prevents the grid from breathing while orbiting.
|
|
41
|
+
* Bounds contain the entire data volume at every supported camera angle. */
|
|
42
|
+
export function projectionBounds(width, depth, maxHeight) {
|
|
43
|
+
const radius = Math.hypot(Math.max(0, finite(width, 0)), Math.max(0, finite(depth, 0))) / 2;
|
|
44
|
+
const height = Math.max(0, finite(maxHeight, 100));
|
|
45
|
+
const pad = Math.max(20, Math.min(radius * 0.10, 48));
|
|
46
|
+
const extent = Math.max(1, radius * Math.sin(75 * radians));
|
|
47
|
+
return { x: -radius - pad, y: -extent - height - pad, width: Math.max(1, radius * 2) + pad * 2, height: extent * 2 + height + pad * 2 };
|
|
48
|
+
}
|
|
49
|
+
export function polygonPath(points, camera) {
|
|
50
|
+
return points.map((point, index) => {
|
|
51
|
+
const p = projectPoint(point, camera);
|
|
52
|
+
return `${index ? "L" : "M"}${p.x.toFixed(3)},${p.y.toFixed(3)}`;
|
|
53
|
+
}).join(" ") + " Z";
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=projection3d.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection3d.js","sourceRoot":"","sources":["../src/projection3d.ts"],"names":[],"mappings":"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"}
|
package/dist/scale.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shading strategies.
|
|
3
|
+
*
|
|
4
|
+
* Linear is the default, matching GitHub and most other heatmaps: bands are cut
|
|
5
|
+
* at even fractions of the largest value, so a reader who knows one chart can
|
|
6
|
+
* read this one.
|
|
7
|
+
*
|
|
8
|
+
* Quantile is available for heavy-tailed data. When a single long day is twenty
|
|
9
|
+
* times the median, linear bands drop most of the grid into the palest shade;
|
|
10
|
+
* ranking the active values instead keeps every band populated whatever the
|
|
11
|
+
* unit. Pass scale="quantile" when the distribution warrants it.
|
|
12
|
+
*/
|
|
13
|
+
/** Band ceilings from the quantiles of the active values, ascending. */
|
|
14
|
+
export declare function quantileThresholds(values: readonly number[], bands?: number): number[];
|
|
15
|
+
/** Band ceilings at even fractions of the maximum. */
|
|
16
|
+
export declare function linearThresholds(values: readonly number[], bands?: number): number[];
|
|
17
|
+
/** Band ceilings spaced logarithmically, for values spanning orders of magnitude. */
|
|
18
|
+
export declare function logThresholds(values: readonly number[], bands?: number): number[];
|
|
19
|
+
/** Places a value on a ladder of band ceilings. Returns 0 for empty. */
|
|
20
|
+
export declare function levelForValue(value: number, thresholds: readonly number[], levels: number): number;
|
|
21
|
+
//# sourceMappingURL=scale.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scale.d.ts","sourceRoot":"","sources":["../src/scale.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,wEAAwE;AACxE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,SAAI,GAAG,MAAM,EAAE,CAoBjF;AAED,sDAAsD;AACtD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,SAAI,GAAG,MAAM,EAAE,CAI/E;AAED,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,SAAI,GAAG,MAAM,EAAE,CAU5E;AAED,wEAAwE;AACxE,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,MAAM,EAAE,MAAM,GACb,MAAM,CAMR"}
|
package/dist/scale.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shading strategies.
|
|
3
|
+
*
|
|
4
|
+
* Linear is the default, matching GitHub and most other heatmaps: bands are cut
|
|
5
|
+
* at even fractions of the largest value, so a reader who knows one chart can
|
|
6
|
+
* read this one.
|
|
7
|
+
*
|
|
8
|
+
* Quantile is available for heavy-tailed data. When a single long day is twenty
|
|
9
|
+
* times the median, linear bands drop most of the grid into the palest shade;
|
|
10
|
+
* ranking the active values instead keeps every band populated whatever the
|
|
11
|
+
* unit. Pass scale="quantile" when the distribution warrants it.
|
|
12
|
+
*/
|
|
13
|
+
/** Band ceilings from the quantiles of the active values, ascending. */
|
|
14
|
+
export function quantileThresholds(values, bands = 4) {
|
|
15
|
+
const active = values.filter((value) => value > 0).sort((left, right) => left - right);
|
|
16
|
+
if (active.length === 0)
|
|
17
|
+
return [];
|
|
18
|
+
const thresholds = [];
|
|
19
|
+
for (let band = 1; band < bands; band += 1) {
|
|
20
|
+
const rank = Math.ceil((active.length * band) / bands) - 1;
|
|
21
|
+
const candidate = active[Math.max(0, Math.min(active.length - 1, rank))];
|
|
22
|
+
// Keep the ladder strictly increasing: a repeated value would create a
|
|
23
|
+
// band nothing can land in and skew every lookup above it.
|
|
24
|
+
if (thresholds.length === 0 || candidate > thresholds[thresholds.length - 1]) {
|
|
25
|
+
thresholds.push(candidate);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const maximum = active[active.length - 1];
|
|
29
|
+
if (thresholds.length === 0 || maximum > thresholds[thresholds.length - 1]) {
|
|
30
|
+
thresholds.push(maximum);
|
|
31
|
+
}
|
|
32
|
+
return thresholds;
|
|
33
|
+
}
|
|
34
|
+
/** Band ceilings at even fractions of the maximum. */
|
|
35
|
+
export function linearThresholds(values, bands = 4) {
|
|
36
|
+
const maximum = values.reduce((largest, value) => (value > largest ? value : largest), 0);
|
|
37
|
+
if (maximum <= 0)
|
|
38
|
+
return [];
|
|
39
|
+
return Array.from({ length: bands }, (_, index) => (maximum * (index + 1)) / bands);
|
|
40
|
+
}
|
|
41
|
+
/** Band ceilings spaced logarithmically, for values spanning orders of magnitude. */
|
|
42
|
+
export function logThresholds(values, bands = 4) {
|
|
43
|
+
const active = values.filter((value) => value > 0);
|
|
44
|
+
if (active.length === 0)
|
|
45
|
+
return [];
|
|
46
|
+
const maximum = Math.max(...active);
|
|
47
|
+
const span = Math.log10(maximum + 1);
|
|
48
|
+
if (span <= 0)
|
|
49
|
+
return [maximum];
|
|
50
|
+
return Array.from({ length: bands }, (_, index) => Math.pow(10, (span * (index + 1)) / bands) - 1);
|
|
51
|
+
}
|
|
52
|
+
/** Places a value on a ladder of band ceilings. Returns 0 for empty. */
|
|
53
|
+
export function levelForValue(value, thresholds, levels) {
|
|
54
|
+
if (value <= 0 || thresholds.length === 0)
|
|
55
|
+
return 0;
|
|
56
|
+
const index = thresholds.findIndex((threshold) => value <= threshold);
|
|
57
|
+
const band = index === -1 ? thresholds.length : index + 1;
|
|
58
|
+
// A short ladder (few distinct values) still spans the full palette.
|
|
59
|
+
return Math.max(1, Math.min(levels, Math.round((band / thresholds.length) * levels)));
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=scale.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scale.js","sourceRoot":"","sources":["../src/scale.ts"],"names":[],"mappings":"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"}
|
package/dist/shapes.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { CSSProperties } from "react";
|
|
2
|
+
import type { HeatmapShape } from "./types.js";
|
|
3
|
+
/** Hexagons tile only when alternate rows are offset by half a column. */
|
|
4
|
+
export declare function rowOffset(shape: HeatmapShape, row: number, columnWidth: number): number;
|
|
5
|
+
/** Hexagon rows interlock, so they sit closer together than their box height. */
|
|
6
|
+
export declare function rowSpacing(shape: HeatmapShape, cellSize: number, gap: number): number;
|
|
7
|
+
export declare function shapeStyle(shape: HeatmapShape, radius: number | string | undefined): CSSProperties;
|
|
8
|
+
/**
|
|
9
|
+
* `bar` grows from the bottom and `ring` thickens inward, so both express
|
|
10
|
+
* intensity through geometry and need the level to draw themselves.
|
|
11
|
+
*/
|
|
12
|
+
export declare function fillStyle(shape: HeatmapShape, level: number, levels: number, color: string, cellSize: number): CSSProperties;
|
|
13
|
+
//# sourceMappingURL=shapes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shapes.d.ts","sourceRoot":"","sources":["../src/shapes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAuB/C,0EAA0E;AAC1E,wBAAgB,SAAS,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEvF;AAED,iFAAiF;AACjF,wBAAgB,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAErF;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAClC,aAAa,CAYf;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,aAAa,CAqBf"}
|