@cosmos.gl/graph 2.6.2-rc.0 → 2.7.0-beta.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 (186) hide show
  1. package/.eslintrc +147 -0
  2. package/.github/SECURITY.md +13 -0
  3. package/.github/dco.yml +4 -0
  4. package/.github/workflows/github_pages.yml +54 -0
  5. package/.storybook/main.ts +26 -0
  6. package/.storybook/manager-head.html +1 -0
  7. package/.storybook/manager.ts +14 -0
  8. package/.storybook/preview.ts +29 -0
  9. package/.storybook/style.css +3 -0
  10. package/CHARTER.md +69 -0
  11. package/CODE_OF_CONDUCT.md +178 -0
  12. package/CONTRIBUTING.md +22 -0
  13. package/GOVERNANCE.md +21 -0
  14. package/cosmos-2-0-migration-notes.md +98 -0
  15. package/cosmos_awesome.md +96 -0
  16. package/dist/config.d.ts +5 -9
  17. package/dist/graph/utils/error-message.d.ts +1 -1
  18. package/dist/helper.d.ts +39 -2
  19. package/dist/index-FUIgayhu.js +19827 -0
  20. package/dist/index-FUIgayhu.js.map +1 -0
  21. package/dist/index.d.ts +17 -64
  22. package/dist/index.js +14 -14654
  23. package/dist/index.js.map +1 -1
  24. package/dist/index.min.js +1062 -475
  25. package/dist/index.min.js.map +1 -1
  26. package/dist/modules/Clusters/index.d.ts +11 -3
  27. package/dist/modules/ForceCenter/index.d.ts +10 -3
  28. package/dist/modules/ForceGravity/index.d.ts +5 -1
  29. package/dist/modules/ForceLink/index.d.ts +8 -5
  30. package/dist/modules/ForceManyBody/index.d.ts +16 -7
  31. package/dist/modules/ForceMouse/index.d.ts +5 -1
  32. package/dist/modules/GraphData/index.d.ts +0 -1
  33. package/dist/modules/Lines/index.d.ts +11 -5
  34. package/dist/modules/Points/index.d.ts +31 -13
  35. package/dist/modules/Store/index.d.ts +93 -0
  36. package/dist/modules/core-module.d.ts +3 -3
  37. package/dist/stories/beginners/basic-set-up/data-gen.d.ts +4 -0
  38. package/dist/stories/beginners/basic-set-up/index.d.ts +6 -0
  39. package/dist/stories/beginners/link-hovering/data-generator.d.ts +19 -0
  40. package/dist/stories/beginners/link-hovering/index.d.ts +6 -0
  41. package/dist/stories/beginners/point-labels/data.d.ts +13 -0
  42. package/dist/stories/beginners/point-labels/index.d.ts +10 -0
  43. package/dist/stories/beginners/point-labels/labels.d.ts +8 -0
  44. package/dist/stories/beginners/quick-start.d.ts +6 -0
  45. package/dist/stories/beginners/remove-points/config.d.ts +2 -0
  46. package/dist/stories/beginners/remove-points/data-gen.d.ts +4 -0
  47. package/dist/stories/beginners/remove-points/index.d.ts +6 -0
  48. package/dist/stories/beginners.stories.d.ts +10 -0
  49. package/dist/stories/clusters/polygon-selection/index.d.ts +6 -0
  50. package/dist/stories/clusters/polygon-selection/polygon.d.ts +20 -0
  51. package/dist/stories/clusters/radial.d.ts +6 -0
  52. package/dist/stories/clusters/with-labels.d.ts +6 -0
  53. package/dist/stories/clusters/worm.d.ts +6 -0
  54. package/dist/stories/clusters.stories.d.ts +9 -0
  55. package/dist/stories/create-cluster-labels.d.ts +4 -0
  56. package/dist/stories/create-cosmos.d.ts +17 -0
  57. package/dist/stories/create-story.d.ts +16 -0
  58. package/dist/stories/experiments/full-mesh.d.ts +6 -0
  59. package/dist/stories/experiments/mesh-with-holes.d.ts +6 -0
  60. package/dist/stories/experiments.stories.d.ts +7 -0
  61. package/dist/stories/generate-mesh-data.d.ts +12 -0
  62. package/dist/stories/geospatial/moscow-metro-stations/index.d.ts +16 -0
  63. package/dist/stories/geospatial/moscow-metro-stations/moscow-metro-coords.d.ts +1 -0
  64. package/dist/stories/geospatial/moscow-metro-stations/point-colors.d.ts +1 -0
  65. package/dist/stories/geospatial.stories.d.ts +6 -0
  66. package/dist/stories/shapes/all-shapes/index.d.ts +6 -0
  67. package/dist/stories/shapes/image-example/index.d.ts +6 -0
  68. package/dist/stories/shapes.stories.d.ts +7 -0
  69. package/dist/stories/test-luma-migration.d.ts +6 -0
  70. package/dist/stories/test.stories.d.ts +6 -0
  71. package/dist/webgl-device-B9ewDj5L.js +3923 -0
  72. package/dist/webgl-device-B9ewDj5L.js.map +1 -0
  73. package/logo.svg +3 -0
  74. package/package.json +5 -7
  75. package/rollup.config.js +70 -0
  76. package/src/config.ts +728 -0
  77. package/src/declaration.d.ts +12 -0
  78. package/src/graph/utils/error-message.ts +23 -0
  79. package/src/helper.ts +113 -0
  80. package/src/index.ts +1769 -0
  81. package/src/modules/Clusters/calculate-centermass.frag +12 -0
  82. package/src/modules/Clusters/calculate-centermass.vert +38 -0
  83. package/src/modules/Clusters/force-cluster.frag +55 -0
  84. package/src/modules/Clusters/index.ts +578 -0
  85. package/src/modules/Drag/index.ts +33 -0
  86. package/src/modules/FPSMonitor/css.ts +53 -0
  87. package/src/modules/FPSMonitor/index.ts +28 -0
  88. package/src/modules/ForceCenter/calculate-centermass.frag +9 -0
  89. package/src/modules/ForceCenter/calculate-centermass.vert +26 -0
  90. package/src/modules/ForceCenter/force-center.frag +37 -0
  91. package/src/modules/ForceCenter/index.ts +284 -0
  92. package/src/modules/ForceGravity/force-gravity.frag +40 -0
  93. package/src/modules/ForceGravity/index.ts +107 -0
  94. package/src/modules/ForceLink/force-spring.ts +89 -0
  95. package/src/modules/ForceLink/index.ts +293 -0
  96. package/src/modules/ForceManyBody/calculate-level.frag +9 -0
  97. package/src/modules/ForceManyBody/calculate-level.vert +37 -0
  98. package/src/modules/ForceManyBody/force-centermass.frag +61 -0
  99. package/src/modules/ForceManyBody/force-level.frag +138 -0
  100. package/src/modules/ForceManyBody/index.ts +525 -0
  101. package/src/modules/ForceManyBody/quadtree-frag-shader.ts +89 -0
  102. package/src/modules/ForceManyBodyQuadtree/calculate-level.frag +9 -0
  103. package/src/modules/ForceManyBodyQuadtree/calculate-level.vert +25 -0
  104. package/src/modules/ForceManyBodyQuadtree/index.ts +157 -0
  105. package/src/modules/ForceManyBodyQuadtree/quadtree-frag-shader.ts +93 -0
  106. package/src/modules/ForceMouse/force-mouse.frag +35 -0
  107. package/src/modules/ForceMouse/index.ts +102 -0
  108. package/src/modules/GraphData/index.ts +383 -0
  109. package/src/modules/Lines/draw-curve-line.frag +59 -0
  110. package/src/modules/Lines/draw-curve-line.vert +248 -0
  111. package/src/modules/Lines/geometry.ts +18 -0
  112. package/src/modules/Lines/hovered-line-index.frag +43 -0
  113. package/src/modules/Lines/hovered-line-index.vert +13 -0
  114. package/src/modules/Lines/index.ts +661 -0
  115. package/src/modules/Points/atlas-utils.ts +137 -0
  116. package/src/modules/Points/drag-point.frag +34 -0
  117. package/src/modules/Points/draw-highlighted.frag +44 -0
  118. package/src/modules/Points/draw-highlighted.vert +145 -0
  119. package/src/modules/Points/draw-points.frag +259 -0
  120. package/src/modules/Points/draw-points.vert +203 -0
  121. package/src/modules/Points/fill-sampled-points.frag +12 -0
  122. package/src/modules/Points/fill-sampled-points.vert +51 -0
  123. package/src/modules/Points/find-hovered-point.frag +15 -0
  124. package/src/modules/Points/find-hovered-point.vert +90 -0
  125. package/src/modules/Points/find-points-on-area-selection.frag +88 -0
  126. package/src/modules/Points/find-points-on-polygon-selection.frag +89 -0
  127. package/src/modules/Points/index.ts +2292 -0
  128. package/src/modules/Points/track-positions.frag +30 -0
  129. package/src/modules/Points/update-position.frag +39 -0
  130. package/src/modules/Shared/buffer.ts +39 -0
  131. package/src/modules/Shared/clear.frag +10 -0
  132. package/src/modules/Shared/quad.vert +13 -0
  133. package/src/modules/Store/index.ts +283 -0
  134. package/src/modules/Zoom/index.ts +148 -0
  135. package/src/modules/core-module.ts +28 -0
  136. package/src/stories/1. welcome.mdx +75 -0
  137. package/src/stories/2. configuration.mdx +111 -0
  138. package/src/stories/3. api-reference.mdx +591 -0
  139. package/src/stories/beginners/basic-set-up/data-gen.ts +33 -0
  140. package/src/stories/beginners/basic-set-up/index.ts +167 -0
  141. package/src/stories/beginners/basic-set-up/style.css +35 -0
  142. package/src/stories/beginners/link-hovering/data-generator.ts +198 -0
  143. package/src/stories/beginners/link-hovering/index.ts +65 -0
  144. package/src/stories/beginners/link-hovering/style.css +73 -0
  145. package/src/stories/beginners/point-labels/data.ts +73 -0
  146. package/src/stories/beginners/point-labels/index.ts +69 -0
  147. package/src/stories/beginners/point-labels/labels.ts +46 -0
  148. package/src/stories/beginners/point-labels/style.css +16 -0
  149. package/src/stories/beginners/quick-start.ts +54 -0
  150. package/src/stories/beginners/remove-points/config.ts +25 -0
  151. package/src/stories/beginners/remove-points/data-gen.ts +30 -0
  152. package/src/stories/beginners/remove-points/index.ts +96 -0
  153. package/src/stories/beginners/remove-points/style.css +31 -0
  154. package/src/stories/beginners.stories.ts +130 -0
  155. package/src/stories/clusters/polygon-selection/index.ts +52 -0
  156. package/src/stories/clusters/polygon-selection/polygon.ts +143 -0
  157. package/src/stories/clusters/polygon-selection/style.css +8 -0
  158. package/src/stories/clusters/radial.ts +24 -0
  159. package/src/stories/clusters/with-labels.ts +54 -0
  160. package/src/stories/clusters/worm.ts +40 -0
  161. package/src/stories/clusters.stories.ts +77 -0
  162. package/src/stories/create-cluster-labels.ts +50 -0
  163. package/src/stories/create-cosmos.ts +72 -0
  164. package/src/stories/create-story.ts +51 -0
  165. package/src/stories/experiments/full-mesh.ts +13 -0
  166. package/src/stories/experiments/mesh-with-holes.ts +13 -0
  167. package/src/stories/experiments.stories.ts +43 -0
  168. package/src/stories/generate-mesh-data.ts +125 -0
  169. package/src/stories/geospatial/moscow-metro-stations/index.ts +66 -0
  170. package/src/stories/geospatial/moscow-metro-stations/moscow-metro-coords.ts +1 -0
  171. package/src/stories/geospatial/moscow-metro-stations/point-colors.ts +46 -0
  172. package/src/stories/geospatial/moscow-metro-stations/style.css +30 -0
  173. package/src/stories/geospatial.stories.ts +30 -0
  174. package/src/stories/shapes/all-shapes/index.ts +73 -0
  175. package/src/stories/shapes/image-example/icons/box.png +0 -0
  176. package/src/stories/shapes/image-example/icons/lego.png +0 -0
  177. package/src/stories/shapes/image-example/icons/s.png +0 -0
  178. package/src/stories/shapes/image-example/icons/swift.png +0 -0
  179. package/src/stories/shapes/image-example/icons/toolbox.png +0 -0
  180. package/src/stories/shapes/image-example/index.ts +246 -0
  181. package/src/stories/shapes.stories.ts +37 -0
  182. package/src/stories/test-luma-migration.ts +195 -0
  183. package/src/stories/test.stories.ts +25 -0
  184. package/src/variables.ts +68 -0
  185. package/tsconfig.json +41 -0
  186. package/vite.config.ts +52 -0
@@ -0,0 +1,12 @@
1
+ declare module '*.frag';
2
+ declare module '*.vert';
3
+ declare module '*.png' {
4
+ const content: string
5
+ // eslint-disable-next-line import/no-default-export
6
+ export default content
7
+ }
8
+ declare module '*?raw' {
9
+ const content: string
10
+ // eslint-disable-next-line import/no-default-export
11
+ export default content
12
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Creates and appends an error message element to the container
3
+ * @param container The HTML element to append the error message to
4
+ * @returns The created error div element
5
+ */
6
+ export function createWebGLErrorMessage (container: HTMLElement, error: string): HTMLDivElement {
7
+ const errorDiv = document.createElement('div')
8
+ errorDiv.style.cssText = `
9
+ color: var(--cosmosgl-error-message-color);
10
+ padding: 0em 2em;
11
+ position: absolute;
12
+ top: 50%; left: 0; right: 0;
13
+ transform: translateY(-50%);
14
+ z-index: 1000;
15
+ font-family: inherit;
16
+ font-size: 1rem;
17
+ text-align: center;
18
+ user-select: none;
19
+ `
20
+ errorDiv.textContent = `Sorry, your device or browser does not support the required WebGL features for this visualization: ${error}`
21
+ container.appendChild(errorDiv)
22
+ return errorDiv
23
+ }
package/src/helper.ts ADDED
@@ -0,0 +1,113 @@
1
+ import { color as d3Color } from 'd3-color'
2
+ import { Device, Framebuffer } from '@luma.gl/core'
3
+ import DOMPurify from 'dompurify'
4
+
5
+ export const isFunction = <T>(a: T): boolean => typeof a === 'function'
6
+ export const isArray = <T>(a: unknown | T[]): a is T[] => Array.isArray(a)
7
+ export const isObject = <T>(a: T): boolean => (a instanceof Object)
8
+ export const isAClassInstance = <T>(a: T): boolean => {
9
+ if (a instanceof Object) {
10
+ // eslint-disable-next-line @typescript-eslint/ban-types
11
+ return (a as T & Object).constructor.name !== 'Function' && (a as T & Object).constructor.name !== 'Object'
12
+ } else return false
13
+ }
14
+ export const isPlainObject = <T>(a: T): boolean => isObject(a) && !isArray(a) && !isFunction(a) && !isAClassInstance(a)
15
+
16
+ export function getRgbaColor (value: string | [number, number, number, number]): [number, number, number, number] {
17
+ let rgba: [number, number, number, number]
18
+ if (isArray(value)) {
19
+ rgba = value
20
+ } else {
21
+ const color = d3Color(value)
22
+ const rgb = color?.rgb()
23
+ rgba = [rgb?.r || 0, rgb?.g || 0, rgb?.b || 0, color?.opacity ?? 1]
24
+ }
25
+
26
+ return [
27
+ rgba[0] / 255,
28
+ rgba[1] / 255,
29
+ rgba[2] / 255,
30
+ rgba[3],
31
+ ]
32
+ }
33
+
34
+ export function rgbToBrightness (r: number, g: number, b: number): number {
35
+ return 0.2126 * r + 0.7152 * g + 0.0722 * b
36
+ }
37
+
38
+ /**
39
+ * TODO: Migrate from deprecated `readPixelsToArrayWebGL` to CommandEncoder API
40
+ *
41
+ * `readPixelsToArrayWebGL` is deprecated in luma.gl v9. The recommended modern approach is:
42
+ *
43
+ * 1. Create a buffer to hold the pixel data:
44
+ * const buffer = device.createBuffer({
45
+ * byteLength: width * height * 4 * 4, // RGBA, 4 bytes per float
46
+ * usage: Buffer.COPY_DST | Buffer.MAP_READ
47
+ * });
48
+ *
49
+ * 2. Copy texture/framebuffer to buffer using command encoder:
50
+ * const commandEncoder = device.createCommandEncoder();
51
+ * commandEncoder.copyTextureToBuffer({
52
+ * sourceTexture: fbo, // Can be Texture or Framebuffer
53
+ * width: sourceWidth ?? fbo.width,
54
+ * height: sourceHeight ?? fbo.height,
55
+ * origin: [sourceX, sourceY],
56
+ * destinationBuffer: buffer
57
+ * });
58
+ * const commandBuffer = commandEncoder.finish();
59
+ * device.submit(commandBuffer);
60
+ *
61
+ * 3. Read the data from the buffer (async):
62
+ * const pixelData = await buffer.readAsync(); // Returns ArrayBuffer
63
+ * return new Float32Array(pixelData);
64
+ *
65
+ * Note: The modern approach is asynchronous, so this function signature would need to change
66
+ * to return Promise<Float32Array> or we'd need to handle async at all call sites (18 locations).
67
+ *
68
+ * Migration impact:
69
+ * - This function is used in 18 places across the codebase
70
+ * - All call sites would need to be updated to handle async
71
+ * - Consider batching the migration to avoid inconsistencies
72
+ *
73
+ * Current status: Deprecated but still functional. Keeping for now until full migration can be planned.
74
+ */
75
+ export function readPixels (device: Device, fbo: Framebuffer, sourceX = 0, sourceY = 0, sourceWidth?: number, sourceHeight?: number): Float32Array {
76
+ // Let luma.gl auto-allocate based on texture format
77
+ // It will use Float32Array for rgba32float textures
78
+ return device.readPixelsToArrayWebGL(fbo, {
79
+ sourceX,
80
+ sourceY,
81
+ sourceWidth,
82
+ sourceHeight,
83
+ }) as Float32Array
84
+ }
85
+
86
+ export function clamp (num: number, min: number, max: number): number {
87
+ return Math.min(Math.max(num, min), max)
88
+ }
89
+
90
+ export function isNumber (value: number | undefined | null | typeof NaN): boolean {
91
+ return value !== undefined && value !== null && !Number.isNaN(value)
92
+ }
93
+
94
+ /**
95
+ * Sanitizes HTML content to prevent XSS attacks using DOMPurify
96
+ *
97
+ * This function is used internally to sanitize HTML content before setting innerHTML,
98
+ * such as in attribution text. It uses a safe default configuration that allows
99
+ * only common safe HTML elements and attributes.
100
+ *
101
+ * @param html The HTML string to sanitize
102
+ * @param options Optional DOMPurify configuration options to override defaults
103
+ * @returns Sanitized HTML string safe for innerHTML usage
104
+ */
105
+ export function sanitizeHtml (html: string, options?: DOMPurify.Config): string {
106
+ return DOMPurify.sanitize(html, {
107
+ // Default configuration: allow common safe HTML elements and attributes
108
+ ALLOWED_TAGS: ['a', 'b', 'i', 'em', 'strong', 'span', 'div', 'p', 'br'],
109
+ ALLOWED_ATTR: ['href', 'target', 'class', 'id', 'style'],
110
+ ALLOW_DATA_ATTR: false,
111
+ ...options,
112
+ })
113
+ }