@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.
- package/dist/bundle/browser-KWU9rWZT.js +123 -0
- package/dist/bundle/{esm-CgfVIRJ-.js → esm-0dYHNV_D.js} +2 -2
- package/dist/bundle/{esm-sIoQYZ21.js → esm-CRMf_I9V.js} +18 -18
- package/dist/bundle/esm-CT3ygiMq.js +1084 -0
- package/dist/bundle/{esm-DQiq2Zhd.js → esm-CscjKVDc.js} +44 -44
- package/dist/bundle/index.es.js +3408 -3185
- package/dist/bundle/index.js +106 -97
- package/dist/schema.json +352 -0
- package/dist/src/config/defaults/markDefaults.d.ts.map +1 -1
- package/dist/src/config/defaults/markDefaults.js +1 -12
- package/dist/src/config/defaults/scaleDefaults.d.ts.map +1 -1
- package/dist/src/config/defaults/scaleDefaults.js +1 -0
- package/dist/src/config/markConfig.d.ts.map +1 -1
- package/dist/src/config/markConfig.js +16 -8
- package/dist/src/config/themes.d.ts.map +1 -1
- package/dist/src/config/themes.js +15 -2
- package/dist/src/data/sources/lazy/bigWigSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/bigWigSource.js +31 -11
- package/dist/src/data/sources/lazy/registerBuiltInLazySources.js +2 -2
- package/dist/src/data/sources/lazy/registerCoreLazySources.d.ts +2 -0
- package/dist/src/data/sources/lazy/registerCoreLazySources.d.ts.map +1 -0
- package/dist/src/data/sources/lazy/registerCoreLazySources.js +2 -0
- package/dist/src/data/sources/lazy/singleAxisWindowedSource.d.ts +19 -3
- package/dist/src/data/sources/lazy/singleAxisWindowedSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/singleAxisWindowedSource.js +34 -13
- package/dist/src/data/sources/lazy/tabixSource.d.ts +7 -0
- package/dist/src/data/sources/lazy/tabixSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/tabixSource.js +18 -0
- package/dist/src/data/sources/lazy/tabixTsvSource.d.ts +37 -0
- package/dist/src/data/sources/lazy/tabixTsvSource.d.ts.map +1 -0
- package/dist/src/data/sources/lazy/tabixTsvSource.js +163 -0
- package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -1
- package/dist/src/data/transforms/filterScoredLabels.js +3 -2
- package/dist/src/embedFactory.d.ts.map +1 -1
- package/dist/src/embedFactory.js +2 -0
- package/dist/src/genomeSpy/viewContextFactory.d.ts.map +1 -1
- package/dist/src/genomeSpy/viewContextFactory.js +1 -0
- package/dist/src/genomeSpyBase.d.ts +6 -0
- package/dist/src/genomeSpyBase.d.ts.map +1 -1
- package/dist/src/genomeSpyBase.js +15 -1
- package/dist/src/gl/webGLHelper.d.ts +5 -2
- package/dist/src/gl/webGLHelper.d.ts.map +1 -1
- package/dist/src/gl/webGLHelper.js +20 -3
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/marks/__snapshots__/shaderSnapshot.test.js.snap +1084 -2
- package/dist/src/marks/link.vertex.glsl.js +1 -1
- package/dist/src/marks/mark.d.ts.map +1 -1
- package/dist/src/marks/mark.js +0 -6
- package/dist/src/marks/rect.vertex.glsl.js +1 -1
- package/dist/src/minimal.d.ts +1 -0
- package/dist/src/minimal.d.ts.map +1 -1
- package/dist/src/minimal.js +6 -4
- package/dist/src/paramRuntime/embedParamApi.d.ts +26 -0
- package/dist/src/paramRuntime/embedParamApi.d.ts.map +1 -0
- package/dist/src/paramRuntime/embedParamApi.js +133 -0
- package/dist/src/scale/scale.js +10 -2
- package/dist/src/scales/domainPlanner.js +1 -1
- package/dist/src/scales/scaleInteractionController.d.ts +8 -4
- package/dist/src/scales/scaleInteractionController.d.ts.map +1 -1
- package/dist/src/scales/scaleInteractionController.js +55 -7
- package/dist/src/scales/scaleResolution.d.ts +3 -3
- package/dist/src/scales/scaleResolution.d.ts.map +1 -1
- package/dist/src/scales/scaleResolution.js +14 -7
- package/dist/src/scales/selectionDomainUtils.d.ts +10 -0
- package/dist/src/scales/selectionDomainUtils.d.ts.map +1 -1
- package/dist/src/scales/selectionDomainUtils.js +32 -3
- package/dist/src/selection/index.d.ts +8 -0
- package/dist/src/selection/index.d.ts.map +1 -0
- package/dist/src/selection/index.js +12 -0
- package/dist/src/spec/channel.d.ts +30 -0
- package/dist/src/spec/data.d.ts +40 -0
- package/dist/src/spec/parameter.d.ts +6 -0
- package/dist/src/spec/transform.d.ts +6 -0
- package/dist/src/styles/genome-spy.css +8 -0
- 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 +8 -0
- package/dist/src/types/embedApi.d.ts +54 -0
- package/dist/src/types/scaleResolutionApi.d.ts +28 -1
- package/dist/src/types/viewContext.d.ts +11 -0
- package/dist/src/utils/ui/tooltip.d.ts.map +1 -1
- package/dist/src/utils/ui/tooltip.js +22 -0
- package/dist/src/view/axisGridView.d.ts.map +1 -1
- package/dist/src/view/axisGridView.js +2 -1
- package/dist/src/view/axisView.d.ts.map +1 -1
- package/dist/src/view/axisView.js +2 -1
- package/dist/src/view/facetView.d.ts.map +1 -1
- package/dist/src/view/facetView.js +2 -1
- package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
- package/dist/src/view/gridView/gridChild.js +9 -1
- package/dist/src/view/gridView/gridView.d.ts.map +1 -1
- package/dist/src/view/gridView/gridView.js +198 -32
- package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
- package/dist/src/view/gridView/scrollbar.js +5 -1
- package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
- package/dist/src/view/gridView/selectionRect.js +5 -1
- package/dist/src/view/gridView/separatorView.d.ts.map +1 -1
- package/dist/src/view/gridView/separatorView.js +5 -1
- package/dist/src/view/testUtils.d.ts +30 -3
- package/dist/src/view/testUtils.d.ts.map +1 -1
- package/dist/src/view/testUtils.js +51 -2
- package/dist/src/view/viewSelectors.d.ts +38 -10
- package/dist/src/view/viewSelectors.d.ts.map +1 -1
- package/dist/src/view/viewSelectors.js +67 -2
- package/dist/src/view/viewUtilTypes.d.ts +15 -0
- package/dist/src/view/viewUtils.d.ts.map +1 -1
- package/dist/src/view/viewUtils.js +10 -0
- package/package.json +3 -3
- package/dist/bundle/browser-BTgw5ieH.js +0 -126
- package/dist/bundle/esm-DtE8VqAv.js +0 -1015
- /package/dist/bundle/{esm-BDFRLEuD.js → esm-C49STiCR.js} +0 -0
- /package/dist/bundle/{esm-CGX-qz1d.js → esm-CuVa5T98.js} +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const shader = "flat out vec4 vColor;flat out float vSize;out float vNormalLengthInPixels;flat out float vGamma;const int SHAPE_ARC=0;const int SHAPE_DOME=1;const int SHAPE_DIAGONAL=2;const int SHAPE_LINE=3;const int ORIENT_VERTICAL=0;const int ORIENT_HORIZONTAL=1;float distanceFromLine(vec2 pointOnLine1,vec2 pointOnLine2,vec2 point){vec2 a=point-pointOnLine1;vec2 b=pointOnLine2-pointOnLine1;vec2 proj=dot(a,b)/dot(b,b)*b;return length(a-proj);}bool isInsideViewport(vec2 point,float marginFactor){vec2 margin=uViewportSize*vec2(marginFactor);return point.x>=-margin.x&&point.x<=uViewportSize.x+margin.x&&point.y>=-margin.y&&point.y<=uViewportSize.y+margin.y;}void main(void){float pixelSize=1.0/uDevicePixelRatio;float opacity=getScaled_opacity()*uViewOpacity;vec2 p1,p2,p3,p4;vec2 a=applySampleFacet(vec2(getScaled_x(),getScaled_y()))*uViewportSize;vec2 b=applySampleFacet(vec2(getScaled_x2(),getScaled_y2()))*uViewportSize;if(uShape<=SHAPE_DOME){if(uShape==SHAPE_DOME){vec2 height=vec2(0.0);if(uOrient==ORIENT_VERTICAL){p1=vec2(min(a.x,b.x),b.y);p4=vec2(max(a.x,b.x),b.y);height=vec2(0.0,a.y-b.y);
|
|
1
|
+
const shader = "flat out vec4 vColor;flat out float vSize;out float vNormalLengthInPixels;flat out float vGamma;const int SHAPE_ARC=0;const int SHAPE_DOME=1;const int SHAPE_DIAGONAL=2;const int SHAPE_LINE=3;const int ORIENT_VERTICAL=0;const int ORIENT_HORIZONTAL=1;float distanceFromLine(vec2 pointOnLine1,vec2 pointOnLine2,vec2 point){vec2 a=point-pointOnLine1;vec2 b=pointOnLine2-pointOnLine1;vec2 proj=dot(a,b)/dot(b,b)*b;return length(a-proj);}bool isInsideViewport(vec2 point,float marginFactor){vec2 margin=uViewportSize*vec2(marginFactor);return point.x>=-margin.x&&point.x<=uViewportSize.x+margin.x&&point.y>=-margin.y&&point.y<=uViewportSize.y+margin.y;}float inverseSmoothstep(float t){t=clamp(t,0.0,1.0);return 0.5-sin(asin(1.0-2.0*t)/3.0);}/***Remaps the parameter t to concentrate vertices to the part that is visible in the viewport.*This keeps the tightly bent endpoints smooth even when zooming in very close.*/float remapVisibleChordParameter(float stripT,float chordStart,float chordEnd,float viewportLength){float chordMin=min(chordStart,chordEnd);float chordMax=max(chordStart,chordEnd);float chordSpan=chordMax-chordMin;if(chordSpan<=0.0){return 0.0;}float visibleChordMin=max(chordMin,0.0);float visibleChordMax=min(chordMax,viewportLength);if(visibleChordMax<=visibleChordMin){return stripT;}float visibleTMin=inverseSmoothstep((visibleChordMin-chordMin)/chordSpan);float visibleTMax=inverseSmoothstep((visibleChordMax-chordMin)/chordSpan);float visibleTSpan=visibleTMax-visibleTMin;float offscreenTSpan=visibleTMin+(1.0-visibleTMax);if(offscreenTSpan<=0.0){return stripT;}float visibleShare=clamp(0.75+(1.0-visibleTSpan)*0.2,0.75,0.95);float offscreenShare=1.0-visibleShare;float leftShare=offscreenShare*visibleTMin/offscreenTSpan;float rightShare=offscreenShare*(1.0-visibleTMax)/offscreenTSpan;if(stripT<=leftShare){return leftShare>0.0 ? mix(0.0,visibleTMin,stripT/leftShare): visibleTMin;}float visibleStart=leftShare;float visibleEnd=visibleStart+visibleShare;if(stripT<=visibleEnd){return visibleShare>0.0? mix(visibleTMin,visibleTMax,(stripT-visibleStart)/visibleShare): visibleTMin;}return rightShare>0.0? mix(visibleTMax,1.0,(stripT-visibleEnd)/rightShare): visibleTMax;}void clampChordToViewport(inout vec2 p1,inout vec2 p4,inout float chordLength){if(chordLength>uMaxChordLength){vec2 chordVector=p4-p1;vec2 unitChordVector=normalize(chordVector);if(isInsideViewport(p1,2.0)){chordLength=uMaxChordLength;p4=p1+unitChordVector*uMaxChordLength;}else if(isInsideViewport(p4,2.0)){chordLength=uMaxChordLength;p1=p4-unitChordVector*uMaxChordLength;}}}void clampDomeApex(inout vec2 p1,inout vec2 p4,int orient){if(orient==ORIENT_VERTICAL){if(p4.x>0.0){p1.x=max(p1.x,-p4.x);}if(p1.x<uViewportSize.x){p4.x=min(p4.x,2.0*uViewportSize.x-p1.x);}}else{if(p4.y>0.0){p1.y=max(p1.y,-p4.y);}if(p1.y<uViewportSize.y){p4.y=min(p4.y,2.0*uViewportSize.y-p1.y);}}}void main(void){float pixelSize=1.0/uDevicePixelRatio;float opacity=getScaled_opacity()*uViewOpacity;vec2 p1,p2,p3,p4;vec2 a=applySampleFacet(vec2(getScaled_x(),getScaled_y()))*uViewportSize;vec2 b=applySampleFacet(vec2(getScaled_x2(),getScaled_y2()))*uViewportSize;if(uShape<=SHAPE_DOME){if(uShape==SHAPE_DOME){vec2 height=vec2(0.0);if(uOrient==ORIENT_VERTICAL){p1=vec2(min(a.x,b.x),b.y);p4=vec2(max(a.x,b.x),b.y);height=vec2(0.0,a.y-b.y);float chordLength=length(p4-p1);clampChordToViewport(p1,p4,chordLength);if(uClampApex){clampDomeApex(p1,p4,ORIENT_VERTICAL);}}else{p1=vec2(b.x,min(a.y,b.y));p4=vec2(b.x,max(a.y,b.y));height=vec2(a.x-b.x,0.0);float chordLength=length(p4-p1);clampChordToViewport(p1,p4,chordLength);if(uClampApex){clampDomeApex(p1,p4,ORIENT_HORIZONTAL);}}vec2 controlOffset=height/0.75;p2=p1+controlOffset;p3=p4+controlOffset;}if(uShape==SHAPE_ARC){p1=a;p4=b;vec2 chordVector=p4-p1;vec2 unitChordVector=normalize(chordVector);vec2 chordNormal=vec2(-unitChordVector.y,unitChordVector.x);float chordLength=length(chordVector);clampChordToViewport(p1,p4,chordLength);float height=max(chordLength/2.0*uArcHeightFactor,uMinArcHeight);vec2 controlOffset=chordNormal*height/0.75;p2=p1+controlOffset;p3=p4+controlOffset;}}else if(uShape==SHAPE_DIAGONAL){if(uOrient==ORIENT_VERTICAL){p1=a;p2=vec2(a.x,(a.y+b.y)/2.0);p3=vec2(b.x,(a.y+b.y)/2.0);p4=b;}else{p1=a;p2=vec2((a.x+b.x)/2.0,a.y);p3=vec2((a.x+b.x)/2.0,b.y);p4=b;}}else if(uShape==SHAPE_LINE){p1=a;p2=(a+b)/2.0;p3=p2;p4=b;}vec2 strip=vec2(float(gl_VertexID/2)/float(uSegmentBreaks),float(gl_VertexID % 2)-0.5);float t=strip.x;if(uShape==SHAPE_DOME){if(uOrient==ORIENT_VERTICAL){t=remapVisibleChordParameter(strip.x,p1.x,p4.x,uViewportSize.x);}else{t=remapVisibleChordParameter(strip.x,p1.y,p4.y,uViewportSize.y);}}else if(uShape==SHAPE_ARC){if(a.y==b.y){t=remapVisibleChordParameter(strip.x,p1.x,p4.x,uViewportSize.x);}else if(a.x==b.x){t=remapVisibleChordParameter(strip.x,p1.y,p4.y,uViewportSize.y);}}vec2 p;vec2 tangent;vec2 q1=mix(p1,p2,t);vec2 q2=mix(p2,p3,t);vec2 q3=mix(p3,p4,t);vec2 r1=mix(q1,q2,t);vec2 r2=mix(q2,q3,t);p=mix(r1,r2,t);tangent=3.0*(r2-r1);tangent=normalize(tangent);vec2 normal=vec2(-tangent.y,tangent.x);float size=getScaled_size();if(size<pixelSize){opacity*=size/pixelSize;size=pixelSize;}float paddedSize=uPickingEnabled? max(size,uMinPickingSize): size+pixelSize;vNormalLengthInPixels=strip.y*paddedSize;if(uShape==SHAPE_ARC&&uArcFadingDistance[0]>0.0&&uArcFadingDistance[1]>0.0&&(!uNoFadingOnPointSelection||!isPointSelected())){float d=distanceFromLine(p1,p4,p);float distanceOpacity=smoothstep(uArcFadingDistance[1],uArcFadingDistance[0],d);opacity*=distanceOpacity;if(distanceOpacity<=0.0){vNormalLengthInPixels=0.0;}}p+=normal*vNormalLengthInPixels;gl_Position=pixelsToNdc(p);vec3 color=getScaled_color();vColor=vec4(color*opacity,opacity);vGamma=getGammaForColor(color);vSize=paddedSize;setupPicking();}";
|
|
2
2
|
export default shader;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mark.d.ts","sourceRoot":"","sources":["../../../src/marks/mark.js"],"names":[],"mappings":"AA8DA,mCAAoC,sBAAsB,CAAC;AAC3D,mCAAoC,sBAAsB,CAAC;AAE3D,uCAAwC,oBAAoB,CAAC;AAE7D;;;;;;;;;;;;;GAaG;AAEH;;GAEG;AACH,0BAF0B,CAAC,SAAd,mCAAW;IAkBpB;;OAEG;IACH,sBAFW,OAAO,qBAAqB,EAAE,OAAO,EA4H/C;IAzHG,oFAAwB;IAGxB,8EAA8E;IAC9E,UADW,OAAO,CAAC,MAAM,uCAAU,OAAO,qBAAqB,EAAE,OAAO,CAAC,CAAC,CACjD;IAIzB;;;OAGG;IACH,sBAHU,OAAO,SAAS,EAAE,UAAU,GAAG;QAAE,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAAE,CAG5C;IAE3B;;;;;;;OAOG;IACH,2BAHU,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAGG;IAEhC;;;OAGG;IACH,uBAHU,OAAO,SAAS,EAAE,WAAW,CAGX;IAE5B;;;OAGG;IACH,2BAHU,OAAO,SAAS,EAAE,eAAe,CAGX;IAEhC;;;OAGG;IACH,2BAHU,OAAO,SAAS,EAAE,gBAAgB,CAGZ;IAEhC;;;;;OAKG;IACH,2BAHU,OAAO,SAAS,EAAE,gBAAgB,CAGZ;IAEhC;;;;;OAKG;IACH,uCAA+B;IAE/B;;;;;OAKG;IACH,4BAA6B;IAE7B,kFAAkF;IAClF,UADW,QAAQ,CAAC,GAAG,CAAC,CACM;IAU9B,qBA6BE;IAEF;;;;;;OAMG;IACH,qBAHU,CAAC,CAQV;IAGL;;;OAGG;IACH,0CAHW,OAAO,CAAC,CAAC,CAAC,QAQpB;IAED,iEAEC;IAED,iBAKC;IAED;;;OAGG;IACH,sBAHW,MAAM,IAAI,qBACV,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,QAYxC;IAED,sBAEC;IAED;;;OAGG;IACH,0BAFa,WAAW,CAIvB;IAED;;;;;OAKG;IACH,2BAHa,OAAO,oBAAoB,EAAE,OAAO,EAAE,CAMlD;IAED;;OAEG;IACH,wBAFa,sCAAS,CAarB;IAED;;OAEG;IACH,4DAcC;IAED;;;;;OAKG;IACH,oGAEC;IAED;;;;;;OAMG;IACH,oDAHW,CAAC,MAAM,CAAC,CAAC,EAAE,QAqCrB;IAED;;;;OAIG;IACH,sDAiDC;IAED,wDAEC;IAED,gEAEC;IAED,uBAEC;IAED;;;OAGG;IACH,2BAEC;IAED;;OAEG;IACH,oCAEC;IAED;;OAEG;IACH,2BAEC;IAED,sEAeC;IAED;;;;;;OAMG;IACH,6CALW,MAAM,kBACN,MAAM,iBACN,MAAM,EAAE,QAmelB;IALG;;;;;;MAIC;IAGL;;;;;;OAMG;IACH,uCAwDC;IAED;;;;;;OAMG;IACH,+CAHW,MAAM,GACJ,CAAS,IAAG,EAAH,GAAG,KAAE,IAAI,CAe9B;IAED;;;;;;;;;;OAUG;IACH,mCALa,CAAC,eACH,MAAM,aACN,CAAC,aACD,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,yCAAU,KAAK,GAAG,QA6BzC;IAED;;OAEG;IACH,
|
|
1
|
+
{"version":3,"file":"mark.d.ts","sourceRoot":"","sources":["../../../src/marks/mark.js"],"names":[],"mappings":"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"}
|
package/dist/src/marks/mark.js
CHANGED
|
@@ -1118,12 +1118,6 @@ export default class Mark {
|
|
|
1118
1118
|
}
|
|
1119
1119
|
|
|
1120
1120
|
if (this.bufferInfo) {
|
|
1121
|
-
// A hack to prevent WebGL: INVALID_OPERATION: drawArrays: no buffer is bound to enabled attribute
|
|
1122
|
-
// TODO: Consider using bufferSubData or DYNAMIC_DRAW etc...
|
|
1123
|
-
for (let i = 0; i < 8; i++) {
|
|
1124
|
-
gl.disableVertexAttribArray(i);
|
|
1125
|
-
}
|
|
1126
|
-
|
|
1127
1121
|
Object.values(this.bufferInfo.attribs).forEach((attribInfo) =>
|
|
1128
1122
|
this.gl.deleteBuffer(attribInfo.buffer)
|
|
1129
1123
|
);
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const shader = "flat out lowp vec4 vFillColor;flat out lowp vec4 vStrokeColor;flat out float vHalfStrokeWidth;flat out vec4 vCornerRadii;\n#if defined(ROUNDED_CORNERS) || defined(STROKED) || defined(SHADOW)\nout vec2 vPosInPixels;\n#endif\nflat out vec2 vHalfSizeInPixels;/***Adjusts the vertex position to ensure that the rectangle is at least `minSpan`*wide or high. Returns a value that reflects the amount of clamping and can be*used to adjust the opacity of the rectangle.**pos: vertex position*frac: vertex position within the rectangle,[0,1]*size: width or height of the rectangle*minSize: minimum width or height of the rectangle*/float clampMinSize(inout float pos,float frac,float size,float minSize){if(minSize>0.0&&size<minSize){pos+=(frac-0.5)*(minSize-size);return size/minSize;}return 1.0;}void sort(inout float a,inout float b){if(a>b){float tmp=b;b=a;a=tmp;}}/***The vertex position wrt the rectangle specified by(x,x2,y,y2).*[0,0]=[x,y],[1,1]=[x2,y2].*The x or y component may contain fractional values if the rectangle*have been tessellated.*/vec2 getVertexPos(){int index=gl_VertexID % 6;return vec2(index==0||index==1||index==3 ? 0.0 : 1.0,index==0||index==1||index==2 ? 0.0 : 1.0);}void main(void){vec2 frac=getVertexPos();vec2 normalizedMinSize=vec2(uMinWidth,uMinHeight)/uViewportSize;vec4 cornerRadii=vec4(uCornerRadiusTopRight,uCornerRadiusBottomRight,uCornerRadiusTopLeft,uCornerRadiusBottomLeft);float x=getScaled_x();float x2=getScaled_x2();float y=getScaled_y();float y2=getScaled_y2();sort(x,x2);sort(y,y2);float clampMargin=1.0;vec2 pos1=vec2(clamp(x,0.0-clampMargin,1.0+clampMargin),y);vec2 pos2=vec2(clamp(x2,0.0-clampMargin,1.0+clampMargin),y2);vec2 size=pos2-pos1;if(size.x
|
|
1
|
+
const shader = "flat out lowp vec4 vFillColor;flat out lowp vec4 vStrokeColor;flat out float vHalfStrokeWidth;flat out vec4 vCornerRadii;\n#if defined(ROUNDED_CORNERS) || defined(STROKED) || defined(SHADOW)\nout vec2 vPosInPixels;\n#endif\nflat out vec2 vHalfSizeInPixels;/***Adjusts the vertex position to ensure that the rectangle is at least `minSpan`*wide or high. Returns a value that reflects the amount of clamping and can be*used to adjust the opacity of the rectangle.**pos: vertex position*frac: vertex position within the rectangle,[0,1]*size: width or height of the rectangle*minSize: minimum width or height of the rectangle*/float clampMinSize(inout float pos,float frac,float size,float minSize){if(minSize>0.0&&size<minSize){pos+=(frac-0.5)*(minSize-size);return size/minSize;}return 1.0;}void sort(inout float a,inout float b){if(a>b){float tmp=b;b=a;a=tmp;}}/***The vertex position wrt the rectangle specified by(x,x2,y,y2).*[0,0]=[x,y],[1,1]=[x2,y2].*The x or y component may contain fractional values if the rectangle*have been tessellated.*/vec2 getVertexPos(){int index=gl_VertexID % 6;return vec2(index==0||index==1||index==3 ? 0.0 : 1.0,index==0||index==1||index==2 ? 0.0 : 1.0);}void main(void){vec2 frac=getVertexPos();vec2 normalizedMinSize=vec2(uMinWidth,uMinHeight)/uViewportSize;vec4 cornerRadii=vec4(uCornerRadiusTopRight,uCornerRadiusBottomRight,uCornerRadiusTopLeft,uCornerRadiusBottomLeft);float x=getScaled_x();float x2=getScaled_x2();float y=getScaled_y();float y2=getScaled_y2();sort(x,x2);sort(y,y2);float clampMargin=1.0;vec2 pos1=vec2(clamp(x,0.0-clampMargin,1.0+clampMargin),y);vec2 pos2=vec2(clamp(x2,0.0-clampMargin,1.0+clampMargin),y2);vec2 size=pos2-pos1;if(size.x<0.0||size.y<0.0){gl_Position=vec4(0.0,0.0,0.0,1.0);return;}vec2 pos=pos1+frac*size;size.y*=getSampleFacetHeight(pos);float opaFactor=uViewOpacity*max(uMinOpacity,clampMinSize(pos.x,frac.x,size.x,normalizedMinSize.x)*clampMinSize(pos.y,frac.y,size.y,normalizedMinSize.y));size=max(size,normalizedMinSize);pos=applySampleFacet(pos);\n#if defined(ROUNDED_CORNERS) || defined(STROKED) || defined(SHADOW)\nfloat aaPadding=1.0/uDevicePixelRatio;float shadowPadding=uShadowBlur+max(abs(uShadowOffsetX),abs(uShadowOffsetY));float strokeWidth=getScaled_strokeWidth();float strokeOpacity=getScaled_strokeOpacity()*opaFactor;vec2 centeredFrac=frac-0.5;vec2 expand=centeredFrac*(strokeWidth+aaPadding+shadowPadding*2.0)/uViewportSize;pos+=expand;vec2 sizeInPixels=size*uViewportSize;vPosInPixels=(centeredFrac+expand/size)*sizeInPixels;vHalfSizeInPixels=sizeInPixels/2.0;vCornerRadii=min(cornerRadii,min(vHalfSizeInPixels.x,vHalfSizeInPixels.y));vHalfStrokeWidth=strokeWidth/2.0;vStrokeColor=vec4(getScaled_stroke()*strokeOpacity,strokeOpacity);\n#endif\ngl_Position=unitToNdc(pos);float fillOpacity=getScaled_fillOpacity()*opaFactor;vFillColor=vec4(getScaled_fill()*fillOpacity,fillOpacity);setupPicking();}";
|
|
2
2
|
export default shader;
|
package/dist/src/minimal.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export const embed: (el: HTMLElement | string, spec: import("./spec/root.js").RootSpec | string, options?: import("./types/embedApi.js").EmbedOptions) => Promise<import("./types/embedApi.js").EmbedResult>;
|
|
2
|
+
export { intervalSelection } from "./selection/index.js";
|
|
2
3
|
import GenomeSpy from "./genomeSpyBase.js";
|
|
3
4
|
import { html } from "lit";
|
|
4
5
|
import icon from "./img/bowtie.svg";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"minimal.d.ts","sourceRoot":"","sources":["../../src/minimal.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"minimal.d.ts","sourceRoot":"","sources":["../../src/minimal.js"],"names":[],"mappings":"AAmBA,6MAA4C;;sBARtB,oBAAoB;qBAJrB,KAAK;iBAKT,kBAAkB;oBACf,6BAA6B;yBACX,mBAAmB"}
|
package/dist/src/minimal.js
CHANGED
|
@@ -2,20 +2,22 @@
|
|
|
2
2
|
* Lean GenomeSpy core entry point.
|
|
3
3
|
*
|
|
4
4
|
* Use this entry when you want the `embed` API without the default built-in
|
|
5
|
-
* eager and lazy format registrations.
|
|
6
|
-
*
|
|
5
|
+
* optional eager and lazy format registrations. Core axis lazy sources remain
|
|
6
|
+
* available.
|
|
7
7
|
*/
|
|
8
8
|
import { html } from "lit";
|
|
9
9
|
|
|
10
|
-
// Lean core entry point: shares the embed API, but skips
|
|
11
|
-
//
|
|
10
|
+
// Lean core entry point: shares the embed API, but skips optional eager and
|
|
11
|
+
// lazy format registrations.
|
|
12
12
|
import GenomeSpy from "./genomeSpyBase.js";
|
|
13
13
|
import icon from "./img/bowtie.svg";
|
|
14
14
|
import favIcon from "./img/genomespy-favicon.svg";
|
|
15
15
|
import { createEmbed, loadSpec } from "./embedFactory.js";
|
|
16
|
+
import "./data/sources/lazy/registerCoreLazySources.js";
|
|
16
17
|
|
|
17
18
|
export { GenomeSpy, html, icon, favIcon };
|
|
18
19
|
|
|
19
20
|
export const embed = createEmbed(GenomeSpy);
|
|
20
21
|
|
|
21
22
|
export { loadSpec };
|
|
23
|
+
export { intervalSelection } from "./selection/index.js";
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {import("../view/view.js").default} View
|
|
3
|
+
* @typedef {import("../spec/parameter.js").Parameter} Parameter
|
|
4
|
+
* @typedef {import("../types/embedApi.js").ParamApi} ParamApi
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Returns a parameter handle for an explicit parameter exposed by the embed API.
|
|
8
|
+
*
|
|
9
|
+
* Current limitations:
|
|
10
|
+
*
|
|
11
|
+
* - Parameters are addressed by name only. Independent same-name parameters
|
|
12
|
+
* throw an ambiguity error.
|
|
13
|
+
* - Computed `expr` parameters are readable but cannot be written.
|
|
14
|
+
* - Point selection parameters are readable but cannot be written through this
|
|
15
|
+
* API because valid values require GenomeSpy-generated datum ids.
|
|
16
|
+
* - Projected selections are not supported.
|
|
17
|
+
*
|
|
18
|
+
* @param {View} root
|
|
19
|
+
* @param {string} name
|
|
20
|
+
* @returns {ParamApi}
|
|
21
|
+
*/
|
|
22
|
+
export function resolveEmbedParam(root: View, name: string): ParamApi;
|
|
23
|
+
export type View = import("../view/view.js").default;
|
|
24
|
+
export type Parameter = import("../spec/parameter.js").Parameter;
|
|
25
|
+
export type ParamApi = import("../types/embedApi.js").ParamApi;
|
|
26
|
+
//# sourceMappingURL=embedParamApi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedParamApi.d.ts","sourceRoot":"","sources":["../../../src/paramRuntime/embedParamApi.js"],"names":[],"mappings":"AAKA;;;;GAIG;AAEH;;;;;;;;;;;;;;;GAeG;AACH,wCAJW,IAAI,QACJ,MAAM,GACJ,QAAQ,CA8DpB;mBAjFY,OAAO,iBAAiB,EAAE,OAAO;wBACjC,OAAO,sBAAsB,EAAE,SAAS;uBACxC,OAAO,sBAAsB,EAAE,QAAQ"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import {
|
|
2
|
+
asSelectionConfig,
|
|
3
|
+
isPointSelectionConfig,
|
|
4
|
+
} from "../selection/selection.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @typedef {import("../view/view.js").default} View
|
|
8
|
+
* @typedef {import("../spec/parameter.js").Parameter} Parameter
|
|
9
|
+
* @typedef {import("../types/embedApi.js").ParamApi} ParamApi
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Returns a parameter handle for an explicit parameter exposed by the embed API.
|
|
14
|
+
*
|
|
15
|
+
* Current limitations:
|
|
16
|
+
*
|
|
17
|
+
* - Parameters are addressed by name only. Independent same-name parameters
|
|
18
|
+
* throw an ambiguity error.
|
|
19
|
+
* - Computed `expr` parameters are readable but cannot be written.
|
|
20
|
+
* - Point selection parameters are readable but cannot be written through this
|
|
21
|
+
* API because valid values require GenomeSpy-generated datum ids.
|
|
22
|
+
* - Projected selections are not supported.
|
|
23
|
+
*
|
|
24
|
+
* @param {View} root
|
|
25
|
+
* @param {string} name
|
|
26
|
+
* @returns {ParamApi}
|
|
27
|
+
*/
|
|
28
|
+
export function resolveEmbedParam(root, name) {
|
|
29
|
+
const matches = collectParamMatches(root, name);
|
|
30
|
+
if (!matches.length) {
|
|
31
|
+
throw new Error('Parameter "' + name + '" not found.');
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const effectiveMatches = new Map();
|
|
35
|
+
for (const match of matches) {
|
|
36
|
+
const runtime = match.view.paramRuntime.findRuntimeForParam(name);
|
|
37
|
+
if (!runtime) {
|
|
38
|
+
throw new Error('Parameter "' + name + '" has no runtime value.');
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
effectiveMatches.set(runtime, {
|
|
42
|
+
runtime,
|
|
43
|
+
readOnly: hasExprParam(effectiveMatches.get(runtime), match),
|
|
44
|
+
pointSelection: hasPointSelectionParam(
|
|
45
|
+
effectiveMatches.get(runtime),
|
|
46
|
+
match
|
|
47
|
+
),
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (effectiveMatches.size > 1) {
|
|
52
|
+
throw new Error('Parameter "' + name + '" is ambiguous.');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const { runtime, readOnly, pointSelection } = effectiveMatches
|
|
56
|
+
.values()
|
|
57
|
+
.next().value;
|
|
58
|
+
|
|
59
|
+
return {
|
|
60
|
+
getValue() {
|
|
61
|
+
return runtime.getValue(name);
|
|
62
|
+
},
|
|
63
|
+
|
|
64
|
+
setValue(value) {
|
|
65
|
+
if (readOnly) {
|
|
66
|
+
throw new Error(
|
|
67
|
+
'Cannot set computed parameter "' + name + '".'
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
if (pointSelection) {
|
|
71
|
+
throw new Error(
|
|
72
|
+
'Cannot set point selection parameter "' +
|
|
73
|
+
name +
|
|
74
|
+
'" through the embed API.'
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
runtime.setValue(name, value);
|
|
79
|
+
root.context.animator.requestRender();
|
|
80
|
+
},
|
|
81
|
+
|
|
82
|
+
subscribe(listener) {
|
|
83
|
+
return runtime.subscribe(name, () => {
|
|
84
|
+
listener(runtime.getValue(name));
|
|
85
|
+
});
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* @param {{ readOnly: boolean } | undefined} previous
|
|
92
|
+
* @param {{ param: Parameter }} match
|
|
93
|
+
* @returns {boolean}
|
|
94
|
+
*/
|
|
95
|
+
function hasExprParam(previous, match) {
|
|
96
|
+
return Boolean(previous?.readOnly || "expr" in match.param);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* @param {{ pointSelection: boolean } | undefined} previous
|
|
101
|
+
* @param {{ param: Parameter }} match
|
|
102
|
+
* @returns {boolean}
|
|
103
|
+
*/
|
|
104
|
+
function hasPointSelectionParam(previous, match) {
|
|
105
|
+
if (previous?.pointSelection) {
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const param = match.param;
|
|
110
|
+
return (
|
|
111
|
+
"select" in param &&
|
|
112
|
+
isPointSelectionConfig(asSelectionConfig(param.select))
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* @param {View} root
|
|
118
|
+
* @param {string} name
|
|
119
|
+
* @returns {{ view: View, param: Parameter }[]}
|
|
120
|
+
*/
|
|
121
|
+
function collectParamMatches(root, name) {
|
|
122
|
+
/** @type {{ view: View, param: Parameter }[]} */
|
|
123
|
+
const matches = [];
|
|
124
|
+
|
|
125
|
+
root.visit((view) => {
|
|
126
|
+
const param = view.paramRuntime.paramConfigs.get(name);
|
|
127
|
+
if (param) {
|
|
128
|
+
matches.push({ view, param });
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
return matches;
|
|
133
|
+
}
|
package/dist/src/scale/scale.js
CHANGED
|
@@ -483,13 +483,21 @@ function configureRangeStep(type, _, count) {
|
|
|
483
483
|
|
|
484
484
|
function configureScheme(type, _, count) {
|
|
485
485
|
var extent = _.schemeExtent,
|
|
486
|
+
schemeCount = _.schemeCount,
|
|
486
487
|
name,
|
|
487
488
|
scheme;
|
|
488
489
|
|
|
489
490
|
if (isArray(_.scheme)) {
|
|
490
491
|
scheme = interpolateColors(_.scheme, _.interpolate, _.interpolateGamma);
|
|
491
492
|
} else {
|
|
492
|
-
|
|
493
|
+
if (isString(_.scheme)) {
|
|
494
|
+
name = _.scheme.toLowerCase();
|
|
495
|
+
} else {
|
|
496
|
+
name = _.scheme.name.toLowerCase();
|
|
497
|
+
extent = _.scheme.extent ?? extent;
|
|
498
|
+
schemeCount = _.scheme.count ?? schemeCount;
|
|
499
|
+
}
|
|
500
|
+
|
|
493
501
|
scheme = getScheme(name);
|
|
494
502
|
if (!scheme) error(`Unrecognized scheme name: ${_.scheme}`);
|
|
495
503
|
}
|
|
@@ -501,7 +509,7 @@ function configureScheme(type, _, count) {
|
|
|
501
509
|
: type === BinOrdinal
|
|
502
510
|
? count - 1
|
|
503
511
|
: type === Quantile || type === Quantize
|
|
504
|
-
? +
|
|
512
|
+
? +schemeCount || DEFAULT_COUNT
|
|
505
513
|
: count;
|
|
506
514
|
|
|
507
515
|
// adjust and/or quantize scheme as appropriate
|
|
@@ -521,7 +521,7 @@ function resolveSelectionDomain(
|
|
|
521
521
|
resolvedChannel
|
|
522
522
|
);
|
|
523
523
|
const hasInitial = domainRef.initial !== undefined;
|
|
524
|
-
const interval = binding.selection
|
|
524
|
+
const interval = binding.selection?.intervals[resolvedChannel];
|
|
525
525
|
const description = paramName + "." + resolvedChannel;
|
|
526
526
|
if (!interval || interval.length !== 2) {
|
|
527
527
|
const initialDomain = includeSelectionInitial
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* @typedef {import("../spec/scale.js").ComplexDomain} ComplexDomain
|
|
5
5
|
* @typedef {import("../spec/scale.js").ZoomParams} ZoomParams
|
|
6
6
|
* @typedef {import("../types/encoder.js").VegaScale} VegaScale
|
|
7
|
+
* @typedef {import("../types/scaleResolutionApi.js").ZoomToOptions} ZoomToOptions
|
|
7
8
|
* @typedef {VegaScale & { props: import("../spec/scale.js").Scale }} ScaleWithProps
|
|
8
9
|
*/
|
|
9
10
|
export default class ScaleInteractionController {
|
|
@@ -11,14 +12,16 @@ export default class ScaleInteractionController {
|
|
|
11
12
|
* @param {object} options
|
|
12
13
|
* @param {() => ScaleWithProps} options.getScale
|
|
13
14
|
* @param {() => import("../utils/animator.js").default} options.getAnimator
|
|
15
|
+
* @param {() => void} options.renderImmediately
|
|
14
16
|
* @param {() => number[]} options.getInitialDomainSnapshot
|
|
15
17
|
* @param {() => number[]} options.getResetDomain
|
|
16
18
|
* @param {(domain: ScalarDomain | ComplexDomain) => number[]} options.fromComplexInterval
|
|
17
19
|
* @param {() => number[]} options.getGenomeExtent
|
|
18
20
|
*/
|
|
19
|
-
constructor({ getScale, getAnimator, getInitialDomainSnapshot, getResetDomain, fromComplexInterval, getGenomeExtent, }: {
|
|
21
|
+
constructor({ getScale, getAnimator, renderImmediately, getInitialDomainSnapshot, getResetDomain, fromComplexInterval, getGenomeExtent, }: {
|
|
20
22
|
getScale: () => ScaleWithProps;
|
|
21
23
|
getAnimator: () => import("../utils/animator.js").default;
|
|
24
|
+
renderImmediately: () => void;
|
|
22
25
|
getInitialDomainSnapshot: () => number[];
|
|
23
26
|
getResetDomain: () => number[];
|
|
24
27
|
fromComplexInterval: (domain: ScalarDomain | ComplexDomain) => number[];
|
|
@@ -52,10 +55,10 @@ export default class ScaleInteractionController {
|
|
|
52
55
|
* Immediately zooms to the given interval.
|
|
53
56
|
*
|
|
54
57
|
* @param {NumericDomain | ComplexDomain} domain
|
|
55
|
-
* @param {boolean | number} [
|
|
56
|
-
*
|
|
58
|
+
* @param {ZoomToOptions | boolean | number} [options] Zoom options.
|
|
59
|
+
* Passing the duration directly as a boolean or number is deprecated.
|
|
57
60
|
*/
|
|
58
|
-
zoomTo(domain: NumericDomain | ComplexDomain,
|
|
61
|
+
zoomTo(domain: NumericDomain | ComplexDomain, options?: ZoomToOptions | boolean | number): Promise<void>;
|
|
59
62
|
/**
|
|
60
63
|
* Resets the current domain to the initial one
|
|
61
64
|
*
|
|
@@ -73,6 +76,7 @@ export type ScalarDomain = import("../spec/scale.js").ScalarDomain;
|
|
|
73
76
|
export type ComplexDomain = import("../spec/scale.js").ComplexDomain;
|
|
74
77
|
export type ZoomParams = import("../spec/scale.js").ZoomParams;
|
|
75
78
|
export type VegaScale = import("../types/encoder.js").VegaScale;
|
|
79
|
+
export type ZoomToOptions = import("../types/scaleResolutionApi.js").ZoomToOptions;
|
|
76
80
|
export type ScaleWithProps = VegaScale & {
|
|
77
81
|
props: import("../spec/scale.js").Scale;
|
|
78
82
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaleInteractionController.d.ts","sourceRoot":"","sources":["../../../src/scales/scaleInteractionController.js"],"names":[],"mappings":"AAuBA
|
|
1
|
+
{"version":3,"file":"scaleInteractionController.d.ts","sourceRoot":"","sources":["../../../src/scales/scaleInteractionController.js"],"names":[],"mappings":"AAuBA;;;;;;;;GAQG;AAEH;IAyBI;;;;;;;;;OASG;IACH,2IARG;QAAsC,QAAQ,EAAtC,MAAM,cAAc;QACkC,WAAW,EAAjE,MAAM,OAAO,sBAAsB,EAAE,OAAO;QACxB,iBAAiB,EAArC,MAAM,IAAI;QACc,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,EAiBA;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,YAC7B,aAAa,GAAG,OAAO,GAAG,MAAM,iBA0E1C;IASD;;;;OAIG;IACH,qBAcC;IAED;;OAEG;IACH,uBAOC;;CACJ;4BA9QY,OAAO,kBAAkB,EAAE,aAAa;2BACxC,OAAO,kBAAkB,EAAE,YAAY;4BACvC,OAAO,kBAAkB,EAAE,aAAa;yBACxC,OAAO,kBAAkB,EAAE,UAAU;wBACrC,OAAO,qBAAqB,EAAE,SAAS;4BACvC,OAAO,gCAAgC,EAAE,aAAa;6BACtD,SAAS,GAAG;IAAE,KAAK,EAAE,OAAO,kBAAkB,EAAE,KAAK,CAAA;CAAE"}
|
|
@@ -27,6 +27,7 @@ import {
|
|
|
27
27
|
* @typedef {import("../spec/scale.js").ComplexDomain} ComplexDomain
|
|
28
28
|
* @typedef {import("../spec/scale.js").ZoomParams} ZoomParams
|
|
29
29
|
* @typedef {import("../types/encoder.js").VegaScale} VegaScale
|
|
30
|
+
* @typedef {import("../types/scaleResolutionApi.js").ZoomToOptions} ZoomToOptions
|
|
30
31
|
* @typedef {VegaScale & { props: import("../spec/scale.js").Scale }} ScaleWithProps
|
|
31
32
|
*/
|
|
32
33
|
|
|
@@ -37,6 +38,9 @@ export default class ScaleInteractionController {
|
|
|
37
38
|
/** @type {() => import("../utils/animator.js").default} */
|
|
38
39
|
#getAnimator;
|
|
39
40
|
|
|
41
|
+
/** @type {() => void} */
|
|
42
|
+
#renderImmediately;
|
|
43
|
+
|
|
40
44
|
/** @type {() => number[]} */
|
|
41
45
|
#getInitialDomainSnapshot;
|
|
42
46
|
|
|
@@ -56,6 +60,7 @@ export default class ScaleInteractionController {
|
|
|
56
60
|
* @param {object} options
|
|
57
61
|
* @param {() => ScaleWithProps} options.getScale
|
|
58
62
|
* @param {() => import("../utils/animator.js").default} options.getAnimator
|
|
63
|
+
* @param {() => void} options.renderImmediately
|
|
59
64
|
* @param {() => number[]} options.getInitialDomainSnapshot
|
|
60
65
|
* @param {() => number[]} options.getResetDomain
|
|
61
66
|
* @param {(domain: ScalarDomain | ComplexDomain) => number[]} options.fromComplexInterval
|
|
@@ -64,6 +69,7 @@ export default class ScaleInteractionController {
|
|
|
64
69
|
constructor({
|
|
65
70
|
getScale,
|
|
66
71
|
getAnimator,
|
|
72
|
+
renderImmediately,
|
|
67
73
|
getInitialDomainSnapshot,
|
|
68
74
|
getResetDomain,
|
|
69
75
|
fromComplexInterval,
|
|
@@ -71,6 +77,7 @@ export default class ScaleInteractionController {
|
|
|
71
77
|
}) {
|
|
72
78
|
this.#getScale = getScale;
|
|
73
79
|
this.#getAnimator = getAnimator;
|
|
80
|
+
this.#renderImmediately = renderImmediately;
|
|
74
81
|
this.#getInitialDomainSnapshot = getInitialDomainSnapshot;
|
|
75
82
|
this.#getResetDomain = getResetDomain;
|
|
76
83
|
this.#fromComplexInterval = fromComplexInterval;
|
|
@@ -170,13 +177,11 @@ export default class ScaleInteractionController {
|
|
|
170
177
|
* Immediately zooms to the given interval.
|
|
171
178
|
*
|
|
172
179
|
* @param {NumericDomain | ComplexDomain} domain
|
|
173
|
-
* @param {boolean | number} [
|
|
174
|
-
*
|
|
180
|
+
* @param {ZoomToOptions | boolean | number} [options] Zoom options.
|
|
181
|
+
* Passing the duration directly as a boolean or number is deprecated.
|
|
175
182
|
*/
|
|
176
|
-
async zoomTo(domain,
|
|
177
|
-
|
|
178
|
-
duration = duration ? 700 : 0;
|
|
179
|
-
}
|
|
183
|
+
async zoomTo(domain, options = false) {
|
|
184
|
+
const { duration, renderImmediately } = normalizeZoomToOptions(options);
|
|
180
185
|
|
|
181
186
|
if (!this.isZoomingSupported()) {
|
|
182
187
|
throw new Error("Not a zoomable scale!");
|
|
@@ -195,6 +200,12 @@ export default class ScaleInteractionController {
|
|
|
195
200
|
const from = /** @type {number[]} */ (scale.domain());
|
|
196
201
|
|
|
197
202
|
if (duration > 0 && from.length == 2) {
|
|
203
|
+
if (renderImmediately) {
|
|
204
|
+
throw new Error(
|
|
205
|
+
"renderImmediately is not supported for animated zooms."
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
|
|
198
209
|
// Spans
|
|
199
210
|
const fw = from[1] - from[0];
|
|
200
211
|
const tw = to[1] - to[0];
|
|
@@ -234,7 +245,11 @@ export default class ScaleInteractionController {
|
|
|
234
245
|
} else {
|
|
235
246
|
this.#cancelZoomTransition();
|
|
236
247
|
scale.domain(to);
|
|
237
|
-
|
|
248
|
+
if (renderImmediately) {
|
|
249
|
+
this.#renderImmediately();
|
|
250
|
+
} else {
|
|
251
|
+
animator?.requestRender();
|
|
252
|
+
}
|
|
238
253
|
}
|
|
239
254
|
}
|
|
240
255
|
|
|
@@ -279,6 +294,39 @@ export default class ScaleInteractionController {
|
|
|
279
294
|
}
|
|
280
295
|
}
|
|
281
296
|
|
|
297
|
+
/**
|
|
298
|
+
* @param {ZoomToOptions | boolean | number | undefined} options
|
|
299
|
+
* @returns {{ duration: number, renderImmediately: boolean }}
|
|
300
|
+
*/
|
|
301
|
+
function normalizeZoomToOptions(options) {
|
|
302
|
+
if (options === undefined) {
|
|
303
|
+
return {
|
|
304
|
+
duration: 0,
|
|
305
|
+
renderImmediately: false,
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
if (isBoolean(options)) {
|
|
310
|
+
return {
|
|
311
|
+
duration: options ? 700 : 0,
|
|
312
|
+
renderImmediately: false,
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
if (typeof options === "number") {
|
|
317
|
+
return {
|
|
318
|
+
duration: options,
|
|
319
|
+
renderImmediately: false,
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
const duration = options.duration ?? 0;
|
|
324
|
+
return {
|
|
325
|
+
duration: isBoolean(duration) ? (duration ? 700 : 0) : duration,
|
|
326
|
+
renderImmediately: options.renderImmediately === true,
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
|
|
282
330
|
/**
|
|
283
331
|
* @param {ScaleWithProps} scale
|
|
284
332
|
* @param {ZoomParams | boolean | undefined} zoom
|
|
@@ -185,10 +185,10 @@ export default class ScaleResolution implements ScaleResolutionApi {
|
|
|
185
185
|
* Immediately zooms to the given interval.
|
|
186
186
|
*
|
|
187
187
|
* @param {NumericDomain | ComplexDomain} domain
|
|
188
|
-
* @param {boolean | number} [
|
|
189
|
-
*
|
|
188
|
+
* @param {import("../types/scaleResolutionApi.js").ZoomToOptions | boolean | number} [options]
|
|
189
|
+
* Zoom options. Passing the duration directly as a boolean or number is deprecated.
|
|
190
190
|
*/
|
|
191
|
-
zoomTo(domain: import("../spec/scale.js").NumericDomain | import("../spec/scale.js").ComplexDomain,
|
|
191
|
+
zoomTo(domain: import("../spec/scale.js").NumericDomain | import("../spec/scale.js").ComplexDomain, options?: import("../types/scaleResolutionApi.js").ZoomToOptions | boolean | number): Promise<void>;
|
|
192
192
|
/**
|
|
193
193
|
* Resets the current domain to the initial one
|
|
194
194
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaleResolution.d.ts","sourceRoot":"","sources":["../../../src/scales/scaleResolution.js"],"names":[],"mappings":"AAoDA;;;;;;;;GAQG;AACH;;;;;;;;;;;;;;;;;;GAkBG;AACH;
|
|
1
|
+
{"version":3,"file":"scaleResolution.d.ts","sourceRoot":"","sources":["../../../src/scales/scaleResolution.js"],"names":[],"mappings":"AAoDA;;;;;;;;GAQG;AACH;;;;;;;;;;;;;;;;;;GAkBG;AACH;IA8cI;;;;;;;;OAQG;IACH,uBALa,CAAC,eACH,QAAQ,CAAC,eAAe,CAAC,YACzB,MAAM,CAAC,GACL,CAAC,CAqBb;IAnaD;;;OAGG;IACH,sEAFW,OAAO,iBAAiB,EAAE,OAAO,EAuC3C;IApCG,8CAAsB;IACtB,0FAA0F;IAC1F,MADW,OAAO,oBAAoB,EAAE,IAAI,CAC5B;IAEhB,iEAAiE;IACjE,MADW,MAAM,CACI;IA2EzB,2BASC;IAwBD;;;;;;;OAOG;IACH,4KAEC;IAED;;;OAGG;IACH,+KAEC;IAiCD,sCA6CC;IA+MD;;;OAGG;IACH,uBAHW,qBAAqB,GACnB,MAAM,OAAO,CAazB;IAED,gBAMC;IAoFD;;;;OAIG;IACH,0CAJW,OAAO,sBAAsB,EAAE,OAAO,aACtC,QAAQ,CAAC,OAAO,qBAAqB,EAAE,aAAa,CAAC,GACnD,MAAM,IAAI,CAkCtB;IAED;;OAEG;IACH,qCAEC;IAED,+BAiBC;IAuED;;;;;;;;;;;OAWG;IACH,0BALa;QACR,QAAQ,EAAE,OAAO,kBAAkB,EAAE,KAAK,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC;QACnE,oBAAoB,EAAE,OAAO,CAAA;KAC9B,CAeH;IAED;;;;;;;OAOG;IACH,wBAFa,OAAO,kBAAkB,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,SAAS,CAShE;IAgGD;;;;;OAKG;IACH,oBAYC;IAED;;;;;OAKG;IACH,0BA0BC;IAoID;;OAEG;IACH;eAnhCkC,OAAO,kBAAkB,EAAE,KAAK;MA0hCjE;IAED;;;;;;OAMG;IACH;eAniCkC,OAAO,kBAAkB,EAAE,KAAK;MA0iCjE;IAED;;;;OAIG;IACH;eAjjCkC,OAAO,kBAAkB,EAAE,KAAK;MA0jCjE;IAED,mBASC;IAED;;;;OAIG;IACH,+DAEC;IAED;;OAEG;IACH,oBAFa,mFAA6B,CASzC;IAED;;OAEG;IACH;;;;MAqBC;IAED;;;;OAIG;IACH,oBAEC;IAED;;OAEG;IACH,sBASC;IAED;;;;;;;OAOG;IACH,kBALW,MAAM,eACN,MAAM,OACN,MAAM,GACJ,OAAO,CAInB;IAED;;;;;;OAMG;IACH,eAJW,mFAA6B,YAC7B,OAAO,gCAAgC,EAAE,aAAa,GAAG,OAAO,GAAG,MAAM,iBAKnF;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;kCAxyC+B,CAAC,SAApB,6CAAkB;;;;UAGrB,OAAO,qBAAqB,EAAE,OAAO;aACrC,CAAC;gBACD,OAAO,oBAAoB,EAAE,mBAAmB;yBAChD,OAAO;;sBApCV,+BAA+B;sBAA/B,+BAA+B;wBAA/B,+BAA+B;wBAA/B,+BAA+B;6BAA/B,+BAA+B"}
|
|
@@ -37,8 +37,8 @@ import { resolveUrl } from "../utils/url.js";
|
|
|
37
37
|
import { orderResolutionMembers } from "./resolutionMemberOrder.js";
|
|
38
38
|
import {
|
|
39
39
|
findIntervalSelectionBindingOwners,
|
|
40
|
+
getIntervalSelection,
|
|
40
41
|
normalizeIntervalForSelection,
|
|
41
|
-
requireIntervalSelection,
|
|
42
42
|
} from "./selectionDomainUtils.js";
|
|
43
43
|
import { toExternalIndexLikeInterval } from "./indexLikeDomainUtils.js";
|
|
44
44
|
|
|
@@ -183,6 +183,7 @@ export default class ScaleResolution {
|
|
|
183
183
|
this.#interactionController = new ScaleInteractionController({
|
|
184
184
|
getScale: () => this.getScale(),
|
|
185
185
|
getAnimator: () => this.#viewContext.animator,
|
|
186
|
+
renderImmediately: () => this.#viewContext.renderImmediately(),
|
|
186
187
|
getInitialDomainSnapshot: () =>
|
|
187
188
|
this.#domainAggregator.initialDomainSnapshot,
|
|
188
189
|
getResetDomain: () => this.#getConfiguredOrDefaultDomain(),
|
|
@@ -324,10 +325,13 @@ export default class ScaleResolution {
|
|
|
324
325
|
return;
|
|
325
326
|
}
|
|
326
327
|
|
|
327
|
-
const selection =
|
|
328
|
+
const selection = getIntervalSelection(
|
|
328
329
|
linkInfo.runtime.getValue(linkInfo.param),
|
|
329
330
|
linkInfo.param
|
|
330
331
|
);
|
|
332
|
+
if (!selection) {
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
331
335
|
|
|
332
336
|
const interval = this.#normalizeDomainIntervalForLinkedSelection(
|
|
333
337
|
this.getScale().domain()
|
|
@@ -412,10 +416,13 @@ export default class ScaleResolution {
|
|
|
412
416
|
* @returns {[number, number] | null}
|
|
413
417
|
*/
|
|
414
418
|
#getCurrentLinkedSelectionInterval(linkInfo) {
|
|
415
|
-
const selection =
|
|
419
|
+
const selection = getIntervalSelection(
|
|
416
420
|
linkInfo.runtime.getValue(linkInfo.param),
|
|
417
421
|
linkInfo.param
|
|
418
422
|
);
|
|
423
|
+
if (!selection) {
|
|
424
|
+
return null;
|
|
425
|
+
}
|
|
419
426
|
const interval = selection.intervals[linkInfo.encoding];
|
|
420
427
|
return interval && interval.length === 2
|
|
421
428
|
? /** @type {[number, number]} */ (interval)
|
|
@@ -1267,11 +1274,11 @@ export default class ScaleResolution {
|
|
|
1267
1274
|
* Immediately zooms to the given interval.
|
|
1268
1275
|
*
|
|
1269
1276
|
* @param {NumericDomain | ComplexDomain} domain
|
|
1270
|
-
* @param {boolean | number} [
|
|
1271
|
-
*
|
|
1277
|
+
* @param {import("../types/scaleResolutionApi.js").ZoomToOptions | boolean | number} [options]
|
|
1278
|
+
* Zoom options. Passing the duration directly as a boolean or number is deprecated.
|
|
1272
1279
|
*/
|
|
1273
|
-
async zoomTo(domain,
|
|
1274
|
-
return this.#interactionController.zoomTo(domain,
|
|
1280
|
+
async zoomTo(domain, options = false) {
|
|
1281
|
+
return this.#interactionController.zoomTo(domain, options);
|
|
1275
1282
|
}
|
|
1276
1283
|
|
|
1277
1284
|
/**
|
|
@@ -10,6 +10,16 @@ export function requireParamRuntime(paramRuntime: {
|
|
|
10
10
|
* @param {string} paramName
|
|
11
11
|
*/
|
|
12
12
|
export function requireIntervalSelection(selection: any, paramName: string): import("../types/selectionTypes.js").IntervalSelection;
|
|
13
|
+
/**
|
|
14
|
+
* Returns an interval selection when the value exists and is of the correct
|
|
15
|
+
* type. Missing values are treated as empty so selection-linked domains can
|
|
16
|
+
* initialize before a pushed outer selection has been seeded.
|
|
17
|
+
*
|
|
18
|
+
* @param {any} selection
|
|
19
|
+
* @param {string} paramName
|
|
20
|
+
* @returns {import("../types/selectionTypes.js").IntervalSelection | undefined}
|
|
21
|
+
*/
|
|
22
|
+
export function getIntervalSelection(selection: any, paramName: string): import("../types/selectionTypes.js").IntervalSelection | undefined;
|
|
13
23
|
/**
|
|
14
24
|
* Resolves the runtime-backed interval selection binding used by a linked
|
|
15
25
|
* domain. Matching is based on the actual resolved runtime slot instead of
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selectionDomainUtils.d.ts","sourceRoot":"","sources":["../../../src/scales/selectionDomainUtils.js"],"names":[],"mappings":"AAOA;;;GAGG;AACH,kDAHW;IAAE,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,CAAA;CAAE,aAC9C,MAAM,OAUhB;AAED;;;GAGG;AACH,oDAHW,GAAG,aACH,MAAM,0DAgBhB;AAED;;;;;;;;GAQG;AACH,sDAJW,OAAO,iBAAiB,EAAE,OAAO,aACjC,MAAM,YACN,GAAG,GAAG,GAAG;;;EAiBnB;AAED;;;;;GAKG;AACH,yDALW,OAAO,iBAAiB,EAAE,OAAO,WACjC,GAAG,aACH,MAAM,YACN,GAAG,GAAG,GAAG;
|
|
1
|
+
{"version":3,"file":"selectionDomainUtils.d.ts","sourceRoot":"","sources":["../../../src/scales/selectionDomainUtils.js"],"names":[],"mappings":"AAOA;;;GAGG;AACH,kDAHW;IAAE,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,CAAA;CAAE,aAC9C,MAAM,OAUhB;AAED;;;GAGG;AACH,oDAHW,GAAG,aACH,MAAM,0DAgBhB;AAED;;;;;;;;GAQG;AACH,gDAJW,GAAG,aACH,MAAM,GACJ,OAAO,4BAA4B,EAAE,iBAAiB,GAAG,SAAS,CAc9E;AAED;;;;;;;;GAQG;AACH,sDAJW,OAAO,iBAAiB,EAAE,OAAO,aACjC,MAAM,YACN,GAAG,GAAG,GAAG;;;EAiBnB;AAED;;;;;GAKG;AACH,yDALW,OAAO,iBAAiB,EAAE,OAAO,WACjC,GAAG,aACH,MAAM,YACN,GAAG,GAAG,GAAG;UAQG,OAAO,iBAAiB,EAAE,OAAO;WAAS,OAAO,sBAAsB,EAAE,kBAAkB;IAuBjH;AAED;;;;;GAKG;AACH,yDALW,OAAO,iBAAiB,EAAE,OAAO,WACjC,GAAG,aACH,MAAM,YACN,GAAG,GAAG,GAAG,WA+CnB;AAED;;;;;GAKG;AACH,wDALW,MAAM,EAAE,cACR,MAAM,EAAE,YACR;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3B,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAsCxC"}
|