@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,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":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAU7C,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B,SAAS,QAAQ,CAAC,KAAsB;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClG,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAClF,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAqC;IACpE,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,GAAG,iBAAiB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5K,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAClD,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,aAAa;QAC/C,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,cAAc;KACjD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAmC;IAC7D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACzC,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACxF,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,IAAmB,EACnB,KAAa,EACb,MAAc,EACd,KAAyB;IAEzB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpG,MAAM,MAAM,GAAG;QACb,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;KAC1B,CAAC;IACF,OAAO;QACL,KAAK,EAAE,CAAC;QACR,MAAM;QACN,UAAU,EAAE,aAAa;QACzB,UAAU,EAAE,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,KAAK;KACvE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EACzB,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,MAAM,EACN,KAAK,GAON;IACC,MAAM,YAAY,GAAG,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC5G,MAAM,UAAU,GAAG,YAAY,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACpG,OAAO,gBAAgB,CAAC,UAAU,CAAC,IAAI,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAc,EAAE,IAAmB,EAAE,KAAa;IAC1E,OAAO,GAAG,MAAM,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;AACtC,CAAC"}
@@ -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"}