@genome-spy/core 0.59.0 → 0.60.1

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 (85) hide show
  1. package/dist/bundle/index.es.js +6100 -5545
  2. package/dist/bundle/index.js +144 -119
  3. package/dist/schema.json +304 -22
  4. package/dist/src/data/collector.d.ts.map +1 -1
  5. package/dist/src/data/collector.js +1 -0
  6. package/dist/src/data/sources/dataUtils.d.ts +2 -1
  7. package/dist/src/data/sources/dataUtils.d.ts.map +1 -1
  8. package/dist/src/data/sources/dataUtils.js +3 -4
  9. package/dist/src/data/sources/inlineSource.d.ts +8 -0
  10. package/dist/src/data/sources/inlineSource.d.ts.map +1 -1
  11. package/dist/src/data/sources/inlineSource.js +17 -1
  12. package/dist/src/data/sources/urlSource.d.ts +1 -0
  13. package/dist/src/data/sources/urlSource.d.ts.map +1 -1
  14. package/dist/src/data/sources/urlSource.js +33 -4
  15. package/dist/src/encoder/encoder.d.ts +1 -1
  16. package/dist/src/genomeSpy.d.ts.map +1 -1
  17. package/dist/src/genomeSpy.js +39 -6
  18. package/dist/src/gl/colorUtils.d.ts +4 -0
  19. package/dist/src/gl/colorUtils.d.ts.map +1 -1
  20. package/dist/src/gl/colorUtils.js +8 -0
  21. package/dist/src/gl/glslScaleGenerator.d.ts +1 -1
  22. package/dist/src/gl/glslScaleGenerator.d.ts.map +1 -1
  23. package/dist/src/gl/glslScaleGenerator.js +1 -9
  24. package/dist/src/gl/includes/common.glsl.js +1 -1
  25. package/dist/src/marks/link.d.ts.map +1 -1
  26. package/dist/src/marks/link.js +8 -0
  27. package/dist/src/marks/mark.d.ts +8 -0
  28. package/dist/src/marks/mark.d.ts.map +1 -1
  29. package/dist/src/marks/mark.js +101 -3
  30. package/dist/src/marks/point.fragment.glsl.js +1 -1
  31. package/dist/src/marks/point.vertex.glsl.js +1 -1
  32. package/dist/src/marks/rect.common.glsl.js +1 -1
  33. package/dist/src/marks/rect.d.ts.map +1 -1
  34. package/dist/src/marks/rect.fragment.glsl.js +1 -1
  35. package/dist/src/marks/rect.js +41 -0
  36. package/dist/src/marks/rect.vertex.glsl.js +1 -1
  37. package/dist/src/selection/selection.d.ts +27 -2
  38. package/dist/src/selection/selection.d.ts.map +1 -1
  39. package/dist/src/selection/selection.js +53 -3
  40. package/dist/src/spec/data.d.ts +18 -1
  41. package/dist/src/spec/mark.d.ts +58 -1
  42. package/dist/src/spec/parameter.d.ts +71 -31
  43. package/dist/src/spec/view.d.ts +9 -2
  44. package/dist/src/styles/genome-spy.css.d.ts +1 -1
  45. package/dist/src/styles/genome-spy.css.d.ts.map +1 -1
  46. package/dist/src/styles/genome-spy.css.js +12 -1
  47. package/dist/src/styles/genome-spy.scss +19 -1
  48. package/dist/src/types/selectionTypes.d.ts +4 -7
  49. package/dist/src/utils/expression.d.ts.map +1 -1
  50. package/dist/src/utils/expression.js +4 -0
  51. package/dist/src/utils/ui/tooltip.d.ts +6 -10
  52. package/dist/src/utils/ui/tooltip.d.ts.map +1 -1
  53. package/dist/src/utils/ui/tooltip.js +74 -42
  54. package/dist/src/view/concatView.d.ts +1 -1
  55. package/dist/src/view/concatView.d.ts.map +1 -1
  56. package/dist/src/view/concatView.js +1 -1
  57. package/dist/src/view/gridView/gridChild.d.ts +53 -0
  58. package/dist/src/view/gridView/gridChild.d.ts.map +1 -0
  59. package/dist/src/view/gridView/gridChild.js +758 -0
  60. package/dist/src/view/gridView/gridView.d.ts +64 -0
  61. package/dist/src/view/gridView/gridView.d.ts.map +1 -0
  62. package/dist/src/view/{gridView.js → gridView/gridView.js} +40 -595
  63. package/dist/src/view/gridView/scrollbar.d.ts +32 -0
  64. package/dist/src/view/gridView/scrollbar.d.ts.map +1 -0
  65. package/dist/src/view/gridView/scrollbar.js +186 -0
  66. package/dist/src/view/gridView/selectionRect.d.ts +10 -0
  67. package/dist/src/view/gridView/selectionRect.d.ts.map +1 -0
  68. package/dist/src/view/gridView/selectionRect.js +182 -0
  69. package/dist/src/view/layout/rectangle.d.ts +11 -1
  70. package/dist/src/view/layout/rectangle.d.ts.map +1 -1
  71. package/dist/src/view/layout/rectangle.js +22 -2
  72. package/dist/src/view/layout/rectangle.test.js +12 -0
  73. package/dist/src/view/paramMediator.d.ts.map +1 -1
  74. package/dist/src/view/paramMediator.js +9 -0
  75. package/dist/src/view/scaleResolution.d.ts +1 -0
  76. package/dist/src/view/scaleResolution.d.ts.map +1 -1
  77. package/dist/src/view/scaleResolution.js +43 -33
  78. package/dist/src/view/view.d.ts +6 -0
  79. package/dist/src/view/view.d.ts.map +1 -1
  80. package/dist/src/view/view.js +19 -0
  81. package/dist/src/view/viewFactory.d.ts.map +1 -1
  82. package/dist/src/view/viewFactory.js +13 -1
  83. package/package.json +2 -2
  84. package/dist/src/view/gridView.d.ts +0 -135
  85. package/dist/src/view/gridView.d.ts.map +0 -1
@@ -85,9 +85,6 @@ export default class ScaleResolution {
85
85
  * @typedef {VegaScale & { props: import("../spec/scale.js").Scale }} ScaleWithProps
86
86
  */
87
87
 
88
- /** @type {number[]} */
89
- #zoomExtent;
90
-
91
88
  /**
92
89
  * @type {Record<ScaleResolutionEventType, Set<ScaleResolutionListener>>}
93
90
  */
@@ -99,6 +96,12 @@ export default class ScaleResolution {
99
96
  /** @type {ScaleWithProps} */
100
97
  #scale;
101
98
 
99
+ /**
100
+ * The initial domain before any zooming.
101
+ * @type {any[]}
102
+ */
103
+ #initialDomain;
104
+
102
105
  /**
103
106
  * Keeps track of the expression references in the range. If range is modified,
104
107
  * new expressions are created and the old ones must be invalidated.
@@ -129,6 +132,14 @@ export default class ScaleResolution {
129
132
  return this.#firstMemberView.context;
130
133
  }
131
134
 
135
+ get zoomExtent() {
136
+ return (
137
+ (this.#scale &&
138
+ isContinuous(this.#scale.type) &&
139
+ this.#getZoomExtent()) ?? [-Infinity, Infinity]
140
+ );
141
+ }
142
+
132
143
  /**
133
144
  * Adds a listener that is called when the scale domain is changed,
134
145
  * e.g., zoomed. The call is synchronous and happens before the views
@@ -170,11 +181,17 @@ export default class ScaleResolution {
170
181
  addMember(newMember) {
171
182
  const { channel, channelDef } = newMember;
172
183
 
184
+ // A convenience hack for cases where the new member should adapt
185
+ // the scale type to the existing one. For example: SelectionRect
186
+ // TODO: Add test
187
+ const adapt = channelDef.type == null && this.type;
188
+
173
189
  if (
174
190
  // @ts-expect-error "sample" is not really a channel with scale
175
191
  channel != "sample" &&
176
192
  !channelDef.type &&
177
- !isSecondaryChannel(channel)
193
+ !isSecondaryChannel(channel) &&
194
+ !adapt
178
195
  ) {
179
196
  throw new Error(
180
197
  `The "type" property must be defined in channel definition: "${channel}": ${JSON.stringify(
@@ -198,15 +215,17 @@ export default class ScaleResolution {
198
215
  this.name = name;
199
216
  }
200
217
 
201
- if (!this.type) {
202
- this.type = type;
203
- } else if (type !== this.type && !isSecondaryChannel(channel)) {
204
- // TODO: Include a reference to the layer
205
- throw new Error(
206
- `Can not use shared scale for different data types: ${this.type} vs. ${type}. Use "resolve: independent" for channel ${this.channel}`
207
- );
208
- // Actually, point scale could be changed into band scale
209
- // TODO: Use the same merging logic as in: https://github.com/vega/vega-lite/blob/master/src/scale.ts
218
+ if (!adapt) {
219
+ if (!this.type) {
220
+ this.type = type;
221
+ } else if (type !== this.type && !isSecondaryChannel(channel)) {
222
+ // TODO: Include a reference to the layer
223
+ throw new Error(
224
+ `Can not use shared scale for different data types: ${this.type} vs. ${type}. Use "resolve: independent" for channel ${this.channel}`
225
+ );
226
+ // Actually, point scale could be changed into band scale
227
+ // TODO: Use the same merging logic as in: https://github.com/vega/vega-lite/blob/master/src/scale.ts
228
+ }
210
229
  }
211
230
 
212
231
  this.members.push(newMember);
@@ -450,11 +469,8 @@ export default class ScaleResolution {
450
469
  scale.props = props;
451
470
  this.#configureRange();
452
471
 
453
- if (isContinuous(scale.type)) {
454
- this.#zoomExtent = this.#getZoomExtent();
455
- }
456
-
457
472
  if (!domainWasInitialized) {
473
+ this.#initialDomain = scale.domain();
458
474
  this.#notifyListeners("domain");
459
475
  return;
460
476
  }
@@ -502,10 +518,6 @@ export default class ScaleResolution {
502
518
  scale.genome(this.getGenome());
503
519
  }
504
520
 
505
- if (isContinuous(scale.type)) {
506
- this.#zoomExtent = this.#getZoomExtent();
507
- }
508
-
509
521
  // Hijack the range method
510
522
  const range = scale.range;
511
523
  if (range) {
@@ -630,13 +642,8 @@ export default class ScaleResolution {
630
642
  }
631
643
 
632
644
  // TODO: Use the zoomTo method. Move clamping etc there.
633
- if (this.#zoomExtent) {
634
- newDomain = clampRange(
635
- newDomain,
636
- this.#zoomExtent[0],
637
- this.#zoomExtent[1]
638
- );
639
- }
645
+ const zoomExtent = this.zoomExtent;
646
+ newDomain = clampRange(newDomain, zoomExtent[0], zoomExtent[1]);
640
647
 
641
648
  if ([0, 1].some((i) => newDomain[i] != oldDomain[i])) {
642
649
  scale.domain(newDomain);
@@ -741,7 +748,7 @@ export default class ScaleResolution {
741
748
  getZoomLevel() {
742
749
  // Zoom level makes sense only for user-zoomable scales where zoom extent is defined
743
750
  if (this.isZoomable()) {
744
- return span(this.#zoomExtent) / span(this.scale.domain());
751
+ return span(this.zoomExtent) / span(this.scale.domain());
745
752
  }
746
753
 
747
754
  return 1.0;
@@ -777,6 +784,9 @@ export default class ScaleResolution {
777
784
  : 0;
778
785
  }
779
786
 
787
+ /**
788
+ * @returns {number[]}
789
+ */
780
790
  #getZoomExtent() {
781
791
  const props = this.scale.props;
782
792
  const zoom = props.zoom;
@@ -791,11 +801,11 @@ export default class ScaleResolution {
791
801
  if (props.type == "locus") {
792
802
  return this.getGenome().getExtent();
793
803
  }
794
-
795
- // TODO: Perhaps this should be "domain" for index scale and nothing for quantitative.
796
- // Would behave similarly to Vega-Lite, which doesn't have constraints.
797
- return this.#scale.domain();
798
804
  }
805
+
806
+ // TODO: Perhaps this should be "domain" for index scale and nothing for quantitative.
807
+ // Would behave similarly to Vega-Lite, which doesn't have constraints.
808
+ return this.#initialDomain;
799
809
  }
800
810
 
801
811
  /**
@@ -194,6 +194,12 @@ export default class View {
194
194
  * @param {boolean} [useCapture]
195
195
  */
196
196
  addInteractionEventListener(type: string, listener: InteractionEventListener, useCapture?: boolean): void;
197
+ /**
198
+ * @param {string} type
199
+ * @param {InteractionEventListener} listener
200
+ * @param {boolean} [useCapture]
201
+ */
202
+ removeInteractionEventListener(type: string, listener: InteractionEventListener, useCapture?: boolean): void;
197
203
  /**
198
204
  * Visits child views in depth-first order. Visitor's return value
199
205
  * controls the traversal.
@@ -1 +1 @@
1
- {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/view/view.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/view/view.js"],"names":[],"mappings":"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"}
@@ -150,6 +150,7 @@ export default class View {
150
150
 
151
151
  if (spec.params) {
152
152
  for (const param of spec.params) {
153
+ // TODO: If interval selection, validate `encodings` or provides defaults
153
154
  this.paramMediator.registerParam(param);
154
155
  }
155
156
  }
@@ -451,6 +452,24 @@ export default class View {
451
452
  listeners.push(listener);
452
453
  }
453
454
 
455
+ /**
456
+ * @param {string} type
457
+ * @param {InteractionEventListener} listener
458
+ * @param {boolean} [useCapture]
459
+ */
460
+ removeInteractionEventListener(type, listener, useCapture) {
461
+ const listenersByType = useCapture
462
+ ? this.#capturingInteractionEventListeners
463
+ : this.#nonCapturingInteractionEventListeners;
464
+ let listeners = listenersByType?.[type];
465
+ if (listeners) {
466
+ const index = listeners.indexOf(listener);
467
+ if (index >= 0) {
468
+ listeners.splice(index, 1);
469
+ }
470
+ }
471
+ }
472
+
454
473
  /**
455
474
  * Visits child views in depth-first order. Visitor's return value
456
475
  * controls the traversal.
@@ -1 +1 @@
1
- {"version":3,"file":"viewFactory.d.ts","sourceRoot":"","sources":["../../../src/view/viewFactory.js"],"names":[],"mappings":"AAgRA;;;;GAIG;AACH,sEAFa,IAAI,sCAAY,CAI5B;AAED;;;;GAIG;AACH,uEAFa,IAAI,uCAAa,CAI7B;AAED;;;;GAIG;AACH,uEAFa,IAAI,uCAAa,CAS7B;AAED;;;;GAIG;AACH,kFAFa,IAAI,IAAI,OAAO,iBAAiB,EAAE,oBAAoB,CAQlE;AAED;;;;GAIG;AACH,mCAHW,MAAM,GACJ,IAAI,IAAI,OAAO,iBAAiB,EAAE,UAAU,CAIxD;AAED;;;;GAIG;AACH,yEAFa,IAAI,yCAAe,CAI/B;AAED;;;;GAIG;AACH,yEAFa,IAAI,IAAI,WAAW,CAI/B;AAED;;;;GAIG;AACH,wEAFa,IAAI,wCAAc,CAI9B;AAED;;;;GAIG;AACH,wEAFa,IAAI,8CAAc,CAS9B;AAlWD,6BAA8B,UAAU,CAAC;AAEzC;;;;GAIG;AAEH;;GAEG;AACH;IAiBI;;OAEG;IACH,sBAFW,kBAAkB,EAoC5B;IAjCG,2CAA2C;IAC3C,SADW,QAAQ,CAAC,kBAAkB,CAAC,CAKtC;IA8BL;;;OAGG;IACH,qEAlDiC,OAAO,yHAC2B,OAAO,oBAAoB,EAAE,OAAO,eAAe,OAAO,WAAW,EAAE,OAAO,gBAAgB,MAAM,KAAK,IAAI,QAmD/K;IAED;;;;;;OAMG;IACH,wHAJW,OAAO,oBAAoB,EAAE,OAAO,eACpC,OAAO,WAAW,EAAE,OAAO,gBAC3B,MAAM,QAmBhB;IAED;;;;OAIG;IACH,sDAFa,IAAI,sCAAY,CAU5B;IAED;;;;;;;;;;OAUG;IACH,yBAPW,qCAAW,OAAO,iBAAiB,EAAE,UAAU,qEAE/C,OAAO,oBAAoB,EAAE,OAAO,eACpC,OAAO,WAAW,EAAE,OAAO,gBAC3B,MAAM,cACN,CAAC,IAAI,oCAAU,KAAK,IAAI,iBAuElC;;CACJ;;;;;kBAjMa,OAAO;eACP,OAAO;;iBAfJ,WAAW"}
1
+ {"version":3,"file":"viewFactory.d.ts","sourceRoot":"","sources":["../../../src/view/viewFactory.js"],"names":[],"mappings":"AA4RA;;;;GAIG;AACH,sEAFa,IAAI,sCAAY,CAI5B;AAED;;;;GAIG;AACH,uEAFa,IAAI,uCAAa,CAI7B;AAED;;;;GAIG;AACH,uEAFa,IAAI,uCAAa,CAS7B;AAED;;;;GAIG;AACH,kFAFa,IAAI,IAAI,OAAO,iBAAiB,EAAE,oBAAoB,CAQlE;AAED;;;;GAIG;AACH,mCAHW,MAAM,GACJ,IAAI,IAAI,OAAO,iBAAiB,EAAE,UAAU,CAIxD;AAED;;;;GAIG;AACH,yEAFa,IAAI,yCAAe,CAI/B;AAED;;;;GAIG;AACH,yEAFa,IAAI,IAAI,WAAW,CAI/B;AAED;;;;GAIG;AACH,wEAFa,IAAI,wCAAc,CAI9B;AAED;;;;GAIG;AACH,wEAFa,IAAI,8CAAc,CAS9B;AA5WD,6BAA8B,UAAU,CAAC;AAEzC;;;;GAIG;AAEH;;GAEG;AACH;IAiBI;;OAEG;IACH,sBAFW,kBAAkB,EAoC5B;IAjCG,2CAA2C;IAC3C,SADW,QAAQ,CAAC,kBAAkB,CAAC,CAKtC;IA8BL;;;OAGG;IACH,qEAlDiC,OAAO,yHAC2B,OAAO,oBAAoB,EAAE,OAAO,eAAe,OAAO,WAAW,EAAE,OAAO,gBAAgB,MAAM,KAAK,IAAI,QAmD/K;IAED;;;;;;OAMG;IACH,wHAJW,OAAO,oBAAoB,EAAE,OAAO,eACpC,OAAO,WAAW,EAAE,OAAO,gBAC3B,MAAM,QAmBhB;IAED;;;;OAIG;IACH,sDAFa,IAAI,sCAAY,CAU5B;IAED;;;;;;;;;;OAUG;IACH,yBAPW,qCAAW,OAAO,iBAAiB,EAAE,UAAU,qEAE/C,OAAO,oBAAoB,EAAE,OAAO,eACpC,OAAO,WAAW,EAAE,OAAO,gBAC3B,MAAM,cACN,CAAC,IAAI,oCAAU,KAAK,IAAI,iBAiFlC;;CACJ;;;;;kBA3Ma,OAAO;eACP,OAAO;;iBAjBJ,WAAW"}
@@ -8,6 +8,8 @@ import { isArray, isObject, isString } from "vega-util";
8
8
  import { loadExternalViewSpec } from "./viewUtils.js";
9
9
  import ContainerView from "./containerView.js";
10
10
  import ViewError from "./viewError.js";
11
+ import { isSelectionParameter } from "./paramMediator.js";
12
+ import { asSelectionConfig } from "../selection/selection.js";
11
13
 
12
14
  export const VIEW_ROOT_NAME = "viewRoot";
13
15
 
@@ -179,11 +181,21 @@ export class ViewFactory {
179
181
  viewSpec = spec;
180
182
  }
181
183
 
184
+ // A view with an interval selection always needs a parent.
185
+ const hasIntervalSelection = (/** @type {ViewSpec} */ spec) =>
186
+ spec?.params?.some(
187
+ (param) =>
188
+ isSelectionParameter(param) &&
189
+ asSelectionConfig(param.select).type == "interval"
190
+ );
191
+
182
192
  // Wrap a unit spec at root into a grid view to get axes, etc.
183
193
  if (
184
194
  !dataParent &&
185
195
  this.options.wrapRoot &&
186
- (isUnitSpec(viewSpec) || isLayerSpec(viewSpec)) &&
196
+ (isUnitSpec(viewSpec) ||
197
+ isLayerSpec(viewSpec) ||
198
+ hasIntervalSelection(viewSpec)) &&
187
199
  defaultName === VIEW_ROOT_NAME
188
200
  ) {
189
201
  viewSpec = {
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  },
8
8
  "contributors": [],
9
9
  "license": "MIT",
10
- "version": "0.59.0",
10
+ "version": "0.60.1",
11
11
  "jsdelivr": "dist/bundle/index.js",
12
12
  "unpkg": "dist/bundle/index.js",
13
13
  "browser": "dist/bundle/index.js",
@@ -67,5 +67,5 @@
67
67
  "devDependencies": {
68
68
  "@types/long": "^4.0.1"
69
69
  },
70
- "gitHead": "a4154688ef99f775352e3548e614689891df45f2"
70
+ "gitHead": "ac0050df2da1342178fdd3a6843c1df5ac898332"
71
71
  }
@@ -1,135 +0,0 @@
1
- /**
2
- * @param {import("../spec/view.js").ViewBackground} viewBackground
3
- * @returns {import("../spec/view.js").UnitSpec}
4
- */
5
- export function createBackground(viewBackground: import("../spec/view.js").ViewBackground): import("../spec/view.js").UnitSpec;
6
- /**
7
- * @param {import("../spec/view.js").ViewBackground} viewBackground
8
- * @returns {import("../spec/view.js").UnitSpec}
9
- */
10
- export function createBackgroundStroke(viewBackground: import("../spec/view.js").ViewBackground): import("../spec/view.js").UnitSpec;
11
- /**
12
- * @param {View} view
13
- */
14
- export function isClippedChildren(view: import("./view.js").default): boolean;
15
- /**
16
- *
17
- * @param {import("./layout/rectangle.js").default} coords
18
- * @param {import("../spec/axis.js").AxisOrient} orient
19
- * @param {AxisView} axisView
20
- */
21
- export function translateAxisCoords(coords: import("./layout/rectangle.js").default, orient: import("../spec/axis.js").AxisOrient, axisView: AxisView): Rectangle;
22
- /**
23
- * Modeled after: https://vega.github.io/vega/docs/layout/
24
- *
25
- * This should take care of the following:
26
- * - Composition: [hv]concat / facet / repeat
27
- * - Views
28
- * - Axes
29
- * - Grid lines
30
- * - View background
31
- * - View titles
32
- * - Facet (column / row) titles
33
- * - Header / footer
34
- * - Zoom / pan
35
- * - Scrollable viewports (with scrollbars)
36
- * - And later on, brushing, legend(?)
37
- */
38
- export default class GridView extends ContainerView {
39
- /**
40
- *
41
- * @param {import("../spec/view.js").AnyConcatSpec} spec
42
- * @param {import("../types/viewContext.js").default} context
43
- * @param {ContainerView} layoutParent
44
- * @param {View} dataParent
45
- * @param {string} name
46
- * @param {number} columns
47
- * @param {import("./view.js").ViewOptions} [options]
48
- */
49
- constructor(spec: import("../spec/view.js").AnyConcatSpec, context: import("../types/viewContext.js").default, layoutParent: ContainerView, dataParent: import("./view.js").default, name: string, columns: number, options?: import("./view.js").ViewOptions);
50
- spec: import("../spec/view.js").AnyConcatSpec;
51
- wrappingFacet: boolean;
52
- /**
53
- * @param {View} view
54
- */
55
- appendChild(view: import("./view.js").default): void;
56
- /**
57
- * @param {View[]} views
58
- */
59
- setChildren(views: import("./view.js").default[]): void;
60
- /**
61
- * Read-only view to children
62
- */
63
- get children(): import("./view.js").default[];
64
- get childCount(): number;
65
- /**
66
- * @protected
67
- */
68
- protected createAxes(): Promise<void[]>;
69
- #private;
70
- }
71
- export class GridChild {
72
- /**
73
- * @param {View} view
74
- * @param {ContainerView} layoutParent
75
- * @param {number} serial
76
- */
77
- constructor(view: import("./view.js").default, layoutParent: ContainerView, serial: number);
78
- layoutParent: ContainerView;
79
- view: import("./view.js").default;
80
- serial: number;
81
- /** @type {UnitView} */
82
- background: UnitView;
83
- /** @type {UnitView} */
84
- backgroundStroke: UnitView;
85
- /** @type {Partial<Record<import("../spec/axis.js").AxisOrient, AxisView>>} axes */
86
- axes: Partial<Record<import("../spec/axis.js").AxisOrient, AxisView>>;
87
- /** @type {Partial<Record<import("../spec/axis.js").AxisOrient, AxisGridView>>} gridLines */
88
- gridLines: Partial<Record<import("../spec/axis.js").AxisOrient, AxisGridView>>;
89
- /** @type {Partial<Record<ScrollDirection, Scrollbar>>} */
90
- scrollbars: Partial<Record<"vertical" | "horizontal", Scrollbar>>;
91
- /** @type {UnitView} */
92
- title: UnitView;
93
- /** @type {Rectangle} */
94
- coords: Rectangle;
95
- getChildren(): Generator<import("./view.js").default, void, unknown>;
96
- /**
97
- * Create view decorations, grid lines, axes, etc.
98
- */
99
- createAxes(): Promise<void>;
100
- getOverhang(): Padding;
101
- getOverhangAndPadding(): Padding;
102
- }
103
- import AxisView from "./axisView.js";
104
- import Rectangle from "./layout/rectangle.js";
105
- import ContainerView from "./containerView.js";
106
- import UnitView from "./unitView.js";
107
- import AxisGridView from "./axisGridView.js";
108
- declare class Scrollbar extends UnitView {
109
- /**
110
- * @param {GridChild} gridChild
111
- * @param {ScrollDirection} scrollDirection
112
- */
113
- constructor(gridChild: GridChild, scrollDirection: "vertical" | "horizontal");
114
- viewportOffset: number;
115
- config: {
116
- scrollbarSize: number;
117
- scrollbarPadding: number;
118
- };
119
- interpolateViewportOffset: ((target: {
120
- x: number;
121
- }) => void) & {
122
- stop: () => void;
123
- };
124
- get scrollOffset(): number;
125
- /**
126
- *
127
- * @param {Rectangle} viewportCoords
128
- * @param {Rectangle} coords
129
- */
130
- updateScrollbar(viewportCoords: Rectangle, coords: Rectangle): void;
131
- #private;
132
- }
133
- import Padding from "./layout/padding.js";
134
- export {};
135
- //# sourceMappingURL=gridView.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gridView.d.ts","sourceRoot":"","sources":["../../../src/view/gridView.js"],"names":[],"mappings":"AAswBA;;;GAGG;AACH,iDAHW,OAAO,iBAAiB,EAAE,cAAc,GACtC,OAAO,iBAAiB,EAAE,QAAQ,CAwB9C;AAED;;;GAGG;AACH,uDAHW,OAAO,iBAAiB,EAAE,cAAc,GACtC,OAAO,iBAAiB,EAAE,QAAQ,CA6C9C;AA2BD;;GAEG;AACH,8EAUC;AAED;;;;;GAKG;AACH,4CAJW,OAAO,uBAAuB,EAAE,OAAO,UACvC,OAAO,iBAAiB,EAAE,UAAU,YACpC,QAAQ,aAmBlB;AA53BD;;;;;;;;;;;;;;;GAeG;AACH;IA6BI;;;;;;;;;OASG;IACH,kBARW,OAAO,iBAAiB,EAAE,aAAa,WACvC,OAAO,yBAAyB,EAAE,OAAO,gBACzC,aAAa,iDAEb,MAAM,WACN,MAAM,YACN,OAAO,WAAW,EAAE,WAAW,EAoBzC;IARG,8CAAgB;IAOhB,uBAA0B;IAG9B;;OAEG;IACH,qDAIC;IAeD;;OAEG;IACH,mBAFW,6BAAM,QAOhB;IAqBD;;OAEG;IACH,8CAEC;IAED,yBAEC;IAED;;OAEG;IACH,wCAmCC;;CA+jBJ;AAgJD;IACI;;;;OAIG;IACH,6DAHW,aAAa,UACb,MAAM,EAoFhB;IAjFG,4BAAgC;IAChC,kCAAgB;IAChB,eAAoB;IAEpB,uBAAuB;IACvB,YADW,QAAQ,CACQ;IAE3B,uBAAuB;IACvB,kBADW,QAAQ,CACc;IAEjC,mFAAmF;IACnF,MADW,OAAO,CAAC,MAAM,CAAC,OAAO,iBAAiB,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAC5D;IAEd,4FAA4F;IAC5F,WADW,OAAO,CAAC,MAAM,CAAC,OAAO,iBAAiB,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAC3D;IAEnB,0DAA0D;IAC1D,YADW,OAAO,CAAC,MAAM,4BAAkB,SAAS,CAAC,CAAC,CAClC;IAEpB,uBAAuB;IACvB,OADW,QAAQ,CACG;IAEtB,wBAAwB;IACxB,QADW,SAAS,CACQ;IA4DhC,qEAcC;IAED;;OAEG;IACH,4BAsKC;IAED,uBAqBC;IAED,iCAEC;CACJ;qBAtrC0D,eAAe;sBAFpD,uBAAuB;0BAGnB,oBAAoB;qBAGzB,eAAe;yBALX,mBAAmB;AAyrC5C;IAeI;;;OAGG;IACH,uBAHW,SAAS,8CA6FnB;IAhGD,uBAAmB;IAsCf;;;MAAoB;IAIpB;;;;MAQC;IAgDL,2BAKC;IAWD;;;;OAIG;IACH,gCAHW,SAAS,UACT,SAAS,QA8CnB;;CACJ;oBA52CmB,qBAAqB"}