@kgdiff/renderer 0.0.0-stage → 0.2.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 (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +53 -2
  3. package/dist/atlas.d.ts +55 -0
  4. package/dist/atlas.d.ts.map +1 -0
  5. package/dist/atlas.js +132 -0
  6. package/dist/atlas.js.map +1 -0
  7. package/dist/camera.d.ts +116 -0
  8. package/dist/camera.d.ts.map +1 -0
  9. package/dist/camera.js +368 -0
  10. package/dist/camera.js.map +1 -0
  11. package/dist/color.d.ts +12 -0
  12. package/dist/color.d.ts.map +1 -0
  13. package/dist/color.js +51 -0
  14. package/dist/color.js.map +1 -0
  15. package/dist/ctx.d.ts +57 -0
  16. package/dist/ctx.d.ts.map +1 -0
  17. package/dist/ctx.js +28 -0
  18. package/dist/ctx.js.map +1 -0
  19. package/dist/draw/background.d.ts +33 -0
  20. package/dist/draw/background.d.ts.map +1 -0
  21. package/dist/draw/background.js +105 -0
  22. package/dist/draw/background.js.map +1 -0
  23. package/dist/draw/badges.d.ts +26 -0
  24. package/dist/draw/badges.d.ts.map +1 -0
  25. package/dist/draw/badges.js +82 -0
  26. package/dist/draw/badges.js.map +1 -0
  27. package/dist/draw/collapsed.d.ts +15 -0
  28. package/dist/draw/collapsed.d.ts.map +1 -0
  29. package/dist/draw/collapsed.js +67 -0
  30. package/dist/draw/collapsed.js.map +1 -0
  31. package/dist/draw/edges.d.ts +14 -0
  32. package/dist/draw/edges.d.ts.map +1 -0
  33. package/dist/draw/edges.js +115 -0
  34. package/dist/draw/edges.js.map +1 -0
  35. package/dist/draw/glyphs.d.ts +31 -0
  36. package/dist/draw/glyphs.d.ts.map +1 -0
  37. package/dist/draw/glyphs.js +114 -0
  38. package/dist/draw/glyphs.js.map +1 -0
  39. package/dist/draw/halos.d.ts +19 -0
  40. package/dist/draw/halos.d.ts.map +1 -0
  41. package/dist/draw/halos.js +91 -0
  42. package/dist/draw/halos.js.map +1 -0
  43. package/dist/draw/labels.d.ts +55 -0
  44. package/dist/draw/labels.d.ts.map +1 -0
  45. package/dist/draw/labels.js +300 -0
  46. package/dist/draw/labels.js.map +1 -0
  47. package/dist/draw/link.d.ts +25 -0
  48. package/dist/draw/link.d.ts.map +1 -0
  49. package/dist/draw/link.js +122 -0
  50. package/dist/draw/link.js.map +1 -0
  51. package/dist/draw/nodes.d.ts +13 -0
  52. package/dist/draw/nodes.d.ts.map +1 -0
  53. package/dist/draw/nodes.js +165 -0
  54. package/dist/draw/nodes.js.map +1 -0
  55. package/dist/draw/shapes.d.ts +7 -0
  56. package/dist/draw/shapes.d.ts.map +1 -0
  57. package/dist/draw/shapes.js +26 -0
  58. package/dist/draw/shapes.js.map +1 -0
  59. package/dist/draw/view.d.ts +36 -0
  60. package/dist/draw/view.d.ts.map +1 -0
  61. package/dist/draw/view.js +16 -0
  62. package/dist/draw/view.js.map +1 -0
  63. package/dist/frame-cache.d.ts +103 -0
  64. package/dist/frame-cache.d.ts.map +1 -0
  65. package/dist/frame-cache.js +349 -0
  66. package/dist/frame-cache.js.map +1 -0
  67. package/dist/index.d.ts +162 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +19 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/input.d.ts +81 -0
  72. package/dist/input.d.ts.map +1 -0
  73. package/dist/input.js +329 -0
  74. package/dist/input.js.map +1 -0
  75. package/dist/labels.d.ts +103 -0
  76. package/dist/labels.d.ts.map +1 -0
  77. package/dist/labels.js +203 -0
  78. package/dist/labels.js.map +1 -0
  79. package/dist/math.d.ts +33 -0
  80. package/dist/math.d.ts.map +1 -0
  81. package/dist/math.js +138 -0
  82. package/dist/math.js.map +1 -0
  83. package/dist/minimap.d.ts +56 -0
  84. package/dist/minimap.d.ts.map +1 -0
  85. package/dist/minimap.js +501 -0
  86. package/dist/minimap.js.map +1 -0
  87. package/dist/paint-stats.d.ts +17 -0
  88. package/dist/paint-stats.d.ts.map +1 -0
  89. package/dist/paint-stats.js +23 -0
  90. package/dist/paint-stats.js.map +1 -0
  91. package/dist/paint.d.ts +64 -0
  92. package/dist/paint.d.ts.map +1 -0
  93. package/dist/paint.js +197 -0
  94. package/dist/paint.js.map +1 -0
  95. package/dist/pick.d.ts +26 -0
  96. package/dist/pick.d.ts.map +1 -0
  97. package/dist/pick.js +125 -0
  98. package/dist/pick.js.map +1 -0
  99. package/dist/renderer.d.ts +28 -0
  100. package/dist/renderer.d.ts.map +1 -0
  101. package/dist/renderer.js +470 -0
  102. package/dist/renderer.js.map +1 -0
  103. package/dist/smooth-zoom.d.ts +21 -0
  104. package/dist/smooth-zoom.d.ts.map +1 -0
  105. package/dist/smooth-zoom.js +52 -0
  106. package/dist/smooth-zoom.js.map +1 -0
  107. package/dist/spatial.d.ts +26 -0
  108. package/dist/spatial.d.ts.map +1 -0
  109. package/dist/spatial.js +103 -0
  110. package/dist/spatial.js.map +1 -0
  111. package/dist/text.d.ts +36 -0
  112. package/dist/text.d.ts.map +1 -0
  113. package/dist/text.js +123 -0
  114. package/dist/text.js.map +1 -0
  115. package/package.json +47 -3
  116. package/src/atlas.ts +171 -0
  117. package/src/camera.ts +482 -0
  118. package/src/color.ts +58 -0
  119. package/src/ctx.ts +102 -0
  120. package/src/draw/background.ts +139 -0
  121. package/src/draw/badges.ts +93 -0
  122. package/src/draw/collapsed.ts +86 -0
  123. package/src/draw/edges.ts +135 -0
  124. package/src/draw/glyphs.ts +168 -0
  125. package/src/draw/halos.ts +101 -0
  126. package/src/draw/labels.ts +399 -0
  127. package/src/draw/link.ts +157 -0
  128. package/src/draw/nodes.ts +184 -0
  129. package/src/draw/shapes.ts +36 -0
  130. package/src/draw/view.ts +37 -0
  131. package/src/frame-cache.ts +382 -0
  132. package/src/index.ts +161 -0
  133. package/src/input.ts +370 -0
  134. package/src/labels.ts +269 -0
  135. package/src/math.ts +185 -0
  136. package/src/minimap.ts +545 -0
  137. package/src/paint-stats.ts +38 -0
  138. package/src/paint.ts +235 -0
  139. package/src/pick.ts +173 -0
  140. package/src/renderer.ts +539 -0
  141. package/src/smooth-zoom.ts +65 -0
  142. package/src/spatial.ts +94 -0
  143. package/src/text.ts +130 -0
package/dist/math.d.ts ADDED
@@ -0,0 +1,33 @@
1
+ /** Small numeric helpers shared by the camera, drawing, culling and picking. */
2
+ export declare const TAU: number;
3
+ /** `value` limited to [lo, hi] (NaN stays NaN). */
4
+ export declare function clamp(value: number, lo: number, hi: number): number;
5
+ export declare function lerp(a: number, b: number, t: number): number;
6
+ /** Hermite smoothstep of `x` between `edge0` and `edge1`. */
7
+ export declare function smoothstep(edge0: number, edge1: number, x: number): number;
8
+ export declare function easeInOutCubic(t: number): number;
9
+ /** Round a CSS-pixel coordinate to the device-pixel grid (crisp text and hairlines). */
10
+ export declare function snap(value: number, dpr: number): number;
11
+ /**
12
+ * Offset (css px) that puts a stroke of `width` css px on whole device pixels:
13
+ * odd device widths are centred on pixel centres, even ones on pixel edges.
14
+ */
15
+ export declare function crispOffset(width: number, dpr: number): number;
16
+ /** One coordinate of B(t) for a quadratic with endpoints `p0`, `p2` and control `c`. */
17
+ export declare function quadAt(p0: number, c: number, p2: number, t: number): number;
18
+ /** One coordinate of B′(t). */
19
+ export declare function quadSlope(p0: number, c: number, p2: number, t: number): number;
20
+ /**
21
+ * Parameter where the curve is `dist` away from its start (`fromEnd` false) or end
22
+ * (`fromEnd` true). Bisection, valid for the gentle curvatures used for parallel edges.
23
+ */
24
+ export declare function quadTrim(x0: number, y0: number, cx: number, cy: number, x2: number, y2: number, dist: number, fromEnd: boolean): number;
25
+ /** Squared distance from (px, py) to the segment a–b. */
26
+ export declare function distToSegmentSq(px: number, py: number, ax: number, ay: number, bx: number, by: number): number;
27
+ /** Squared distance from (px, py) to a quadratic curve, by flattening into `steps` segments. */
28
+ export declare function distToQuadSq(px: number, py: number, x0: number, y0: number, cx: number, cy: number, x2: number, y2: number, steps?: number): number;
29
+ /** Whether segment a–b touches the axis-aligned rectangle (Liang–Barsky). */
30
+ export declare function segmentHitsRect(ax: number, ay: number, bx: number, by: number, x0: number, y0: number, x1: number, y1: number): boolean;
31
+ /** Whether two rectangles given as x, y, w, h overlap (touching edges do not count). */
32
+ export declare function rectsOverlap(ax: number, ay: number, aw: number, ah: number, bx: number, by: number, bw: number, bh: number): boolean;
33
+ //# sourceMappingURL=math.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../src/math.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAEhF,eAAO,MAAM,GAAG,QAAc,CAAC;AAE/B,mDAAmD;AACnD,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,6DAA6D;AAC7D,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAG1E;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wFAAwF;AACxF,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9D;AAQD,wFAAwF;AACxF,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAG3E;AAED,+BAA+B;AAC/B,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,GACf,MAAM,CAkBR;AAED,yDAAyD;AACzD,wBAAgB,eAAe,CAC7B,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,MAAM,CASR;AAED,gGAAgG;AAChG,wBAAgB,YAAY,CAC1B,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,KAAK,SAAK,GACT,MAAM,CAcR;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,CAC7B,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,OAAO,CA4BT;AAED,wFAAwF;AACxF,wBAAgB,YAAY,CAC1B,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,OAAO,CAET"}
package/dist/math.js ADDED
@@ -0,0 +1,138 @@
1
+ /** Small numeric helpers shared by the camera, drawing, culling and picking. */
2
+ export const TAU = Math.PI * 2;
3
+ /** `value` limited to [lo, hi] (NaN stays NaN). */
4
+ export function clamp(value, lo, hi) {
5
+ return Math.min(Math.max(value, lo), hi);
6
+ }
7
+ export function lerp(a, b, t) {
8
+ return a + (b - a) * t;
9
+ }
10
+ /** Hermite smoothstep of `x` between `edge0` and `edge1`. */
11
+ export function smoothstep(edge0, edge1, x) {
12
+ const t = clamp((x - edge0) / (edge1 - edge0), 0, 1);
13
+ return t * t * (3 - 2 * t);
14
+ }
15
+ export function easeInOutCubic(t) {
16
+ return t < 0.5 ? 4 * t * t * t : 1 - (-2 * t + 2) ** 3 / 2;
17
+ }
18
+ /** Round a CSS-pixel coordinate to the device-pixel grid (crisp text and hairlines). */
19
+ export function snap(value, dpr) {
20
+ return Math.round(value * dpr) / dpr;
21
+ }
22
+ /**
23
+ * Offset (css px) that puts a stroke of `width` css px on whole device pixels:
24
+ * odd device widths are centred on pixel centres, even ones on pixel edges.
25
+ */
26
+ export function crispOffset(width, dpr) {
27
+ return Math.round(width * dpr) % 2 === 1 ? 0.5 / dpr : 0;
28
+ }
29
+ // ─── Quadratic Bézier edges ─────────────────────────────────────────────────
30
+ //
31
+ // Curvature convention (edges and glyphs): the control point is the chord midpoint
32
+ // moved along the left normal (−dy, dx) by `curvature · chord length`. The curve's
33
+ // apex therefore sits `curvature / 2 · length` off the chord; the sign picks the side.
34
+ /** One coordinate of B(t) for a quadratic with endpoints `p0`, `p2` and control `c`. */
35
+ export function quadAt(p0, c, p2, t) {
36
+ const u = 1 - t;
37
+ return u * u * p0 + 2 * u * t * c + t * t * p2;
38
+ }
39
+ /** One coordinate of B′(t). */
40
+ export function quadSlope(p0, c, p2, t) {
41
+ return 2 * (1 - t) * (c - p0) + 2 * t * (p2 - c);
42
+ }
43
+ /**
44
+ * Parameter where the curve is `dist` away from its start (`fromEnd` false) or end
45
+ * (`fromEnd` true). Bisection, valid for the gentle curvatures used for parallel edges.
46
+ */
47
+ export function quadTrim(x0, y0, cx, cy, x2, y2, dist, fromEnd) {
48
+ if (dist <= 0)
49
+ return fromEnd ? 1 : 0;
50
+ const ox = fromEnd ? x2 : x0;
51
+ const oy = fromEnd ? y2 : y0;
52
+ const d2 = dist * dist;
53
+ let lo = fromEnd ? 1 : 0;
54
+ let hi = 0.5;
55
+ const mx = quadAt(x0, cx, x2, 0.5) - ox;
56
+ const my = quadAt(y0, cy, y2, 0.5) - oy;
57
+ if (mx * mx + my * my <= d2)
58
+ return 0.5;
59
+ for (let i = 0; i < 12; i++) {
60
+ const mid = (lo + hi) / 2;
61
+ const px = quadAt(x0, cx, x2, mid) - ox;
62
+ const py = quadAt(y0, cy, y2, mid) - oy;
63
+ if (px * px + py * py < d2)
64
+ lo = mid;
65
+ else
66
+ hi = mid;
67
+ }
68
+ return (lo + hi) / 2;
69
+ }
70
+ /** Squared distance from (px, py) to the segment a–b. */
71
+ export function distToSegmentSq(px, py, ax, ay, bx, by) {
72
+ const dx = bx - ax;
73
+ const dy = by - ay;
74
+ const len2 = dx * dx + dy * dy;
75
+ let t = len2 > 0 ? ((px - ax) * dx + (py - ay) * dy) / len2 : 0;
76
+ t = clamp(t, 0, 1);
77
+ const ex = ax + t * dx - px;
78
+ const ey = ay + t * dy - py;
79
+ return ex * ex + ey * ey;
80
+ }
81
+ /** Squared distance from (px, py) to a quadratic curve, by flattening into `steps` segments. */
82
+ export function distToQuadSq(px, py, x0, y0, cx, cy, x2, y2, steps = 16) {
83
+ let best = Number.POSITIVE_INFINITY;
84
+ let ax = x0;
85
+ let ay = y0;
86
+ for (let i = 1; i <= steps; i++) {
87
+ const t = i / steps;
88
+ const bx = quadAt(x0, cx, x2, t);
89
+ const by = quadAt(y0, cy, y2, t);
90
+ const d = distToSegmentSq(px, py, ax, ay, bx, by);
91
+ if (d < best)
92
+ best = d;
93
+ ax = bx;
94
+ ay = by;
95
+ }
96
+ return best;
97
+ }
98
+ /** Whether segment a–b touches the axis-aligned rectangle (Liang–Barsky). */
99
+ export function segmentHitsRect(ax, ay, bx, by, x0, y0, x1, y1) {
100
+ if (ax >= x0 && ax <= x1 && ay >= y0 && ay <= y1)
101
+ return true;
102
+ if (bx >= x0 && bx <= x1 && by >= y0 && by <= y1)
103
+ return true;
104
+ if ((ax < x0 && bx < x0) ||
105
+ (ax > x1 && bx > x1) ||
106
+ (ay < y0 && by < y0) ||
107
+ (ay > y1 && by > y1)) {
108
+ return false;
109
+ }
110
+ const dx = bx - ax;
111
+ const dy = by - ay;
112
+ let t0 = 0;
113
+ let t1 = 1;
114
+ const clip = (p, q) => {
115
+ if (p === 0)
116
+ return q >= 0;
117
+ const r = q / p;
118
+ if (p < 0) {
119
+ if (r > t1)
120
+ return false;
121
+ if (r > t0)
122
+ t0 = r;
123
+ }
124
+ else {
125
+ if (r < t0)
126
+ return false;
127
+ if (r < t1)
128
+ t1 = r;
129
+ }
130
+ return true;
131
+ };
132
+ return clip(-dx, ax - x0) && clip(dx, x1 - ax) && clip(-dy, ay - y0) && clip(dy, y1 - ay);
133
+ }
134
+ /** Whether two rectangles given as x, y, w, h overlap (touching edges do not count). */
135
+ export function rectsOverlap(ax, ay, aw, ah, bx, by, bw, bh) {
136
+ return ax < bx + bw && bx < ax + aw && ay < by + bh && by < ay + ah;
137
+ }
138
+ //# sourceMappingURL=math.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.js","sourceRoot":"","sources":["../src/math.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Minimap (docs/visual-language.md §Minimap): a 184 × 128 floating card with the graph's edges
3
+ * as faint hairlines (below 3k edges), neutral nodes as small dots, changed nodes as outlined
4
+ * dots in their family color, and the viewport as an accent rectangle. Click or drag to navigate.
5
+ *
6
+ * The world window is centred on the content and grows just enough to contain the viewport, so
7
+ * the rectangle is always fully visible while the content stays centred and as large as possible.
8
+ * The window shrinks at once when the viewport needs room and grows back eased, with hysteresis,
9
+ * so panning never makes it jitter. Marks are rasterized into an offscreen layer whenever the
10
+ * window or the frame changes; camera moves otherwise only blit that layer and the rectangle.
11
+ */
12
+ import type { Rect } from '@kgdiff/core';
13
+ import type { NodeVisual, Theme } from '@kgdiff/scene';
14
+ import { type Ctx2D, type SurfaceFactory } from './ctx.js';
15
+ import type { Minimap, MinimapOptions, Renderer } from './index.js';
16
+ export interface MinimapDeps {
17
+ readonly context?: Ctx2D | null;
18
+ readonly surfaceFactory?: SurfaceFactory;
19
+ }
20
+ /** The family color of a change mark, or null for neutral context (by `NodeVisual.family`). */
21
+ export declare function markColor(n: NodeVisual, theme: Theme): string | null;
22
+ /**
23
+ * The minimap's world window: centred on the content, covering the content and the viewport.
24
+ * Extending symmetrically keeps the content centred; the viewport always fits inside.
25
+ */
26
+ export declare function minimapWindow(content: Rect, viewport: Rect | null): Rect;
27
+ /**
28
+ * Minimap zoom (px per world unit) with asymmetric smoothing: shrinks at once (the viewport
29
+ * must stay visible), grows back eased and only once it has `GROW_SLACK` room (no jitter).
30
+ */
31
+ export declare class WindowScale {
32
+ value: number;
33
+ target: number;
34
+ growing: boolean;
35
+ /** Set the scale the window needs now; returns whether `value` changed. */
36
+ retarget(target: number): boolean;
37
+ /** Advance the eased growth by `dt` ms; returns whether it is still growing. */
38
+ step(dt: number): boolean;
39
+ }
40
+ /** Uniform scale + offset that fits `bounds` into a w × h box with padding, centred. */
41
+ export declare function fitTransform(bounds: Rect, w: number, h: number, pad: number): {
42
+ s: number;
43
+ ox: number;
44
+ oy: number;
45
+ };
46
+ /** The minimap plus internals tests and the dev harness inspect. */
47
+ export interface MinimapImpl extends Minimap {
48
+ /** Current world → minimap transform (css px), or null without content. */
49
+ transform(): {
50
+ readonly s: number;
51
+ readonly ox: number;
52
+ readonly oy: number;
53
+ } | null;
54
+ }
55
+ export declare function createMinimapImpl(container: HTMLElement, renderer: Renderer, options?: MinimapOptions, deps?: MinimapDeps): MinimapImpl;
56
+ //# sourceMappingURL=minimap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minimap.d.ts","sourceRoot":"","sources":["../src/minimap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,KAAK,EAAgC,UAAU,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACrF,OAAO,EAAE,KAAK,KAAK,EAAmC,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAE5F,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAqBpE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;CAC1C;AAED,+FAA+F;AAC/F,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAIpE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAexE;AAED;;;GAGG;AACH,qBAAa,WAAW;IACtB,KAAK,SAAK;IACV,MAAM,SAAK;IACX,OAAO,UAAS;IAEhB,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAWhC;IAED,gFAAgF;IAChF,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAQxB;CACF;AAED,wFAAwF;AACxF,wBAAgB,YAAY,CAC1B,MAAM,EAAE,IAAI,EACZ,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,GAAG,EAAE,MAAM,GACV;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAOvC;AAED,oEAAoE;AACpE,MAAM,WAAW,WAAY,SAAQ,OAAO;IAC1C,2EAA2E;IAC3E,SAAS,IAAI;QAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACtF;AA6ZD,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,WAAW,EACtB,QAAQ,EAAE,QAAQ,EAClB,OAAO,GAAE,cAAmB,EAC5B,IAAI,GAAE,WAAgB,GACrB,WAAW,CAEb"}