@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,19 @@
|
|
|
1
|
+
import type { Heatmap3DFace, Heatmap3DPattern, Heatmap3DThemeName } from "./types.js";
|
|
2
|
+
export type NormalizedHeatmap3DPattern = {
|
|
3
|
+
width: number;
|
|
4
|
+
bitmap: number[];
|
|
5
|
+
background: string;
|
|
6
|
+
foreground: string;
|
|
7
|
+
};
|
|
8
|
+
export declare function normalizePattern(pattern: Heatmap3DPattern | undefined): NormalizedHeatmap3DPattern | null;
|
|
9
|
+
export declare function patternPath(pattern: NormalizedHeatmap3DPattern): string;
|
|
10
|
+
export declare function builtInPattern(face: Heatmap3DFace, level: number, levels: number, theme: Heatmap3DThemeName): NormalizedHeatmap3DPattern;
|
|
11
|
+
export declare function patternFor({ patterns, face, level, levels, theme, }: {
|
|
12
|
+
patterns?: Partial<Record<Heatmap3DFace, readonly Heatmap3DPattern[]>>;
|
|
13
|
+
face: Heatmap3DFace;
|
|
14
|
+
level: number;
|
|
15
|
+
levels: number;
|
|
16
|
+
theme: Heatmap3DThemeName;
|
|
17
|
+
}): NormalizedHeatmap3DPattern;
|
|
18
|
+
export declare function patternId(prefix: string, face: Heatmap3DFace, level: number): string;
|
|
19
|
+
//# sourceMappingURL=heatmap3d-patterns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heatmap3d-patterns.d.ts","sourceRoot":"","sources":["../src/heatmap3d-patterns.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEtF,MAAM,MAAM,0BAA0B,GAAG;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAYF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,GAAG,0BAA0B,GAAG,IAAI,CAUzG;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,0BAA0B,GAAG,MAAM,CASvE;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,kBAAkB,GACxB,0BAA0B,CAc5B;AAED,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,MAAM,EACN,KAAK,GACN,EAAE;IACD,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,SAAS,gBAAgB,EAAE,CAAC,CAAC,CAAC;IACvE,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,kBAAkB,CAAC;CAC3B,GAAG,0BAA0B,CAI7B;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpF"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { resolve3DTheme } from "./colors.js";
|
|
2
|
+
const MAX_PATTERN_WIDTH = 32;
|
|
3
|
+
function rowValue(value) {
|
|
4
|
+
if (typeof value === "number")
|
|
5
|
+
return Number.isFinite(value) ? Math.floor(Math.max(0, value)) : 0;
|
|
6
|
+
const trimmed = value.trim();
|
|
7
|
+
if (/^[01]+$/.test(trimmed))
|
|
8
|
+
return Number.parseInt(trimmed, 2);
|
|
9
|
+
const parsed = Number.parseInt(trimmed.replace(/^#/, "").replace(/^0x/i, ""), 16);
|
|
10
|
+
return Number.isFinite(parsed) ? Math.max(0, parsed) : 0;
|
|
11
|
+
}
|
|
12
|
+
export function normalizePattern(pattern) {
|
|
13
|
+
if (!pattern || !Number.isInteger(pattern.width) || pattern.width < 1 || pattern.width > MAX_PATTERN_WIDTH || !Array.isArray(pattern.bitmap) || pattern.bitmap.length === 0) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
width: pattern.width,
|
|
18
|
+
bitmap: pattern.bitmap.map((row) => rowValue(row)),
|
|
19
|
+
background: pattern.background ?? "transparent",
|
|
20
|
+
foreground: pattern.foreground ?? "currentColor",
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export function patternPath(pattern) {
|
|
24
|
+
const cells = [];
|
|
25
|
+
pattern.bitmap.forEach((row, y) => {
|
|
26
|
+
for (let x = 0; x < pattern.width; x += 1) {
|
|
27
|
+
const bit = 2 ** (pattern.width - x - 1);
|
|
28
|
+
if (row >= bit && Math.floor(row / bit) % 2 === 1)
|
|
29
|
+
cells.push(`M${x} ${y}h1v1H${x}z`);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
return cells.join("");
|
|
33
|
+
}
|
|
34
|
+
export function builtInPattern(face, level, levels, theme) {
|
|
35
|
+
const density = Math.max(1, Math.min(4, Math.ceil((Math.max(1, level) / Math.max(1, levels)) * 4)));
|
|
36
|
+
const bitmap = [
|
|
37
|
+
density >= 1 ? 0b1000 : 0,
|
|
38
|
+
density >= 3 ? 0b0010 : 0,
|
|
39
|
+
density >= 2 ? 0b0100 : 0,
|
|
40
|
+
density >= 4 ? 0b0001 : 0,
|
|
41
|
+
];
|
|
42
|
+
return {
|
|
43
|
+
width: 4,
|
|
44
|
+
bitmap,
|
|
45
|
+
background: "transparent",
|
|
46
|
+
foreground: face === "top" ? "#ffffffb8" : resolve3DTheme(theme).floor,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export function patternFor({ patterns, face, level, levels, theme, }) {
|
|
50
|
+
const facePatterns = patterns?.[face] ?? (face === "left" || face === "right" ? patterns?.side : undefined);
|
|
51
|
+
const configured = facePatterns?.[Math.min(Math.max(0, level - 1), (facePatterns.length ?? 1) - 1)];
|
|
52
|
+
return normalizePattern(configured) ?? builtInPattern(face, level, levels, theme);
|
|
53
|
+
}
|
|
54
|
+
export function patternId(prefix, face, level) {
|
|
55
|
+
return `${prefix}-${face}-${level}`;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=heatmap3d-patterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heatmap3d-patterns.js","sourceRoot":"","sources":["../src/heatmap3d-patterns.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type Point3D } from "./projection3d.js";
|
|
2
|
+
import type { Heatmap3DBlockStyle, Heatmap3DCamera, Heatmap3DShape, Heatmap3DFace, ResolvedCell } from "./types.js";
|
|
3
|
+
export type Heatmap3DFaceGeometry = {
|
|
4
|
+
points: Point3D[];
|
|
5
|
+
shade: number;
|
|
6
|
+
face: Heatmap3DFace;
|
|
7
|
+
windows?: Point3D[][];
|
|
8
|
+
};
|
|
9
|
+
export type Heatmap3DObjectGeometry = {
|
|
10
|
+
faces: Heatmap3DFaceGeometry[];
|
|
11
|
+
studs: Heatmap3DFaceGeometry[][];
|
|
12
|
+
footprint: Point3D[];
|
|
13
|
+
roof?: Point3D[];
|
|
14
|
+
};
|
|
15
|
+
export type Heatmap3DCellGeometry = {
|
|
16
|
+
cell: ResolvedCell;
|
|
17
|
+
x: number;
|
|
18
|
+
y: number;
|
|
19
|
+
height: number;
|
|
20
|
+
depth: number;
|
|
21
|
+
geometry: Heatmap3DObjectGeometry;
|
|
22
|
+
};
|
|
23
|
+
export declare const point: (x: number, y: number, z: number) => Point3D;
|
|
24
|
+
export declare function cameraDirection(camera: Heatmap3DCamera): {
|
|
25
|
+
x: number;
|
|
26
|
+
y: number;
|
|
27
|
+
};
|
|
28
|
+
export declare function rectangle(x: number, y: number, width: number, depth: number, z: number): Point3D[];
|
|
29
|
+
export declare function circle(x: number, y: number, radius: number, z: number, segments?: number): Point3D[];
|
|
30
|
+
export declare function extrude(footprint: Point3D[], base: number, height: number, camera: Heatmap3DCamera, building?: boolean): Heatmap3DFaceGeometry[];
|
|
31
|
+
export declare function geometryFor(x: number, y: number, size: number, height: number, shape: Heatmap3DShape, blockStyle: Heatmap3DBlockStyle, camera: Heatmap3DCamera): Heatmap3DObjectGeometry;
|
|
32
|
+
/**
|
|
33
|
+
* The shared scene model. React and the static SVG renderer consume the same
|
|
34
|
+
* sorted geometry, so a screenshot and an interactive chart cannot disagree
|
|
35
|
+
* about heights, visible faces, or painter order.
|
|
36
|
+
*/
|
|
37
|
+
export declare function buildHeatmap3DScene({ cells, cellSize, gap, width, depth, domain, maxHeight, shape, blockStyle, camera, }: {
|
|
38
|
+
cells: readonly ResolvedCell[];
|
|
39
|
+
cellSize: number;
|
|
40
|
+
gap: number;
|
|
41
|
+
width: number;
|
|
42
|
+
depth: number;
|
|
43
|
+
domain: readonly [number, number];
|
|
44
|
+
maxHeight: number;
|
|
45
|
+
shape: Heatmap3DShape;
|
|
46
|
+
blockStyle: Heatmap3DBlockStyle;
|
|
47
|
+
camera: Heatmap3DCamera;
|
|
48
|
+
}): Heatmap3DCellGeometry[];
|
|
49
|
+
//# sourceMappingURL=heatmap3d-scene.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heatmap3d-scene.d.ts","sourceRoot":"","sources":["../src/heatmap3d-scene.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,KAAK,EACV,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,aAAa,EACb,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,EAAE,qBAAqB,EAAE,CAAC;IAC/B,KAAK,EAAE,qBAAqB,EAAE,EAAE,CAAC;IACjC,SAAS,EAAE,OAAO,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,YAAY,CAAC;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,uBAAuB,CAAC;CACnC,CAAC;AAEF,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,KAAG,OAAwB,CAAC;AAEjF,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe;;;EAMtD;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE,CAOlG;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,SAAK,GAAG,OAAO,EAAE,CAKhG;AAED,wBAAgB,OAAO,CACrB,SAAS,EAAE,OAAO,EAAE,EACpB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,eAAe,EACvB,QAAQ,UAAQ,GACf,qBAAqB,EAAE,CAuCzB;AAED,wBAAgB,WAAW,CACzB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,cAAc,EACrB,UAAU,EAAE,mBAAmB,EAC/B,MAAM,EAAE,eAAe,GACtB,uBAAuB,CAyBzB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,QAAQ,EACR,GAAG,EACH,KAAK,EACL,KAAK,EACL,MAAM,EACN,SAAS,EACT,KAAK,EACL,UAAU,EACV,MAAM,GACP,EAAE;IACD,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,cAAc,CAAC;IACtB,UAAU,EAAE,mBAAmB,CAAC;IAChC,MAAM,EAAE,eAAe,CAAC;CACzB,GAAG,qBAAqB,EAAE,CAe1B"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { projectPoint, valueToHeight } from "./projection3d.js";
|
|
2
|
+
export const point = (x, y, z) => ({ x, y, z });
|
|
3
|
+
export function cameraDirection(camera) {
|
|
4
|
+
const radians = Math.PI / 180;
|
|
5
|
+
return {
|
|
6
|
+
x: Math.sin(camera.yaw * radians),
|
|
7
|
+
y: Math.cos(camera.yaw * radians),
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export function rectangle(x, y, width, depth, z) {
|
|
11
|
+
return [
|
|
12
|
+
point(x - width / 2, y - depth / 2, z),
|
|
13
|
+
point(x + width / 2, y - depth / 2, z),
|
|
14
|
+
point(x + width / 2, y + depth / 2, z),
|
|
15
|
+
point(x - width / 2, y + depth / 2, z),
|
|
16
|
+
];
|
|
17
|
+
}
|
|
18
|
+
export function circle(x, y, radius, z, segments = 24) {
|
|
19
|
+
return Array.from({ length: segments }, (_, index) => {
|
|
20
|
+
const angle = index / segments * Math.PI * 2;
|
|
21
|
+
return point(x + Math.cos(angle) * radius, y + Math.sin(angle) * radius, z);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
export function extrude(footprint, base, height, camera, building = false) {
|
|
25
|
+
const direction = cameraDirection(camera);
|
|
26
|
+
const faces = [];
|
|
27
|
+
if (height > base) {
|
|
28
|
+
footprint.forEach((a, index) => {
|
|
29
|
+
const b = footprint[(index + 1) % footprint.length];
|
|
30
|
+
const length = Math.hypot(b.x - a.x, b.y - a.y);
|
|
31
|
+
if (length <= 0)
|
|
32
|
+
return;
|
|
33
|
+
const normal = { x: (b.y - a.y) / length, y: -(b.x - a.x) / length };
|
|
34
|
+
if (normal.x * direction.x + normal.y * direction.y <= 0.00001)
|
|
35
|
+
return;
|
|
36
|
+
const windows = [];
|
|
37
|
+
if (building && height > 5) {
|
|
38
|
+
const windowColumns = Math.max(1, Math.min(3, Math.floor(length / 5)));
|
|
39
|
+
const floors = Math.max(1, Math.min(12, Math.floor(height / 7)));
|
|
40
|
+
for (let floor = 0; floor < floors; floor += 1) {
|
|
41
|
+
for (let column = 0; column < windowColumns; column += 1) {
|
|
42
|
+
const left = (column + 0.28) / windowColumns;
|
|
43
|
+
const right = (column + 0.66) / windowColumns;
|
|
44
|
+
const low = base + (height - base) * (floor + 0.26) / floors;
|
|
45
|
+
const high = base + (height - base) * (floor + 0.58) / floors;
|
|
46
|
+
const at = (fraction, z) => point(a.x + (b.x - a.x) * fraction, a.y + (b.y - a.y) * fraction, z);
|
|
47
|
+
windows.push([at(left, low), at(right, low), at(right, high), at(left, high)]);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
faces.push({
|
|
52
|
+
points: [point(a.x, a.y, base), point(b.x, b.y, base), point(b.x, b.y, height), point(a.x, a.y, height)],
|
|
53
|
+
shade: -0.14 - normal.x * 0.12 - normal.y * 0.12,
|
|
54
|
+
face: normal.x >= 0 ? "right" : "left",
|
|
55
|
+
windows,
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
faces.push({ points: footprint.map((p) => ({ ...p, z: height })), shade: 0.14, face: "top" });
|
|
60
|
+
return faces;
|
|
61
|
+
}
|
|
62
|
+
export function geometryFor(x, y, size, height, shape, blockStyle, camera) {
|
|
63
|
+
const width = size * (shape === "bar" ? 0.42 : 0.94);
|
|
64
|
+
const depth = size * 0.94;
|
|
65
|
+
const footprint = shape === "circle" ? circle(x, y, size * 0.47, 0) : rectangle(x, y, width, depth, 0);
|
|
66
|
+
const studHeight = blockStyle === "lego" ? Math.min(size * 0.15, height * 0.2) : 0;
|
|
67
|
+
const faces = extrude(footprint, 0, height - studHeight, camera, blockStyle === "building");
|
|
68
|
+
const studs = [];
|
|
69
|
+
if (studHeight > 0) {
|
|
70
|
+
const positions = shape === "circle"
|
|
71
|
+
? [[x, y]]
|
|
72
|
+
: shape === "bar"
|
|
73
|
+
? [[x, y - depth * 0.24], [x, y + depth * 0.24]]
|
|
74
|
+
: [[x - width * 0.24, y - depth * 0.24], [x + width * 0.24, y - depth * 0.24], [x - width * 0.24, y + depth * 0.24], [x + width * 0.24, y + depth * 0.24]];
|
|
75
|
+
positions.sort((a, b) => projectPoint(point(a[0], a[1], 0), camera).depth - projectPoint(point(b[0], b[1], 0), camera).depth);
|
|
76
|
+
positions.forEach(([sx, sy]) => studs.push(extrude(circle(sx, sy, size * (shape === "circle" ? 0.24 : 0.135), height - studHeight, 12), height - studHeight, height, camera)));
|
|
77
|
+
}
|
|
78
|
+
const roof = blockStyle === "building" && height > 0
|
|
79
|
+
? shape === "circle" ? circle(x, y, size * 0.34, height) : rectangle(x, y, width * 0.76, depth * 0.76, height)
|
|
80
|
+
: undefined;
|
|
81
|
+
return { faces, studs, footprint, roof };
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* The shared scene model. React and the static SVG renderer consume the same
|
|
85
|
+
* sorted geometry, so a screenshot and an interactive chart cannot disagree
|
|
86
|
+
* about heights, visible faces, or painter order.
|
|
87
|
+
*/
|
|
88
|
+
export function buildHeatmap3DScene({ cells, cellSize, gap, width, depth, domain, maxHeight, shape, blockStyle, camera, }) {
|
|
89
|
+
const step = cellSize + gap;
|
|
90
|
+
return cells.map((cell) => {
|
|
91
|
+
const x = cell.column * step + cellSize / 2 - width / 2;
|
|
92
|
+
const y = cell.row * step + cellSize / 2 - depth / 2;
|
|
93
|
+
const height = cell.known ? valueToHeight(cell.value, domain, maxHeight) : 0;
|
|
94
|
+
return {
|
|
95
|
+
cell,
|
|
96
|
+
x,
|
|
97
|
+
y,
|
|
98
|
+
height,
|
|
99
|
+
depth: projectPoint(point(x, y, 0), camera).depth,
|
|
100
|
+
geometry: geometryFor(x, y, cellSize, height, shape, blockStyle, camera),
|
|
101
|
+
};
|
|
102
|
+
}).sort((a, b) => a.depth - b.depth || a.cell.row - b.cell.row || a.cell.column - b.cell.column);
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=heatmap3d-scene.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heatmap3d-scene.js","sourceRoot":"","sources":["../src/heatmap3d-scene.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type NormalizedHeatmap3DPattern } from "./heatmap3d-patterns.js";
|
|
2
|
+
import type { Heatmap3DFace, Heatmap3DFaceColor, Heatmap3DMaterial, Heatmap3DPattern, Heatmap3DThemeName, ResolvedCell } from "./types.js";
|
|
3
|
+
export declare const DEFAULT_HEATMAP_3D_COLORS: readonly ["#9be9a8", "#40c463", "#30a14e", "#216e39"];
|
|
4
|
+
export type Heatmap3DVisualOptions = {
|
|
5
|
+
theme: Heatmap3DThemeName;
|
|
6
|
+
material: Heatmap3DMaterial;
|
|
7
|
+
colors?: readonly string[];
|
|
8
|
+
emptyColor?: string;
|
|
9
|
+
patterns?: Partial<Record<Heatmap3DFace, readonly Heatmap3DPattern[]>>;
|
|
10
|
+
faceColor?: Heatmap3DFaceColor;
|
|
11
|
+
levels: number;
|
|
12
|
+
columns: number;
|
|
13
|
+
patternPrefix: string;
|
|
14
|
+
};
|
|
15
|
+
export type Heatmap3DCellVisual = {
|
|
16
|
+
baseColor: string;
|
|
17
|
+
faceColor: (face: Heatmap3DFace) => string;
|
|
18
|
+
patternId: (face: Heatmap3DFace) => string | undefined;
|
|
19
|
+
};
|
|
20
|
+
export declare function resolveHeatmap3DVisual({ cell, options, }: {
|
|
21
|
+
cell: ResolvedCell;
|
|
22
|
+
options: Heatmap3DVisualOptions;
|
|
23
|
+
}): Heatmap3DCellVisual;
|
|
24
|
+
export declare function resolveHeatmap3DPattern({ face, level, options, }: {
|
|
25
|
+
face: Heatmap3DFace;
|
|
26
|
+
level: number;
|
|
27
|
+
options: Heatmap3DVisualOptions;
|
|
28
|
+
}): NormalizedHeatmap3DPattern;
|
|
29
|
+
export declare function heatmap3DLegendColors(options: Heatmap3DVisualOptions): string[];
|
|
30
|
+
//# sourceMappingURL=heatmap3d-visuals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heatmap3d-visuals.d.ts","sourceRoot":"","sources":["../src/heatmap3d-visuals.ts"],"names":[],"mappings":"AACA,OAAO,EAAyB,KAAK,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACjG,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,yBAAyB,uDAAwD,CAAC;AAE/F,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,SAAS,gBAAgB,EAAE,CAAC,CAAC,CAAC;IACvE,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,MAAM,CAAC;IAC3C,SAAS,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,MAAM,GAAG,SAAS,CAAC;CACxD,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,EACrC,IAAI,EACJ,OAAO,GACR,EAAE;IACD,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,sBAAsB,CAAC;CACjC,GAAG,mBAAmB,CA0BtB;AAED,wBAAgB,uBAAuB,CAAC,EACtC,IAAI,EACJ,KAAK,EACL,OAAO,GACR,EAAE;IACD,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,sBAAsB,CAAC;CACjC,GAAG,0BAA0B,CAQ7B;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,EAAE,CAQ/E"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { resolve3DColors, resolve3DFaceColor, resolve3DTheme } from "./colors.js";
|
|
2
|
+
import { patternFor, patternId } from "./heatmap3d-patterns.js";
|
|
3
|
+
export const DEFAULT_HEATMAP_3D_COLORS = ["#9be9a8", "#40c463", "#30a14e", "#216e39"];
|
|
4
|
+
export function resolveHeatmap3DVisual({ cell, options, }) {
|
|
5
|
+
const palette = resolve3DColors({
|
|
6
|
+
theme: options.theme,
|
|
7
|
+
colors: options.colors,
|
|
8
|
+
column: cell.column,
|
|
9
|
+
columns: options.columns,
|
|
10
|
+
levels: options.levels,
|
|
11
|
+
});
|
|
12
|
+
const baseColor = cell.level > 0
|
|
13
|
+
? palette[Math.min(palette.length - 1, cell.level - 1)]
|
|
14
|
+
: options.emptyColor ?? resolve3DTheme(options.theme).emptyColor;
|
|
15
|
+
return {
|
|
16
|
+
baseColor,
|
|
17
|
+
faceColor: (face) => resolve3DFaceColor({
|
|
18
|
+
cell,
|
|
19
|
+
face,
|
|
20
|
+
color: baseColor,
|
|
21
|
+
level: cell.level,
|
|
22
|
+
theme: options.theme,
|
|
23
|
+
faceColor: options.faceColor,
|
|
24
|
+
}),
|
|
25
|
+
patternId: (face) => {
|
|
26
|
+
if (options.material !== "pattern" || !cell.known || cell.level <= 0)
|
|
27
|
+
return undefined;
|
|
28
|
+
return patternId(options.patternPrefix, face, cell.level);
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export function resolveHeatmap3DPattern({ face, level, options, }) {
|
|
33
|
+
return patternFor({
|
|
34
|
+
patterns: options.patterns,
|
|
35
|
+
face,
|
|
36
|
+
level,
|
|
37
|
+
levels: options.levels,
|
|
38
|
+
theme: options.theme,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
export function heatmap3DLegendColors(options) {
|
|
42
|
+
return resolve3DColors({
|
|
43
|
+
theme: options.theme,
|
|
44
|
+
colors: options.colors,
|
|
45
|
+
column: Math.max(0, Math.floor(options.columns / 2)),
|
|
46
|
+
columns: options.columns,
|
|
47
|
+
levels: options.levels,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=heatmap3d-visuals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heatmap3d-visuals.js","sourceRoot":"","sources":["../src/heatmap3d-visuals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,SAAS,EAAmC,MAAM,yBAAyB,CAAC;AAUjG,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAU,CAAC;AAoB/F,MAAM,UAAU,sBAAsB,CAAC,EACrC,IAAI,EACJ,OAAO,GAIR;IACC,MAAM,OAAO,GAAG,eAAe,CAAC;QAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC;QAC9B,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACvD,CAAC,CAAC,OAAO,CAAC,UAAU,IAAI,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC;IACnE,OAAO;QACL,SAAS;QACT,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC;YACtC,IAAI;YACJ,IAAI;YACJ,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC;QACF,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;YAClB,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC;gBAAE,OAAO,SAAS,CAAC;YACvF,OAAO,SAAS,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5D,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,EACtC,IAAI,EACJ,KAAK,EACL,OAAO,GAKR;IACC,OAAO,UAAU,CAAC;QAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,IAAI;QACJ,KAAK;QACL,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAA+B;IACnE,OAAO,eAAe,CAAC;QACrB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QACpD,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Heatmap3DProps } from "./types.js";
|
|
2
|
+
/** An SVG city of values. Every tower's highest point is its numerical height;
|
|
3
|
+
* detail never adds an unmeasured storey, and unknowns never become buildings. */
|
|
4
|
+
export declare function Heatmap3D({ rows, columns, values, scale, levels: levelsProp, thresholds, shape, blockStyle, cellSize, gap, theme: themeProp, material, patterns, faceColor, animation, colors: colorsProp, emptyColor: emptyColorProp, unknownOpacity, maxHeight: maxHeightProp, heightDomain, yaw, pitch, zoom, onCameraChange, interactive, showControls, rowLabels, columnLabels, tooltip, cellLabel, onCellClick, isSlotHidden, showLegend, legendLabels, ariaLabel, className, style, ...rest }: Heatmap3DProps): import("react").JSX.Element;
|
|
5
|
+
export default Heatmap3D;
|
|
6
|
+
//# sourceMappingURL=heatmap3d.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heatmap3d.d.ts","sourceRoot":"","sources":["../src/heatmap3d.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAmB,cAAc,EAAgB,MAAM,YAAY,CAAC;AAchF;kFACkF;AAClF,wBAAgB,SAAS,CAAC,EACxB,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EACvE,KAAmB,EAAE,UAAoB,EAAE,QAAa,EAAE,GAAO,EACjE,KAAK,EAAE,SAAS,EAAE,QAAkB,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAkB,EAC7E,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,cAAoB,EACpE,SAAS,EAAE,aAAmB,EAAE,YAAY,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAC9E,WAAkB,EAAE,YAAmB,EAAE,SAAS,EAAE,YAAY,EAChE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,UAAkB,EAAE,YAAY,EAC/E,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,EACrC,EAAE,cAAc,+BA0QhB;AAED,eAAe,SAAS,CAAC"}
|