@dxos/react-ui-canvas 0.7.5-feature-compute.4d9d99a

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 (67) hide show
  1. package/LICENSE +8 -0
  2. package/README.md +1 -0
  3. package/dist/lib/browser/index.mjs +605 -0
  4. package/dist/lib/browser/index.mjs.map +7 -0
  5. package/dist/lib/browser/meta.json +1 -0
  6. package/dist/lib/node/index.cjs +641 -0
  7. package/dist/lib/node/index.cjs.map +7 -0
  8. package/dist/lib/node/meta.json +1 -0
  9. package/dist/lib/node-esm/index.mjs +607 -0
  10. package/dist/lib/node-esm/index.mjs.map +7 -0
  11. package/dist/lib/node-esm/meta.json +1 -0
  12. package/dist/types/src/components/Canvas/Canvas.d.ts +15 -0
  13. package/dist/types/src/components/Canvas/Canvas.d.ts.map +1 -0
  14. package/dist/types/src/components/Canvas/Canvas.stories.d.ts +9 -0
  15. package/dist/types/src/components/Canvas/Canvas.stories.d.ts.map +1 -0
  16. package/dist/types/src/components/Canvas/index.d.ts +2 -0
  17. package/dist/types/src/components/Canvas/index.d.ts.map +1 -0
  18. package/dist/types/src/components/FPS.d.ts +9 -0
  19. package/dist/types/src/components/FPS.d.ts.map +1 -0
  20. package/dist/types/src/components/Grid/Grid.d.ts +19 -0
  21. package/dist/types/src/components/Grid/Grid.d.ts.map +1 -0
  22. package/dist/types/src/components/Grid/Grid.stories.d.ts +8 -0
  23. package/dist/types/src/components/Grid/Grid.stories.d.ts.map +1 -0
  24. package/dist/types/src/components/Grid/index.d.ts +2 -0
  25. package/dist/types/src/components/Grid/index.d.ts.map +1 -0
  26. package/dist/types/src/components/index.d.ts +4 -0
  27. package/dist/types/src/components/index.d.ts.map +1 -0
  28. package/dist/types/src/hooks/index.d.ts +4 -0
  29. package/dist/types/src/hooks/index.d.ts.map +1 -0
  30. package/dist/types/src/hooks/projection.d.ts +58 -0
  31. package/dist/types/src/hooks/projection.d.ts.map +1 -0
  32. package/dist/types/src/hooks/useCanvasContext.d.ts +13 -0
  33. package/dist/types/src/hooks/useCanvasContext.d.ts.map +1 -0
  34. package/dist/types/src/hooks/useWheel.d.ts +8 -0
  35. package/dist/types/src/hooks/useWheel.d.ts.map +1 -0
  36. package/dist/types/src/index.d.ts +5 -0
  37. package/dist/types/src/index.d.ts.map +1 -0
  38. package/dist/types/src/types.d.ts +20 -0
  39. package/dist/types/src/types.d.ts.map +1 -0
  40. package/dist/types/src/util/index.d.ts +3 -0
  41. package/dist/types/src/util/index.d.ts.map +1 -0
  42. package/dist/types/src/util/svg.d.ts +33 -0
  43. package/dist/types/src/util/svg.d.ts.map +1 -0
  44. package/dist/types/src/util/svg.stories.d.ts +6 -0
  45. package/dist/types/src/util/svg.stories.d.ts.map +1 -0
  46. package/dist/types/src/util/util.d.ts +17 -0
  47. package/dist/types/src/util/util.d.ts.map +1 -0
  48. package/dist/types/tsconfig.tsbuildinfo +1 -0
  49. package/package.json +61 -0
  50. package/src/components/Canvas/Canvas.stories.tsx +109 -0
  51. package/src/components/Canvas/Canvas.tsx +89 -0
  52. package/src/components/Canvas/index.ts +5 -0
  53. package/src/components/FPS.tsx +98 -0
  54. package/src/components/Grid/Grid.stories.tsx +41 -0
  55. package/src/components/Grid/Grid.tsx +87 -0
  56. package/src/components/Grid/index.ts +5 -0
  57. package/src/components/index.ts +7 -0
  58. package/src/hooks/index.ts +7 -0
  59. package/src/hooks/projection.tsx +156 -0
  60. package/src/hooks/useCanvasContext.tsx +29 -0
  61. package/src/hooks/useWheel.tsx +107 -0
  62. package/src/index.ts +8 -0
  63. package/src/types.ts +13 -0
  64. package/src/util/index.ts +6 -0
  65. package/src/util/svg.stories.tsx +45 -0
  66. package/src/util/svg.tsx +131 -0
  67. package/src/util/util.ts +50 -0
@@ -0,0 +1,641 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var node_exports = {};
30
+ __export(node_exports, {
31
+ Arrow: () => Arrow,
32
+ Canvas: () => Canvas,
33
+ CanvasContext: () => CanvasContext,
34
+ DATA_TEST_ID: () => DATA_TEST_ID,
35
+ Dimension: () => Dimension,
36
+ FPS: () => FPS,
37
+ Grid: () => Grid,
38
+ GridComponent: () => GridComponent,
39
+ GridPattern: () => GridPattern,
40
+ Marker: () => Marker,
41
+ Markers: () => Markers,
42
+ Point: () => Point,
43
+ ProjectionMapper: () => ProjectionMapper,
44
+ Rect: () => Rect,
45
+ createPath: () => createPath,
46
+ defaultOrigin: () => defaultOrigin,
47
+ getRelativePoint: () => getRelativePoint,
48
+ getZoomTransform: () => getZoomTransform,
49
+ inspectElement: () => inspectElement,
50
+ testId: () => testId,
51
+ useCanvasContext: () => useCanvasContext,
52
+ useWheel: () => useWheel,
53
+ zoomInPlace: () => zoomInPlace,
54
+ zoomTo: () => zoomTo
55
+ });
56
+ module.exports = __toCommonJS(node_exports);
57
+ var import_react = __toESM(require("react"));
58
+ var import_react_resize_detector = require("react-resize-detector");
59
+ var import_react_ui_theme = require("@dxos/react-ui-theme");
60
+ var d3 = __toESM(require("d3"));
61
+ var import_transformation_matrix = require("transformation-matrix");
62
+ var import_react2 = require("react");
63
+ var import_debug = require("@dxos/debug");
64
+ var import_bind_event_listener = require("bind-event-listener");
65
+ var import_react3 = require("react");
66
+ var import_react4 = __toESM(require("react"));
67
+ var import_react_ui_theme2 = require("@dxos/react-ui-theme");
68
+ var import_react5 = __toESM(require("react"));
69
+ var import_react_ui_theme3 = require("@dxos/react-ui-theme");
70
+ var import_react6 = __toESM(require("react"));
71
+ var import_react_ui = require("@dxos/react-ui");
72
+ var import_react_ui_theme4 = require("@dxos/react-ui-theme");
73
+ var import_effect = require("@dxos/effect");
74
+ var defaultOrigin = {
75
+ x: 0,
76
+ y: 0
77
+ };
78
+ var ProjectionMapper = class {
79
+ constructor(bounds, scale, offset) {
80
+ this._bounds = {
81
+ width: 0,
82
+ height: 0
83
+ };
84
+ this._scale = 1;
85
+ this._offset = defaultOrigin;
86
+ this._toScreen = (0, import_transformation_matrix.identity)();
87
+ this._toModel = (0, import_transformation_matrix.identity)();
88
+ if (bounds && scale && offset) {
89
+ this.update(bounds, scale, offset);
90
+ }
91
+ }
92
+ update(bounds, scale, offset) {
93
+ this._bounds = bounds;
94
+ this._scale = scale;
95
+ this._offset = offset;
96
+ this._toScreen = (0, import_transformation_matrix.compose)(
97
+ // NOTE: Order is important.
98
+ (0, import_transformation_matrix.translate)(this._offset.x, this._offset.y),
99
+ (0, import_transformation_matrix.scale)(this._scale)
100
+ );
101
+ this._toModel = (0, import_transformation_matrix.inverse)(this._toScreen);
102
+ return this;
103
+ }
104
+ get bounds() {
105
+ return this._bounds;
106
+ }
107
+ get scale() {
108
+ return this._scale;
109
+ }
110
+ get offset() {
111
+ return this._offset;
112
+ }
113
+ toScreen(points) {
114
+ return (0, import_transformation_matrix.applyToPoints)(this._toScreen, points);
115
+ }
116
+ toModel(points) {
117
+ return (0, import_transformation_matrix.applyToPoints)(this._toModel, points);
118
+ }
119
+ };
120
+ var getZoomTransform = ({ scale, offset, pos, newScale }) => {
121
+ return {
122
+ scale: newScale,
123
+ offset: {
124
+ x: pos.x - (pos.x - offset.x) * (newScale / scale),
125
+ y: pos.y - (pos.y - offset.y) * (newScale / scale)
126
+ }
127
+ };
128
+ };
129
+ var zoomInPlace = (setTransform, pos, offset, current, next, delay = 200) => {
130
+ const is = d3.interpolate(current, next);
131
+ d3.transition().ease(d3.easeSinOut).duration(delay).tween("zoom", () => (t) => {
132
+ const newScale = is(t);
133
+ setTransform(getZoomTransform({
134
+ scale: current,
135
+ newScale,
136
+ offset,
137
+ pos
138
+ }));
139
+ });
140
+ };
141
+ var noop = () => {
142
+ };
143
+ var zoomTo = (setTransform, current, next, delay = 200, cb = noop) => {
144
+ const is = d3.interpolateObject({
145
+ scale: current.scale,
146
+ ...current.offset
147
+ }, {
148
+ scale: next.scale,
149
+ ...next.offset
150
+ });
151
+ d3.transition().ease(d3.easeSinOut).duration(delay).tween("zoom", () => (t) => {
152
+ const { scale, x, y } = is(t);
153
+ setTransform({
154
+ scale,
155
+ offset: {
156
+ x,
157
+ y
158
+ }
159
+ });
160
+ }).on("end", cb);
161
+ };
162
+ var CanvasContext = /* @__PURE__ */ (0, import_react2.createContext)(null);
163
+ var useCanvasContext = () => {
164
+ return (0, import_react2.useContext)(CanvasContext) ?? (0, import_debug.raise)(new Error("Missing CanvasContext"));
165
+ };
166
+ var createPath = (points, join = false) => {
167
+ return [
168
+ "M",
169
+ points.map(({ x, y }) => `${x},${y}`).join(" L "),
170
+ join ? "Z" : ""
171
+ ].join(" ");
172
+ };
173
+ var Markers = ({ id = "dx-marker", classNames }) => {
174
+ return /* @__PURE__ */ import_react4.default.createElement(import_react4.default.Fragment, null, /* @__PURE__ */ import_react4.default.createElement(Arrow, {
175
+ id: `${id}-arrow-start`,
176
+ dir: "start",
177
+ classNames
178
+ }), /* @__PURE__ */ import_react4.default.createElement(Arrow, {
179
+ id: `${id}-arrow-end`,
180
+ dir: "end",
181
+ classNames
182
+ }), /* @__PURE__ */ import_react4.default.createElement(Arrow, {
183
+ id: `${id}-triangle-start`,
184
+ dir: "start",
185
+ closed: true,
186
+ classNames
187
+ }), /* @__PURE__ */ import_react4.default.createElement(Arrow, {
188
+ id: `${id}-triangle-end`,
189
+ dir: "end",
190
+ closed: true,
191
+ classNames
192
+ }), /* @__PURE__ */ import_react4.default.createElement(Marker, {
193
+ id: `${id}-circle`,
194
+ pos: {
195
+ x: 8,
196
+ y: 8
197
+ },
198
+ size: {
199
+ width: 16,
200
+ height: 16
201
+ }
202
+ }, /* @__PURE__ */ import_react4.default.createElement("circle", {
203
+ cx: 8,
204
+ cy: 8,
205
+ r: 5,
206
+ stroke: "context-stroke",
207
+ className: (0, import_react_ui_theme2.mx)(classNames)
208
+ })));
209
+ };
210
+ var Marker = ({ id, className, children, pos: { x: refX, y: refY }, size: { width: markerWidth, height: markerHeight }, fill, ...rest }) => /* @__PURE__ */ import_react4.default.createElement("marker", {
211
+ id,
212
+ className,
213
+ refX,
214
+ refY,
215
+ markerWidth,
216
+ markerHeight,
217
+ markerUnits: "strokeWidth",
218
+ orient: "auto",
219
+ ...rest
220
+ }, children);
221
+ var Arrow = ({ classNames, id, size = 16, dir = "end", closed = false }) => /* @__PURE__ */ import_react4.default.createElement(Marker, {
222
+ id,
223
+ size: {
224
+ width: size,
225
+ height: size
226
+ },
227
+ pos: dir === "end" ? {
228
+ x: size,
229
+ y: size / 2
230
+ } : {
231
+ x: 0,
232
+ y: size / 2
233
+ }
234
+ }, /* @__PURE__ */ import_react4.default.createElement("path", {
235
+ fill: closed ? void 0 : "none",
236
+ stroke: "context-stroke",
237
+ className: (0, import_react_ui_theme2.mx)(classNames),
238
+ d: createPath(dir === "end" ? [
239
+ {
240
+ x: 1,
241
+ y: 1
242
+ },
243
+ {
244
+ x: size,
245
+ y: size / 2
246
+ },
247
+ {
248
+ x: 1,
249
+ y: size - 1
250
+ }
251
+ ] : [
252
+ {
253
+ x: size - 1,
254
+ y: 1
255
+ },
256
+ {
257
+ x: 0,
258
+ y: size / 2
259
+ },
260
+ {
261
+ x: size - 1,
262
+ y: size - 1
263
+ }
264
+ ], closed)
265
+ }));
266
+ var GridPattern = ({ classNames, id, size, offset }) => /* @__PURE__ */ import_react4.default.createElement("pattern", {
267
+ id,
268
+ x: (size / 2 + offset.x) % size,
269
+ y: (size / 2 + offset.y) % size,
270
+ width: size,
271
+ height: size,
272
+ patternUnits: "userSpaceOnUse"
273
+ }, /* @__PURE__ */ import_react4.default.createElement("g", {
274
+ className: (0, import_react_ui_theme2.mx)(classNames)
275
+ }, /* @__PURE__ */ import_react4.default.createElement("line", {
276
+ x1: 0,
277
+ y1: size / 2,
278
+ x2: size,
279
+ y2: size / 2
280
+ }), /* @__PURE__ */ import_react4.default.createElement("line", {
281
+ x1: size / 2,
282
+ y1: 0,
283
+ x2: size / 2,
284
+ y2: size
285
+ })));
286
+ var logged = false;
287
+ var getRelativePoint = (el, ev) => {
288
+ const rect = el.getBoundingClientRect();
289
+ return {
290
+ x: ev.clientX - rect.x,
291
+ y: ev.clientY - rect.top
292
+ };
293
+ };
294
+ var testId = (id, inspect = false) => {
295
+ if (inspect) {
296
+ if (!logged) {
297
+ console.log("Open storybook in expanded window;\nthen run INSPECT()");
298
+ logged = true;
299
+ }
300
+ window.INSPECT = () => {
301
+ const el = document.querySelector(`[data-test-id="${id}"]`);
302
+ window.inspect(el);
303
+ console.log(el);
304
+ };
305
+ }
306
+ return {
307
+ [DATA_TEST_ID]: id
308
+ };
309
+ };
310
+ var inspectElement = (el) => {
311
+ window.INSPECT = () => {
312
+ window.inspect(el);
313
+ window.element = el;
314
+ console.log("Open storybook in expanded window;\nthen run INSPECT()");
315
+ console.log(el);
316
+ };
317
+ };
318
+ var DATA_TEST_ID = "data-test-id";
319
+ var defaultOptions = {
320
+ zoom: true
321
+ };
322
+ var useWheel = (options = defaultOptions) => {
323
+ const { root, setProjection } = useCanvasContext();
324
+ (0, import_react3.useEffect)(() => {
325
+ if (!root) {
326
+ return;
327
+ }
328
+ return (0, import_bind_event_listener.bindAll)(root, [
329
+ {
330
+ type: "wheel",
331
+ options: {
332
+ capture: true,
333
+ passive: false
334
+ },
335
+ listener: (ev) => {
336
+ const zooming = isWheelZooming(ev);
337
+ if (!hasFocus(root) && !zooming) {
338
+ return;
339
+ }
340
+ ev.preventDefault();
341
+ if (zooming && !options.zoom) {
342
+ return;
343
+ }
344
+ if (ev.ctrlKey) {
345
+ if (!root) {
346
+ return;
347
+ }
348
+ setProjection(({ scale, offset }) => {
349
+ const pos = getRelativePoint(root, ev);
350
+ const scaleSensitivity = 0.01;
351
+ const newScale = scale * Math.exp(-ev.deltaY * scaleSensitivity);
352
+ return getZoomTransform({
353
+ scale,
354
+ offset,
355
+ newScale,
356
+ pos
357
+ });
358
+ });
359
+ } else {
360
+ setProjection(({ scale, offset: { x, y } }) => {
361
+ return {
362
+ scale,
363
+ offset: {
364
+ x: x - ev.deltaX,
365
+ y: y - ev.deltaY
366
+ }
367
+ };
368
+ });
369
+ }
370
+ }
371
+ }
372
+ ]);
373
+ }, [
374
+ root
375
+ ]);
376
+ };
377
+ var isWheelZooming = (ev) => {
378
+ if (ev.ctrlKey || ev.metaKey) {
379
+ return Math.abs(ev.deltaY) > 0 || Math.abs(ev.deltaZ) > 0;
380
+ }
381
+ return false;
382
+ };
383
+ var hasFocus = (element) => {
384
+ const activeElement = document.activeElement;
385
+ if (!activeElement) {
386
+ return false;
387
+ }
388
+ let shadowActive = activeElement;
389
+ while (shadowActive?.shadowRoot?.activeElement) {
390
+ shadowActive = shadowActive.shadowRoot.activeElement;
391
+ }
392
+ let current = element;
393
+ while (current) {
394
+ if (current === activeElement || current === shadowActive) {
395
+ return true;
396
+ }
397
+ current = current.parentElement;
398
+ }
399
+ return false;
400
+ };
401
+ var Canvas = /* @__PURE__ */ (0, import_react.forwardRef)(({ children, classNames, scale: _scale = 1, offset: _offset = defaultOrigin, ...props }, forwardedRef) => {
402
+ const { ref, width = 0, height = 0 } = (0, import_react_resize_detector.useResizeDetector)();
403
+ const [ready, setReady] = (0, import_react.useState)(false);
404
+ const [{ scale, offset }, setProjection] = (0, import_react.useState)({
405
+ scale: _scale,
406
+ offset: _offset
407
+ });
408
+ (0, import_react.useEffect)(() => {
409
+ if (width && height && offset === defaultOrigin) {
410
+ setProjection({
411
+ scale,
412
+ offset: {
413
+ x: width / 2,
414
+ y: height / 2
415
+ }
416
+ });
417
+ }
418
+ }, [
419
+ width,
420
+ height,
421
+ scale,
422
+ offset
423
+ ]);
424
+ const projection = (0, import_react.useMemo)(() => new ProjectionMapper(), []);
425
+ (0, import_react.useEffect)(() => {
426
+ projection.update({
427
+ width,
428
+ height
429
+ }, scale, offset);
430
+ if (offset !== defaultOrigin) {
431
+ setReady(true);
432
+ }
433
+ }, [
434
+ projection,
435
+ scale,
436
+ offset,
437
+ width,
438
+ height
439
+ ]);
440
+ const styles = (0, import_react.useMemo)(() => {
441
+ return {
442
+ // NOTE: Order is important.
443
+ transform: `translate(${offset.x}px, ${offset.y}px) scale(${scale})`,
444
+ visibility: width && height ? "visible" : "hidden"
445
+ };
446
+ }, [
447
+ scale,
448
+ offset
449
+ ]);
450
+ (0, import_react.useImperativeHandle)(forwardedRef, () => {
451
+ return {
452
+ setProjection: async (projection2) => {
453
+ setProjection(projection2);
454
+ }
455
+ };
456
+ }, [
457
+ ref
458
+ ]);
459
+ return /* @__PURE__ */ import_react.default.createElement(CanvasContext.Provider, {
460
+ value: {
461
+ root: ref.current,
462
+ ready,
463
+ width,
464
+ height,
465
+ scale,
466
+ offset,
467
+ styles,
468
+ projection,
469
+ setProjection
470
+ }
471
+ }, /* @__PURE__ */ import_react.default.createElement("div", {
472
+ role: "none",
473
+ ...props,
474
+ className: (0, import_react_ui_theme.mx)("absolute inset-0 overflow-hidden", classNames),
475
+ ref
476
+ }, ready ? children : null));
477
+ });
478
+ var SEC = 1e3;
479
+ var FPS = ({ classNames, width = 60, height = 30, bar = "bg-cyan-500" }) => {
480
+ const [{ fps, max, len }, dispatch] = (0, import_react5.useReducer)((state) => {
481
+ const currentTime = Date.now();
482
+ if (currentTime > state.prevTime + SEC) {
483
+ const nextFPS = [
484
+ ...new Array(Math.floor((currentTime - state.prevTime - SEC) / SEC)).fill(0),
485
+ Math.max(1, Math.round(state.frames * SEC / (currentTime - state.prevTime)))
486
+ ];
487
+ return {
488
+ max: Math.max(state.max, ...nextFPS),
489
+ len: Math.min(state.len + nextFPS.length, width),
490
+ fps: [
491
+ ...state.fps,
492
+ ...nextFPS
493
+ ].slice(-width),
494
+ frames: 1,
495
+ prevTime: currentTime
496
+ };
497
+ } else {
498
+ return {
499
+ ...state,
500
+ frames: state.frames + 1
501
+ };
502
+ }
503
+ }, {
504
+ max: 0,
505
+ len: 0,
506
+ fps: [],
507
+ frames: 0,
508
+ prevTime: Date.now()
509
+ });
510
+ const requestRef = (0, import_react5.useRef)();
511
+ const tick = () => {
512
+ dispatch();
513
+ requestRef.current = requestAnimationFrame(tick);
514
+ };
515
+ (0, import_react5.useEffect)(() => {
516
+ requestRef.current = requestAnimationFrame(tick);
517
+ return () => {
518
+ if (requestRef.current) {
519
+ cancelAnimationFrame(requestRef.current);
520
+ }
521
+ };
522
+ }, []);
523
+ return /* @__PURE__ */ import_react5.default.createElement("div", {
524
+ style: {
525
+ width: width + 6
526
+ },
527
+ className: (0, import_react_ui_theme3.mx)("relative flex flex-col p-0.5", "bg-base text-xs text-subdued font-thin pointer-events-none border border-separator", classNames)
528
+ }, /* @__PURE__ */ import_react5.default.createElement("div", null, fps[len - 1], " FPS"), /* @__PURE__ */ import_react5.default.createElement("div", {
529
+ className: "w-full relative",
530
+ style: {
531
+ height
532
+ }
533
+ }, fps.map((frame, i) => /* @__PURE__ */ import_react5.default.createElement("div", {
534
+ key: `fps-${i}`,
535
+ className: bar,
536
+ style: {
537
+ position: "absolute",
538
+ bottom: 0,
539
+ right: `${len - 1 - i}px`,
540
+ height: `${height * frame / max}px`,
541
+ width: 1
542
+ }
543
+ }))));
544
+ };
545
+ var gridRatios = [
546
+ 1 / 4,
547
+ 1,
548
+ 4,
549
+ 16
550
+ ];
551
+ var defaultGridSize = 16;
552
+ var defaultOffset = {
553
+ x: 0,
554
+ y: 0
555
+ };
556
+ var createId = (parent, grid) => `dx-canvas-grid-${parent}-${grid}`;
557
+ var GridComponent = /* @__PURE__ */ (0, import_react6.forwardRef)(({ size: gridSize = defaultGridSize, scale = 1, offset = defaultOffset, showAxes = true, classNames }, forwardedRef) => {
558
+ const svgRef = (0, import_react_ui.useForwardedRef)(forwardedRef);
559
+ const instanceId = (0, import_react6.useId)();
560
+ const grids = (0, import_react6.useMemo)(() => gridRatios.map((ratio) => ({
561
+ id: ratio,
562
+ size: ratio * gridSize * scale
563
+ })).filter(({ size }) => size >= gridSize && size <= 256), [
564
+ gridSize,
565
+ scale
566
+ ]);
567
+ const { width = 0, height = 0 } = svgRef.current?.getBoundingClientRect() ?? {};
568
+ return /* @__PURE__ */ import_react6.default.createElement("svg", {
569
+ ...testId("dx-canvas-grid"),
570
+ ref: svgRef,
571
+ className: (0, import_react_ui_theme4.mx)("absolute inset-0 w-full h-full pointer-events-none touch-none select-none", "stroke-neutral-500", classNames)
572
+ }, /* @__PURE__ */ import_react6.default.createElement("defs", null, grids.map(({ id, size }) => /* @__PURE__ */ import_react6.default.createElement(GridPattern, {
573
+ key: id,
574
+ id: createId(instanceId, id),
575
+ offset,
576
+ size
577
+ }))), showAxes && /* @__PURE__ */ import_react6.default.createElement(import_react6.default.Fragment, null, /* @__PURE__ */ import_react6.default.createElement("line", {
578
+ x1: 0,
579
+ y1: offset.y,
580
+ x2: width,
581
+ y2: offset.y,
582
+ className: "stroke-neutral-500 opacity-40"
583
+ }), /* @__PURE__ */ import_react6.default.createElement("line", {
584
+ x1: offset.x,
585
+ y1: 0,
586
+ x2: offset.x,
587
+ y2: height,
588
+ className: "stroke-neutral-500 opacity-40"
589
+ })), /* @__PURE__ */ import_react6.default.createElement("g", null, grids.map(({ id }, i) => /* @__PURE__ */ import_react6.default.createElement("rect", {
590
+ key: id,
591
+ opacity: 0.1 + i * 0.05,
592
+ fill: `url(#${createId(instanceId, id)})`,
593
+ width: "100%",
594
+ height: "100%"
595
+ }))));
596
+ });
597
+ var Grid = (props) => {
598
+ const { scale, offset } = useCanvasContext();
599
+ return /* @__PURE__ */ import_react6.default.createElement(GridComponent, {
600
+ ...props,
601
+ scale,
602
+ offset
603
+ });
604
+ };
605
+ var Point = import_effect.S.Struct({
606
+ x: import_effect.S.Number,
607
+ y: import_effect.S.Number
608
+ });
609
+ var Dimension = import_effect.S.Struct({
610
+ width: import_effect.S.Number,
611
+ height: import_effect.S.Number
612
+ });
613
+ var Rect = import_effect.S.extend(Point, Dimension);
614
+ // Annotate the CommonJS export names for ESM import in node:
615
+ 0 && (module.exports = {
616
+ Arrow,
617
+ Canvas,
618
+ CanvasContext,
619
+ DATA_TEST_ID,
620
+ Dimension,
621
+ FPS,
622
+ Grid,
623
+ GridComponent,
624
+ GridPattern,
625
+ Marker,
626
+ Markers,
627
+ Point,
628
+ ProjectionMapper,
629
+ Rect,
630
+ createPath,
631
+ defaultOrigin,
632
+ getRelativePoint,
633
+ getZoomTransform,
634
+ inspectElement,
635
+ testId,
636
+ useCanvasContext,
637
+ useWheel,
638
+ zoomInPlace,
639
+ zoomTo
640
+ });
641
+ //# sourceMappingURL=index.cjs.map