@genome-spy/core 0.67.0 → 0.68.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.
- package/dist/bundle/index.es.js +7641 -6313
- package/dist/bundle/index.js +115 -134
- package/dist/schema.json +534 -132
- package/dist/src/data/collector.d.ts +20 -0
- package/dist/src/data/collector.d.ts.map +1 -1
- package/dist/src/data/collector.js +148 -0
- package/dist/src/data/dataFlow.d.ts +6 -0
- package/dist/src/data/dataFlow.d.ts.map +1 -1
- package/dist/src/data/dataFlow.js +10 -0
- package/dist/src/data/flowInit.d.ts.map +1 -1
- package/dist/src/data/flowInit.js +2 -3
- package/dist/src/data/flowNode.d.ts +8 -0
- package/dist/src/data/flowNode.d.ts.map +1 -1
- package/dist/src/data/flowNode.js +18 -0
- package/dist/src/data/keyIndex.d.ts +18 -0
- package/dist/src/data/keyIndex.d.ts.map +1 -0
- package/dist/src/data/keyIndex.js +241 -0
- package/dist/src/data/keyIndex.test.d.ts +2 -0
- package/dist/src/data/keyIndex.test.d.ts.map +1 -0
- package/dist/src/data/sources/dataSource.d.ts.map +1 -1
- package/dist/src/data/sources/dataSource.js +5 -1
- package/dist/src/data/sources/dataSourceFactory.d.ts +14 -12
- package/dist/src/data/sources/dataSourceFactory.d.ts.map +1 -1
- package/dist/src/data/sources/dataSourceFactory.js +52 -16
- package/dist/src/data/sources/lazy/mockLazySource.d.ts +29 -0
- package/dist/src/data/sources/lazy/mockLazySource.d.ts.map +1 -0
- package/dist/src/data/sources/lazy/mockLazySource.js +44 -0
- package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts +22 -1
- package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/singleAxisLazySource.js +34 -2
- package/dist/src/data/sources/lazy/singleAxisWindowedSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/singleAxisWindowedSource.js +15 -0
- package/dist/src/data/sources/lazy/tabixSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/tabixSource.js +15 -5
- package/dist/src/data/transforms/stack.d.ts.map +1 -1
- package/dist/src/data/transforms/stack.js +1 -0
- package/dist/src/encoder/accessor.d.ts +43 -0
- package/dist/src/encoder/accessor.d.ts.map +1 -1
- package/dist/src/encoder/accessor.js +164 -0
- package/dist/src/encoder/encoder.d.ts +11 -2
- package/dist/src/encoder/encoder.d.ts.map +1 -1
- package/dist/src/encoder/encoder.js +24 -4
- package/dist/src/encoder/metadataChannels.d.ts +15 -0
- package/dist/src/encoder/metadataChannels.d.ts.map +1 -0
- package/dist/src/encoder/metadataChannels.js +65 -0
- package/dist/src/encoder/metadataChannels.test.d.ts +2 -0
- package/dist/src/encoder/metadataChannels.test.d.ts.map +1 -0
- package/dist/src/genome/scaleLocus.d.ts.map +1 -1
- package/dist/src/genome/scaleLocus.js +14 -1
- package/dist/src/genomeSpy/containerUi.d.ts +0 -1
- package/dist/src/genomeSpy/containerUi.d.ts.map +1 -1
- package/dist/src/genomeSpy/containerUi.js +0 -14
- package/dist/src/genomeSpy/loadingIndicatorManager.d.ts +3 -7
- package/dist/src/genomeSpy/loadingIndicatorManager.d.ts.map +1 -1
- package/dist/src/genomeSpy/loadingIndicatorManager.js +68 -20
- package/dist/src/genomeSpy/loadingStatusRegistry.d.ts +52 -0
- package/dist/src/genomeSpy/loadingStatusRegistry.d.ts.map +1 -0
- package/dist/src/genomeSpy/loadingStatusRegistry.js +86 -0
- package/dist/src/genomeSpy/viewContextFactory.d.ts.map +1 -1
- package/dist/src/genomeSpy/viewContextFactory.js +0 -1
- package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -1
- package/dist/src/genomeSpy/viewDataInit.js +56 -11
- package/dist/src/genomeSpy.d.ts +0 -2
- package/dist/src/genomeSpy.d.ts.map +1 -1
- package/dist/src/genomeSpy.js +46 -26
- package/dist/src/marks/mark.d.ts.map +1 -1
- package/dist/src/marks/mark.js +18 -11
- package/dist/src/marks/markUtils.js +1 -1
- package/dist/src/scale/scale.d.ts +6 -1
- package/dist/src/scale/scale.d.ts.map +1 -1
- package/dist/src/scale/scale.js +83 -23
- package/dist/src/scales/axisResolution.d.ts.map +1 -1
- package/dist/src/scales/axisResolution.js +10 -0
- package/dist/src/scales/{scaleDomainAggregator.d.ts → domainPlanner.d.ts} +6 -3
- package/dist/src/scales/domainPlanner.d.ts.map +1 -0
- package/dist/src/scales/{scaleDomainAggregator.js → domainPlanner.js} +128 -10
- package/dist/src/scales/domainPlanner.test.d.ts +2 -0
- package/dist/src/scales/domainPlanner.test.d.ts.map +1 -0
- package/dist/src/scales/scaleInteractionController.d.ts +6 -0
- package/dist/src/scales/scaleInteractionController.d.ts.map +1 -1
- package/dist/src/scales/scaleInteractionController.js +41 -3
- package/dist/src/scales/scaleResolution.d.ts +19 -17
- package/dist/src/scales/scaleResolution.d.ts.map +1 -1
- package/dist/src/scales/scaleResolution.js +181 -70
- package/dist/src/scales/scaleResolution.test.d.ts.map +1 -1
- package/dist/src/selection/selection.d.ts +21 -0
- package/dist/src/selection/selection.d.ts.map +1 -1
- package/dist/src/selection/selection.js +82 -0
- package/dist/src/spec/channel.d.ts +52 -15
- package/dist/src/spec/data.d.ts +4 -0
- package/dist/src/spec/parameter.d.ts +16 -11
- package/dist/src/spec/testing.d.ts +12 -0
- package/dist/src/spec/testing.d.ts.map +1 -0
- package/dist/src/spec/testing.js +20 -0
- package/dist/src/spec/view.d.ts +45 -10
- package/dist/src/styles/genome-spy.css +3 -31
- package/dist/src/styles/genome-spy.css.d.ts +1 -1
- package/dist/src/styles/genome-spy.css.d.ts.map +1 -1
- package/dist/src/styles/genome-spy.css.js +0 -29
- package/dist/src/types/encoder.d.ts +37 -2
- package/dist/src/types/rendering.d.ts +4 -3
- package/dist/src/types/viewContext.d.ts +0 -14
- package/dist/src/utils/throttle.d.ts +4 -1
- package/dist/src/utils/throttle.d.ts.map +1 -1
- package/dist/src/utils/throttle.js +54 -23
- package/dist/src/utils/throttle.test.d.ts +2 -0
- package/dist/src/utils/throttle.test.d.ts.map +1 -0
- package/dist/src/utils/transition.d.ts +21 -0
- package/dist/src/utils/transition.d.ts.map +1 -1
- package/dist/src/utils/transition.js +28 -0
- package/dist/src/utils/ui/tooltip.d.ts.map +1 -1
- package/dist/src/utils/ui/tooltip.js +7 -1
- package/dist/src/utils/ui/tooltip.test.d.ts +2 -0
- package/dist/src/utils/ui/tooltip.test.d.ts.map +1 -0
- package/dist/src/view/axisGridView.d.ts.map +1 -1
- package/dist/src/view/axisGridView.js +22 -5
- package/dist/src/view/axisView.d.ts.map +1 -1
- package/dist/src/view/axisView.js +20 -5
- package/dist/src/view/concatView.js +3 -3
- package/dist/src/view/containerMutationHelper.js +1 -1
- package/dist/src/view/containerView.d.ts +9 -5
- package/dist/src/view/containerView.d.ts.map +1 -1
- package/dist/src/view/containerView.js +34 -9
- package/dist/src/view/dataReadiness.d.ts +46 -0
- package/dist/src/view/dataReadiness.d.ts.map +1 -0
- package/dist/src/view/dataReadiness.js +267 -0
- package/dist/src/view/dataReadiness.test.d.ts +2 -0
- package/dist/src/view/dataReadiness.test.d.ts.map +1 -0
- package/dist/src/view/facetView.d.ts.map +1 -1
- package/dist/src/view/facetView.js +7 -5
- package/dist/src/view/flowBuilder.d.ts.map +1 -1
- package/dist/src/view/flowBuilder.js +5 -1
- package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
- package/dist/src/view/gridView/gridChild.js +8 -0
- package/dist/src/view/gridView/gridView.d.ts.map +1 -1
- package/dist/src/view/gridView/gridView.js +119 -2
- package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
- package/dist/src/view/gridView/scrollbar.js +3 -0
- package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
- package/dist/src/view/gridView/selectionRect.js +20 -5
- package/dist/src/view/gridView/separatorView.d.ts +51 -0
- package/dist/src/view/gridView/separatorView.d.ts.map +1 -0
- package/dist/src/view/gridView/separatorView.js +275 -0
- package/dist/src/view/layerView.js +3 -3
- package/dist/src/view/layout/flexLayout.d.ts +0 -30
- package/dist/src/view/layout/flexLayout.d.ts.map +1 -1
- package/dist/src/view/layout/flexLayout.js +0 -86
- package/dist/src/view/paramMediator.d.ts +19 -0
- package/dist/src/view/paramMediator.d.ts.map +1 -1
- package/dist/src/view/paramMediator.js +86 -19
- package/dist/src/view/testUtils.d.ts.map +1 -1
- package/dist/src/view/testUtils.js +6 -1
- package/dist/src/view/unitView.d.ts +8 -13
- package/dist/src/view/unitView.d.ts.map +1 -1
- package/dist/src/view/unitView.js +110 -41
- package/dist/src/view/view.d.ts +22 -14
- package/dist/src/view/view.d.ts.map +1 -1
- package/dist/src/view/view.js +93 -9
- package/dist/src/view/viewFactory.d.ts.map +1 -1
- package/dist/src/view/viewFactory.js +20 -1
- package/dist/src/view/viewSelectors.d.ts +148 -0
- package/dist/src/view/viewSelectors.d.ts.map +1 -0
- package/dist/src/view/viewSelectors.js +773 -0
- package/dist/src/view/viewSelectors.test.d.ts +2 -0
- package/dist/src/view/viewSelectors.test.d.ts.map +1 -0
- package/dist/src/view/viewUtils.d.ts +0 -8
- package/dist/src/view/viewUtils.d.ts.map +1 -1
- package/dist/src/view/viewUtils.js +1 -21
- package/package.json +3 -3
- package/dist/src/scales/scaleDomainAggregator.d.ts.map +0 -1
- package/dist/src/scales/scaleDomainAggregator.test.d.ts +0 -2
- package/dist/src/scales/scaleDomainAggregator.test.d.ts.map +0 -1
package/dist/src/scale/scale.js
CHANGED
|
@@ -11,8 +11,20 @@
|
|
|
11
11
|
/* eslint-disable */
|
|
12
12
|
// @ts-nocheck
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
/*
|
|
15
|
+
* Rewrite rationale (non-perf):
|
|
16
|
+
* - This module mixes spec-level policy, vega-scale helpers, and D3 scale
|
|
17
|
+
* mutability. The combination works but is clunky to maintain and hard to
|
|
18
|
+
* integrate with higher-level orchestration like ScaleResolution.
|
|
19
|
+
* - Side-effectful configuration and implicit defaults make the data flow
|
|
20
|
+
* difficult to reason about and to test in isolation.
|
|
21
|
+
*
|
|
22
|
+
* Why not rewrite yet:
|
|
23
|
+
* - Behavior is subtle and well-tested; a rewrite is risky without a clear
|
|
24
|
+
* contract for the pure inputs/outputs and their callers.
|
|
25
|
+
* - It depends on D3 scale semantics (copy, unknown, interpolate, etc.), so any
|
|
26
|
+
* refactor must preserve those semantics explicitly.
|
|
27
|
+
*/
|
|
16
28
|
|
|
17
29
|
import { tickCount } from "./ticks.js";
|
|
18
30
|
import {
|
|
@@ -128,11 +140,15 @@ export function configureScale(_, scale, logger) {
|
|
|
128
140
|
}
|
|
129
141
|
}
|
|
130
142
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
)
|
|
143
|
+
const domainConfig = configureDomain(scale, _, logger);
|
|
144
|
+
if (domainConfig.domain) {
|
|
145
|
+
scale.domain(domainConfig.domain);
|
|
146
|
+
}
|
|
147
|
+
if (domainConfig.applyOrdinalUnknown) {
|
|
148
|
+
scale.unknown(domainConfig.ordinalUnknown);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
configureRange(scale, _, configureBins(scale, _, domainConfig.count));
|
|
136
152
|
}
|
|
137
153
|
|
|
138
154
|
/**
|
|
@@ -191,24 +207,62 @@ function isContinuousColor(_) {
|
|
|
191
207
|
);
|
|
192
208
|
}
|
|
193
209
|
|
|
210
|
+
function copyScaleForDomain(scale) {
|
|
211
|
+
if (!scale.copy) {
|
|
212
|
+
return scale;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
const copy = scale.copy();
|
|
216
|
+
if (copy.type == null && scale.type != null) {
|
|
217
|
+
copy.type = scale.type;
|
|
218
|
+
}
|
|
219
|
+
return copy;
|
|
220
|
+
}
|
|
221
|
+
|
|
194
222
|
export function configureDomain(scale, _, logger) {
|
|
195
223
|
if (!scale.domain) {
|
|
196
|
-
return
|
|
224
|
+
return {
|
|
225
|
+
domain: null,
|
|
226
|
+
count: 0,
|
|
227
|
+
ordinalUnknown: undefined,
|
|
228
|
+
applyOrdinalUnknown: false,
|
|
229
|
+
};
|
|
197
230
|
}
|
|
198
231
|
|
|
199
232
|
logger = ensureLogger(logger);
|
|
200
233
|
|
|
234
|
+
const workingScale = copyScaleForDomain(scale);
|
|
235
|
+
|
|
201
236
|
// check raw domain, if provided use that and exit early
|
|
202
|
-
var raw = rawDomain(
|
|
203
|
-
if (raw > -1)
|
|
237
|
+
var raw = rawDomain(workingScale, _.domainRaw, logger);
|
|
238
|
+
if (raw > -1) {
|
|
239
|
+
return {
|
|
240
|
+
domain: workingScale.domain(),
|
|
241
|
+
count: raw,
|
|
242
|
+
ordinalUnknown:
|
|
243
|
+
workingScale.type === Ordinal
|
|
244
|
+
? _.domainImplicit
|
|
245
|
+
? scaleImplicit
|
|
246
|
+
: undefined
|
|
247
|
+
: undefined,
|
|
248
|
+
applyOrdinalUnknown: false,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
204
251
|
|
|
205
252
|
var domain = _.domain,
|
|
206
|
-
type =
|
|
207
|
-
zero = _.zero || (_.zero === undefined && includeZero(
|
|
253
|
+
type = workingScale.type,
|
|
254
|
+
zero = _.zero || (_.zero === undefined && includeZero(workingScale)),
|
|
208
255
|
n,
|
|
209
256
|
mid;
|
|
210
257
|
|
|
211
|
-
if (!domain)
|
|
258
|
+
if (!domain) {
|
|
259
|
+
return {
|
|
260
|
+
domain: null,
|
|
261
|
+
count: 0,
|
|
262
|
+
ordinalUnknown: undefined,
|
|
263
|
+
applyOrdinalUnknown: false,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
212
266
|
|
|
213
267
|
// adjust continuous domain for minimum pixel padding
|
|
214
268
|
if (includePad(type) && _.padding && domain[0] !== peek(domain)) {
|
|
@@ -247,21 +301,27 @@ export function configureDomain(scale, _, logger) {
|
|
|
247
301
|
}
|
|
248
302
|
|
|
249
303
|
// set the scale domain
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
// if ordinal scale domain is defined, prevent implicit
|
|
253
|
-
// domain construction as side-effect of scale lookup
|
|
254
|
-
if (type === Ordinal) {
|
|
255
|
-
scale.unknown(_.domainImplicit ? scaleImplicit : undefined);
|
|
256
|
-
}
|
|
304
|
+
workingScale.domain(domainCheck(type, domain, logger));
|
|
257
305
|
|
|
258
306
|
// perform 'nice' adjustment as requested
|
|
259
|
-
if (_.nice &&
|
|
260
|
-
|
|
307
|
+
if (_.nice && workingScale.nice) {
|
|
308
|
+
workingScale.nice(
|
|
309
|
+
(_.nice !== true && tickCount(workingScale, _.nice)) || null
|
|
310
|
+
);
|
|
261
311
|
}
|
|
262
312
|
|
|
263
313
|
// return the cardinality of the domain
|
|
264
|
-
return
|
|
314
|
+
return {
|
|
315
|
+
domain: workingScale.domain(),
|
|
316
|
+
count: domain.length,
|
|
317
|
+
ordinalUnknown:
|
|
318
|
+
type === Ordinal
|
|
319
|
+
? _.domainImplicit
|
|
320
|
+
? scaleImplicit
|
|
321
|
+
: undefined
|
|
322
|
+
: undefined,
|
|
323
|
+
applyOrdinalUnknown: type === Ordinal,
|
|
324
|
+
};
|
|
265
325
|
}
|
|
266
326
|
|
|
267
327
|
function rawDomain(scale, raw, logger) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"axisResolution.d.ts","sourceRoot":"","sources":["../../../src/scales/axisResolution.js"],"names":[],"mappings":"AAcA;;;;;;;GAOG;AACH;IASI;;OAEG;IACH,qBAFW,OAAO,oBAAoB,EAAE,wBAAwB,EAI/D;IADG,+DAAsB;IAG1B,2BAGC;IAiCD;;;OAGG;IACH,uBAHW,oBAAoB,GAClB,MAAM,OAAO,CAQzB;IAED;;;OAGG;IACH,qBAHW,oBAAoB,GAClB,OAAO,CAQnB;IAED,qDAuBC;IAED,
|
|
1
|
+
{"version":3,"file":"axisResolution.d.ts","sourceRoot":"","sources":["../../../src/scales/axisResolution.js"],"names":[],"mappings":"AAcA;;;;;;;GAOG;AACH;IASI;;OAEG;IACH,qBAFW,OAAO,oBAAoB,EAAE,wBAAwB,EAI/D;IADG,+DAAsB;IAG1B,2BAGC;IAiCD;;;OAGG;IACH,uBAHW,oBAAoB,GAClB,MAAM,OAAO,CAQzB;IAED;;;OAGG;IACH,qBAHW,oBAAoB,GAClB,OAAO,CAQnB;IAED,qDAuBC;IAED,mBAmEC;;CACJ;iCAhL6D,CAAC,SAAlD,OAAQ,oBAAoB,EAAE,iBAAkB;UAGnD,OAAO,qBAAqB,EAAE,OAAO;aACrC,CAAC;gBACD,OAAO,oBAAoB,EAAE,mBAAmB"}
|
|
@@ -137,6 +137,9 @@ export default class AxisResolution {
|
|
|
137
137
|
|
|
138
138
|
return {
|
|
139
139
|
member,
|
|
140
|
+
axisTitle:
|
|
141
|
+
// TODO: Proper type guard
|
|
142
|
+
"axis" in channelDef ? channelDef.axis?.title : undefined,
|
|
140
143
|
explicitTitle: coalesce(
|
|
141
144
|
// TODO: Proper type guard
|
|
142
145
|
"axis" in channelDef ? channelDef.axis?.title : undefined,
|
|
@@ -150,6 +153,13 @@ export default class AxisResolution {
|
|
|
150
153
|
};
|
|
151
154
|
|
|
152
155
|
const titles = Array.from(this.#members).map(computeTitle);
|
|
156
|
+
const explicitAxisTitle = titles
|
|
157
|
+
.map((title) => title.axisTitle)
|
|
158
|
+
.find((title) => title !== undefined);
|
|
159
|
+
|
|
160
|
+
if (explicitAxisTitle !== undefined) {
|
|
161
|
+
return explicitAxisTitle;
|
|
162
|
+
}
|
|
153
163
|
|
|
154
164
|
// Skip implicit secondary channel titles if the primary channel has an explicit title
|
|
155
165
|
const filteredTitles = titles.filter((title) => {
|
|
@@ -4,16 +4,18 @@
|
|
|
4
4
|
* @typedef {import("../spec/scale.js").ScalarDomain} ScalarDomain
|
|
5
5
|
* @typedef {import("./scaleResolution.js").ScaleResolutionMember} ScaleResolutionMember
|
|
6
6
|
*/
|
|
7
|
-
export default class
|
|
7
|
+
export default class DomainPlanner {
|
|
8
8
|
/**
|
|
9
9
|
* @param {object} options
|
|
10
10
|
* @param {() => Set<ScaleResolutionMember>} options.getMembers
|
|
11
|
+
* @param {() => Set<ScaleResolutionMember>} [options.getDataMembers]
|
|
11
12
|
* @param {() => import("../spec/channel.js").Type} options.getType
|
|
12
13
|
* @param {() => number[]} options.getLocusExtent
|
|
13
14
|
* @param {(interval: ScalarDomain | ComplexDomain) => number[]} options.fromComplexInterval
|
|
14
15
|
*/
|
|
15
|
-
constructor({ getMembers, getType, getLocusExtent, fromComplexInterval }: {
|
|
16
|
+
constructor({ getMembers, getDataMembers, getType, getLocusExtent, fromComplexInterval, }: {
|
|
16
17
|
getMembers: () => Set<ScaleResolutionMember>;
|
|
18
|
+
getDataMembers?: () => Set<ScaleResolutionMember>;
|
|
17
19
|
getType: () => import("../spec/channel.js").Type;
|
|
18
20
|
getLocusExtent: () => number[];
|
|
19
21
|
fromComplexInterval: (interval: ScalarDomain | ComplexDomain) => number[];
|
|
@@ -23,6 +25,7 @@ export default class ScaleDomainAggregator {
|
|
|
23
25
|
*/
|
|
24
26
|
get initialDomainSnapshot(): any[];
|
|
25
27
|
hasConfiguredDomain(): boolean;
|
|
28
|
+
invalidateConfiguredDomain(): void;
|
|
26
29
|
/**
|
|
27
30
|
* Returns the configured domain or a data-derived/default domain.
|
|
28
31
|
*
|
|
@@ -54,4 +57,4 @@ export type DomainArray = import("../utils/domainArray.js").DomainArray;
|
|
|
54
57
|
export type ComplexDomain = import("../spec/scale.js").ComplexDomain;
|
|
55
58
|
export type ScalarDomain = import("../spec/scale.js").ScalarDomain;
|
|
56
59
|
export type ScaleResolutionMember = import("./scaleResolution.js").ScaleResolutionMember;
|
|
57
|
-
//# sourceMappingURL=
|
|
60
|
+
//# sourceMappingURL=domainPlanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domainPlanner.d.ts","sourceRoot":"","sources":["../../../src/scales/domainPlanner.js"],"names":[],"mappings":"AAOA;;;;;GAKG;AAEH;IA2BI;;;;;;;OAOG;IACH,2FANG;QAAkD,UAAU,EAApD,MAAM,GAAG,CAAC,qBAAqB,CAAC;QACW,cAAc,GAAzD,MAAM,GAAG,CAAC,qBAAqB,CAAC;QACiB,OAAO,EAAxD,MAAM,OAAO,oBAAoB,EAAE,IAAI;QACf,cAAc,EAAtC,MAAM,MAAM,EAAE;QACgD,mBAAmB,EAAjF,CAAC,QAAQ,EAAE,YAAY,GAAG,aAAa,KAAK,MAAM,EAAE;KAC9D,EAaA;IAED;;OAEG;IACH,6BAFa,GAAG,EAAE,CAIjB;IAED,+BAEC;IAED,mCAEC;IAED;;;;;OAKG;IACH,iDAHW,OAAO,GACL,GAAG,EAAE,CAYjB;IAED;;;;OAIG;IACH,uBAFY,WAAW,CActB;IAED;;;;OAIG;IACH,iBAFY,WAAW,GAAG,SAAS,CAQlC;IAED;;;;OAIG;IACH,4BAJW,OAAO,qBAAqB,EAAE,SAAS,wBACvC,OAAO,GACL,OAAO,CAgBnB;;CAkCJ;0BA7KY,OAAO,yBAAyB,EAAE,WAAW;4BAC7C,OAAO,kBAAkB,EAAE,aAAa;2BACxC,OAAO,kBAAkB,EAAE,YAAY;oCACvC,OAAO,sBAAsB,EAAE,qBAAqB"}
|
|
@@ -3,6 +3,7 @@ import { isContinuous } from "vega-scale";
|
|
|
3
3
|
|
|
4
4
|
import { LOCUS } from "./scaleResolutionConstants.js";
|
|
5
5
|
import createDomain from "../utils/domainArray.js";
|
|
6
|
+
import { getAccessorDomainKey, isScaleAccessor } from "../encoder/accessor.js";
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* @typedef {import("../utils/domainArray.js").DomainArray} DomainArray
|
|
@@ -11,10 +12,13 @@ import createDomain from "../utils/domainArray.js";
|
|
|
11
12
|
* @typedef {import("./scaleResolution.js").ScaleResolutionMember} ScaleResolutionMember
|
|
12
13
|
*/
|
|
13
14
|
|
|
14
|
-
export default class
|
|
15
|
+
export default class DomainPlanner {
|
|
15
16
|
/** @type {() => Set<ScaleResolutionMember>} */
|
|
16
17
|
#getMembers;
|
|
17
18
|
|
|
19
|
+
/** @type {() => Set<ScaleResolutionMember>} */
|
|
20
|
+
#getDataMembers;
|
|
21
|
+
|
|
18
22
|
/** @type {() => import("../spec/channel.js").Type} */
|
|
19
23
|
#getType;
|
|
20
24
|
|
|
@@ -27,15 +31,31 @@ export default class ScaleDomainAggregator {
|
|
|
27
31
|
/** @type {any[]} */
|
|
28
32
|
#initialDomain;
|
|
29
33
|
|
|
34
|
+
/** @type {DomainArray | undefined} */
|
|
35
|
+
#configuredDomain;
|
|
36
|
+
|
|
37
|
+
#configuredDomainDirty = true;
|
|
38
|
+
|
|
39
|
+
/** @type {WeakMap<ScaleResolutionMember, import("../types/encoder.js").ScaleAccessor[]>} */
|
|
40
|
+
#accessorsByMember = new WeakMap();
|
|
41
|
+
|
|
30
42
|
/**
|
|
31
43
|
* @param {object} options
|
|
32
44
|
* @param {() => Set<ScaleResolutionMember>} options.getMembers
|
|
45
|
+
* @param {() => Set<ScaleResolutionMember>} [options.getDataMembers]
|
|
33
46
|
* @param {() => import("../spec/channel.js").Type} options.getType
|
|
34
47
|
* @param {() => number[]} options.getLocusExtent
|
|
35
48
|
* @param {(interval: ScalarDomain | ComplexDomain) => number[]} options.fromComplexInterval
|
|
36
49
|
*/
|
|
37
|
-
constructor({
|
|
50
|
+
constructor({
|
|
51
|
+
getMembers,
|
|
52
|
+
getDataMembers,
|
|
53
|
+
getType,
|
|
54
|
+
getLocusExtent,
|
|
55
|
+
fromComplexInterval,
|
|
56
|
+
}) {
|
|
38
57
|
this.#getMembers = getMembers;
|
|
58
|
+
this.#getDataMembers = getDataMembers ?? getMembers;
|
|
39
59
|
this.#getType = getType;
|
|
40
60
|
this.#getLocusExtent = getLocusExtent;
|
|
41
61
|
this.#fromComplexInterval = fromComplexInterval;
|
|
@@ -52,6 +72,10 @@ export default class ScaleDomainAggregator {
|
|
|
52
72
|
return !!this.getConfiguredDomain();
|
|
53
73
|
}
|
|
54
74
|
|
|
75
|
+
invalidateConfiguredDomain() {
|
|
76
|
+
this.#configuredDomainDirty = true;
|
|
77
|
+
}
|
|
78
|
+
|
|
55
79
|
/**
|
|
56
80
|
* Returns the configured domain or a data-derived/default domain.
|
|
57
81
|
*
|
|
@@ -76,10 +100,17 @@ export default class ScaleDomainAggregator {
|
|
|
76
100
|
* @return {DomainArray}
|
|
77
101
|
*/
|
|
78
102
|
getConfiguredDomain() {
|
|
79
|
-
|
|
103
|
+
if (!this.#configuredDomainDirty) {
|
|
104
|
+
return this.#configuredDomain;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const domain = resolveConfiguredDomain(
|
|
80
108
|
this.#getMembers(),
|
|
81
109
|
this.#fromComplexInterval
|
|
82
110
|
);
|
|
111
|
+
this.#configuredDomain = domain;
|
|
112
|
+
this.#configuredDomainDirty = false;
|
|
113
|
+
return domain;
|
|
83
114
|
}
|
|
84
115
|
|
|
85
116
|
/**
|
|
@@ -88,7 +119,11 @@ export default class ScaleDomainAggregator {
|
|
|
88
119
|
* @return {DomainArray | undefined}
|
|
89
120
|
*/
|
|
90
121
|
getDataDomain() {
|
|
91
|
-
return resolveDataDomain(
|
|
122
|
+
return resolveDataDomain(
|
|
123
|
+
this.#getDataMembers(),
|
|
124
|
+
this.#getType,
|
|
125
|
+
(member) => this.#getMemberAccessors(member)
|
|
126
|
+
);
|
|
92
127
|
}
|
|
93
128
|
|
|
94
129
|
/**
|
|
@@ -111,6 +146,39 @@ export default class ScaleDomainAggregator {
|
|
|
111
146
|
|
|
112
147
|
return false;
|
|
113
148
|
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* @param {ScaleResolutionMember} member
|
|
152
|
+
* @returns {import("../types/encoder.js").ScaleAccessor[]}
|
|
153
|
+
*/
|
|
154
|
+
#getMemberAccessors(member) {
|
|
155
|
+
const cached = this.#accessorsByMember.get(member);
|
|
156
|
+
if (cached) {
|
|
157
|
+
return cached;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const encoders = member.view.mark.encoders;
|
|
161
|
+
if (!encoders) {
|
|
162
|
+
return [];
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const encoder = encoders[member.channel];
|
|
166
|
+
if (!encoder) {
|
|
167
|
+
return [];
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const accessors = encoder.accessors ?? [];
|
|
171
|
+
if (accessors.length === 0) {
|
|
172
|
+
return [];
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const scaleAccessors = accessors
|
|
176
|
+
.filter(isScaleAccessor)
|
|
177
|
+
.filter((accessor) => !accessor.channelDef.domainInert);
|
|
178
|
+
|
|
179
|
+
this.#accessorsByMember.set(member, scaleAccessors);
|
|
180
|
+
return scaleAccessors;
|
|
181
|
+
}
|
|
114
182
|
}
|
|
115
183
|
|
|
116
184
|
/**
|
|
@@ -120,6 +188,7 @@ export default class ScaleDomainAggregator {
|
|
|
120
188
|
*/
|
|
121
189
|
function resolveConfiguredDomain(members, fromComplexInterval) {
|
|
122
190
|
const domains = Array.from(members)
|
|
191
|
+
.filter((member) => member.contributesToDomain)
|
|
123
192
|
.map((member) => member.channelDef)
|
|
124
193
|
.filter((channelDef) => channelDef.scale?.domain)
|
|
125
194
|
.map((channelDef) =>
|
|
@@ -139,18 +208,67 @@ function resolveConfiguredDomain(members, fromComplexInterval) {
|
|
|
139
208
|
/**
|
|
140
209
|
* @param {Set<ScaleResolutionMember>} members
|
|
141
210
|
* @param {() => import("../spec/channel.js").Type} getType
|
|
211
|
+
* @param {(member: ScaleResolutionMember) => import("../types/encoder.js").ScaleAccessor[]} getAccessorsForMember
|
|
142
212
|
* @returns {DomainArray | undefined}
|
|
143
213
|
*/
|
|
144
|
-
function resolveDataDomain(members, getType) {
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
|
|
214
|
+
function resolveDataDomain(members, getType, getAccessorsForMember) {
|
|
215
|
+
const type = getType();
|
|
216
|
+
|
|
217
|
+
/** @type {Map<import("../data/collector.js").default | null, Map<string, DomainArray>>} */
|
|
218
|
+
const domainsByCollector = new Map();
|
|
219
|
+
|
|
220
|
+
for (const member of members) {
|
|
221
|
+
if (!member.contributesToDomain) {
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
const accessors = getAccessorsForMember(member);
|
|
226
|
+
if (accessors.length === 0) {
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
const collector = member.view.getCollector();
|
|
231
|
+
|
|
232
|
+
for (const accessor of accessors) {
|
|
233
|
+
const domainKey = getAccessorDomainKey(accessor, type);
|
|
234
|
+
|
|
235
|
+
const collectorKey = collector ?? null;
|
|
236
|
+
let domainsForCollector = domainsByCollector.get(collectorKey);
|
|
237
|
+
if (!domainsForCollector) {
|
|
238
|
+
domainsForCollector = new Map();
|
|
239
|
+
domainsByCollector.set(collectorKey, domainsForCollector);
|
|
240
|
+
}
|
|
148
241
|
|
|
149
|
-
|
|
242
|
+
if (domainsForCollector.has(domainKey)) {
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
let domain;
|
|
247
|
+
if (collector) {
|
|
248
|
+
domain = collector.getDomain(domainKey, type, accessor);
|
|
249
|
+
} else if (accessor.constant) {
|
|
250
|
+
domain = createDomain(type);
|
|
251
|
+
domain.extend(accessor({}));
|
|
252
|
+
} else {
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
domainsForCollector.set(domainKey, domain);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
if (domainsByCollector.size === 0) {
|
|
150
261
|
return undefined;
|
|
151
262
|
}
|
|
152
263
|
|
|
153
|
-
|
|
264
|
+
const domain = createDomain(type);
|
|
265
|
+
for (const domainsForCollector of domainsByCollector.values()) {
|
|
266
|
+
for (const memberDomain of domainsForCollector.values()) {
|
|
267
|
+
domain.extendAll(memberDomain);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
return domain;
|
|
154
272
|
}
|
|
155
273
|
|
|
156
274
|
/**
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domainPlanner.test.d.ts","sourceRoot":"","sources":["../../../src/scales/domainPlanner.test.js"],"names":[],"mappings":""}
|
|
@@ -27,6 +27,12 @@ export default class ScaleInteractionController {
|
|
|
27
27
|
getZoomExtent(): number[];
|
|
28
28
|
isZoomable(): boolean;
|
|
29
29
|
isZoomingSupported(): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* @param {number[]} previousDomain
|
|
32
|
+
* @param {number[]} newDomain
|
|
33
|
+
* @returns {"restore" | "animate" | "notify" | "none"}
|
|
34
|
+
*/
|
|
35
|
+
getDomainChangeAction(previousDomain: number[], newDomain: number[]): "restore" | "animate" | "notify" | "none";
|
|
30
36
|
/**
|
|
31
37
|
* Return true if the scale is zoomable and the current domain differs from the initial domain.
|
|
32
38
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaleInteractionController.d.ts","sourceRoot":"","sources":["../../../src/scales/scaleInteractionController.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scaleInteractionController.d.ts","sourceRoot":"","sources":["../../../src/scales/scaleInteractionController.js"],"names":[],"mappings":"AAoBA;;;;;;;GAOG;AAEH;IAsBI;;;;;;;;OAQG;IACH,wHAPG;QAAsC,QAAQ,EAAtC,MAAM,cAAc;QACkC,WAAW,EAAjE,MAAM,OAAO,sBAAsB,EAAE,OAAO;QACpB,wBAAwB,EAAhD,MAAM,MAAM,EAAE;QACU,cAAc,EAAtC,MAAM,MAAM,EAAE;QAC8C,mBAAmB,EAA/E,CAAC,MAAM,EAAE,YAAY,GAAG,aAAa,KAAK,MAAM,EAAE;QAC1B,eAAe,EAAvC,MAAM,MAAM,EAAE;KACxB,EAeA;IAED,0BAUC;IAED,sBAEC;IAED,8BAGC;IAED;;;;OAIG;IACH,sCAJW,MAAM,EAAE,aACR,MAAM,EAAE,GACN,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAarD;IAED;;;;OAIG;IACH,oBAQC;IAED;;;;;;;OAOG;IACH,kBALW,MAAM,eACN,MAAM,OACN,MAAM,GACJ,OAAO,CA2BnB;IAED;;;;;;OAMG;IACH,eAJW,aAAa,GAAG,aAAa,aAC7B,OAAO,GAAG,MAAM,iBA+D1B;IASD;;;;OAIG;IACH,qBAcC;IAED;;OAEG;IACH,uBAOC;;CACJ;4BA5PY,OAAO,kBAAkB,EAAE,aAAa;2BACxC,OAAO,kBAAkB,EAAE,YAAY;4BACvC,OAAO,kBAAkB,EAAE,aAAa;yBACxC,OAAO,kBAAkB,EAAE,UAAU;wBACrC,OAAO,qBAAqB,EAAE,SAAS;6BACvC,SAAS,GAAG;IAAE,KAAK,EAAE,OAAO,kBAAkB,EAAE,KAAK,CAAA;CAAE"}
|
|
@@ -11,11 +11,12 @@ import {
|
|
|
11
11
|
zoomLog,
|
|
12
12
|
zoomPow,
|
|
13
13
|
} from "vega-util";
|
|
14
|
-
import { isContinuous } from "vega-scale";
|
|
14
|
+
import { isContinuous, isDiscrete } from "vega-scale";
|
|
15
15
|
import { easeCubicInOut } from "d3-ease";
|
|
16
16
|
|
|
17
17
|
import eerp from "../utils/eerp.js";
|
|
18
18
|
import { shallowArrayEquals } from "../utils/arrayUtils.js";
|
|
19
|
+
import { createCancelToken } from "../utils/transition.js";
|
|
19
20
|
|
|
20
21
|
/**
|
|
21
22
|
* @typedef {import("../spec/scale.js").NumericDomain} NumericDomain
|
|
@@ -45,6 +46,9 @@ export default class ScaleInteractionController {
|
|
|
45
46
|
/** @type {() => number[]} */
|
|
46
47
|
#getGenomeExtent;
|
|
47
48
|
|
|
49
|
+
/** @type {{ canceled: boolean } | null} */
|
|
50
|
+
#zoomTransitionToken = null;
|
|
51
|
+
|
|
48
52
|
/**
|
|
49
53
|
* @param {object} options
|
|
50
54
|
* @param {() => ScaleWithProps} options.getScale
|
|
@@ -87,7 +91,26 @@ export default class ScaleInteractionController {
|
|
|
87
91
|
}
|
|
88
92
|
|
|
89
93
|
isZoomingSupported() {
|
|
90
|
-
|
|
94
|
+
const type = this.#getScale().type;
|
|
95
|
+
return isContinuous(type) && !isDiscrete(type);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* @param {number[]} previousDomain
|
|
100
|
+
* @param {number[]} newDomain
|
|
101
|
+
* @returns {"restore" | "animate" | "notify" | "none"}
|
|
102
|
+
*/
|
|
103
|
+
getDomainChangeAction(previousDomain, newDomain) {
|
|
104
|
+
if (shallowArrayEquals(newDomain, previousDomain)) {
|
|
105
|
+
return "none";
|
|
106
|
+
}
|
|
107
|
+
if (this.isZoomable()) {
|
|
108
|
+
return "restore";
|
|
109
|
+
}
|
|
110
|
+
if (this.isZoomingSupported()) {
|
|
111
|
+
return "animate";
|
|
112
|
+
}
|
|
113
|
+
return "notify";
|
|
91
114
|
}
|
|
92
115
|
|
|
93
116
|
/**
|
|
@@ -178,10 +201,14 @@ export default class ScaleInteractionController {
|
|
|
178
201
|
const ac = from[0] == to[0];
|
|
179
202
|
const bc = from[1] == to[1];
|
|
180
203
|
|
|
181
|
-
|
|
204
|
+
this.#cancelZoomTransition();
|
|
205
|
+
const cancelToken = createCancelToken();
|
|
206
|
+
this.#zoomTransitionToken = cancelToken;
|
|
207
|
+
|
|
182
208
|
await animator.transition({
|
|
183
209
|
duration,
|
|
184
210
|
easingFunction: easeCubicInOut,
|
|
211
|
+
cancelToken,
|
|
185
212
|
onUpdate: (t) => {
|
|
186
213
|
const w = eerp(fw, tw, t);
|
|
187
214
|
const wt = fw == tw ? t : (fw - w) / (fw - tw);
|
|
@@ -194,13 +221,24 @@ export default class ScaleInteractionController {
|
|
|
194
221
|
},
|
|
195
222
|
});
|
|
196
223
|
|
|
224
|
+
if (this.#zoomTransitionToken === cancelToken) {
|
|
225
|
+
this.#zoomTransitionToken = null;
|
|
226
|
+
}
|
|
197
227
|
scale.domain(to);
|
|
198
228
|
} else {
|
|
229
|
+
this.#cancelZoomTransition();
|
|
199
230
|
scale.domain(to);
|
|
200
231
|
animator?.requestRender();
|
|
201
232
|
}
|
|
202
233
|
}
|
|
203
234
|
|
|
235
|
+
#cancelZoomTransition() {
|
|
236
|
+
if (this.#zoomTransitionToken) {
|
|
237
|
+
this.#zoomTransitionToken.canceled = true;
|
|
238
|
+
this.#zoomTransitionToken = null;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
204
242
|
/**
|
|
205
243
|
* Resets the current domain to the initial one
|
|
206
244
|
*
|
|
@@ -1,18 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Reconfigures scale domains for resolutions used by the given view(s).
|
|
3
|
-
*
|
|
4
|
-
* Use this for data-driven updates where only domains need refreshing.
|
|
5
|
-
*
|
|
6
|
-
* TODO: This should be made unnecessary. Collectors should trigger the reconfiguration
|
|
7
|
-
* for those views that get their data from the collector.
|
|
8
|
-
*
|
|
9
|
-
* TODO: This may reconfigure channels that are not affected by the change.
|
|
10
|
-
* Causes performance issues with domains that are extracted from data.
|
|
11
|
-
*
|
|
12
|
-
* @param {import("../view/view.js").default | import("../view/view.js").default[]} fromViews
|
|
13
|
-
* @param {(view: import("../view/view.js").default) => boolean} [viewFilter]
|
|
14
|
-
*/
|
|
15
|
-
export function reconfigureScaleDomains(fromViews: import("../view/view.js").default | import("../view/view.js").default[], viewFilter?: (view: import("../view/view.js").default) => boolean): void;
|
|
16
1
|
/**
|
|
17
2
|
* @template {ChannelWithScale}[T=ChannelWithScale]
|
|
18
3
|
*
|
|
@@ -20,7 +5,7 @@ export function reconfigureScaleDomains(fromViews: import("../view/view.js").def
|
|
|
20
5
|
* @prop {import("../view/unitView.js").default} view TODO: Get rid of the view reference
|
|
21
6
|
* @prop {T} channel
|
|
22
7
|
* @prop {import("../spec/channel.js").ChannelDefWithScale} channelDef
|
|
23
|
-
* @prop {
|
|
8
|
+
* @prop {boolean} contributesToDomain
|
|
24
9
|
*/
|
|
25
10
|
/**
|
|
26
11
|
* Resolves a shared scale for a channel by merging scale properties and domains
|
|
@@ -29,6 +14,16 @@ export function reconfigureScaleDomains(fromViews: import("../view/view.js").def
|
|
|
29
14
|
* notifications, while delegating domain aggregation, scale instance setup, and
|
|
30
15
|
* interaction logic to focused helpers.
|
|
31
16
|
*
|
|
17
|
+
* Documentation overview of current concerns this class (and its helpers) deal with:
|
|
18
|
+
* - Resolution membership and rules (shared/independent/forced/excluded, visibility, registration).
|
|
19
|
+
* - Scale property aggregation (merge props, channel overrides, unique scale names).
|
|
20
|
+
* - Domain computation and caching (configured/data unions, defaults, indexer stability, subscriptions).
|
|
21
|
+
* - Scale instance lifecycle (create, reconfigure props, apply domains, notify changes).
|
|
22
|
+
* - Interaction and zoom (zoom/pan/reset coordination, snapshots, zoom extents).
|
|
23
|
+
* - Rendering integration (range textures, axis sizing/positioning).
|
|
24
|
+
* - Locus-specific conversions (complex intervals, genome extent bindings).
|
|
25
|
+
* - Diagnostics and edge cases (ordinal unknown, nice/zero/padding, log warnings).
|
|
26
|
+
*
|
|
32
27
|
* @implements {ScaleResolutionApi}
|
|
33
28
|
*/
|
|
34
29
|
export default class ScaleResolution implements ScaleResolutionApi {
|
|
@@ -61,6 +56,12 @@ export default class ScaleResolution implements ScaleResolutionApi {
|
|
|
61
56
|
* @returns {() => boolean}
|
|
62
57
|
*/
|
|
63
58
|
registerMember(member: ScaleResolutionMember): () => boolean;
|
|
59
|
+
/**
|
|
60
|
+
* @param {import("../data/collector.js").default} collector
|
|
61
|
+
* @param {Iterable<import("../types/encoder.js").ScaleAccessor>} accessors
|
|
62
|
+
* @returns {() => void}
|
|
63
|
+
*/
|
|
64
|
+
registerCollectorSubscriptions(collector: import("../data/collector.js").default, accessors: Iterable<import("../types/encoder.js").ScaleAccessor>): () => void;
|
|
64
65
|
/**
|
|
65
66
|
* Reconfigures the scale: updates domain and other settings.
|
|
66
67
|
*
|
|
@@ -72,6 +73,7 @@ export default class ScaleResolution implements ScaleResolutionApi {
|
|
|
72
73
|
* Reconfigures only the effective domain (configured + data-derived).
|
|
73
74
|
*
|
|
74
75
|
* Use this when data changes but the scale membership and properties are stable.
|
|
76
|
+
*
|
|
75
77
|
*/
|
|
76
78
|
reconfigureDomain(): void;
|
|
77
79
|
/**
|
|
@@ -188,7 +190,7 @@ export type ScaleResolutionMember<T extends import("../spec/channel.js").Channel
|
|
|
188
190
|
view: import("../view/unitView.js").default;
|
|
189
191
|
channel: T;
|
|
190
192
|
channelDef: import("../spec/channel.js").ChannelDefWithScale;
|
|
191
|
-
|
|
193
|
+
contributesToDomain: boolean;
|
|
192
194
|
};
|
|
193
195
|
import { INDEX } from "./scaleResolutionConstants.js";
|
|
194
196
|
import { LOCUS } from "./scaleResolutionConstants.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaleResolution.d.ts","sourceRoot":"","sources":["../../../src/scales/scaleResolution.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scaleResolution.d.ts","sourceRoot":"","sources":["../../../src/scales/scaleResolution.js"],"names":[],"mappings":"AAuCA;;;;;;;;GAQG;AACH;;;;;;;;;;;;;;;;;;GAkBG;AACH;IA8CI;;OAEG;IACH,2DAkCC;IAjCG,8CAAsB;IACtB,0FAA0F;IAC1F,MADW,OAAO,oBAAoB,EAAE,IAAI,CAC5B;IAEhB,iEAAiE;IACjE,MADW,MAAM,CACI;IAoEzB,2BASC;IAqBD;;;;;;;OAOG;IACH,4KAEC;IAED;;;OAGG;IACH,+KAEC;IA6ED;;;OAGG;IACH,uBAHW,qBAAqB,GACnB,MAAM,OAAO,CAYzB;IAWD;;;;OAIG;IACH,0CAJW,OAAO,sBAAsB,EAAE,OAAO,aACtC,QAAQ,CAAC,OAAO,qBAAqB,EAAE,aAAa,CAAC,GACnD,MAAM,IAAI,CAkCtB;IA4HD;;;;;OAKG;IACH,oBAUC;IAED;;;;;OAKG;IACH,0BAuBC;IAuGD;;OAEG;IACH;eA5jBkC,OAAO,kBAAkB,EAAE,KAAK;MAmkBjE;IAED;;;;;;OAMG;IACH;eA5kBkC,OAAO,kBAAkB,EAAE,KAAK;MA8kBjE;IAED;;;;OAIG;IACH;eArlBkC,OAAO,kBAAkB,EAAE,KAAK;MA8lBjE;IAED,mBAEC;IAED;;;;OAIG;IACH,+DAEC;IAED;;OAEG;IACH,oBAFa,mFAA6B,CAMzC;IAED;;;;OAIG;IACH,oBAEC;IAED;;OAEG;IACH,sBAGC;IAED;;;;;;;OAOG;IACH,kBALW,MAAM,eACN,MAAM,OACN,MAAM,GACJ,OAAO,CAInB;IAED;;;;;;OAMG;IACH,eAJW,mFAA6B,aAC7B,OAAO,GAAG,MAAM,iBAK1B;IAED;;;;OAIG;IACH,qBAEC;IAED;;;;;OAKG;IACH,uBAEC;IAED;;;;;;;OAOG;IACH,wBAoBC;IAED;;;;;OAKG;IACH,uBAFW,MAAM,yDAUhB;IAED;;OAEG;IACH,iBAFW,MAAM,yDAIhB;IAED;;;OAGG;IACH,qBAHW,MAAM,+CAAmB,GACvB,MAAM,CAIlB;IAED;;;OAGG;IACH,8BAHW,kFAA4B,GAC1B,MAAM,EAAE,CAOpB;;CACJ;kCAlyB+B,CAAC,SAApB,6CAAkB;;;;UAGrB,OAAO,qBAAqB,EAAE,OAAO;aACrC,CAAC;gBACD,OAAO,oBAAoB,EAAE,mBAAmB;yBAChD,OAAO;;sBAvBV,+BAA+B;sBAA/B,+BAA+B;wBAA/B,+BAA+B;wBAA/B,+BAA+B;6BAA/B,+BAA+B"}
|