@genome-spy/core 0.79.0 → 0.79.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundle/index.es.js +2812 -2768
- package/dist/bundle/index.js +82 -82
- package/dist/src/data/sources/lazy/legendEntriesSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/legendEntriesSource.js +6 -5
- package/dist/src/view/gridView/gridView.d.ts.map +1 -1
- package/dist/src/view/gridView/gridView.js +38 -2
- package/dist/src/view/gridView/legendLayout.d.ts +5 -1
- package/dist/src/view/gridView/legendLayout.d.ts.map +1 -1
- package/dist/src/view/gridView/legendLayout.js +13 -9
- package/dist/src/view/legendView.d.ts +3 -0
- package/dist/src/view/legendView.d.ts.map +1 -1
- package/dist/src/view/legendView.js +50 -7
- package/dist/src/view/testUtils.d.ts.map +1 -1
- package/dist/src/view/testUtils.js +32 -1
- package/dist/src/view/view.d.ts.map +1 -1
- package/dist/src/view/view.js +5 -0
- package/dist/src/view/viewChrome.d.ts +33 -0
- package/dist/src/view/viewChrome.d.ts.map +1 -0
- package/dist/src/view/viewChrome.js +64 -0
- package/dist/src/view/viewSelectors.d.ts +1 -9
- package/dist/src/view/viewSelectors.d.ts.map +1 -1
- package/dist/src/view/viewSelectors.js +5 -16
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"legendEntriesSource.d.ts","sourceRoot":"","sources":["../../../../../src/data/sources/lazy/legendEntriesSource.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"legendEntriesSource.d.ts","sourceRoot":"","sources":["../../../../../src/data/sources/lazy/legendEntriesSource.js"],"names":[],"mappings":"AAkMA;;;GAGG;AACH,gDAHW,OAAO,uBAAuB,EAAE,OAAO,WACvC,OAAO,0BAA0B,EAAE,gBAAgB,wDAW7D;AAjMD;IAUI;;;OAGG;IACH,oBAHW,OAAO,uBAAuB,EAAE,iBAAiB,QACjD,OAAO,uBAAuB,EAAE,OAAO,EAmCjD;IA9BG,0DAAoB;IACpB,sEAAsE;IA4C1E;;;;;OAKG;IACH,uBAFa,MAAM,IAAI,CAQtB;;CAwGJ;uBAzLsB,kBAAkB"}
|
|
@@ -183,11 +183,12 @@ export default class LegendEntriesSource extends DataSource {
|
|
|
183
183
|
? validTicks(scale, this.params.values, count)
|
|
184
184
|
: tickValues(scale, count);
|
|
185
185
|
|
|
186
|
-
return values
|
|
187
|
-
value
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
186
|
+
return values
|
|
187
|
+
.flatMap((value) => {
|
|
188
|
+
const label = format(value);
|
|
189
|
+
return label ? [{ value, label }] : [];
|
|
190
|
+
})
|
|
191
|
+
.map((entry, index) => ({ ...entry, _legendIndex: index }));
|
|
191
192
|
}
|
|
192
193
|
}
|
|
193
194
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gridView.d.ts","sourceRoot":"","sources":["../../../../src/view/gridView/gridView.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gridView.d.ts","sourceRoot":"","sources":["../../../../src/view/gridView/gridView.js"],"names":[],"mappings":"AAgoDA;;GAEG;AACH,sHAUC;AAqFD;;;;;GAKG;AACH,4CAJW,OAAO,wBAAwB,EAAE,OAAO,UACxC,OAAO,oBAAoB,EAAE,UAAU,YACvC,QAAQ,aA+BlB;AArnDD;;;;;;;;;;;;;;;;;;GAkBG;AACH,8BAH2D,KAAK,SAAnD,OAAQ,oBAAoB,EAAE,aAAc;IAgDrD;;;;;;;;;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;;;;;OAKG;IACH,uBAHW,MAAM,SACN,MAAM,QAKhB;IAeD;;OAEG;IACH,mBAFW,qEAAM,QAWhB;IAYD;;OAEG;IACH,sFAEC;IAED,yBAEC;IAED;;OAEG;IACH,sCAEC;IAED;;;;;;OAMG;IACH,yBAFW;QAAE,YAAY,CAAC,EAAE,SAAS,EAAE,CAAA;KAAE,iBAWxC;IAED;;;;OAIG;IACH,gCAqCC;IAED;;;;;;OAMG;IACH,mCAUC;;CA4mCJ;qBAljDM,gBAAgB;sBALD,wBAAwB;0BAMpB,qBAAqB;sBAQzB,gBAAgB"}
|
|
@@ -91,7 +91,11 @@ function getLegendParallelSizeConstraints(legends) {
|
|
|
91
91
|
if (orient == "top" || orient == "bottom") {
|
|
92
92
|
widths.push(size.width);
|
|
93
93
|
} else {
|
|
94
|
-
|
|
94
|
+
// Side gradients can fill the available viewport height, but that
|
|
95
|
+
// available height must be determined by the real grid children and
|
|
96
|
+
// top/bottom chrome. Otherwise a shared right/left legend can make
|
|
97
|
+
// the grid grow to the browser height and then fill that height.
|
|
98
|
+
heights.push({ px: getSizeDefMinPx(size.height), grow: 0 });
|
|
95
99
|
}
|
|
96
100
|
}
|
|
97
101
|
|
|
@@ -1238,7 +1242,7 @@ export default class GridView extends ContainerView {
|
|
|
1238
1242
|
|
|
1239
1243
|
renderLocalLegends(
|
|
1240
1244
|
gridChild.legends,
|
|
1241
|
-
axes,
|
|
1245
|
+
this.#getLegendOffsetAxes(axes, col, row, grid),
|
|
1242
1246
|
viewportCoords,
|
|
1243
1247
|
context,
|
|
1244
1248
|
options,
|
|
@@ -1326,6 +1330,38 @@ export default class GridView extends ContainerView {
|
|
|
1326
1330
|
context.popView(this);
|
|
1327
1331
|
}
|
|
1328
1332
|
|
|
1333
|
+
/**
|
|
1334
|
+
* Local legends are GridChild-owned, but shared axes are GridView-owned.
|
|
1335
|
+
* When they share an orient, the axis should remain next to the plot and
|
|
1336
|
+
* the legend should move outside it. Give legend placement the applicable
|
|
1337
|
+
* shared edge axes so `renderLocalLegends()` can apply the same offset it
|
|
1338
|
+
* already uses for local axes.
|
|
1339
|
+
*
|
|
1340
|
+
* @param {Partial<Record<import("../../spec/axis.js").AxisOrient, AxisView>>} axes
|
|
1341
|
+
* @param {number} col
|
|
1342
|
+
* @param {number} row
|
|
1343
|
+
* @param {Grid} grid
|
|
1344
|
+
*/
|
|
1345
|
+
#getLegendOffsetAxes(axes, col, row, grid) {
|
|
1346
|
+
/** @type {Partial<Record<import("../../spec/axis.js").AxisOrient, AxisView>>} */
|
|
1347
|
+
const offsetAxes = { ...axes };
|
|
1348
|
+
|
|
1349
|
+
for (const axisView of Object.values(this.#sharedAxes)) {
|
|
1350
|
+
const orient = axisView.axisProps.orient;
|
|
1351
|
+
const isEdge =
|
|
1352
|
+
(orient == "left" && col == 0) ||
|
|
1353
|
+
(orient == "right" && col == grid.nCols - 1) ||
|
|
1354
|
+
(orient == "top" && row == 0) ||
|
|
1355
|
+
(orient == "bottom" && row == grid.nRows - 1);
|
|
1356
|
+
|
|
1357
|
+
if (isEdge && !offsetAxes[orient]) {
|
|
1358
|
+
offsetAxes[orient] = axisView;
|
|
1359
|
+
}
|
|
1360
|
+
}
|
|
1361
|
+
|
|
1362
|
+
return offsetAxes;
|
|
1363
|
+
}
|
|
1364
|
+
|
|
1329
1365
|
/**
|
|
1330
1366
|
* @param {import("../../utils/interaction.js").default} event
|
|
1331
1367
|
*/
|
|
@@ -4,7 +4,9 @@
|
|
|
4
4
|
* @param {{
|
|
5
5
|
* getPerpendicularSize: () => number,
|
|
6
6
|
* getOffset: () => number,
|
|
7
|
-
* getParallelSize?: () => number | undefined
|
|
7
|
+
* getParallelSize?: () => number | undefined,
|
|
8
|
+
* getWidth?: () => number,
|
|
9
|
+
* getHeight?: () => number
|
|
8
10
|
* }} legendView
|
|
9
11
|
* @param {number} [axisOffset]
|
|
10
12
|
*/
|
|
@@ -12,6 +14,8 @@ export function translateLegendCoords(coords: import("../layout/rectangle.js").d
|
|
|
12
14
|
getPerpendicularSize: () => number;
|
|
13
15
|
getOffset: () => number;
|
|
14
16
|
getParallelSize?: () => number | undefined;
|
|
17
|
+
getWidth?: () => number;
|
|
18
|
+
getHeight?: () => number;
|
|
15
19
|
}, axisOffset?: number): import("../layout/rectangle.js").default;
|
|
16
20
|
/**
|
|
17
21
|
* @param {import("./gridChildLegends.js").GridChildLegends} legends
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"legendLayout.d.ts","sourceRoot":"","sources":["../../../../src/view/gridView/legendLayout.js"],"names":[],"mappings":"AAKA
|
|
1
|
+
{"version":3,"file":"legendLayout.d.ts","sourceRoot":"","sources":["../../../../src/view/gridView/legendLayout.js"],"names":[],"mappings":"AAKA;;;;;;;;;;;GAWG;AACH,8CAXW,OAAO,wBAAwB,EAAE,OAAO,UACxC,OAAO,sBAAsB,EAAE,YAAY,cAC3C;IACJ,oBAAoB,EAAE,MAAM,MAAM,CAAC;IACnC,SAAS,EAAE,MAAM,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,EAAE,MAAM,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,MAAM,CAAA;CAC3B,eACO,MAAM,4CAyDhB;AAED;;;;;;;;GAQG;AACH,4CARW,OAAO,uBAAuB,EAAE,gBAAgB,QAChD,OAAO,CAAC,MAAM,CAAC,OAAO,oBAAoB,EAAE,UAAU,EAAE,OAAO,gBAAgB,EAAE,OAAO,CAAC,CAAC,kBAC1F,OAAO,wBAAwB,EAAE,OAAO,WACxC,OAAO,6CAA6C,EAAE,OAAO,WAC7D,OAAO,0BAA0B,EAAE,gBAAgB,mBACnD,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,SAC7D,MAAM,QAiChB"}
|
|
@@ -9,7 +9,9 @@ const LEGEND_ZINDEX = 1;
|
|
|
9
9
|
* @param {{
|
|
10
10
|
* getPerpendicularSize: () => number,
|
|
11
11
|
* getOffset: () => number,
|
|
12
|
-
* getParallelSize?: () => number | undefined
|
|
12
|
+
* getParallelSize?: () => number | undefined,
|
|
13
|
+
* getWidth?: () => number,
|
|
14
|
+
* getHeight?: () => number
|
|
13
15
|
* }} legendView
|
|
14
16
|
* @param {number} [axisOffset]
|
|
15
17
|
*/
|
|
@@ -24,6 +26,8 @@ export function translateLegendCoords(
|
|
|
24
26
|
const parallelSize = legendView.getParallelSize?.() ?? coords.height;
|
|
25
27
|
const cornerParallelSize =
|
|
26
28
|
legendView.getParallelSize?.() ?? coords.height - 2 * offset;
|
|
29
|
+
const cornerWidth = legendView.getWidth?.() ?? ps;
|
|
30
|
+
const cornerHeight = legendView.getHeight?.() ?? cornerParallelSize;
|
|
27
31
|
|
|
28
32
|
if (orient == "bottom") {
|
|
29
33
|
return coords
|
|
@@ -44,25 +48,25 @@ export function translateLegendCoords(
|
|
|
44
48
|
} else if (orient == "top-left") {
|
|
45
49
|
return coords
|
|
46
50
|
.translate(axisOffset + offset, offset)
|
|
47
|
-
.modify({ width:
|
|
51
|
+
.modify({ width: cornerWidth, height: cornerHeight });
|
|
48
52
|
} else if (orient == "top-right") {
|
|
49
53
|
return coords
|
|
50
|
-
.translate(coords.width -
|
|
51
|
-
.modify({ width:
|
|
54
|
+
.translate(coords.width - cornerWidth - axisOffset - offset, offset)
|
|
55
|
+
.modify({ width: cornerWidth, height: cornerHeight });
|
|
52
56
|
} else if (orient == "bottom-left") {
|
|
53
57
|
return coords
|
|
54
58
|
.translate(
|
|
55
59
|
axisOffset + offset,
|
|
56
|
-
coords.height -
|
|
60
|
+
coords.height - cornerHeight - offset
|
|
57
61
|
)
|
|
58
|
-
.modify({ width:
|
|
62
|
+
.modify({ width: cornerWidth, height: cornerHeight });
|
|
59
63
|
} else if (orient == "bottom-right") {
|
|
60
64
|
return coords
|
|
61
65
|
.translate(
|
|
62
|
-
coords.width -
|
|
63
|
-
coords.height -
|
|
66
|
+
coords.width - cornerWidth - axisOffset - offset,
|
|
67
|
+
coords.height - cornerHeight - offset
|
|
64
68
|
)
|
|
65
|
-
.modify({ width:
|
|
69
|
+
.modify({ width: cornerWidth, height: cornerHeight });
|
|
66
70
|
} else {
|
|
67
71
|
throw new Error(`Invalid legend orientation: ${orient}`);
|
|
68
72
|
}
|
|
@@ -62,6 +62,8 @@ export class LegendRegionView extends ContainerView<import("../spec/view.js").Co
|
|
|
62
62
|
*/
|
|
63
63
|
addLegendView(legendView: LegendView): void;
|
|
64
64
|
getPerpendicularSize(): number;
|
|
65
|
+
getWidth(): number;
|
|
66
|
+
getHeight(): number;
|
|
65
67
|
getOffset(): number;
|
|
66
68
|
getParallelSize(): number;
|
|
67
69
|
#private;
|
|
@@ -128,6 +130,7 @@ export type SymbolLegendStyle = {
|
|
|
128
130
|
export type MeasuredLabels = {
|
|
129
131
|
maxWidth: number;
|
|
130
132
|
maxEntryWidth: number;
|
|
133
|
+
maxX: number;
|
|
131
134
|
maxY: number;
|
|
132
135
|
};
|
|
133
136
|
import ContainerView from "./containerView.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"legendView.d.ts","sourceRoot":"","sources":["../../../src/view/legendView.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"legendView.d.ts","sourceRoot":"","sources":["../../../src/view/legendView.js"],"names":[],"mappings":"AA8VA;;;;;;;;;;;;GAYG;AACH,8IAXG;IAAgC,OAAO,GAA/B,WAAW,EAAE;IAC0C,OAAO,EAA9D,OAAO,oBAAoB,EAAE,gBAAgB;IACoC,cAAc,GAA/F,OAAO,CAAC,MAAM,CAAC,OAAO,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC1C,WAAW,GAAvC,iBAAiB;IACY,cAAc,GAA3C,OAAO,GAAG,QAAQ;IACI,MAAM,EAA5B,YAAY;IACK,MAAM,GAAvB,MAAM;IACqC,QAAQ,EAAnD,OAAO,oBAAoB,EAAE,IAAI;IACkB,OAAO,EAA1D,OAAO,yBAAyB,EAAE,OAAO;CACjD,GAAU,cAAc,CA+M1B;AAED;;;;;;;GAOG;AACH,+EANG;IAA+D,OAAO,EAA9D,OAAO,oBAAoB,EAAE,gBAAgB;IACvB,MAAM,EAA5B,YAAY;IACK,MAAM,GAAvB,MAAM;IAC6C,OAAO,EAA1D,OAAO,yBAAyB,EAAE,OAAO;CACjD,GAAU,cAAc,CAgO1B;AAED;;;;;;GAMG;AACH,sDANW;IACJ,oBAAoB,EAAE,MAAM,MAAM,CAAC;IACnC,SAAS,EAAE,MAAM,MAAM,CAAA;CAC1B,GAAG,SAAS,GACH,MAAM,CAMlB;AAED;IASI;;;;;;OAMG;IACH,oBANW,OAAO,mBAAmB,EAAE,YAAY,gBACxC,MAAM,WACN,OAAO,yBAAyB,EAAE,OAAO,gBACzC,OAAO,oBAAoB,EAAE,OAAO,cACpC,OAAO,WAAW,EAAE,OAAO,EAqBrC;IALG,iDAAoB;IAuBxB;;OAEG;IACH,0BAFW,UAAU,QAWpB;IA2DD,+BAuBC;IAED,mBAOC;IAED,oBAQC;IAED,oBAOC;IAED,0BAcC;;CAiDJ;AAED;IAyBI;;;;;;;;;;;;;;;OAeG;IACH,gHAdG;QAA8B,OAAO,GAA7B,WAAW,EAAE;QACwC,OAAO,EAA5D,OAAO,oBAAoB,EAAE,gBAAgB;QACkC,cAAc,GAA7F,OAAO,CAAC,MAAM,CAAC,OAAO,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;QAC5C,WAAW,GAArC,iBAAiB;QACU,cAAc,GAAzC,OAAO,GAAG,QAAQ;QACY,IAAI,GAAlC,QAAQ,GAAG,UAAU;QACD,MAAM,EAA1B,YAAY;QACG,MAAM,GAArB,MAAM;QACmC,QAAQ,EAAjD,OAAO,oBAAoB,EAAE,IAAI;KACzC,WAAQ,OAAO,yBAAyB,EAAE,OAAO,gBACzC,OAAO,oBAAoB,EAAE,OAAO,cACpC,OAAO,WAAW,EAAE,OAAO,YAC3B,OAAO,WAAW,EAAE,WAAW,EA0DzC;IATG,sDAAyB;IA6G7B,+BAEC;IAED,oBAEC;IAED;;OAEG;IACH,8BAFW,MAAM,OAAO,QAIvB;IAQD,oBAEC;IAED,iCAUC;IAkED;;;;;;;;;OASG;IACH,4BAFa,MAAM,IAAI,CAyBtB;;CA+BJ;2BAxyCY,OAAO,mBAAmB,EAAE,YAAY;0BACxC,OAAO,2BAA2B,EAAE,WAAW;6BAC/C,CAAC,OAAO,iBAAiB,EAAE,WAAW,GAAG,OAAO,iBAAiB,EAAE,WAAW,CAAC,GAAG;IACxF,IAAI,EAAE,OAAO,iBAAiB,EAAE,cAAc,CAAA;CACjD;gCACS;IACN,IAAI,CAAC,EAAE,OAAO,CAAC,OAAO,iBAAiB,EAAE,UAAU,CAAC,CAAC;IACrD,QAAQ,CAAC,EAAE,OAAO,CAAC,OAAO,oBAAoB,EAAE,QAAQ,CAAC,CAAA;CAC5D;;cAoyCM,MAAM;mBACN,MAAM;UACN,MAAM;UACN,MAAM;;0BA/3CU,oBAAoB"}
|
|
@@ -227,10 +227,17 @@ function createLegendRootSpec(legend, body, context, forcedScaleChannels = []) {
|
|
|
227
227
|
/**
|
|
228
228
|
* @param {LegendConfig} legend
|
|
229
229
|
*/
|
|
230
|
-
function
|
|
230
|
+
function isTopBottomLegend(legend) {
|
|
231
231
|
return legend.orient == "top" || legend.orient == "bottom";
|
|
232
232
|
}
|
|
233
233
|
|
|
234
|
+
/**
|
|
235
|
+
* @param {LegendConfig} legend
|
|
236
|
+
*/
|
|
237
|
+
function isHorizontalLegend(legend) {
|
|
238
|
+
return isTopBottomLegend(legend) || legend.direction == "horizontal";
|
|
239
|
+
}
|
|
240
|
+
|
|
234
241
|
/**
|
|
235
242
|
* @param {LegendConfig} legend
|
|
236
243
|
* @returns {import("../spec/legend.js").LegendTitleOrient}
|
|
@@ -955,6 +962,25 @@ export class LegendRegionView extends ContainerView {
|
|
|
955
962
|
}
|
|
956
963
|
}
|
|
957
964
|
|
|
965
|
+
getWidth() {
|
|
966
|
+
return Math.max(
|
|
967
|
+
0,
|
|
968
|
+
...this.#getVisibleLegendViews().map((legendView) =>
|
|
969
|
+
getSizeDefMinPx(legendView.getSize().width)
|
|
970
|
+
)
|
|
971
|
+
);
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
getHeight() {
|
|
975
|
+
return this.#getVisibleLegendViews().reduce(
|
|
976
|
+
(sum, legendView, index) =>
|
|
977
|
+
sum +
|
|
978
|
+
getSizeDefMinPx(legendView.getSize().height) +
|
|
979
|
+
(index > 0 ? this.#stackSpacing : 0),
|
|
980
|
+
0
|
|
981
|
+
);
|
|
982
|
+
}
|
|
983
|
+
|
|
958
984
|
getOffset() {
|
|
959
985
|
return Math.max(
|
|
960
986
|
0,
|
|
@@ -1188,17 +1214,17 @@ export default class LegendView extends ContainerView {
|
|
|
1188
1214
|
return new FlexDimensions({ px: 0, grow: 0 }, { px: 0, grow: 0 });
|
|
1189
1215
|
}
|
|
1190
1216
|
|
|
1217
|
+
const contentHorizontal = isHorizontalLegend(this.legendProps);
|
|
1191
1218
|
const mainSize = { grow: 1 };
|
|
1192
1219
|
const perpendicularSize = { px: this.getPerpendicularSize() };
|
|
1193
1220
|
const parallelSize = this.#hasFlexibleParallelSize()
|
|
1194
1221
|
? this.#getFlexibleStackedParallelSize()
|
|
1195
1222
|
: { px: this.getStackedParallelSize() };
|
|
1196
1223
|
|
|
1197
|
-
if (
|
|
1198
|
-
this.legendProps.orient == "top" ||
|
|
1199
|
-
this.legendProps.orient == "bottom"
|
|
1200
|
-
) {
|
|
1224
|
+
if (isTopBottomLegend(this.legendProps)) {
|
|
1201
1225
|
return new FlexDimensions(mainSize, perpendicularSize);
|
|
1226
|
+
} else if (contentHorizontal) {
|
|
1227
|
+
return new FlexDimensions(parallelSize, perpendicularSize);
|
|
1202
1228
|
} else {
|
|
1203
1229
|
return new FlexDimensions(perpendicularSize, parallelSize);
|
|
1204
1230
|
}
|
|
@@ -1397,6 +1423,7 @@ export default class LegendView extends ContainerView {
|
|
|
1397
1423
|
* @typedef {object} MeasuredLabels
|
|
1398
1424
|
* @prop {number} maxWidth
|
|
1399
1425
|
* @prop {number} maxEntryWidth
|
|
1426
|
+
* @prop {number} maxX
|
|
1400
1427
|
* @prop {number} maxY
|
|
1401
1428
|
*/
|
|
1402
1429
|
|
|
@@ -1407,6 +1434,7 @@ export default class LegendView extends ContainerView {
|
|
|
1407
1434
|
function getMeasuredLabels(labelViews) {
|
|
1408
1435
|
let maxWidth = 0;
|
|
1409
1436
|
let maxEntryWidth = 0;
|
|
1437
|
+
let maxX = 0;
|
|
1410
1438
|
let maxY = 0;
|
|
1411
1439
|
let completed = false;
|
|
1412
1440
|
|
|
@@ -1426,6 +1454,11 @@ function getMeasuredLabels(labelViews) {
|
|
|
1426
1454
|
maxEntryWidth,
|
|
1427
1455
|
Number(datum.entryWidth) || 0
|
|
1428
1456
|
);
|
|
1457
|
+
maxX = Math.max(
|
|
1458
|
+
maxX,
|
|
1459
|
+
(Number(datum.labelX) || 0) +
|
|
1460
|
+
(Number(datum[LABEL_WIDTH_FIELD]) || 0)
|
|
1461
|
+
);
|
|
1429
1462
|
maxY = Math.max(maxY, Number(datum.labelY) || 0);
|
|
1430
1463
|
});
|
|
1431
1464
|
}
|
|
@@ -1434,6 +1467,7 @@ function getMeasuredLabels(labelViews) {
|
|
|
1434
1467
|
? {
|
|
1435
1468
|
maxWidth: Math.ceil(maxWidth),
|
|
1436
1469
|
maxEntryWidth: Math.ceil(maxEntryWidth),
|
|
1470
|
+
maxX: Math.ceil(maxX),
|
|
1437
1471
|
maxY: Math.ceil(maxY),
|
|
1438
1472
|
}
|
|
1439
1473
|
: undefined;
|
|
@@ -1505,7 +1539,11 @@ function getStackedLegendParallelSize(legend, type, measuredLabels, context) {
|
|
|
1505
1539
|
return combine(DEFAULT_GRADIENT_LEGEND_LENGTH);
|
|
1506
1540
|
} else if (measuredLabels) {
|
|
1507
1541
|
const labelFontSize = legend.labelFontSize ?? 10;
|
|
1508
|
-
|
|
1542
|
+
const bodyExtent = isHorizontalLegend(legend)
|
|
1543
|
+
? measuredLabels.maxX
|
|
1544
|
+
: measuredLabels.maxY + labelFontSize / 2;
|
|
1545
|
+
|
|
1546
|
+
return combine(bodyExtent);
|
|
1509
1547
|
} else {
|
|
1510
1548
|
return combine(
|
|
1511
1549
|
Math.sqrt(legend.symbolSize ?? 100) +
|
|
@@ -1593,7 +1631,12 @@ function getTitleWidth(legend, context) {
|
|
|
1593
1631
|
fontStyle: legend.titleFontStyle,
|
|
1594
1632
|
fontWeight: legend.titleFontWeight,
|
|
1595
1633
|
});
|
|
1596
|
-
|
|
1634
|
+
// Generated legend title width is materialized into the child spec before
|
|
1635
|
+
// asynchronous font loading has necessarily completed. Use fallback metrics
|
|
1636
|
+
// to avoid a padding-only title extent. TODO: Recompute generated legend
|
|
1637
|
+
// specs or make title extent lazy when requested font metrics become ready.
|
|
1638
|
+
const metrics =
|
|
1639
|
+
font.metrics ?? context.fontManager.getDefaultFont().metrics;
|
|
1597
1640
|
if (!metrics) {
|
|
1598
1641
|
return 0;
|
|
1599
1642
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../../src/view/testUtils.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../../src/view/testUtils.js"],"names":[],"mappings":"AAkEA;;;;GAIG;AACH,2DAJW,OAAO,kBAAkB,EAAE,kBAAkB,mBAC7C,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC,CAAC,CAAC,6CAQzD;AAED;;;GAGG;AACH,uEAHW,OAAO,kBAAkB,EAAE,kBAAkB,GAC3C,uBAAuB,CAmCnC;AAGS,uBAAC,CAAC,SAAS,OAAO,WAAW,EAAE,OAAO,QAAQ,QAAQ,aAAa;IAAE,KAAI,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;CAAE,uBAAuB,OAAO,kBAAkB,EAAE,kBAAkB,mBAAmB,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC,CAAC,CAAC,GAAK,OAAO,CAAC,CAAC,CAAC,CAAA;AA0BlP,oCAAC,CAAC,SAAS,OAAO,WAAW,EAAE,OAAO,QAAQ,QAAQ,aAAa;IAAE,KAAI,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;CAAE,YAAY,WAAW,YAAY;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAC,GAAK,OAAO,CAAC,CAAC,CAAC,CAAA;AAqBjM;;;;;;GAMG;AACH,qCAHW,IAAI,WACJ,OAAO,uBAAuB,EAAE,OAAO;;;;;EAoBjD;AAED;;;;;;GAMG;AACH,mCAJW,QAAQ,uBACR,OAAO,kBAAkB,EAAE,kBAAkB,WAC7C,OAAO,uBAAuB,EAAE,OAAO;;;;;GAuBjD;;;;;;uBAxNY,OAAO,iBAAiB,EAAE,QAAQ;;;;;0BAClC,OAAO,yBAAyB,EAAE,OAAO;;;;;sCACzC,WAAW,GAAG;IACtB,aAAa,EAAE,CACb,IAAI,EAAE,OAAO,WAAW,EAAE,OAAO,EACjC,IAAI,EAAE,OAAO,iBAAiB,EAAE,kBAAkB,EAClD,OAAO,CAAC,EAAE,GAAG,KACV,IAAI,CAAA;CACV;0CAoBG,mCAAmC;iBANzB,WAAW;qCAMrB,mCAAmC"}
|
|
@@ -35,6 +35,34 @@ import { INTERNAL_DEFAULT_CONFIG } from "../config/defaultConfig.js";
|
|
|
35
35
|
import { mergeConfigScopes } from "../config/mergeConfig.js";
|
|
36
36
|
import { resolveBaseConfig } from "../config/resolveConfig.js";
|
|
37
37
|
import { DEFAULT_THEME_NAME, resolveThemeSelection } from "../config/themes.js";
|
|
38
|
+
import BmFontManager from "../fonts/bmFontManager.js";
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Uses the embedded default font for every font request. Layout snapshots
|
|
42
|
+
* should be stable and independent of asynchronously loaded font variants.
|
|
43
|
+
*/
|
|
44
|
+
class LayoutSnapshotFontManager {
|
|
45
|
+
#fontManager = new BmFontManager();
|
|
46
|
+
|
|
47
|
+
getDefaultFont() {
|
|
48
|
+
return this.#fontManager.getDefaultFont();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
getFont() {
|
|
52
|
+
return this.getDefaultFont();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** @returns {Promise<void>} */
|
|
56
|
+
async waitUntilReady() {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function createLayoutSnapshotFontManager() {
|
|
62
|
+
return /** @type {BmFontManager} */ (
|
|
63
|
+
/** @type {unknown} */ (new LayoutSnapshotFontManager())
|
|
64
|
+
);
|
|
65
|
+
}
|
|
38
66
|
|
|
39
67
|
/**
|
|
40
68
|
* @param {import("./viewFactory.js").ViewFactoryOptions} [viewFactoryOptions]
|
|
@@ -183,7 +211,10 @@ export async function specToLayout(spec, viewFactoryOptions = {}, coords) {
|
|
|
183
211
|
wrapRoot: true,
|
|
184
212
|
...viewFactoryOptions,
|
|
185
213
|
},
|
|
186
|
-
{
|
|
214
|
+
{
|
|
215
|
+
baseConfig,
|
|
216
|
+
fontManager: createLayoutSnapshotFontManager(),
|
|
217
|
+
}
|
|
187
218
|
);
|
|
188
219
|
|
|
189
220
|
return renderToLayout(view, coords);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/view/view.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/view/view.js"],"names":[],"mappings":"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"}
|
package/dist/src/view/view.js
CHANGED
|
@@ -25,6 +25,7 @@ import {
|
|
|
25
25
|
clipCoords,
|
|
26
26
|
normalizeClipOptions,
|
|
27
27
|
} from "./renderingContext/clipOptions.js";
|
|
28
|
+
import { isInChromeSubtree } from "./viewChrome.js";
|
|
28
29
|
|
|
29
30
|
// TODO: View classes have too many responsibilities. Come up with a way
|
|
30
31
|
// to separate the concerns. However, most concerns are tightly tied to
|
|
@@ -488,6 +489,10 @@ export default class View {
|
|
|
488
489
|
* @returns {number | import("../spec/view.js").Step | undefined}
|
|
489
490
|
*/
|
|
490
491
|
#getConfiguredDefaultSize(dimension) {
|
|
492
|
+
if (isInChromeSubtree(this)) {
|
|
493
|
+
return undefined;
|
|
494
|
+
}
|
|
495
|
+
|
|
491
496
|
const viewConfig = this.getConfig().view;
|
|
492
497
|
if (!viewConfig) {
|
|
493
498
|
return undefined;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {import("./view.js").default} view
|
|
3
|
+
* @param {ChromeOverride} behavior
|
|
4
|
+
*/
|
|
5
|
+
export function setChromeOverride(view: import("./view.js").default, behavior: ChromeOverride): void;
|
|
6
|
+
/**
|
|
7
|
+
* @param {import("./view.js").default} view
|
|
8
|
+
* @returns {ChromeOverride | undefined}
|
|
9
|
+
*/
|
|
10
|
+
export function getChromeOverride(view: import("./view.js").default): ChromeOverride | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Returns whether a view itself has been marked as decorative chrome.
|
|
13
|
+
*
|
|
14
|
+
* @param {import("./view.js").default} view
|
|
15
|
+
* @returns {boolean}
|
|
16
|
+
*/
|
|
17
|
+
export function isChromeView(view: import("./view.js").default): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Returns whether a view is inside a chrome subtree in the layout hierarchy.
|
|
20
|
+
*
|
|
21
|
+
* @param {import("./view.js").default} view
|
|
22
|
+
* @returns {boolean}
|
|
23
|
+
*/
|
|
24
|
+
export function isInChromeSubtree(view: import("./view.js").default): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Tracks views that are decorative chrome instead of user-authored plot views.
|
|
27
|
+
*
|
|
28
|
+
* Chrome views may still need inherited data, scales, or parameters, but they
|
|
29
|
+
* should not participate in plot-oriented defaults such as configured
|
|
30
|
+
* continuous view sizes.
|
|
31
|
+
*/
|
|
32
|
+
export type ChromeOverride = "exclude" | "excludeSubtree";
|
|
33
|
+
//# sourceMappingURL=viewChrome.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewChrome.d.ts","sourceRoot":"","sources":["../../../src/view/viewChrome.js"],"names":[],"mappings":"AAaA;;;GAGG;AACH,wCAHW,OAAO,WAAW,EAAE,OAAO,YAC3B,cAAc,QAIxB;AAED;;;GAGG;AACH,wCAHW,OAAO,WAAW,EAAE,OAAO,GACzB,cAAc,GAAG,SAAS,CAItC;AAED;;;;;GAKG;AACH,mCAHW,OAAO,WAAW,EAAE,OAAO,GACzB,OAAO,CAInB;AAED;;;;;GAKG;AACH,wCAHW,OAAO,WAAW,EAAE,OAAO,GACzB,OAAO,CAoBnB;;;;;;;;6BAxDY,SAAS,GAAG,gBAAgB"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracks views that are decorative chrome instead of user-authored plot views.
|
|
3
|
+
*
|
|
4
|
+
* Chrome views may still need inherited data, scales, or parameters, but they
|
|
5
|
+
* should not participate in plot-oriented defaults such as configured
|
|
6
|
+
* continuous view sizes.
|
|
7
|
+
*
|
|
8
|
+
* @typedef {"exclude" | "excludeSubtree"} ChromeOverride
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/** @type {WeakMap<import("./view.js").default, ChromeOverride>} */
|
|
12
|
+
const chromeOverrides = new WeakMap();
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @param {import("./view.js").default} view
|
|
16
|
+
* @param {ChromeOverride} behavior
|
|
17
|
+
*/
|
|
18
|
+
export function setChromeOverride(view, behavior) {
|
|
19
|
+
chromeOverrides.set(view, behavior);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @param {import("./view.js").default} view
|
|
24
|
+
* @returns {ChromeOverride | undefined}
|
|
25
|
+
*/
|
|
26
|
+
export function getChromeOverride(view) {
|
|
27
|
+
return chromeOverrides.get(view);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Returns whether a view itself has been marked as decorative chrome.
|
|
32
|
+
*
|
|
33
|
+
* @param {import("./view.js").default} view
|
|
34
|
+
* @returns {boolean}
|
|
35
|
+
*/
|
|
36
|
+
export function isChromeView(view) {
|
|
37
|
+
return chromeOverrides.has(view);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Returns whether a view is inside a chrome subtree in the layout hierarchy.
|
|
42
|
+
*
|
|
43
|
+
* @param {import("./view.js").default} view
|
|
44
|
+
* @returns {boolean}
|
|
45
|
+
*/
|
|
46
|
+
export function isInChromeSubtree(view) {
|
|
47
|
+
/** @type {import("./view.js").default | null} */
|
|
48
|
+
let current = view;
|
|
49
|
+
|
|
50
|
+
while (current) {
|
|
51
|
+
const behavior = chromeOverrides.get(current);
|
|
52
|
+
if (behavior === "excludeSubtree") {
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (current === view && behavior === "exclude") {
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
current = current.layoutParent;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
@@ -36,13 +36,6 @@ export function markViewAsNonAddressable(view: import("./view.js").default, opti
|
|
|
36
36
|
* @param {ChromeOptions} [options]
|
|
37
37
|
*/
|
|
38
38
|
export function markViewAsChrome(view: import("./view.js").default, options?: ChromeOptions): void;
|
|
39
|
-
/**
|
|
40
|
-
* Returns whether a view has been marked as decorative chrome.
|
|
41
|
-
*
|
|
42
|
-
* @param {import("./view.js").default} view
|
|
43
|
-
* @returns {boolean}
|
|
44
|
-
*/
|
|
45
|
-
export function isChromeView(view: import("./view.js").default): boolean;
|
|
46
39
|
/**
|
|
47
40
|
* Returns the import scope chain for a view, using named import instances.
|
|
48
41
|
*
|
|
@@ -137,6 +130,7 @@ export function getBookmarkableParams(root: import("./view.js").default): Bookma
|
|
|
137
130
|
* @returns {SelectorValidationIssue[]}
|
|
138
131
|
*/
|
|
139
132
|
export function validateSelectorConstraints(root: import("./view.js").default): SelectorValidationIssue[];
|
|
133
|
+
export { isChromeView } from "./viewChrome.js";
|
|
140
134
|
/**
|
|
141
135
|
* Selectors identify views and parameters in a way that stays stable when the
|
|
142
136
|
* same template/import is instantiated multiple times. They combine a chain of
|
|
@@ -151,7 +145,6 @@ export function validateSelectorConstraints(root: import("./view.js").default):
|
|
|
151
145
|
* @typedef {{ message: string, scope: string[] }} SelectorValidationIssue
|
|
152
146
|
* @typedef {{ name: string | null }} ImportScopeInfo
|
|
153
147
|
* @typedef {"exclude" | "excludeSubtree"} AddressableOverride
|
|
154
|
-
* @typedef {"exclude" | "excludeSubtree"} ChromeOverride
|
|
155
148
|
* @typedef {{ skipSubtree?: boolean }} AddressableOptions
|
|
156
149
|
* @typedef {{ skipSubtree?: boolean }} ChromeOptions
|
|
157
150
|
* @typedef {{ view: import("./view.js").default, param: import("../spec/parameter.js").Parameter }} ResolvedParam
|
|
@@ -172,7 +165,6 @@ export type ImportScopeInfo = {
|
|
|
172
165
|
name: string | null;
|
|
173
166
|
};
|
|
174
167
|
export type AddressableOverride = "exclude" | "excludeSubtree";
|
|
175
|
-
export type ChromeOverride = "exclude" | "excludeSubtree";
|
|
176
168
|
export type AddressableOptions = {
|
|
177
169
|
skipSubtree?: boolean;
|
|
178
170
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"viewSelectors.d.ts","sourceRoot":"","sources":["../../../src/view/viewSelectors.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"viewSelectors.d.ts","sourceRoot":"","sources":["../../../src/view/viewSelectors.js"],"names":[],"mappings":"AAqCA;;;;;GAKG;AACH,6CAHW,OAAO,WAAW,EAAE,OAAO,aAC3B,MAAM,GAAG,IAAI,QAIvB;AAED;;;;;;;;GAQG;AACH,wCAHW,OAAO,WAAW,EAAE,OAAO,aAC3B,MAAM,GAAG,IAAI,QAIvB;AAeD;;;;;GAKG;AACH,yCAHW,OAAO,WAAW,EAAE,OAAO,GACzB,eAAe,GAAG,SAAS,CAIvC;AAED;;;;;GAKG;AACH,+CAHW,OAAO,WAAW,EAAE,OAAO,YAC3B,kBAAkB,QAM5B;AAED;;;;;GAKG;AACH,uCAHW,OAAO,WAAW,EAAE,OAAO,YAC3B,aAAa,QAMvB;AAED;;;;;GAKG;AACH,wCAHW,OAAO,WAAW,EAAE,OAAO,GACzB,MAAM,EAAE,CAgBpB;AAED;;;;;GAKG;AACH,sCAHW,OAAO,WAAW,EAAE,OAAO,GACzB,YAAY,CAYxB;AAED;;;;;;GAMG;AACH,uCAJW,OAAO,WAAW,EAAE,OAAO,aAC3B,MAAM,GACJ,aAAa,CAazB;AAED;;;;;GAKG;AACH,+CAHW,aAAa,GACX,MAAM,CAQlB;AAED;;;;;GAKG;AACH,0CAHW,OAAO,WAAW,EAAE,OAAO,GACzB,OAAO,WAAW,EAAE,OAAO,EAAE,CAWzC;AAED;;;;;GAKG;AACH,0CAHW,OAAO,WAAW,EAAE,OAAO,WAC3B,OAAO,WAAW,EAAE,OAAO,QAerC;AAED;;;;;GAKG;AACH,wCAHW,OAAO,WAAW,EAAE,OAAO,GACzB,OAAO,WAAW,EAAE,OAAO,EAAE,CAWzC;AAED;;;;;GAKG;AACH,4CAHW,OAAO,WAAW,EAAE,OAAO,WAC3B,OAAO,WAAW,EAAE,OAAO,QAerC;AAED;;;;;;GAMG;AACH,0CAJW,OAAO,WAAW,EAAE,OAAO,YAC3B,YAAY,GACV,OAAO,WAAW,EAAE,OAAO,GAAG,SAAS,CAoCnD;AAED;;;;;;GAMG;AACH,2CAJW,OAAO,WAAW,EAAE,OAAO,YAC3B,aAAa,GACX,aAAa,GAAG,SAAS,CAuCrC;AAED;;;;;GAKG;AACH,8CAHW,OAAO,WAAW,EAAE,OAAO,WAC3B,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,QAyBjD;AAED;;;;;GAKG;AACH,4CAHW,OAAO,WAAW,EAAE,OAAO,GACzB,sBAAsB,EAAE,CAOpC;AAED;;;;;GAKG;AACH,kDAHW,OAAO,WAAW,EAAE,OAAO,GACzB,uBAAuB,EAAE,CAarC;;AA9YD;;;;;;GAMG;AAEH;;;;;;;;;;GAUG;AAEH,wCAAyC,IAAI,CAAC;2BAXjC,OAAO,sBAAsB,EAAE,YAAY;4BAC3C,OAAO,sBAAsB,EAAE,aAAa;qCAC5C;IAAE,IAAI,EAAE,OAAO,WAAW,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,sBAAsB,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,aAAa,CAAA;CAAE;sCAC/G;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE;8BACpC;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;kCACvB,SAAS,GAAG,gBAAgB;iCAC5B;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE;4BACzB;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE;4BACzB;IAAE,IAAI,EAAE,OAAO,WAAW,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,sBAAsB,EAAE,SAAS,CAAA;CAAE"}
|
|
@@ -3,6 +3,9 @@ import {
|
|
|
3
3
|
isSelectionParameter,
|
|
4
4
|
isVariableParameter,
|
|
5
5
|
} from "../paramRuntime/paramUtils.js";
|
|
6
|
+
import { getChromeOverride, setChromeOverride } from "./viewChrome.js";
|
|
7
|
+
|
|
8
|
+
export { isChromeView } from "./viewChrome.js";
|
|
6
9
|
|
|
7
10
|
/**
|
|
8
11
|
* Selectors identify views and parameters in a way that stays stable when the
|
|
@@ -19,7 +22,6 @@ import {
|
|
|
19
22
|
* @typedef {{ message: string, scope: string[] }} SelectorValidationIssue
|
|
20
23
|
* @typedef {{ name: string | null }} ImportScopeInfo
|
|
21
24
|
* @typedef {"exclude" | "excludeSubtree"} AddressableOverride
|
|
22
|
-
* @typedef {"exclude" | "excludeSubtree"} ChromeOverride
|
|
23
25
|
* @typedef {{ skipSubtree?: boolean }} AddressableOptions
|
|
24
26
|
* @typedef {{ skipSubtree?: boolean }} ChromeOptions
|
|
25
27
|
* @typedef {{ view: import("./view.js").default, param: import("../spec/parameter.js").Parameter }} ResolvedParam
|
|
@@ -33,9 +35,6 @@ const importScopes = new WeakMap();
|
|
|
33
35
|
/** @type {WeakMap<import("./view.js").default, AddressableOverride>} */
|
|
34
36
|
const addressableOverrides = new WeakMap();
|
|
35
37
|
|
|
36
|
-
/** @type {WeakMap<import("./view.js").default, ChromeOverride>} */
|
|
37
|
-
const chromeOverrides = new WeakMap();
|
|
38
|
-
|
|
39
38
|
/**
|
|
40
39
|
* Marks a view as the root of an import scope.
|
|
41
40
|
*
|
|
@@ -103,17 +102,7 @@ export function markViewAsNonAddressable(view, options = {}) {
|
|
|
103
102
|
export function markViewAsChrome(view, options = {}) {
|
|
104
103
|
const skipSubtree = options.skipSubtree ?? false;
|
|
105
104
|
const behavior = skipSubtree ? "excludeSubtree" : "exclude";
|
|
106
|
-
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Returns whether a view has been marked as decorative chrome.
|
|
111
|
-
*
|
|
112
|
-
* @param {import("./view.js").default} view
|
|
113
|
-
* @returns {boolean}
|
|
114
|
-
*/
|
|
115
|
-
export function isChromeView(view) {
|
|
116
|
-
return chromeOverrides.has(view);
|
|
105
|
+
setChromeOverride(view, behavior);
|
|
117
106
|
}
|
|
118
107
|
|
|
119
108
|
/**
|
|
@@ -215,7 +204,7 @@ export function getAddressableViews(root) {
|
|
|
215
204
|
*/
|
|
216
205
|
export function visitNonChromeViews(root, visitor) {
|
|
217
206
|
root.visit((view) => {
|
|
218
|
-
const behavior =
|
|
207
|
+
const behavior = getChromeOverride(view);
|
|
219
208
|
if (behavior === "excludeSubtree") {
|
|
220
209
|
return VISIT_SKIP;
|
|
221
210
|
}
|
package/package.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
},
|
|
8
8
|
"contributors": [],
|
|
9
9
|
"license": "MIT",
|
|
10
|
-
"version": "0.79.
|
|
10
|
+
"version": "0.79.1",
|
|
11
11
|
"jsdelivr": "dist/bundle/index.js",
|
|
12
12
|
"unpkg": "dist/bundle/index.js",
|
|
13
13
|
"browser": "dist/bundle/index.js",
|
|
@@ -78,5 +78,5 @@
|
|
|
78
78
|
"devDependencies": {
|
|
79
79
|
"@types/long": "^4.0.1"
|
|
80
80
|
},
|
|
81
|
-
"gitHead": "
|
|
81
|
+
"gitHead": "bd399afa44797ccbf7da2564ccc2ab52c7aa0a72"
|
|
82
82
|
}
|