@genome-spy/core 0.75.0 → 0.77.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 (114) hide show
  1. package/dist/bundle/browser-KWU9rWZT.js +123 -0
  2. package/dist/bundle/{esm-CgfVIRJ-.js → esm-0dYHNV_D.js} +2 -2
  3. package/dist/bundle/{esm-sIoQYZ21.js → esm-CRMf_I9V.js} +18 -18
  4. package/dist/bundle/esm-CT3ygiMq.js +1084 -0
  5. package/dist/bundle/{esm-DQiq2Zhd.js → esm-CscjKVDc.js} +44 -44
  6. package/dist/bundle/index.es.js +3408 -3185
  7. package/dist/bundle/index.js +106 -97
  8. package/dist/schema.json +352 -0
  9. package/dist/src/config/defaults/markDefaults.d.ts.map +1 -1
  10. package/dist/src/config/defaults/markDefaults.js +1 -12
  11. package/dist/src/config/defaults/scaleDefaults.d.ts.map +1 -1
  12. package/dist/src/config/defaults/scaleDefaults.js +1 -0
  13. package/dist/src/config/markConfig.d.ts.map +1 -1
  14. package/dist/src/config/markConfig.js +16 -8
  15. package/dist/src/config/themes.d.ts.map +1 -1
  16. package/dist/src/config/themes.js +15 -2
  17. package/dist/src/data/sources/lazy/bigWigSource.d.ts.map +1 -1
  18. package/dist/src/data/sources/lazy/bigWigSource.js +31 -11
  19. package/dist/src/data/sources/lazy/registerBuiltInLazySources.js +2 -2
  20. package/dist/src/data/sources/lazy/registerCoreLazySources.d.ts +2 -0
  21. package/dist/src/data/sources/lazy/registerCoreLazySources.d.ts.map +1 -0
  22. package/dist/src/data/sources/lazy/registerCoreLazySources.js +2 -0
  23. package/dist/src/data/sources/lazy/singleAxisWindowedSource.d.ts +19 -3
  24. package/dist/src/data/sources/lazy/singleAxisWindowedSource.d.ts.map +1 -1
  25. package/dist/src/data/sources/lazy/singleAxisWindowedSource.js +34 -13
  26. package/dist/src/data/sources/lazy/tabixSource.d.ts +7 -0
  27. package/dist/src/data/sources/lazy/tabixSource.d.ts.map +1 -1
  28. package/dist/src/data/sources/lazy/tabixSource.js +18 -0
  29. package/dist/src/data/sources/lazy/tabixTsvSource.d.ts +37 -0
  30. package/dist/src/data/sources/lazy/tabixTsvSource.d.ts.map +1 -0
  31. package/dist/src/data/sources/lazy/tabixTsvSource.js +163 -0
  32. package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -1
  33. package/dist/src/data/transforms/filterScoredLabels.js +3 -2
  34. package/dist/src/embedFactory.d.ts.map +1 -1
  35. package/dist/src/embedFactory.js +2 -0
  36. package/dist/src/genomeSpy/viewContextFactory.d.ts.map +1 -1
  37. package/dist/src/genomeSpy/viewContextFactory.js +1 -0
  38. package/dist/src/genomeSpyBase.d.ts +6 -0
  39. package/dist/src/genomeSpyBase.d.ts.map +1 -1
  40. package/dist/src/genomeSpyBase.js +15 -1
  41. package/dist/src/gl/webGLHelper.d.ts +5 -2
  42. package/dist/src/gl/webGLHelper.d.ts.map +1 -1
  43. package/dist/src/gl/webGLHelper.js +20 -3
  44. package/dist/src/index.d.ts +1 -0
  45. package/dist/src/index.d.ts.map +1 -1
  46. package/dist/src/index.js +1 -0
  47. package/dist/src/marks/__snapshots__/shaderSnapshot.test.js.snap +1084 -2
  48. package/dist/src/marks/link.vertex.glsl.js +1 -1
  49. package/dist/src/marks/mark.d.ts.map +1 -1
  50. package/dist/src/marks/mark.js +0 -6
  51. package/dist/src/marks/rect.vertex.glsl.js +1 -1
  52. package/dist/src/minimal.d.ts +1 -0
  53. package/dist/src/minimal.d.ts.map +1 -1
  54. package/dist/src/minimal.js +6 -4
  55. package/dist/src/paramRuntime/embedParamApi.d.ts +26 -0
  56. package/dist/src/paramRuntime/embedParamApi.d.ts.map +1 -0
  57. package/dist/src/paramRuntime/embedParamApi.js +133 -0
  58. package/dist/src/scale/scale.js +10 -2
  59. package/dist/src/scales/domainPlanner.js +1 -1
  60. package/dist/src/scales/scaleInteractionController.d.ts +8 -4
  61. package/dist/src/scales/scaleInteractionController.d.ts.map +1 -1
  62. package/dist/src/scales/scaleInteractionController.js +55 -7
  63. package/dist/src/scales/scaleResolution.d.ts +3 -3
  64. package/dist/src/scales/scaleResolution.d.ts.map +1 -1
  65. package/dist/src/scales/scaleResolution.js +14 -7
  66. package/dist/src/scales/selectionDomainUtils.d.ts +10 -0
  67. package/dist/src/scales/selectionDomainUtils.d.ts.map +1 -1
  68. package/dist/src/scales/selectionDomainUtils.js +32 -3
  69. package/dist/src/selection/index.d.ts +8 -0
  70. package/dist/src/selection/index.d.ts.map +1 -0
  71. package/dist/src/selection/index.js +12 -0
  72. package/dist/src/spec/channel.d.ts +30 -0
  73. package/dist/src/spec/data.d.ts +40 -0
  74. package/dist/src/spec/parameter.d.ts +6 -0
  75. package/dist/src/spec/transform.d.ts +6 -0
  76. package/dist/src/styles/genome-spy.css +8 -0
  77. package/dist/src/styles/genome-spy.css.d.ts +1 -1
  78. package/dist/src/styles/genome-spy.css.d.ts.map +1 -1
  79. package/dist/src/styles/genome-spy.css.js +8 -0
  80. package/dist/src/types/embedApi.d.ts +54 -0
  81. package/dist/src/types/scaleResolutionApi.d.ts +28 -1
  82. package/dist/src/types/viewContext.d.ts +11 -0
  83. package/dist/src/utils/ui/tooltip.d.ts.map +1 -1
  84. package/dist/src/utils/ui/tooltip.js +22 -0
  85. package/dist/src/view/axisGridView.d.ts.map +1 -1
  86. package/dist/src/view/axisGridView.js +2 -1
  87. package/dist/src/view/axisView.d.ts.map +1 -1
  88. package/dist/src/view/axisView.js +2 -1
  89. package/dist/src/view/facetView.d.ts.map +1 -1
  90. package/dist/src/view/facetView.js +2 -1
  91. package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
  92. package/dist/src/view/gridView/gridChild.js +9 -1
  93. package/dist/src/view/gridView/gridView.d.ts.map +1 -1
  94. package/dist/src/view/gridView/gridView.js +198 -32
  95. package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
  96. package/dist/src/view/gridView/scrollbar.js +5 -1
  97. package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
  98. package/dist/src/view/gridView/selectionRect.js +5 -1
  99. package/dist/src/view/gridView/separatorView.d.ts.map +1 -1
  100. package/dist/src/view/gridView/separatorView.js +5 -1
  101. package/dist/src/view/testUtils.d.ts +30 -3
  102. package/dist/src/view/testUtils.d.ts.map +1 -1
  103. package/dist/src/view/testUtils.js +51 -2
  104. package/dist/src/view/viewSelectors.d.ts +38 -10
  105. package/dist/src/view/viewSelectors.d.ts.map +1 -1
  106. package/dist/src/view/viewSelectors.js +67 -2
  107. package/dist/src/view/viewUtilTypes.d.ts +15 -0
  108. package/dist/src/view/viewUtils.d.ts.map +1 -1
  109. package/dist/src/view/viewUtils.js +10 -0
  110. package/package.json +3 -3
  111. package/dist/bundle/browser-BTgw5ieH.js +0 -126
  112. package/dist/bundle/esm-DtE8VqAv.js +0 -1015
  113. /package/dist/bundle/{esm-BDFRLEuD.js → esm-C49STiCR.js} +0 -0
  114. /package/dist/bundle/{esm-CGX-qz1d.js → esm-CuVa5T98.js} +0 -0
@@ -39,6 +39,29 @@ export function requireIntervalSelection(selection, paramName) {
39
39
  return selection;
40
40
  }
41
41
 
42
+ /**
43
+ * Returns an interval selection when the value exists and is of the correct
44
+ * type. Missing values are treated as empty so selection-linked domains can
45
+ * initialize before a pushed outer selection has been seeded.
46
+ *
47
+ * @param {any} selection
48
+ * @param {string} paramName
49
+ * @returns {import("../types/selectionTypes.js").IntervalSelection | undefined}
50
+ */
51
+ export function getIntervalSelection(selection, paramName) {
52
+ if (!selection) {
53
+ return;
54
+ }
55
+
56
+ if (!isIntervalSelection(selection)) {
57
+ throw new Error(
58
+ `Selection domain parameter "${paramName}" must be an interval selection.`
59
+ );
60
+ }
61
+
62
+ return selection;
63
+ }
64
+
42
65
  /**
43
66
  * Resolves the runtime-backed interval selection binding used by a linked
44
67
  * domain. Matching is based on the actual resolved runtime slot instead of
@@ -52,7 +75,7 @@ export function resolveIntervalSelectionBinding(view, paramName, encoding) {
52
75
  const runtime = view.paramRuntime.findRuntimeForParam
53
76
  ? requireParamRuntime(view.paramRuntime, paramName)
54
77
  : view.paramRuntime;
55
- const selection = requireIntervalSelection(
78
+ const selection = getIntervalSelection(
56
79
  runtime.getValue
57
80
  ? runtime.getValue(paramName)
58
81
  : view.paramRuntime.findValue(paramName),
@@ -71,7 +94,12 @@ export function resolveIntervalSelectionBinding(view, paramName, encoding) {
71
94
  * @param {string} paramName
72
95
  * @param {"x" | "y"} encoding
73
96
  */
74
- export function findIntervalSelectionBindingOwners(root, runtime, paramName, encoding) {
97
+ export function findIntervalSelectionBindingOwners(
98
+ root,
99
+ runtime,
100
+ paramName,
101
+ encoding
102
+ ) {
75
103
  /** @type {{ view: import("../view/view.js").default, param: import("../spec/parameter.js").SelectionParameter }[]} */
76
104
  const owners = [];
77
105
 
@@ -124,7 +152,8 @@ export function hasIntervalSelectionBindingInScope(
124
152
 
125
153
  seen.add(candidateView);
126
154
 
127
- const param = candidateView.paramRuntime?.paramConfigs?.get(paramName);
155
+ const param =
156
+ candidateView.paramRuntime?.paramConfigs?.get(paramName);
128
157
  if (!param || !isSelectionParameter(param)) {
129
158
  continue;
130
159
  }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Creates a runtime interval selection value for use with parameter APIs.
3
+ *
4
+ * @param {Partial<Record<import("../spec/channel.js").PositionalChannel, [number, number] | null>>} intervals
5
+ * @returns {import("../types/selectionTypes.js").IntervalSelection}
6
+ */
7
+ export function intervalSelection(intervals: Partial<Record<import("../spec/channel.js").PositionalChannel, [number, number] | null>>): import("../types/selectionTypes.js").IntervalSelection;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/selection/index.js"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,6CAHW,OAAO,CAAC,MAAM,CAAC,OAAO,oBAAoB,EAAE,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GACtF,OAAO,4BAA4B,EAAE,iBAAiB,CAOlE"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Creates a runtime interval selection value for use with parameter APIs.
3
+ *
4
+ * @param {Partial<Record<import("../spec/channel.js").PositionalChannel, [number, number] | null>>} intervals
5
+ * @returns {import("../types/selectionTypes.js").IntervalSelection}
6
+ */
7
+ export function intervalSelection(intervals) {
8
+ return {
9
+ type: "interval",
10
+ intervals: { ...intervals },
11
+ };
12
+ }
@@ -99,6 +99,12 @@ export interface TypeMixins<T extends Type> {
99
99
  }
100
100
 
101
101
  export interface FieldDefBase {
102
+ /**
103
+ * A description of the encoded field. Can be used for documentation and
104
+ * to explain the meaning of the channel mapping.
105
+ */
106
+ description?: string;
107
+
102
108
  /**
103
109
  * __Required.__ A string defining the name of the field from which to pull a data value
104
110
  * or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.
@@ -169,12 +175,24 @@ export interface ValueDefBase<V extends Value = Scalar> {
169
175
  * A constant value in visual domain (e.g., `"red"` / `"#0099ff"`, values between `0` to `1` for opacity).
170
176
  */
171
177
  value: V | ExprRef;
178
+
179
+ /**
180
+ * A description of the encoded value. Can be used for documentation and
181
+ * to explain the meaning of the channel mapping.
182
+ */
183
+ description?: string;
172
184
  }
173
185
 
174
186
  export type ValueDef<V extends Value = Scalar> = ValueDefBase<V> & TitleMixins;
175
187
 
176
188
  export interface DatumDef<V extends Scalar | ExprRef = Scalar | ExprRef>
177
189
  extends Partial<TypeMixins<Type>>, BandMixins, ScaleMixins, TitleMixins {
190
+ /**
191
+ * A description of the encoded datum. Can be used for documentation and
192
+ * to explain the meaning of the channel mapping.
193
+ */
194
+ description?: string;
195
+
178
196
  /**
179
197
  * A constant value in data domain.
180
198
  */
@@ -183,6 +201,12 @@ export interface DatumDef<V extends Scalar | ExprRef = Scalar | ExprRef>
183
201
 
184
202
  export interface ExprDef
185
203
  extends Partial<TypeMixins<Type>>, BandMixins, TitleMixins {
204
+ /**
205
+ * A description of the encoded expression. Can be used for documentation
206
+ * and to explain the meaning of the channel mapping.
207
+ */
208
+ description?: string;
209
+
186
210
  /**
187
211
  * An expression. Properties of the data can be accessed through the `datum` object.
188
212
  */
@@ -332,6 +356,12 @@ export interface PositionMixins extends BandMixins {
332
356
  export type PositionFieldDefBase = ScaleFieldDef<Type>;
333
357
 
334
358
  export interface ChromPosDefBase extends BandMixins {
359
+ /**
360
+ * A description of the encoded position. Can be used for documentation and
361
+ * to explain the meaning of the channel mapping.
362
+ */
363
+ description?: string;
364
+
335
365
  /**
336
366
  * The field having the chromosome or contig.
337
367
  */
@@ -138,6 +138,12 @@ export type InlineDataset =
138
138
  | object;
139
139
 
140
140
  export interface DataBase {
141
+ /**
142
+ * A description of the data source. Can be used for documentation and to
143
+ * explain the role of the data in the visualization.
144
+ */
145
+ description?: string;
146
+
141
147
  /**
142
148
  * An object that specifies the format for parsing the data.
143
149
  */
@@ -202,6 +208,12 @@ export interface DynamicCallbackData extends DataBase {
202
208
  export type Generator = SequenceGenerator;
203
209
 
204
210
  export interface GeneratorBase {
211
+ /**
212
+ * A description of the data source. Can be used for documentation and to
213
+ * explain the role of the generated data in the visualization.
214
+ */
215
+ description?: string;
216
+
205
217
  /**
206
218
  * Provide a placeholder name and bind data at runtime.
207
219
  */
@@ -240,6 +252,12 @@ export interface SequenceParams {
240
252
  }
241
253
 
242
254
  export interface LazyData {
255
+ /**
256
+ * A description of the data source. Can be used for documentation and to
257
+ * explain the role of the lazy data in the visualization.
258
+ */
259
+ description?: string;
260
+
243
261
  lazy: LazyDataParams;
244
262
  }
245
263
 
@@ -250,6 +268,7 @@ export type LazyDataParams =
250
268
  | BigWigData
251
269
  | BigBedData
252
270
  | BamData
271
+ | TabixTsvData
253
272
  | Gff3Data
254
273
  | VcfData;
255
274
 
@@ -446,6 +465,27 @@ export interface TabixData extends DebouncedData {
446
465
  windowSize?: number;
447
466
  }
448
467
 
468
+ export interface TabixTsvData extends TabixData {
469
+ type: "tabix";
470
+
471
+ /**
472
+ * Ordered list of field names for headerless tabix TSV input.
473
+ * If omitted, the source tries to read a commented header line from the
474
+ * tabix file header or the first row of a plain TSV header.
475
+ */
476
+ columns?: string[];
477
+
478
+ /**
479
+ * Optional type parsing for TSV fields. When omitted, field types are
480
+ * inferred automatically. Set to `null` to disable spec-based type
481
+ * inference and rely on data inference, or provide a field-to-type map to
482
+ * override selected columns.
483
+ *
484
+ * __Default value:__ `"auto"`
485
+ */
486
+ parse?: Parse | null;
487
+ }
488
+
449
489
  export interface Gff3Data extends TabixData {
450
490
  type: "gff3";
451
491
  }
@@ -18,6 +18,12 @@ export interface ParameterBase {
18
18
  */
19
19
  name: string;
20
20
 
21
+ /**
22
+ * A description of the parameter. Can be used for documentation and to
23
+ * explain the meaning of the control or selection.
24
+ */
25
+ description?: string;
26
+
21
27
  push?: "outer";
22
28
  }
23
29
 
@@ -11,6 +11,12 @@ export type Field = string;
11
11
  export interface TransformParamsBase {
12
12
  /** The type of the transform to be applied */
13
13
  type: string;
14
+
15
+ /**
16
+ * A description of the transform step. Can be used for documentation
17
+ * and agent context.
18
+ */
19
+ description?: string;
14
20
  }
15
21
 
16
22
  export interface IdentifierParams extends TransformParamsBase {
@@ -177,6 +177,14 @@
177
177
  }
178
178
  }
179
179
 
180
+ .autoscroll-container {
181
+ max-height: min(40em, 50vh);
182
+ overflow-x: hidden;
183
+ overflow-y: auto;
184
+ padding-right: var(--genome-spy-basic-spacing);
185
+ margin-right: calc(-1 * var(--genome-spy-basic-spacing));
186
+ }
187
+
180
188
  .na {
181
189
  color: #aaa;
182
190
  font-style: italic;
@@ -1,3 +1,3 @@
1
1
  export default css;
2
- declare const css: "\n@scope {\n:scope {\n--genome-spy-basic-spacing: 10px;\n--genome-spy-font-family:\nsystem-ui, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif,\n\"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n\nfont-family: var(--genome-spy-font-family);\n\nposition: relative;\n\ndisplay: flex;\nflex-direction: column;\n}\n\n.canvas-wrapper {\nposition: relative;\nflex-grow: 1;\noverflow: hidden;\n}\n\ncanvas {\ndisplay: block;\ntouch-action: none;\ntransform: scale(1, 1);\nopacity: 1;\ntransition:\ntransform 0.6s,\nopacity 0.6s;\n\n&:focus,\n&:focus-visible {\noutline: none;\n}\n}\n\n.loading {\n> canvas {\ntransform: scale(0.95, 0.95);\nopacity: 0;\n}\n}\n\n.loading-indicators {\nposition: absolute;\ninset: 0;\n\nuser-select: none;\npointer-events: none;\n\ndiv {\nposition: absolute;\ndisplay: flex;\nalign-items: center;\njustify-content: center;\n\n> div {\nfont-size: 11px;\ntransition: opacity 0.2s;\nbackground: white;\npadding: 2px 5px;\ndisplay: flex;\nborder-radius: 3px;\ngap: 0.5em;\nopacity: 0;\n\n&.loading {\nopacity: 0.5;\n}\n\n&.error {\nopacity: 0.8;\ncolor: firebrick;\n}\n\n> * {\ndisplay: block;\n}\n\nimg {\nwidth: 1.5em;\nheight: 1.5em;\n}\n}\n}\n}\n\n.tooltip {\nposition: absolute;\n\nmax-width: 450px;\noverflow: hidden;\n\n--background-color: #f6f6f6;\nbackground: var(--background-color);\npadding: var(--genome-spy-basic-spacing);\n\n--font-size: 12px;\nfont-size: var(--font-size);\n\nbox-shadow: 0px 3px 15px 0px rgba(0, 0, 0, 0.21);\n\n&:not(.sticky) {\npointer-events: none;\n}\n\ntransition:\noutline-color 0.3s ease-in-out,\nbox-shadow 0.3s ease-in-out;\n\noutline: 0px solid transparent;\n&.sticky {\noutline: 2px solid black;\nbox-shadow: 0px 3px 18px 0px rgba(0, 0, 0, 0.3);\n}\n\nz-index: 100;\n\n> :last-child {\nmargin-bottom: 0;\n}\n\n> .title {\npadding-bottom: calc(var(--genome-spy-basic-spacing) / 2);\nmargin-bottom: calc(var(--genome-spy-basic-spacing) / 2);\nborder-bottom: 1px dashed var(--background-color);\nborder-bottom: 1px dashed\ncolor-mix(in srgb, black 25%, var(--background-color));\n}\n\n.summary {\nfont-size: 12px;\n}\n\ntable {\n&:first-child {\nmargin-top: 0;\n}\n\nborder-collapse: collapse;\n\nth,\ntd {\npadding: 2px 0.4em;\nvertical-align: top;\nfont-size: var(--font-size);\n\n&:first-child {\npadding-left: 0;\n}\n}\n\nth {\ntext-align: left;\nfont-weight: bold;\n}\n}\n\n.color-legend {\ndisplay: inline-block;\nwidth: 0.8em;\nheight: 0.8em;\nmargin-left: 0.4em;\nbox-shadow: 0px 0px 3px 1px white;\n}\n\n.color-legend-unmapped {\nbackground-color: transparent;\nborder: 1px solid black;\nbox-sizing: border-box;\nbox-shadow: none;\n}\n\n.attributes {\n.hovered {\nbackground-color: #e0e0e0;\n}\n}\n\n.na {\ncolor: #aaa;\nfont-style: italic;\nfont-size: 80%;\n}\n}\n\n.gene-track-tooltip {\n.summary {\nfont-size: 90%;\n}\n}\n\n.gs-input-binding {\ndisplay: grid;\ngrid-template-columns: max-content max-content;\ncolumn-gap: 1em;\nrow-gap: 0.3em;\njustify-items: start;\n\n> select,\n> input:not([type=\"checkbox\"]) {\nwidth: 100%;\n}\n\ninput[type=\"range\"] + span {\ndisplay: inline-block;\nmargin-left: 0.3em;\nmin-width: 2.2em;\nfont-variant-numeric: tabular-nums;\n}\n\ninput[type=\"range\"],\ninput[type=\"radio\"] {\nvertical-align: text-bottom;\n}\n\n.radio-group {\ndisplay: flex;\nalign-items: center;\n}\n\n.description {\nmax-width: 26em;\ngrid-column: 1 / -1;\ncolor: #777;\nfont-size: 90%;\nmargin-top: -0.5em;\n}\n}\n\n.gs-input-bindings {\nflex-basis: content;\nfont-size: 14px;\npadding: var(--genome-spy-basic-spacing);\n}\n\n.message-box {\ndisplay: flex;\nalign-items: center;\njustify-content: center;\nposition: absolute;\ntop: 0;\nheight: 100%;\nwidth: 100%;\n\n> div {\nborder: 1px solid red;\npadding: 10px;\nbackground: #fff0f0;\n}\n}\n}\n";
2
+ declare const css: "\n@scope {\n:scope {\n--genome-spy-basic-spacing: 10px;\n--genome-spy-font-family:\nsystem-ui, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif,\n\"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n\nfont-family: var(--genome-spy-font-family);\n\nposition: relative;\n\ndisplay: flex;\nflex-direction: column;\n}\n\n.canvas-wrapper {\nposition: relative;\nflex-grow: 1;\noverflow: hidden;\n}\n\ncanvas {\ndisplay: block;\ntouch-action: none;\ntransform: scale(1, 1);\nopacity: 1;\ntransition:\ntransform 0.6s,\nopacity 0.6s;\n\n&:focus,\n&:focus-visible {\noutline: none;\n}\n}\n\n.loading {\n> canvas {\ntransform: scale(0.95, 0.95);\nopacity: 0;\n}\n}\n\n.loading-indicators {\nposition: absolute;\ninset: 0;\n\nuser-select: none;\npointer-events: none;\n\ndiv {\nposition: absolute;\ndisplay: flex;\nalign-items: center;\njustify-content: center;\n\n> div {\nfont-size: 11px;\ntransition: opacity 0.2s;\nbackground: white;\npadding: 2px 5px;\ndisplay: flex;\nborder-radius: 3px;\ngap: 0.5em;\nopacity: 0;\n\n&.loading {\nopacity: 0.5;\n}\n\n&.error {\nopacity: 0.8;\ncolor: firebrick;\n}\n\n> * {\ndisplay: block;\n}\n\nimg {\nwidth: 1.5em;\nheight: 1.5em;\n}\n}\n}\n}\n\n.tooltip {\nposition: absolute;\n\nmax-width: 450px;\noverflow: hidden;\n\n--background-color: #f6f6f6;\nbackground: var(--background-color);\npadding: var(--genome-spy-basic-spacing);\n\n--font-size: 12px;\nfont-size: var(--font-size);\n\nbox-shadow: 0px 3px 15px 0px rgba(0, 0, 0, 0.21);\n\n&:not(.sticky) {\npointer-events: none;\n}\n\ntransition:\noutline-color 0.3s ease-in-out,\nbox-shadow 0.3s ease-in-out;\n\noutline: 0px solid transparent;\n&.sticky {\noutline: 2px solid black;\nbox-shadow: 0px 3px 18px 0px rgba(0, 0, 0, 0.3);\n}\n\nz-index: 100;\n\n> :last-child {\nmargin-bottom: 0;\n}\n\n> .title {\npadding-bottom: calc(var(--genome-spy-basic-spacing) / 2);\nmargin-bottom: calc(var(--genome-spy-basic-spacing) / 2);\nborder-bottom: 1px dashed var(--background-color);\nborder-bottom: 1px dashed\ncolor-mix(in srgb, black 25%, var(--background-color));\n}\n\n.summary {\nfont-size: 12px;\n}\n\ntable {\n&:first-child {\nmargin-top: 0;\n}\n\nborder-collapse: collapse;\n\nth,\ntd {\npadding: 2px 0.4em;\nvertical-align: top;\nfont-size: var(--font-size);\n\n&:first-child {\npadding-left: 0;\n}\n}\n\nth {\ntext-align: left;\nfont-weight: bold;\n}\n}\n\n.color-legend {\ndisplay: inline-block;\nwidth: 0.8em;\nheight: 0.8em;\nmargin-left: 0.4em;\nbox-shadow: 0px 0px 3px 1px white;\n}\n\n.color-legend-unmapped {\nbackground-color: transparent;\nborder: 1px solid black;\nbox-sizing: border-box;\nbox-shadow: none;\n}\n\n.attributes {\n.hovered {\nbackground-color: #e0e0e0;\n}\n}\n\n.autoscroll-container {\nmax-height: min(40em, 50vh);\noverflow-x: hidden;\noverflow-y: auto;\npadding-right: var(--genome-spy-basic-spacing);\nmargin-right: calc(-1 * var(--genome-spy-basic-spacing));\n}\n\n.na {\ncolor: #aaa;\nfont-style: italic;\nfont-size: 80%;\n}\n}\n\n.gene-track-tooltip {\n.summary {\nfont-size: 90%;\n}\n}\n\n.gs-input-binding {\ndisplay: grid;\ngrid-template-columns: max-content max-content;\ncolumn-gap: 1em;\nrow-gap: 0.3em;\njustify-items: start;\n\n> select,\n> input:not([type=\"checkbox\"]) {\nwidth: 100%;\n}\n\ninput[type=\"range\"] + span {\ndisplay: inline-block;\nmargin-left: 0.3em;\nmin-width: 2.2em;\nfont-variant-numeric: tabular-nums;\n}\n\ninput[type=\"range\"],\ninput[type=\"radio\"] {\nvertical-align: text-bottom;\n}\n\n.radio-group {\ndisplay: flex;\nalign-items: center;\n}\n\n.description {\nmax-width: 26em;\ngrid-column: 1 / -1;\ncolor: #777;\nfont-size: 90%;\nmargin-top: -0.5em;\n}\n}\n\n.gs-input-bindings {\nflex-basis: content;\nfont-size: 14px;\npadding: var(--genome-spy-basic-spacing);\n}\n\n.message-box {\ndisplay: flex;\nalign-items: center;\njustify-content: center;\nposition: absolute;\ntop: 0;\nheight: 100%;\nwidth: 100%;\n\n> div {\nborder: 1px solid red;\npadding: 10px;\nbackground: #fff0f0;\n}\n}\n}\n";
3
3
  //# sourceMappingURL=genome-spy.css.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"genome-spy.css.d.ts","sourceRoot":"","sources":["../../../src/styles/genome-spy.css.js"],"names":[],"mappings":";AAAA,isHA6PE"}
1
+ {"version":3,"file":"genome-spy.css.d.ts","sourceRoot":"","sources":["../../../src/styles/genome-spy.css.js"],"names":[],"mappings":";AAAA,i5HAqQE"}
@@ -178,6 +178,14 @@ background-color: #e0e0e0;
178
178
  }
179
179
  }
180
180
 
181
+ .autoscroll-container {
182
+ max-height: min(40em, 50vh);
183
+ overflow-x: hidden;
184
+ overflow-y: auto;
185
+ padding-right: var(--genome-spy-basic-spacing);
186
+ margin-right: calc(-1 * var(--genome-spy-basic-spacing));
187
+ }
188
+
181
189
  .na {
182
190
  color: #aaa;
183
191
  font-style: italic;
@@ -2,6 +2,8 @@ import { ScaleResolutionApi } from "./scaleResolutionApi.js";
2
2
  import { TooltipHandler } from "../tooltip/tooltipHandler.js";
3
3
  import { RootSpec } from "../spec/root.js";
4
4
  import { GenomeSpyConfig } from "../spec/config.js";
5
+ import { Scalar } from "../spec/channel.js";
6
+ import { IntervalSelection } from "./selectionTypes.js";
5
7
 
6
8
  /**
7
9
  * Embeds GenomeSpy into the DOM
@@ -54,6 +56,47 @@ export interface EmbedOptions {
54
56
  onError?: (error: unknown, container: HTMLElement) => boolean | void;
55
57
  }
56
58
 
59
+ /**
60
+ * Runtime value type covered by the default embed parameter API.
61
+ *
62
+ * The default type covers scalar variable parameters and interval selections.
63
+ * Object and array variable parameters are supported at runtime, but callers
64
+ * should provide their own generic type when accessing them:
65
+ *
66
+ * `const param = api.getParam<MyValue>("myParam")`
67
+ *
68
+ * Current limitations:
69
+ *
70
+ * - Parameters are addressed by name only. Independent same-name parameters
71
+ * throw an ambiguity error.
72
+ * - Computed `expr` parameters are readable but cannot be written.
73
+ * - Point selections are readable as runtime values but are not supported for
74
+ * writes through the initial API because valid values require
75
+ * GenomeSpy-generated datum ids.
76
+ * - Projected selections are not supported.
77
+ */
78
+ export type ParamValue = Scalar | null | undefined | IntervalSelection;
79
+
80
+ /**
81
+ * A handle for reading, writing, and subscribing to an explicit parameter.
82
+ */
83
+ export interface ParamApi<T = ParamValue> {
84
+ /**
85
+ * Returns the current parameter value.
86
+ */
87
+ getValue: () => T;
88
+
89
+ /**
90
+ * Sets the parameter value. Computed `expr` parameters throw when set.
91
+ */
92
+ setValue: (value: T) => void;
93
+
94
+ /**
95
+ * Subscribes to parameter changes. Returns an unsubscribe function.
96
+ */
97
+ subscribe: (listener: (value: T) => void) => () => void;
98
+ }
99
+
57
100
  /**
58
101
  * An API for controlling the embedded GenomeSpy instance.
59
102
  */
@@ -82,6 +125,17 @@ export interface EmbedResult {
82
125
  */
83
126
  getScaleResolutionByName: (name: string) => ScaleResolutionApi;
84
127
 
128
+ /**
129
+ * Returns a handle for reading, writing, and subscribing to a named
130
+ * parameter.
131
+ *
132
+ * Parameters are addressed by name only. If the name resolves to multiple
133
+ * independent parameters, this method throws an ambiguity error. Parameters
134
+ * declared with `push: "outer"` are treated as aliases of the outer
135
+ * parameter they write to.
136
+ */
137
+ getParam: <T = ParamValue>(name: string) => ParamApi<T>;
138
+
85
139
  /**
86
140
  * Waits until lazy data sources have loaded data for the current visible
87
141
  * positional domain.
@@ -10,6 +10,25 @@ export interface ScaleResolutionEvent {
10
10
 
11
11
  export type ScaleResolutionListener = (event: ScaleResolutionEvent) => void;
12
12
 
13
+ export interface ZoomToOptions {
14
+ /**
15
+ * Approximate transition duration. Zero or omitted zooms immediately.
16
+ * Boolean `true` indicates a default duration.
17
+ */
18
+ duration?: boolean | number;
19
+
20
+ /**
21
+ * Render immediately without scheduling an animation frame.
22
+ *
23
+ * This is intended for synchronizing multiple GenomeSpy instances, where
24
+ * the target view should be redrawn during the same animation frame as the
25
+ * source view. Use it only for zero-duration zooms. It is not supported for
26
+ * animated transitions and may do redundant work if several domains are
27
+ * applied before the browser has a chance to paint.
28
+ */
29
+ renderImmediately?: boolean;
30
+ }
31
+
13
32
  /**
14
33
  * A public API for ScaleResolution
15
34
  */
@@ -59,6 +78,14 @@ export interface ScaleResolutionApi {
59
78
 
60
79
  zoomTo(
61
80
  domain: number[] | ComplexDomain,
62
- duration?: boolean | number
81
+ options?: ZoomToOptions
82
+ ): Promise<void>;
83
+
84
+ /**
85
+ * @deprecated Use the options object form: `zoomTo(domain, { duration })`.
86
+ */
87
+ zoomTo(
88
+ domain: number[] | ComplexDomain,
89
+ duration: boolean | number
63
90
  ): Promise<void>;
64
91
  }
@@ -34,6 +34,17 @@ export default interface ViewContext {
34
34
 
35
35
  requestLayoutReflow: () => void;
36
36
 
37
+ /**
38
+ * Renders the current scene immediately without scheduling an animation frame.
39
+ *
40
+ * This is intended for synchronization paths where another GenomeSpy
41
+ * instance is already rendering the current animation frame and this view
42
+ * must repaint after a synchronous state update, such as linked scale
43
+ * domains. Callers should use the animator for ordinary rendering. Calling
44
+ * this repeatedly before the browser paints may do redundant work.
45
+ */
46
+ renderImmediately: () => void;
47
+
37
48
  updateTooltip: <T>(
38
49
  datum: T,
39
50
  converter?: (datum: T) => Promise<TemplateResult>
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip.d.ts","sourceRoot":"","sources":["../../../../src/utils/ui/tooltip.js"],"names":[],"mappings":"AAIA,0CAA2C,qBAAqB,CAAC;AACjE,4CAA6C,uBAAuB,CAAC;AAErE;IAsBI;;OAEG;IACH,uBAFW,WAAW,EAUrB;IAED;;OAEG;IACH,mBAFW,OAAO,EAQjB;IAED,cAVW,OAAO,CAYjB;IAED;;OAEG;IACH,qBAFW,OAAO,EAOjB;IAED,eATW,OAAO,CAWjB;IAED,uBAEC;IAED;;OAEG;IACH,0BAFW,OAAO,QAOjB;IAED,wBAEC;IAED;;OAEG;IACH,4BAFW,UAAU,QAsCpB;IA/BG,8BAA2D;IAiC/D,wBAiBC;IAED;;OAEG;IACH,oBAFW,MAAM,GAAG,OAAO,KAAK,EAAE,cAAc,GAAG,WAAW,QAqB7D;IAED,cAGC;IAED;;;;;;;OAOG;IACH,gBAFa,CAAC,SAFH,CAAC,cACD,CAAS,IAAC,EAAD,CAAC,KAAE,OAAO,CAAC,MAAM,GAAG,WAAW,GAAG,OAAO,KAAK,EAAE,cAAc,CAAC,QAyBlF;IAED,sBAEC;;CACJ"}
1
+ {"version":3,"file":"tooltip.d.ts","sourceRoot":"","sources":["../../../../src/utils/ui/tooltip.js"],"names":[],"mappings":"AAIA,0CAA2C,qBAAqB,CAAC;AACjE,4CAA6C,uBAAuB,CAAC;AAErE;IAsBI;;OAEG;IACH,uBAFW,WAAW,EAUrB;IAED;;OAEG;IACH,mBAFW,OAAO,EAQjB;IAED,cAVW,OAAO,CAYjB;IAED;;OAEG;IACH,qBAFW,OAAO,EAOjB;IAED,eATW,OAAO,CAWjB;IAED,uBAEC;IAED;;OAEG;IACH,0BAFW,OAAO,QAOjB;IAED,wBAEC;IAED;;OAEG;IACH,4BAFW,UAAU,QAsCpB;IA/BG,8BAA2D;IAiC/D,wBAiBC;IAED;;OAEG;IACH,oBAFW,MAAM,GAAG,OAAO,KAAK,EAAE,cAAc,GAAG,WAAW,QAwB7D;IAED,cAGC;IAED;;;;;;;OAOG;IACH,gBAFa,CAAC,SAFH,CAAC,cACD,CAAS,IAAC,EAAD,CAAC,KAAE,OAAO,CAAC,MAAM,GAAG,WAAW,GAAG,OAAO,KAAK,EAAE,cAAc,CAAC,QAyBlF;IAED,sBAEC;;CACJ"}
@@ -165,6 +165,9 @@ export default class Tooltip {
165
165
  }
166
166
 
167
167
  render(content, this.#element);
168
+ this.#element
169
+ .querySelectorAll(".autoscroll-container")
170
+ .forEach(scrollHoveredTooltipRow);
168
171
 
169
172
  this.visible = true;
170
173
 
@@ -213,6 +216,25 @@ export default class Tooltip {
213
216
  }
214
217
  }
215
218
 
219
+ /**
220
+ * Scrolls the highlighted tooltip row into view after Lit has committed the
221
+ * current render.
222
+ *
223
+ * @param {Element | undefined} element
224
+ */
225
+ function scrollHoveredTooltipRow(element) {
226
+ if (!element) {
227
+ return;
228
+ }
229
+
230
+ queueMicrotask(() => {
231
+ element.querySelector("tr.hovered")?.scrollIntoView({
232
+ block: "nearest",
233
+ inline: "nearest",
234
+ });
235
+ });
236
+ }
237
+
216
238
  /**
217
239
  * Calculate euclidean distance
218
240
  *
@@ -1 +1 @@
1
- {"version":3,"file":"axisGridView.d.ts","sourceRoot":"","sources":["../../../src/view/axisGridView.js"],"names":[],"mappings":"AAIA;;;GAGG;AAEH;;;;;;GAMG;AACH;IACI;;;;;;;OAOG;IACH,uBAPW,IAAI,QAEJ,MAAM,WADN,OAAO,yBAAyB,EAAE,OAAO,gBAEzC,OAAO,oBAAoB,EAAE,OAAO,cACpC,OAAO,WAAW,EAAE,OAAO,YAC3B,OAAO,WAAW,EAAE,WAAW,EAkBzC;IAHG,0CAA0B;IAK9B,kDAEC;CAKJ;gCA7CY,OAAO,oBAAoB,EAAE,wBAAwB;iCACrD,OAAO,iBAAiB,EAAE,kBAAkB;;;;mBAM5C,OAAO,WAAW,EAAE,OAAO;;;;mBAC3B,OAAO,iBAAiB,EAAE,IAAI;;;;yBAC9B,OAAO,iBAAiB,EAAE,UAAU;sBAd3B,gBAAgB"}
1
+ {"version":3,"file":"axisGridView.d.ts","sourceRoot":"","sources":["../../../src/view/axisGridView.js"],"names":[],"mappings":"AAIA;;;GAGG;AAEH;;;;;;GAMG;AACH;IACI;;;;;;;OAOG;IACH,uBAPW,IAAI,QAEJ,MAAM,WADN,OAAO,yBAAyB,EAAE,OAAO,gBAEzC,OAAO,oBAAoB,EAAE,OAAO,cACpC,OAAO,WAAW,EAAE,OAAO,YAC3B,OAAO,WAAW,EAAE,WAAW,EAmBzC;IAJG,0CAA0B;IAM9B,kDAEC;CAKJ;gCA9CY,OAAO,oBAAoB,EAAE,wBAAwB;iCACrD,OAAO,iBAAiB,EAAE,kBAAkB;;;;mBAM5C,OAAO,WAAW,EAAE,OAAO;;;;mBAC3B,OAAO,iBAAiB,EAAE,IAAI;;;;yBAC9B,OAAO,iBAAiB,EAAE,UAAU;sBAd3B,gBAAgB"}
@@ -1,6 +1,6 @@
1
1
  import LayerView from "./layerView.js";
2
2
  import { orient2channel } from "./axisView.js";
3
- import { markViewAsNonAddressable } from "./viewSelectors.js";
3
+ import { markViewAsChrome, markViewAsNonAddressable } from "./viewSelectors.js";
4
4
 
5
5
  /**
6
6
  * @typedef {import("../spec/channel.js").PrimaryPositionalChannel} PositionalChannel
@@ -39,6 +39,7 @@ export default class AxisGridView extends LayerView {
39
39
  this.axisProps = axisProps;
40
40
 
41
41
  markViewAsNonAddressable(this, { skipSubtree: true });
42
+ markViewAsChrome(this, { skipSubtree: true });
42
43
  }
43
44
 
44
45
  getOrient() {
@@ -1 +1 @@
1
- {"version":3,"file":"axisView.d.ts","sourceRoot":"","sources":["../../../src/view/axisView.js"],"names":[],"mappings":"AAuCA;;GAEG;AACH,kIAEC;AAqhBD;;;;GAIG;AACH,wFAHW,MAAM,uCAqNhB;AAlwBD;;GAEG;AACH,8BAFU,MAAM,CAAC,OAAO,oBAAoB,EAAE,wBAAwB,EAAE,sCAAY,CAAC,CAKnF;AAEF;;GAEG;AACH,8BAFU,MAAM,uCAAa,OAAO,oBAAoB,EAAE,wBAAwB,CAAC,CAMjF;AASF;;;;;GAKG;AACH;IAeI;;;;;;;;OAQG;IAEH;;;;;;;OAOG;IACH,6DALW,MAAM,WADN,OAAO,yBAAyB,EAAE,OAAO,gBAEzC,OAAO,oBAAoB,EAAE,OAAO,cACpC,OAAO,WAAW,EAAE,OAAO,YAC3B,OAAO,WAAW,EAAE,WAAW,EAsDzC;IARG,iFAA8B;IA8ClC,+BAEC;;CAuEJ;sBAxPqB,gBAAgB"}
1
+ {"version":3,"file":"axisView.d.ts","sourceRoot":"","sources":["../../../src/view/axisView.js"],"names":[],"mappings":"AAuCA;;GAEG;AACH,kIAEC;AAshBD;;;;GAIG;AACH,wFAHW,MAAM,uCAqNhB;AAnwBD;;GAEG;AACH,8BAFU,MAAM,CAAC,OAAO,oBAAoB,EAAE,wBAAwB,EAAE,sCAAY,CAAC,CAKnF;AAEF;;GAEG;AACH,8BAFU,MAAM,uCAAa,OAAO,oBAAoB,EAAE,wBAAwB,CAAC,CAMjF;AASF;;;;;GAKG;AACH;IAeI;;;;;;;;OAQG;IAEH;;;;;;;OAOG;IACH,6DALW,MAAM,WADN,OAAO,yBAAyB,EAAE,OAAO,gBAEzC,OAAO,oBAAoB,EAAE,OAAO,cACpC,OAAO,WAAW,EAAE,OAAO,YAC3B,OAAO,WAAW,EAAE,WAAW,EAuDzC;IATG,iFAA8B;IA+ClC,+BAEC;;CAuEJ;sBAzPqB,gBAAgB"}
@@ -1,7 +1,7 @@
1
1
  import LayerView from "./layerView.js";
2
2
  import { FlexDimensions } from "./layout/flexLayout.js";
3
3
  import UnitView from "./unitView.js";
4
- import { markViewAsNonAddressable } from "./viewSelectors.js";
4
+ import { markViewAsChrome, markViewAsNonAddressable } from "./viewSelectors.js";
5
5
  import { getConfiguredAxisDefaults } from "../config/axisConfig.js";
6
6
 
7
7
  const CHROM_LAYER_NAME = "chromosome_ticks_and_labels";
@@ -135,6 +135,7 @@ export default class AxisView extends LayerView {
135
135
  );
136
136
 
137
137
  markViewAsNonAddressable(this, { skipSubtree: true });
138
+ markViewAsChrome(this, { skipSubtree: true });
138
139
  }
139
140
 
140
141
  async initializeChildren() {
@@ -1 +1 @@
1
- {"version":3,"file":"facetView.d.ts","sourceRoot":"","sources":["../../../src/view/facetView.js"],"names":[],"mappings":"AAoDA;;;;;;;;;;;;;;GAcG;AACH;IACI;;;;;;;OAOG;IACH;;;;;;OAMG;IACH,kBALW,OAAO,gBAAgB,EAAE,SAAS,WAClC,OAAO,gBAAgB,EAAE,WAAW,UACpC,aAAa,QACb,MAAM,EA+BhB;IA1BG,UAAgB;IAEhB,WAEC;IAED;;;;OAIG;IACH,aAFU,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAavC;IAED,oDAAoD;IACpD,kBADY,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,CACa;IAajE,sBAIC;IAED;;;OAGG;IACH,qBAFW,KAAK,GAAG,QAAQ,OAwB1B;IAED,qBAyCC;IAED,qBASC;IA6BD,kDAgBC;IAOD;;;;OAIG;IACH,gBAJW,OAAO,4CAA4C,EAAE,OAAO,UAC5D,OAAO,uBAAuB,EAAE,OAAO,YACvC,OAAO,WAAW,EAAE,gBAAgB,QA2L9C;IA3KO,wBAA0B;CA4KrC;2BAlbY,QAAQ,GAAG,KAAK;;;;;;aA4CnB,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE;;;0BA3Df,oBAAoB;qBACzB,eAAe"}
1
+ {"version":3,"file":"facetView.d.ts","sourceRoot":"","sources":["../../../src/view/facetView.js"],"names":[],"mappings":"AAoDA;;;;;;;;;;;;;;GAcG;AACH;IACI;;;;;;;OAOG;IACH;;;;;;OAMG;IACH,kBALW,OAAO,gBAAgB,EAAE,SAAS,WAClC,OAAO,gBAAgB,EAAE,WAAW,UACpC,aAAa,QACb,MAAM,EAgChB;IA3BG,UAAgB;IAEhB,WAEC;IAED;;;;OAIG;IACH,aAFU,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAcvC;IAED,oDAAoD;IACpD,kBADY,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,CACa;IAajE,sBAIC;IAED;;;OAGG;IACH,qBAFW,KAAK,GAAG,QAAQ,OAwB1B;IAED,qBAyCC;IAED,qBASC;IA6BD,kDAgBC;IAOD;;;;OAIG;IACH,gBAJW,OAAO,4CAA4C,EAAE,OAAO,UAC5D,OAAO,uBAAuB,EAAE,OAAO,YACvC,OAAO,WAAW,EAAE,gBAAgB,QA2L9C;IA3KO,wBAA0B;CA4KrC;2BAnbY,QAAQ,GAAG,KAAK;;;;;;aA4CnB,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE;;;0BA3Df,oBAAoB;qBACzB,eAAe"}
@@ -12,7 +12,7 @@ import coalesce from "../utils/coalesce.js";
12
12
  import { field as vegaField } from "vega-util";
13
13
  import DecoratorView from "./decoratorView.js";
14
14
  import Padding from "./layout/padding.js";
15
- import { markViewAsNonAddressable } from "./viewSelectors.js";
15
+ import { markViewAsChrome, markViewAsNonAddressable } from "./viewSelectors.js";
16
16
 
17
17
  const DEFAULT_SPACING = 20;
18
18
 
@@ -104,6 +104,7 @@ export default class FacetView extends ContainerView {
104
104
  `facetLabel-${channel}`
105
105
  );
106
106
  markViewAsNonAddressable(labelView, { skipSubtree: true });
107
+ markViewAsChrome(labelView, { skipSubtree: true });
107
108
  return [channel, labelView];
108
109
  })
109
110
  );
@@ -1 +1 @@
1
- {"version":3,"file":"gridChild.d.ts","sourceRoot":"","sources":["../../../../src/view/gridView/gridChild.js"],"names":[],"mappings":"AAo2BA;;;;;GAKG;AACH,qDALW,OAAO,yBAAyB,EAAE,uBAAuB,CAAC,MAAM,CAAC,sBACjE,OAAO,aACP,MAAM,GACJ,OAAO,yBAAyB,EAAE,WAAW,GAAG,SAAS,CAyBrE;AAcD;;;GAGG;AACH,iDAHW,OAAO,oBAAoB,EAAE,cAAc,GACzC,OAAO,oBAAoB,EAAE,QAAQ,CA6BjD;AAED;;;GAGG;AACH,uDAHW,OAAO,oBAAoB,EAAE,cAAc,GACzC,OAAO,oBAAoB,EAAE,QAAQ,CA4CjD;AAn8BD;IACI;;;;;;OAMG;IAEH;;;;OAIG;IACH,kBAJW,OAAO,YAAY,EAAE,OAAO,gBAC5B,OAAO,qBAAqB,EAAE,OAAO,UACrC,MAAM,EAmHhB;IAhHG,gGAAgC;IAChC,0EAAgB;IAChB,eAAoB;IAEpB,uBAAuB;IACvB,YADW,QAAQ,CACQ;IAE3B,uBAAuB;IACvB,kBADW,QAAQ,CACc;IAEjC,sFAAsF;IACtF,MADW,OAAO,CAAC,MAAM,CAAC,OAAO,oBAAoB,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAC/D;IAEd,+FAA+F;IAC/F,WADW,OAAO,CAAC,MAAM,CAAC,OAAO,oBAAoB,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAC9D;IAEnB,mFAAmF;IACnF,YADW,OAAO,CAAC,MAAM,CAAC,OAAO,gBAAgB,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC,CAC3D;IAEpB,4BAA4B;IAC5B,eADW,aAAa,CACM;IAE9B,uBAAuB;IACvB,OADW,QAAQ,CACG;IAEtB,qBAAqB;IACrB,kBADW,MAAM,CACQ;IAEzB,iCAAiC;IACjC,wBADW,MAAM,GAAG,SAAS,CACU;IAEvC,qBAAqB;IACrB,aADW,MAAM,CACG;IAEpB,wBAAwB;IACxB,QADW,SAAS,CACQ;IAwhBhC,6GAiBC;IAED;;OAEG;IACH,4BA2LC;IAED;;OAEG;IACH,yBAWC;IAED,uBAqBC;IAED,iCAEC;;CACJ;qBAj1BoB,gBAAgB;qBANK,gBAAgB;yBADjC,oBAAoB;sBASvB,gBAAgB;0BACoB,oBAAoB;sBALxD,wBAAwB;oBAF1B,sBAAsB"}
1
+ {"version":3,"file":"gridChild.d.ts","sourceRoot":"","sources":["../../../../src/view/gridView/gridChild.js"],"names":[],"mappings":"AA42BA;;;;;GAKG;AACH,qDALW,OAAO,yBAAyB,EAAE,uBAAuB,CAAC,MAAM,CAAC,sBACjE,OAAO,aACP,MAAM,GACJ,OAAO,yBAAyB,EAAE,WAAW,GAAG,SAAS,CAyBrE;AAcD;;;GAGG;AACH,iDAHW,OAAO,oBAAoB,EAAE,cAAc,GACzC,OAAO,oBAAoB,EAAE,QAAQ,CA6BjD;AAED;;;GAGG;AACH,uDAHW,OAAO,oBAAoB,EAAE,cAAc,GACzC,OAAO,oBAAoB,EAAE,QAAQ,CA4CjD;AAx8BD;IACI;;;;;;OAMG;IAEH;;;;OAIG;IACH,kBAJW,OAAO,YAAY,EAAE,OAAO,gBAC5B,OAAO,qBAAqB,EAAE,OAAO,UACrC,MAAM,EAwHhB;IArHG,gGAAgC;IAChC,0EAAgB;IAChB,eAAoB;IAEpB,uBAAuB;IACvB,YADW,QAAQ,CACQ;IAE3B,uBAAuB;IACvB,kBADW,QAAQ,CACc;IAEjC,sFAAsF;IACtF,MADW,OAAO,CAAC,MAAM,CAAC,OAAO,oBAAoB,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAC/D;IAEd,+FAA+F;IAC/F,WADW,OAAO,CAAC,MAAM,CAAC,OAAO,oBAAoB,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAC9D;IAEnB,mFAAmF;IACnF,YADW,OAAO,CAAC,MAAM,CAAC,OAAO,gBAAgB,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC,CAC3D;IAEpB,4BAA4B;IAC5B,eADW,aAAa,CACM;IAE9B,uBAAuB;IACvB,OADW,QAAQ,CACG;IAEtB,qBAAqB;IACrB,kBADW,MAAM,CACQ;IAEzB,iCAAiC;IACjC,wBADW,MAAM,GAAG,SAAS,CACU;IAEvC,qBAAqB;IACrB,aADW,MAAM,CACG;IAEpB,wBAAwB;IACxB,QADW,SAAS,CACQ;IA6hBhC,6GAiBC;IAED;;OAEG;IACH,4BA2LC;IAED;;OAEG;IACH,yBAWC;IAED,uBAqBC;IAED,iCAEC;;CACJ;qBAz1BoB,gBAAgB;qBANK,gBAAgB;yBADjC,oBAAoB;sBAYvB,gBAAgB;0BACoB,oBAAoB;sBARxD,wBAAwB;oBAF1B,sBAAsB"}
@@ -16,7 +16,10 @@ import Point from "../layout/point.js";
16
16
  import Rectangle from "../layout/rectangle.js";
17
17
  import createTitle, { resolveTitleSpec } from "../title.js";
18
18
  import UnitView from "../unitView.js";
19
- import { markViewAsNonAddressable } from "../viewSelectors.js";
19
+ import {
20
+ markViewAsChrome,
21
+ markViewAsNonAddressable,
22
+ } from "../viewSelectors.js";
20
23
  import Scrollbar from "./scrollbar.js";
21
24
  import SelectionRect, { INTERVAL_DRAG_ACTIVE_PARAM } from "./selectionRect.js";
22
25
  import { normalizeIntervalForSelection } from "../../scales/selectionDomainUtils.js";
@@ -101,6 +104,7 @@ export default class GridChild {
101
104
  markViewAsNonAddressable(this.background, {
102
105
  skipSubtree: true,
103
106
  });
107
+ markViewAsChrome(this.background, { skipSubtree: true });
104
108
  }
105
109
 
106
110
  const backgroundStrokeSpec = createBackgroundStroke(viewBackground);
@@ -118,6 +122,9 @@ export default class GridChild {
118
122
  markViewAsNonAddressable(this.backgroundStroke, {
119
123
  skipSubtree: true,
120
124
  });
125
+ markViewAsChrome(this.backgroundStroke, {
126
+ skipSubtree: true,
127
+ });
121
128
  }
122
129
 
123
130
  const titleSpec = resolveTitleSpec(
@@ -139,6 +146,7 @@ export default class GridChild {
139
146
  );
140
147
  this.title = unitView;
141
148
  markViewAsNonAddressable(this.title, { skipSubtree: true });
149
+ markViewAsChrome(this.title, { skipSubtree: true });
142
150
  }
143
151
  }
144
152
 
@@ -1 +1 @@
1
- {"version":3,"file":"gridView.d.ts","sourceRoot":"","sources":["../../../../src/view/gridView/gridView.js"],"names":[],"mappings":"AAmmCA;;GAEG;AACH,sHAUC;AA4DD;;;;;GAKG;AACH,4CAJW,OAAO,wBAAwB,EAAE,OAAO,UACxC,OAAO,oBAAoB,EAAE,UAAU,YACvC,QAAQ,aAmBlB;AAtpCD;;;;;;;;;;;;;;;;;;GAkBG;AACH,8BAH2D,KAAK,SAAnD,OAAQ,oBAAoB,EAAE,aAAc;IA6CrD;;;;;;;;;OASG;IACH,kBARW,KAAK,WACL,OAAO,4BAA4B,EAAE,OAAO,gBAC5C,aAAa,yFAEb,MAAM,WACN,MAAM,YACN,OAAO,YAAY,EAAE,WAAW,EAyC1C;IAtBG,uBAA0B;IAwB9B;;OAEG;IACH,6FAEC;IAED;;;;;;OAMG;IACH,4FAFa,SAAS,CAIrB;IAED;;;;;;;OAOG;IACH,oGAHW,MAAM,GACJ,SAAS,CASrB;IAED;;;;;OAKG;IACH,iGAQC;IAED;;;;;OAKG;IACH,qBAFW,MAAM,QAUhB;IAeD;;OAEG;IACH,mBAFW,qEAAM,QAWhB;IAYD;;OAEG;IACH,sFAEC;IAED,yBAEC;IAED;;OAEG;IACH,sCAKC;IAED;;;;OAIG;IACH,gCAqCC;;CA6xBJ;qBAtlC0D,gBAAgB;sBADrD,wBAAwB;0BAEpB,qBAAqB;sBAQzB,gBAAgB"}
1
+ {"version":3,"file":"gridView.d.ts","sourceRoot":"","sources":["../../../../src/view/gridView/gridView.js"],"names":[],"mappings":"AAywCA;;GAEG;AACH,sHAUC;AA4DD;;;;;GAKG;AACH,4CAJW,OAAO,wBAAwB,EAAE,OAAO,UACxC,OAAO,oBAAoB,EAAE,UAAU,YACvC,QAAQ,aAmBlB;AA3zCD;;;;;;;;;;;;;;;;;;GAkBG;AACH,8BAH2D,KAAK,SAAnD,OAAQ,oBAAoB,EAAE,aAAc;IA6CrD;;;;;;;;;OASG;IACH,kBARW,KAAK,WACL,OAAO,4BAA4B,EAAE,OAAO,gBAC5C,aAAa,yFAEb,MAAM,WACN,MAAM,YACN,OAAO,YAAY,EAAE,WAAW,EAyC1C;IAtBG,uBAA0B;IAwB9B;;OAEG;IACH,6FAEC;IAED;;;;;;OAMG;IACH,4FAFa,SAAS,CAIrB;IAED;;;;;;;OAOG;IACH,oGAHW,MAAM,GACJ,SAAS,CASrB;IAED;;;;;OAKG;IACH,iGAQC;IAED;;;;;OAKG;IACH,qBAFW,MAAM,QAUhB;IAeD;;OAEG;IACH,mBAFW,qEAAM,QAWhB;IAYD;;OAEG;IACH,sFAEC;IAED,yBAEC;IAED;;OAEG;IACH,sCAKC;IAED;;;;OAIG;IACH,gCAqCC;;CAu4BJ;qBAjsC0D,gBAAgB;sBADrD,wBAAwB;0BAEpB,qBAAqB;sBAQzB,gBAAgB"}