@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.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +471 -0
  3. package/dist/calendar.d.ts +40 -0
  4. package/dist/calendar.d.ts.map +1 -0
  5. package/dist/calendar.js +136 -0
  6. package/dist/calendar.js.map +1 -0
  7. package/dist/colors.d.ts +112 -0
  8. package/dist/colors.d.ts.map +1 -0
  9. package/dist/colors.js +186 -0
  10. package/dist/colors.js.map +1 -0
  11. package/dist/grid.d.ts +26 -0
  12. package/dist/grid.d.ts.map +1 -0
  13. package/dist/grid.js +102 -0
  14. package/dist/grid.js.map +1 -0
  15. package/dist/heatmap.d.ts +4 -0
  16. package/dist/heatmap.d.ts.map +1 -0
  17. package/dist/heatmap.js +134 -0
  18. package/dist/heatmap.js.map +1 -0
  19. package/dist/heatmap3d-patterns.d.ts +19 -0
  20. package/dist/heatmap3d-patterns.d.ts.map +1 -0
  21. package/dist/heatmap3d-patterns.js +57 -0
  22. package/dist/heatmap3d-patterns.js.map +1 -0
  23. package/dist/heatmap3d-scene.d.ts +49 -0
  24. package/dist/heatmap3d-scene.d.ts.map +1 -0
  25. package/dist/heatmap3d-scene.js +104 -0
  26. package/dist/heatmap3d-scene.js.map +1 -0
  27. package/dist/heatmap3d-visuals.d.ts +30 -0
  28. package/dist/heatmap3d-visuals.d.ts.map +1 -0
  29. package/dist/heatmap3d-visuals.js +50 -0
  30. package/dist/heatmap3d-visuals.js.map +1 -0
  31. package/dist/heatmap3d.d.ts +6 -0
  32. package/dist/heatmap3d.d.ts.map +1 -0
  33. package/dist/heatmap3d.js +268 -0
  34. package/dist/heatmap3d.js.map +1 -0
  35. package/dist/index.d.ts +11 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +11 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/projection3d.d.ts +29 -0
  40. package/dist/projection3d.d.ts.map +1 -0
  41. package/dist/projection3d.js +55 -0
  42. package/dist/projection3d.js.map +1 -0
  43. package/dist/scale.d.ts +21 -0
  44. package/dist/scale.d.ts.map +1 -0
  45. package/dist/scale.js +61 -0
  46. package/dist/scale.js.map +1 -0
  47. package/dist/shapes.d.ts +13 -0
  48. package/dist/shapes.d.ts.map +1 -0
  49. package/dist/shapes.js +63 -0
  50. package/dist/shapes.js.map +1 -0
  51. package/dist/static-svg.d.ts +45 -0
  52. package/dist/static-svg.d.ts.map +1 -0
  53. package/dist/static-svg.js +177 -0
  54. package/dist/static-svg.js.map +1 -0
  55. package/dist/types.d.ts +151 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +2 -0
  58. package/dist/types.js.map +1 -0
  59. package/docs/cover.png +0 -0
  60. package/docs/playground-2d.png +0 -0
  61. package/docs/playground-3d.png +0 -0
  62. package/package.json +61 -0
  63. 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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"}
@@ -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":"AAIA,MAAM,CAAC,MAAM,cAAc,GAAoB,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAChF,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC;AAC9B,MAAM,MAAM,GAAG,CAAC,KAAyB,EAAE,QAAgB,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC3G,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAEtG,MAAM,UAAU,eAAe,CAAC,MAAgC;IAC9D,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;IACnD,OAAO;QACL,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG;QAC1C,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;QAChE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;KAC/D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,KAAuD,EACvD,QAAoC;IAEpC,IAAI,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC5H,OAAO,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,MAAiC,EAAE,SAAiB;IAC/F,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAClD,OAAO,KAAK,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;AACvF,CAAC;AAED;iFACiF;AACjF,MAAM,UAAU,YAAY,CAAC,KAAc,EAAE,MAAuB;IAClE,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,OAAO,CAAC;IACjC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC;IACrC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtE,OAAO;QACL,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QACpD,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QAC5D,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;KACjE,CAAC;AACJ,CAAC;AAED;4EAC4E;AAC5E,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,KAAa,EAAE,SAAiB;IAC9E,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC5F,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC;IAC5D,OAAO,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,GAAG,MAAM,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;AAC1I,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAA0B,EAAE,MAAuB;IAC7E,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACjC,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACtC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;AACtB,CAAC"}
@@ -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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"}
@@ -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"}