@tileflow/dev 0.1.0-alpha.36 → 0.1.0-alpha.37
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/README.md +5 -5
- package/THIRD_PARTY_NOTICES.md +4 -4
- package/dist/{devtools-browser.js → inspector-browser.js} +511 -470
- package/dist/{devtools-observer.js → inspector-observer.js} +1 -1
- package/dist/{preview-assets-MT3RXZMN.js → preview-assets-ATLLYY72.js} +2 -2
- package/dist/preview.js +16 -83
- package/dist/server.d.ts +1 -1
- package/dist/server.js +541 -541
- package/docs/layers-inspection.md +1 -1
- package/docs/local-comparison-workbench-and-compiler-inspection.md +5 -5
- package/docs/map-design-diagnostics.md +1 -1
- package/package.json +4 -4
|
@@ -9013,7 +9013,7 @@ async function readBoundedTileflowResponse(response, maximumBytes) {
|
|
|
9013
9013
|
return result;
|
|
9014
9014
|
}
|
|
9015
9015
|
|
|
9016
|
-
// src/
|
|
9016
|
+
// src/inspector/font-preview.ts
|
|
9017
9017
|
var fontPreviewLines = ["Aa Bb Cc 0123456789", "Streets, parks and caf\xE9s."];
|
|
9018
9018
|
function readPreviewGlyphs(bytes2) {
|
|
9019
9019
|
const glyphs = /* @__PURE__ */ new Map();
|
|
@@ -9070,12 +9070,12 @@ var FontPreviews = class {
|
|
|
9070
9070
|
canvas.height = 92 * ratio;
|
|
9071
9071
|
canvas.style.width = "320px";
|
|
9072
9072
|
canvas.style.height = "92px";
|
|
9073
|
-
canvas.className = "
|
|
9073
|
+
canvas.className = "inspector-font-preview";
|
|
9074
9074
|
canvas.setAttribute("role", "img");
|
|
9075
9075
|
canvas.setAttribute("aria-label", `${font}: ${lines.join(" / ")}`);
|
|
9076
9076
|
const ctx = canvas.getContext("2d");
|
|
9077
9077
|
ctx.scale(ratio, ratio);
|
|
9078
|
-
const ink = getComputedStyle(document.body).getPropertyValue("--ink").trim() || "#
|
|
9078
|
+
const ink = getComputedStyle(document.body).getPropertyValue("--ink").trim() || "#171717";
|
|
9079
9079
|
const color = Color.parse(ink);
|
|
9080
9080
|
const rgb = [color.r, color.g, color.b].map((n) => Math.round(n * 255));
|
|
9081
9081
|
ctx.fillStyle = ink;
|
|
@@ -9168,7 +9168,7 @@ var FontPreviews = class {
|
|
|
9168
9168
|
}
|
|
9169
9169
|
};
|
|
9170
9170
|
|
|
9171
|
-
// src/
|
|
9171
|
+
// src/inspector/sprite-catalog.ts
|
|
9172
9172
|
var SpriteCatalog = class {
|
|
9173
9173
|
cache = /* @__PURE__ */ new Map();
|
|
9174
9174
|
generation = "";
|
|
@@ -9244,7 +9244,7 @@ var SpriteCatalog = class {
|
|
|
9244
9244
|
}
|
|
9245
9245
|
};
|
|
9246
9246
|
|
|
9247
|
-
// src/
|
|
9247
|
+
// src/inspector/theme-labels.ts
|
|
9248
9248
|
var themeLabels = {
|
|
9249
9249
|
light: "Light",
|
|
9250
9250
|
default: "Default",
|
|
@@ -9265,7 +9265,7 @@ function themeVariantLabel(variant, metadata) {
|
|
|
9265
9265
|
return `${themeLabel(variant.palette, metadata)}${moment ? ` \xB7 ${moment[0].toUpperCase()}${moment.slice(1)}` : ""}`;
|
|
9266
9266
|
}
|
|
9267
9267
|
|
|
9268
|
-
// src/
|
|
9268
|
+
// src/inspector/assets.ts
|
|
9269
9269
|
function el(tag, className = "", text = "") {
|
|
9270
9270
|
const node = document.createElement(tag);
|
|
9271
9271
|
node.className = className;
|
|
@@ -9323,7 +9323,7 @@ var AssetsPanel = class {
|
|
|
9323
9323
|
}) {
|
|
9324
9324
|
this.active = active2;
|
|
9325
9325
|
this.revealLayer = revealLayer;
|
|
9326
|
-
const tabs = el("div", "
|
|
9326
|
+
const tabs = el("div", "inspector-subtabs");
|
|
9327
9327
|
tabs.setAttribute("role", "tablist");
|
|
9328
9328
|
tabs.setAttribute("aria-label", "Asset categories");
|
|
9329
9329
|
for (const category of ["Sprites", "Models", "Fonts"]) {
|
|
@@ -9333,9 +9333,9 @@ var AssetsPanel = class {
|
|
|
9333
9333
|
category === "Sprites" ? "Icons" : category === "Models" ? "3D models" : category
|
|
9334
9334
|
);
|
|
9335
9335
|
tab.type = "button";
|
|
9336
|
-
tab.id = `
|
|
9336
|
+
tab.id = `inspector-assets-${category.toLowerCase()}`;
|
|
9337
9337
|
tab.setAttribute("role", "tab");
|
|
9338
|
-
tab.setAttribute("aria-controls", "
|
|
9338
|
+
tab.setAttribute("aria-controls", "inspector-assets-content");
|
|
9339
9339
|
tab.addEventListener("click", () => this.select(category));
|
|
9340
9340
|
tab.addEventListener("keydown", (event) => {
|
|
9341
9341
|
const names = [...this.tabs.keys()];
|
|
@@ -9375,7 +9375,7 @@ var AssetsPanel = class {
|
|
|
9375
9375
|
this.palette.onchange = changeVariant;
|
|
9376
9376
|
this.moment.onchange = changeVariant;
|
|
9377
9377
|
this.toolbar.append(this.search, this.sampleInput, this.palette, this.moment);
|
|
9378
|
-
this.content.id = "
|
|
9378
|
+
this.content.id = "inspector-assets-content";
|
|
9379
9379
|
this.content.setAttribute("role", "tabpanel");
|
|
9380
9380
|
this.status.setAttribute("role", "status");
|
|
9381
9381
|
root.append(tabs, this.toolbar, this.content, this.status);
|
|
@@ -9397,12 +9397,12 @@ var AssetsPanel = class {
|
|
|
9397
9397
|
sample = "Streets, parks and caf\xE9s.";
|
|
9398
9398
|
sampleInput = el("input");
|
|
9399
9399
|
fontTimer;
|
|
9400
|
-
assetAside = el("aside", "
|
|
9400
|
+
assetAside = el("aside", "inspector-asset-aside");
|
|
9401
9401
|
revealLayer;
|
|
9402
9402
|
search = el("input");
|
|
9403
|
-
toolbar = el("div", "
|
|
9404
|
-
content = el("div", "
|
|
9405
|
-
status = el("div", "
|
|
9403
|
+
toolbar = el("div", "inspector-tools");
|
|
9404
|
+
content = el("div", "inspector-scroll inspector-assets-content");
|
|
9405
|
+
status = el("div", "inspector-footer");
|
|
9406
9406
|
map;
|
|
9407
9407
|
style;
|
|
9408
9408
|
dirty = true;
|
|
@@ -9467,7 +9467,7 @@ var AssetsPanel = class {
|
|
|
9467
9467
|
this.status.textContent = "";
|
|
9468
9468
|
this.status.title = "";
|
|
9469
9469
|
if (!this.style || !this.map) {
|
|
9470
|
-
this.content.append(el("p", "
|
|
9470
|
+
this.content.append(el("p", "inspector-empty", "Waiting for map assets\u2026"));
|
|
9471
9471
|
return;
|
|
9472
9472
|
}
|
|
9473
9473
|
if (this.category === "Sprites") {
|
|
@@ -9478,7 +9478,7 @@ var AssetsPanel = class {
|
|
|
9478
9478
|
this.renderModels();
|
|
9479
9479
|
return;
|
|
9480
9480
|
}
|
|
9481
|
-
const values2 = el("dl", "
|
|
9481
|
+
const values2 = el("dl", "inspector-kv");
|
|
9482
9482
|
if (this.category === "Glyphs") {
|
|
9483
9483
|
values2.append(
|
|
9484
9484
|
el("dt", "", "Glyph URL"),
|
|
@@ -9498,17 +9498,17 @@ var AssetsPanel = class {
|
|
|
9498
9498
|
})
|
|
9499
9499
|
])
|
|
9500
9500
|
].sort();
|
|
9501
|
-
const list = el("div", "
|
|
9501
|
+
const list = el("div", "inspector-font-list");
|
|
9502
9502
|
this.fontRun = new AbortController();
|
|
9503
9503
|
const { signal } = this.fontRun;
|
|
9504
9504
|
for (const font of fonts) {
|
|
9505
|
-
const card = el("figure", "
|
|
9506
|
-
const preview = el("div", "
|
|
9507
|
-
preview.append(el("span", "
|
|
9505
|
+
const card = el("figure", "inspector-font-card");
|
|
9506
|
+
const preview = el("div", "inspector-font-sample");
|
|
9507
|
+
preview.append(el("span", "inspector-font-loading", "Loading preview\u2026"));
|
|
9508
9508
|
card.append(el("figcaption", "", font), preview);
|
|
9509
9509
|
const entries = this.map.style?.glyphManager?.entries;
|
|
9510
9510
|
const entry = entries?.[font], ranges = Object.keys(entry?.ranges ?? {});
|
|
9511
|
-
const resources = this.active().frame.contentWindow?.
|
|
9511
|
+
const resources = this.active().frame.contentWindow?.__tileflowInspectorObserver?.records.filter((record) => record.kind === "Font") ?? [];
|
|
9512
9512
|
const matching = resources.filter((record) => {
|
|
9513
9513
|
try {
|
|
9514
9514
|
return decodeURIComponent(record.url).includes(font);
|
|
@@ -9516,12 +9516,12 @@ var AssetsPanel = class {
|
|
|
9516
9516
|
return false;
|
|
9517
9517
|
}
|
|
9518
9518
|
});
|
|
9519
|
-
const stats = el("div", "
|
|
9519
|
+
const stats = el("div", "inspector-font-ranges");
|
|
9520
9520
|
for (const range of ranges)
|
|
9521
9521
|
stats.append(
|
|
9522
9522
|
el(
|
|
9523
9523
|
"code",
|
|
9524
|
-
"
|
|
9524
|
+
"inspector-filter-chip",
|
|
9525
9525
|
/^\d+$/u.test(range) ? `${Number(range) * 256}\u2013${Number(range) * 256 + 255}` : range
|
|
9526
9526
|
)
|
|
9527
9527
|
);
|
|
@@ -9533,10 +9533,10 @@ var AssetsPanel = class {
|
|
|
9533
9533
|
)
|
|
9534
9534
|
);
|
|
9535
9535
|
card.append(stats);
|
|
9536
|
-
const uses = el("div", "
|
|
9536
|
+
const uses = el("div", "inspector-tile-chip-list");
|
|
9537
9537
|
for (const layer of this.style.layers)
|
|
9538
9538
|
if (layer.type === "symbol" && JSON.stringify(layer.layout?.["text-font"] ?? "").includes(font.split(",")[0])) {
|
|
9539
|
-
const link = el("button", "
|
|
9539
|
+
const link = el("button", "inspector-tile-chip", layer.id);
|
|
9540
9540
|
link.onclick = () => this.revealLayer(layer.id);
|
|
9541
9541
|
uses.append(link);
|
|
9542
9542
|
}
|
|
@@ -9546,13 +9546,13 @@ var AssetsPanel = class {
|
|
|
9546
9546
|
if (!signal.aborted) preview.replaceChildren(canvas);
|
|
9547
9547
|
}).catch((error2) => {
|
|
9548
9548
|
if (signal.aborted) return;
|
|
9549
|
-
preview.replaceChildren(el("span", "
|
|
9549
|
+
preview.replaceChildren(el("span", "inspector-font-loading", "Preview unavailable"));
|
|
9550
9550
|
preview.title = error2 instanceof Error ? error2.message : String(error2);
|
|
9551
9551
|
});
|
|
9552
9552
|
}
|
|
9553
9553
|
this.content.append(list);
|
|
9554
9554
|
if (!fonts.length)
|
|
9555
|
-
this.content.append(el("p", "
|
|
9555
|
+
this.content.append(el("p", "inspector-empty", "No static font stacks in this style."));
|
|
9556
9556
|
this.status.textContent = `${fonts.length} font families`;
|
|
9557
9557
|
}
|
|
9558
9558
|
this.content.append(values2);
|
|
@@ -9568,14 +9568,14 @@ var AssetsPanel = class {
|
|
|
9568
9568
|
this.content.append(
|
|
9569
9569
|
el(
|
|
9570
9570
|
"p",
|
|
9571
|
-
"
|
|
9571
|
+
"inspector-empty",
|
|
9572
9572
|
this.names.length ? "No icons match this filter." : "No sprite images registered in this map."
|
|
9573
9573
|
)
|
|
9574
9574
|
);
|
|
9575
9575
|
return;
|
|
9576
9576
|
}
|
|
9577
|
-
const grid = el("div", "
|
|
9578
|
-
const layout = el("div", "
|
|
9577
|
+
const grid = el("div", "inspector-sprite-grid");
|
|
9578
|
+
const layout = el("div", "inspector-asset-layout"), main = el("div", "inspector-asset-main");
|
|
9579
9579
|
main.append(grid);
|
|
9580
9580
|
layout.append(main, this.assetAside);
|
|
9581
9581
|
this.content.append(layout);
|
|
@@ -9594,7 +9594,7 @@ var AssetsPanel = class {
|
|
|
9594
9594
|
const append = () => {
|
|
9595
9595
|
const fragment = document.createDocumentFragment();
|
|
9596
9596
|
for (const end = Math.min(cursor + 80, names.length); cursor < end; cursor++) {
|
|
9597
|
-
const name = names[cursor], card = el("figure", "
|
|
9597
|
+
const name = names[cursor], card = el("figure", "inspector-sprite-card");
|
|
9598
9598
|
card.dataset.sprite = name;
|
|
9599
9599
|
card.tabIndex = 0;
|
|
9600
9600
|
card.setAttribute("role", "button");
|
|
@@ -9614,9 +9614,9 @@ var AssetsPanel = class {
|
|
|
9614
9614
|
});
|
|
9615
9615
|
card.title = name;
|
|
9616
9616
|
card.append(
|
|
9617
|
-
el("div", "
|
|
9617
|
+
el("div", "inspector-sprite-preview"),
|
|
9618
9618
|
el("figcaption", "", name),
|
|
9619
|
-
el("small", "
|
|
9619
|
+
el("small", "inspector-sprite-size")
|
|
9620
9620
|
);
|
|
9621
9621
|
fragment.append(card);
|
|
9622
9622
|
this.previews.observe(card);
|
|
@@ -9633,23 +9633,23 @@ var AssetsPanel = class {
|
|
|
9633
9633
|
this.variantRun?.abort();
|
|
9634
9634
|
this.variantRun = new AbortController();
|
|
9635
9635
|
const signal = this.variantRun.signal;
|
|
9636
|
-
const matrix = el("div", "
|
|
9636
|
+
const matrix = el("div", "inspector-asset-variants");
|
|
9637
9637
|
const variants = (window.__tileflowScene?.variants() ?? []).filter(
|
|
9638
9638
|
(v) => !v.timeOfDay || ["day", "night"].includes(v.timeOfDay)
|
|
9639
9639
|
);
|
|
9640
9640
|
if (!variants.length) {
|
|
9641
|
-
const cell = el("div", "
|
|
9641
|
+
const cell = el("div", "inspector-asset-variant");
|
|
9642
9642
|
cell.dataset.sprite = name;
|
|
9643
|
-
cell.append(el("div", "
|
|
9643
|
+
cell.append(el("div", "inspector-sprite-preview"), el("code", "", name), el("small"));
|
|
9644
9644
|
this.drawSprite(map, cell);
|
|
9645
9645
|
matrix.append(cell);
|
|
9646
9646
|
}
|
|
9647
9647
|
for (const variant of variants) {
|
|
9648
|
-
const cell = el("div", "
|
|
9648
|
+
const cell = el("div", "inspector-asset-variant");
|
|
9649
9649
|
cell.dataset.sprite = name;
|
|
9650
9650
|
cell.dataset.night = String(variant.timeOfDay === "night");
|
|
9651
9651
|
cell.append(
|
|
9652
|
-
el("div", "
|
|
9652
|
+
el("div", "inspector-sprite-preview", "\u2026"),
|
|
9653
9653
|
el("code", "", themeVariantLabel(variant, this.style?.metadata)),
|
|
9654
9654
|
el("small")
|
|
9655
9655
|
);
|
|
@@ -9660,18 +9660,18 @@ var AssetsPanel = class {
|
|
|
9660
9660
|
cell.dataset.sprite = id;
|
|
9661
9661
|
cell.title = mapped ? id : `${id} \xB7 exact atlas ID; no corresponding expression output found`;
|
|
9662
9662
|
if (!result.icons.getImage(id)) {
|
|
9663
|
-
cell.querySelector(".
|
|
9663
|
+
cell.querySelector(".inspector-sprite-preview").textContent = "Missing";
|
|
9664
9664
|
return;
|
|
9665
9665
|
}
|
|
9666
|
-
cell.querySelector(".
|
|
9666
|
+
cell.querySelector(".inspector-sprite-preview").textContent = "";
|
|
9667
9667
|
this.drawSprite(result.icons, cell);
|
|
9668
9668
|
}).catch(() => {
|
|
9669
9669
|
if (!signal.aborted)
|
|
9670
|
-
cell.querySelector(".
|
|
9670
|
+
cell.querySelector(".inspector-sprite-preview").textContent = "Unavailable";
|
|
9671
9671
|
});
|
|
9672
9672
|
}
|
|
9673
9673
|
this.assetAside.append(matrix);
|
|
9674
|
-
const image = map.getImage(name), values2 = el("dl", "
|
|
9674
|
+
const image = map.getImage(name), values2 = el("dl", "inspector-kv");
|
|
9675
9675
|
for (const [key, value] of Object.entries({
|
|
9676
9676
|
Width: image?.data?.width,
|
|
9677
9677
|
Height: image?.data?.height,
|
|
@@ -9679,12 +9679,12 @@ var AssetsPanel = class {
|
|
|
9679
9679
|
SDF: image?.sdf
|
|
9680
9680
|
}))
|
|
9681
9681
|
values2.append(el("dt", "", key), el("dd", "", String(value ?? "Unavailable")));
|
|
9682
|
-
this.assetAside.append(values2, el("div", "
|
|
9682
|
+
this.assetAside.append(values2, el("div", "inspector-section-heading", "Used by"));
|
|
9683
9683
|
const matches = (this.iconStyle ?? this.style).layers.filter(
|
|
9684
9684
|
(layer) => layer.type === "symbol" && JSON.stringify(layer.layout?.["icon-image"] ?? "").includes(name)
|
|
9685
9685
|
);
|
|
9686
9686
|
for (const layer of matches) {
|
|
9687
|
-
const link = el("button", "
|
|
9687
|
+
const link = el("button", "inspector-tile-chip", layer.id);
|
|
9688
9688
|
link.onclick = () => this.revealLayer(layer.id);
|
|
9689
9689
|
this.assetAside.append(link);
|
|
9690
9690
|
}
|
|
@@ -9692,7 +9692,7 @@ var AssetsPanel = class {
|
|
|
9692
9692
|
this.assetAside.append(
|
|
9693
9693
|
el(
|
|
9694
9694
|
"p",
|
|
9695
|
-
"
|
|
9695
|
+
"inspector-note",
|
|
9696
9696
|
"No literal reference. Data-driven icon expressions may select this image."
|
|
9697
9697
|
)
|
|
9698
9698
|
);
|
|
@@ -9743,19 +9743,19 @@ var AssetsPanel = class {
|
|
|
9743
9743
|
this.content.append(
|
|
9744
9744
|
el(
|
|
9745
9745
|
"p",
|
|
9746
|
-
"
|
|
9746
|
+
"inspector-empty",
|
|
9747
9747
|
"No 3D model assets are loaded. Enable a 3D module or navigate to its coverage."
|
|
9748
9748
|
)
|
|
9749
9749
|
);
|
|
9750
9750
|
return;
|
|
9751
9751
|
}
|
|
9752
|
-
const layout = el("div", "
|
|
9752
|
+
const layout = el("div", "inspector-asset-layout"), main = el("div", "inspector-asset-main"), grid = el("div", "inspector-model-grid");
|
|
9753
9753
|
if (!models.some((m) => m.id === this.selectedModel)) this.selectedModel = models[0].id;
|
|
9754
9754
|
const show = (model) => {
|
|
9755
9755
|
this.selectedModel = model.id;
|
|
9756
9756
|
this.assetAside.replaceChildren(el("h3", "", model.id));
|
|
9757
9757
|
this.assetAside.append(this.modelCanvas(model, 280));
|
|
9758
|
-
const values2 = el("dl", "
|
|
9758
|
+
const values2 = el("dl", "inspector-kv");
|
|
9759
9759
|
for (const [key, value] of Object.entries({
|
|
9760
9760
|
Module: model.module,
|
|
9761
9761
|
Format: model.format,
|
|
@@ -9771,7 +9771,7 @@ var AssetsPanel = class {
|
|
|
9771
9771
|
cell.setAttribute("aria-pressed", String(cell.dataset.model === model.id));
|
|
9772
9772
|
};
|
|
9773
9773
|
for (const model of models) {
|
|
9774
|
-
const card = el("button", "
|
|
9774
|
+
const card = el("button", "inspector-model-card");
|
|
9775
9775
|
card.dataset.model = model.id;
|
|
9776
9776
|
card.append(
|
|
9777
9777
|
this.modelCanvas(model, 160),
|
|
@@ -9858,7 +9858,7 @@ var AssetsPanel = class {
|
|
|
9858
9858
|
return canvas;
|
|
9859
9859
|
}
|
|
9860
9860
|
drawSprite(map, card) {
|
|
9861
|
-
const preview = card.querySelector(".
|
|
9861
|
+
const preview = card.querySelector(".inspector-sprite-preview");
|
|
9862
9862
|
try {
|
|
9863
9863
|
const image = map.getImage(card.dataset.sprite);
|
|
9864
9864
|
if (!image?.data || image.isWebGLImage) throw new Error("Preview unavailable");
|
|
@@ -9908,14 +9908,14 @@ var AssetsPanel = class {
|
|
|
9908
9908
|
}
|
|
9909
9909
|
};
|
|
9910
9910
|
|
|
9911
|
-
// src/
|
|
9911
|
+
// src/inspector/map-value.ts
|
|
9912
9912
|
function mapValue(map, value) {
|
|
9913
9913
|
if (value === void 0) return value;
|
|
9914
9914
|
const realm = map.getContainer?.()?.ownerDocument?.defaultView;
|
|
9915
9915
|
return (realm?.JSON ?? JSON).parse(JSON.stringify(value));
|
|
9916
9916
|
}
|
|
9917
9917
|
|
|
9918
|
-
// src/
|
|
9918
|
+
// src/inspector/style-edits.ts
|
|
9919
9919
|
function propertySpec(type, section, name) {
|
|
9920
9920
|
if (type === "custom" && section === "layout" && name === "visibility")
|
|
9921
9921
|
return propertySpec("background", "layout", "visibility");
|
|
@@ -10749,13 +10749,13 @@ var VectorTile = class {
|
|
|
10749
10749
|
}
|
|
10750
10750
|
};
|
|
10751
10751
|
|
|
10752
|
-
// src/
|
|
10752
|
+
// src/inspector/tiles.ts
|
|
10753
10753
|
function visibleTiles(map) {
|
|
10754
10754
|
const managers = map.style?.tileManagers;
|
|
10755
10755
|
if (!managers) return { supported: false, tiles: [] };
|
|
10756
10756
|
const tiles = [];
|
|
10757
10757
|
for (const [source, manager] of Object.entries(managers)) {
|
|
10758
|
-
if (source.startsWith("__tileflow-
|
|
10758
|
+
if (source.startsWith("__tileflow-inspector-")) continue;
|
|
10759
10759
|
for (const tile of manager?._inViewTiles?.getAllTiles?.() || []) {
|
|
10760
10760
|
const canonical = tile.tileID?.canonical;
|
|
10761
10761
|
if (!canonical || ![canonical.z, canonical.x, canonical.y].every(Number.isInteger)) continue;
|
|
@@ -10847,7 +10847,7 @@ function inspectTile(map, record) {
|
|
|
10847
10847
|
return { ...result, ...decoded };
|
|
10848
10848
|
}
|
|
10849
10849
|
|
|
10850
|
-
// src/
|
|
10850
|
+
// src/inspector/beacon/runner.ts
|
|
10851
10851
|
function readCamera(map) {
|
|
10852
10852
|
const center = map.getCenter();
|
|
10853
10853
|
return {
|
|
@@ -10859,12 +10859,12 @@ function readCamera(map) {
|
|
|
10859
10859
|
}
|
|
10860
10860
|
function moveCamera(map, camera, duration = 0, userInput = false) {
|
|
10861
10861
|
const options = mapValue(map, { ...camera, duration });
|
|
10862
|
-
const event = {
|
|
10862
|
+
const event = { tileflowInspector: true, ...userInput ? { tileflowUserCamera: true } : {} };
|
|
10863
10863
|
if (duration) map.easeTo(options, event);
|
|
10864
10864
|
else map.jumpTo(options, event);
|
|
10865
10865
|
}
|
|
10866
10866
|
|
|
10867
|
-
// src/
|
|
10867
|
+
// src/inspector/overdraw.ts
|
|
10868
10868
|
var overdrawColors = [
|
|
10869
10869
|
"#151b27",
|
|
10870
10870
|
"#2563eb",
|
|
@@ -10953,7 +10953,7 @@ var OverdrawHeatmap = class {
|
|
|
10953
10953
|
}
|
|
10954
10954
|
};
|
|
10955
10955
|
|
|
10956
|
-
// src/
|
|
10956
|
+
// src/inspector/debug.ts
|
|
10957
10957
|
var el2 = (tag, cls = "", text = "") => {
|
|
10958
10958
|
const node = document.createElement(tag);
|
|
10959
10959
|
node.className = cls;
|
|
@@ -10964,16 +10964,16 @@ var DebugPanel = class {
|
|
|
10964
10964
|
constructor(root, active2, overdraw) {
|
|
10965
10965
|
this.active = active2;
|
|
10966
10966
|
this.overdraw = overdraw;
|
|
10967
|
-
const content = el2("div", "
|
|
10968
|
-
const overlays = el2("section", "
|
|
10969
|
-
overlays.append(el2("div", "
|
|
10967
|
+
const content = el2("div", "inspector-scroll inspector-card-page");
|
|
10968
|
+
const overlays = el2("section", "inspector-card");
|
|
10969
|
+
overlays.append(el2("div", "inspector-section-heading", "Map overlays"));
|
|
10970
10970
|
const specs = [
|
|
10971
10971
|
["showOverdrawInspector", "Overdraw", "How many times each pixel is painted per frame"],
|
|
10972
10972
|
["showCollisionBoxes", "Collision boxes", "Which labels and icons are placed or dropped"],
|
|
10973
10973
|
["showTileBoundaries", "Tile boundaries", "Edges and z/x/y of every loaded tile"]
|
|
10974
10974
|
];
|
|
10975
10975
|
for (const [key, title, description] of specs) {
|
|
10976
|
-
const row = el2("label", "
|
|
10976
|
+
const row = el2("label", "inspector-debug-overlay"), preview2 = el2("span", "inspector-debug-preview"), copy = el2("span"), toggle = el2("input");
|
|
10977
10977
|
preview2.innerHTML = this.preview(key);
|
|
10978
10978
|
copy.append(el2("strong", "", title), el2("small", "", description));
|
|
10979
10979
|
toggle.type = "checkbox";
|
|
@@ -10986,9 +10986,9 @@ var DebugPanel = class {
|
|
|
10986
10986
|
if (key === "showOverdrawInspector") overlays.append(this.help);
|
|
10987
10987
|
if (key === "showCollisionBoxes") overlays.append(this.collisionHelp);
|
|
10988
10988
|
}
|
|
10989
|
-
const legend = el2("div", "
|
|
10989
|
+
const legend = el2("div", "inspector-overdraw-legend");
|
|
10990
10990
|
for (const passes of [0, 1, 2, 4, 8]) {
|
|
10991
|
-
const item = el2("span", "
|
|
10991
|
+
const item = el2("span", "inspector-overdraw-key"), swatch = el2("i", "inspector-overdraw-swatch");
|
|
10992
10992
|
swatch.style.background = overdrawColors[passes];
|
|
10993
10993
|
item.append(swatch, document.createTextNode(passes === 8 ? "8+" : String(passes)));
|
|
10994
10994
|
legend.append(item);
|
|
@@ -11011,9 +11011,9 @@ var DebugPanel = class {
|
|
|
11011
11011
|
)
|
|
11012
11012
|
);
|
|
11013
11013
|
this.help.hidden = this.collisionHelp.hidden = true;
|
|
11014
|
-
const scale = el2("section", "
|
|
11015
|
-
scale.append(el2("div", "
|
|
11016
|
-
const controls = el2("div", "
|
|
11014
|
+
const scale = el2("section", "inspector-card");
|
|
11015
|
+
scale.append(el2("div", "inspector-section-heading", "Scale factor"));
|
|
11016
|
+
const controls = el2("div", "inspector-debug-scale");
|
|
11017
11017
|
controls.append(el2("span", "", "Pixel ratio"));
|
|
11018
11018
|
for (const value of [1, 1.5, 2, 3]) {
|
|
11019
11019
|
const b = el2("button", "", `${value}\xD7`);
|
|
@@ -11045,11 +11045,11 @@ var DebugPanel = class {
|
|
|
11045
11045
|
controls,
|
|
11046
11046
|
el2(
|
|
11047
11047
|
"p",
|
|
11048
|
-
"
|
|
11048
|
+
"inspector-note",
|
|
11049
11049
|
"Changes the actual map canvas resolution. Camera and CSS layout stay unchanged."
|
|
11050
11050
|
)
|
|
11051
11051
|
);
|
|
11052
|
-
const preview = el2("div", "
|
|
11052
|
+
const preview = el2("div", "inspector-debug-scale");
|
|
11053
11053
|
preview.append(el2("span", "", "Preview"));
|
|
11054
11054
|
this.specimen.append(this.sample);
|
|
11055
11055
|
this.specimen.insertAdjacentHTML(
|
|
@@ -11067,10 +11067,10 @@ var DebugPanel = class {
|
|
|
11067
11067
|
switches = /* @__PURE__ */ new Map();
|
|
11068
11068
|
ratio = el2("input");
|
|
11069
11069
|
slider = el2("input");
|
|
11070
|
-
help = el2("div", "
|
|
11071
|
-
collisionHelp = el2("div", "
|
|
11072
|
-
ratios = el2("div", "
|
|
11073
|
-
specimen = el2("div", "
|
|
11070
|
+
help = el2("div", "inspector-overdraw-help");
|
|
11071
|
+
collisionHelp = el2("div", "inspector-overdraw-help");
|
|
11072
|
+
ratios = el2("div", "inspector-segments");
|
|
11073
|
+
specimen = el2("div", "inspector-debug-specimen");
|
|
11074
11074
|
sample = el2("span", "", "Main Street");
|
|
11075
11075
|
timer;
|
|
11076
11076
|
setOverlay(key, enabled) {
|
|
@@ -11126,7 +11126,7 @@ function sanitizeDiagnosticSecrets(value) {
|
|
|
11126
11126
|
);
|
|
11127
11127
|
}
|
|
11128
11128
|
|
|
11129
|
-
// src/
|
|
11129
|
+
// src/inspector/observer.ts
|
|
11130
11130
|
function resourceAddress(input, base = "http://localhost") {
|
|
11131
11131
|
try {
|
|
11132
11132
|
const url = new URL(input.replace(/^(?:tileflow-pmtiles|pmtiles):\/\//u, ""), base);
|
|
@@ -11137,9 +11137,9 @@ function resourceAddress(input, base = "http://localhost") {
|
|
|
11137
11137
|
}
|
|
11138
11138
|
}
|
|
11139
11139
|
|
|
11140
|
-
// src/
|
|
11140
|
+
// src/inspector/layers/model.ts
|
|
11141
11141
|
var sampleLimit = 80;
|
|
11142
|
-
var internalLayer = (id) => id.startsWith("__tileflow-
|
|
11142
|
+
var internalLayer = (id) => id.startsWith("__tileflow-inspector-");
|
|
11143
11143
|
function layerInventory(side) {
|
|
11144
11144
|
const map = side.map;
|
|
11145
11145
|
if (!map) return [];
|
|
@@ -11502,7 +11502,7 @@ ${fence}
|
|
|
11502
11502
|
`;
|
|
11503
11503
|
}
|
|
11504
11504
|
|
|
11505
|
-
// src/
|
|
11505
|
+
// src/inspector/diagnostics/model.ts
|
|
11506
11506
|
function diagnosticSignature(value) {
|
|
11507
11507
|
if (value === void 0) return "undefined";
|
|
11508
11508
|
if (value === null || typeof value !== "object") return JSON.stringify(value);
|
|
@@ -11526,8 +11526,8 @@ function diagnosticFinding(key, finding, revision) {
|
|
|
11526
11526
|
};
|
|
11527
11527
|
}
|
|
11528
11528
|
|
|
11529
|
-
// src/
|
|
11530
|
-
var internalLayer2 = (id) => id.startsWith("__tileflow-
|
|
11529
|
+
// src/inspector/diagnostics/checks.ts
|
|
11530
|
+
var internalLayer2 = (id) => id.startsWith("__tileflow-inspector-");
|
|
11531
11531
|
var diagnosticLimits = {
|
|
11532
11532
|
detailedLayers: 2e3,
|
|
11533
11533
|
renderedCandidates: 5e3,
|
|
@@ -11916,7 +11916,7 @@ function sampleDiagnosticLabels(map, limit = 40) {
|
|
|
11916
11916
|
return samples;
|
|
11917
11917
|
}
|
|
11918
11918
|
|
|
11919
|
-
// src/
|
|
11919
|
+
// src/inspector/beacon/probes.ts
|
|
11920
11920
|
function rendererProbe(map) {
|
|
11921
11921
|
const internal = map, style = internal.style;
|
|
11922
11922
|
const gl = map.getCanvas().getContext("webgl2");
|
|
@@ -11959,7 +11959,7 @@ function rendererProbe(map) {
|
|
|
11959
11959
|
});
|
|
11960
11960
|
for (const id of map.getLayersOrder()) {
|
|
11961
11961
|
const layer = map.getLayer(id);
|
|
11962
|
-
if (layer?.type !== "custom" || id.startsWith("__tileflow-
|
|
11962
|
+
if (layer?.type !== "custom" || id.startsWith("__tileflow-inspector")) continue;
|
|
11963
11963
|
const target = layer.implementation ?? layer;
|
|
11964
11964
|
hook(target, "render", (fn, args) => {
|
|
11965
11965
|
const start = performance.now();
|
|
@@ -12063,7 +12063,7 @@ function sampleOverdraw(map, signal) {
|
|
|
12063
12063
|
});
|
|
12064
12064
|
}
|
|
12065
12065
|
|
|
12066
|
-
// src/
|
|
12066
|
+
// src/inspector/diagnostics/performance.ts
|
|
12067
12067
|
var active = /* @__PURE__ */ new WeakSet();
|
|
12068
12068
|
var drawMethods = [
|
|
12069
12069
|
"drawArrays",
|
|
@@ -12138,7 +12138,7 @@ async function samplePerformance(map, signal, options = {}) {
|
|
|
12138
12138
|
result.limitations.push("The current map style is unavailable.");
|
|
12139
12139
|
return result;
|
|
12140
12140
|
}
|
|
12141
|
-
if (style.layers.some((layer) => layer.id.startsWith("__tileflow-
|
|
12141
|
+
if (style.layers.some((layer) => layer.id.startsWith("__tileflow-inspector-"))) {
|
|
12142
12142
|
result.limitations.push(
|
|
12143
12143
|
"Clear map highlights or geometry editing overlays before observing drawing work."
|
|
12144
12144
|
);
|
|
@@ -12351,57 +12351,57 @@ function performanceFindings(observation, camera) {
|
|
|
12351
12351
|
return findings;
|
|
12352
12352
|
}
|
|
12353
12353
|
|
|
12354
|
-
// src/
|
|
12354
|
+
// src/inspector/diagnostics/styles.ts
|
|
12355
12355
|
var diagnosticsStyles = `
|
|
12356
|
-
.
|
|
12357
|
-
.
|
|
12358
|
-
.
|
|
12359
|
-
.
|
|
12360
|
-
.
|
|
12361
|
-
.
|
|
12362
|
-
.
|
|
12363
|
-
.
|
|
12364
|
-
.
|
|
12365
|
-
.
|
|
12366
|
-
.
|
|
12367
|
-
.
|
|
12368
|
-
.
|
|
12369
|
-
.
|
|
12370
|
-
.
|
|
12371
|
-
.
|
|
12372
|
-
.
|
|
12373
|
-
.
|
|
12374
|
-
.
|
|
12375
|
-
.
|
|
12376
|
-
.
|
|
12377
|
-
.
|
|
12378
|
-
.
|
|
12379
|
-
.
|
|
12380
|
-
.
|
|
12381
|
-
.
|
|
12382
|
-
.
|
|
12383
|
-
.
|
|
12384
|
-
.
|
|
12385
|
-
.
|
|
12386
|
-
.
|
|
12387
|
-
.
|
|
12388
|
-
.
|
|
12389
|
-
.
|
|
12390
|
-
.
|
|
12391
|
-
.
|
|
12392
|
-
.
|
|
12393
|
-
.
|
|
12394
|
-
.
|
|
12395
|
-
.
|
|
12396
|
-
.
|
|
12397
|
-
.
|
|
12398
|
-
.
|
|
12399
|
-
.
|
|
12400
|
-
.
|
|
12401
|
-
@container(max-width:520px){.
|
|
12356
|
+
.inspector-diagnostics{background:var(--paper);color:var(--ink);font:12px/1.45 var(--ui)}
|
|
12357
|
+
.inspector-diagnostics-toolbar{justify-content:space-between;gap:8px;padding:7px 10px}
|
|
12358
|
+
.inspector-diagnostics-actions,.inspector-diagnostics-filters{display:flex;align-items:center;gap:5px;flex-wrap:wrap}
|
|
12359
|
+
.inspector-diagnostics-toolbar strong{font-size:12px;font-weight:600}
|
|
12360
|
+
.inspector-diagnostics-toolbar .inspector-diagnostics-check{border:1px solid var(--border);background:var(--surface)}
|
|
12361
|
+
.inspector-diagnostics-filters{padding:6px 10px;border-bottom:1px solid var(--border);flex:none}
|
|
12362
|
+
.inspector-diagnostics-filters button{border:1px solid transparent;background:transparent;padding:3px 8px;border-radius:4px;font-size:11px}
|
|
12363
|
+
.inspector-diagnostics-filters button[aria-pressed=true]{color:var(--accent);background:var(--accent-soft);border-color:color-mix(in srgb,var(--accent) 25%,transparent)}
|
|
12364
|
+
.inspector-diagnostics-summary{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:7px 10px;border-bottom:1px solid var(--border);color:var(--muted);font-size:11px;flex:none}
|
|
12365
|
+
.inspector-diagnostics-summary .inspector-diagnostics-scope{margin-left:auto;color:var(--faint)}
|
|
12366
|
+
.inspector-diagnostics-summary button{margin-left:auto;background:transparent;border:0;font-size:11px;color:var(--muted);padding:0}
|
|
12367
|
+
.inspector-diagnostics-list{flex:1;min-height:0;overflow:auto}
|
|
12368
|
+
.inspector-diagnostic{border-bottom:1px solid var(--border)}
|
|
12369
|
+
.inspector-diagnostic>summary{list-style:none;cursor:pointer;display:grid;grid-template-columns:17px minmax(0,1fr) auto;align-items:start;column-gap:8px;padding:10px 12px}
|
|
12370
|
+
.inspector-diagnostic>summary::-webkit-details-marker{display:none}
|
|
12371
|
+
.inspector-diagnostic>summary:hover{background:var(--hover)}
|
|
12372
|
+
.inspector-diagnostic>summary:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}
|
|
12373
|
+
.inspector-diagnostic-indicator{font-size:13px;line-height:18px;color:var(--warn)}
|
|
12374
|
+
.inspector-diagnostic[data-kind=problem] .inspector-diagnostic-indicator{color:var(--danger)}
|
|
12375
|
+
.inspector-diagnostic-title{font-weight:500;font-size:12px;display:block;line-height:18px}
|
|
12376
|
+
.inspector-diagnostic-subtitle{display:block;color:var(--muted);font-size:11px;margin-top:2px;overflow-wrap:anywhere}
|
|
12377
|
+
.inspector-diagnostic-category{font-size:10px;line-height:18px;color:var(--muted);white-space:nowrap;text-align:right}
|
|
12378
|
+
.inspector-diagnostic-context{display:block;color:var(--faint);font-size:10px;margin-top:3px}
|
|
12379
|
+
.inspector-diagnostic[data-stale=true] .inspector-diagnostic-context{color:var(--warn)}
|
|
12380
|
+
.inspector-diagnostic-detail{padding:0 12px 12px 37px;max-width:1040px;display:flex;flex-direction:column;gap:10px}
|
|
12381
|
+
.inspector-diagnostic-detail p{margin:0;color:var(--muted);font-size:12px;max-width:820px}
|
|
12382
|
+
.inspector-diagnostic-detail .inspector-diagnostic-state{border-left:2px solid var(--warn);padding:4px 9px;background:var(--warn-soft);font-size:11px}
|
|
12383
|
+
.inspector-diagnostic-evidence{display:grid;grid-template-columns:minmax(100px,max-content) minmax(0,1fr);column-gap:18px;row-gap:5px;margin:0;padding:9px 11px;border:1px solid var(--border);border-radius:4px;background:var(--surface);font-size:11px}
|
|
12384
|
+
.inspector-diagnostic-evidence dt{color:var(--muted)}
|
|
12385
|
+
.inspector-diagnostic-evidence dd{margin:0;overflow-wrap:anywhere;font-family:var(--mono)}
|
|
12386
|
+
.inspector-diagnostic-links,.inspector-diagnostic-layers{display:flex;flex-wrap:wrap;gap:5px;align-items:center}
|
|
12387
|
+
.inspector-diagnostic-links button{font-size:11px;min-height:25px;padding:3px 8px}
|
|
12388
|
+
.inspector-diagnostic-links .inspector-diagnostic-dismiss{margin-left:auto;background:transparent;border-color:transparent;color:var(--muted)}
|
|
12389
|
+
.inspector-diagnostic-layers button{font:10px/1.4 var(--mono);padding:3px 6px;background:var(--surface);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
12390
|
+
.inspector-diagnostic-layers span{font-size:11px;color:var(--muted)}
|
|
12391
|
+
.inspector-diagnostic-samples{display:flex;flex-direction:column;gap:5px}
|
|
12392
|
+
.inspector-diagnostic-samples button{text-align:left;background:transparent;border:1px solid var(--border);font-size:11px;padding:5px 8px;overflow-wrap:anywhere}
|
|
12393
|
+
.inspector-diagnostic-samples button::before{content:'\u2197';color:var(--muted);padding-right:6px}
|
|
12394
|
+
.inspector-diagnostic-limitations{margin:0;padding-left:16px;color:var(--muted);font-size:11px}
|
|
12395
|
+
.inspector-diagnostic-limitations li+li{margin-top:4px}
|
|
12396
|
+
.inspector-diagnostics-empty{padding:28px 20px;max-width:620px;display:flex;flex-direction:column;gap:7px;color:var(--muted)}
|
|
12397
|
+
.inspector-diagnostics-empty strong{font-size:13px;font-weight:500;color:var(--ink)}
|
|
12398
|
+
.inspector-diagnostics-empty p{margin:0;font-size:12px}
|
|
12399
|
+
.inspector-diagnostics-status{min-height:25px;align-items:center;font-size:11px}
|
|
12400
|
+
.inspector-diagnostics-status:empty{display:none}
|
|
12401
|
+
@container(max-width:520px){.inspector-diagnostic>summary{grid-template-columns:15px minmax(0,1fr);padding:9px}.inspector-diagnostic-category{grid-column:2;text-align:left;font-size:10px}.inspector-diagnostic-detail{padding-left:32px}.inspector-diagnostic-evidence{grid-template-columns:minmax(0,1fr)}.inspector-diagnostic-evidence dd+dt{margin-top:5px}.inspector-diagnostics-filters{gap:2px}.inspector-diagnostics-filters button{padding:3px 5px}}
|
|
12402
12402
|
`;
|
|
12403
12403
|
|
|
12404
|
-
// src/
|
|
12404
|
+
// src/inspector/diagnostics/panel.ts
|
|
12405
12405
|
var el3 = (tag, cls = "", text = "") => {
|
|
12406
12406
|
const node = document.createElement(tag);
|
|
12407
12407
|
node.className = cls;
|
|
@@ -12426,11 +12426,11 @@ var DiagnosticsPanel = class {
|
|
|
12426
12426
|
constructor(root, options) {
|
|
12427
12427
|
this.root = root;
|
|
12428
12428
|
this.options = options;
|
|
12429
|
-
root.classList.add("
|
|
12429
|
+
root.classList.add("inspector-diagnostics");
|
|
12430
12430
|
const style = el3("style");
|
|
12431
12431
|
style.nonce = document.querySelector("style[nonce]")?.nonce || "";
|
|
12432
12432
|
style.textContent = diagnosticsStyles;
|
|
12433
|
-
const actions = el3("div", "
|
|
12433
|
+
const actions = el3("div", "inspector-diagnostics-actions");
|
|
12434
12434
|
actions.append(this.check, this.cancelButton, this.copy);
|
|
12435
12435
|
this.toolbar.append(el3("strong", "", "Diagnostics"), actions);
|
|
12436
12436
|
this.cancelButton.hidden = true;
|
|
@@ -12479,12 +12479,12 @@ var DiagnosticsPanel = class {
|
|
|
12479
12479
|
expanded = /* @__PURE__ */ new Set();
|
|
12480
12480
|
missingImages = /* @__PURE__ */ new Map();
|
|
12481
12481
|
renderKey = "";
|
|
12482
|
-
toolbar = el3("div", "
|
|
12483
|
-
filters = el3("div", "
|
|
12484
|
-
summary = el3("div", "
|
|
12485
|
-
list = el3("div", "
|
|
12486
|
-
status = el3("div", "
|
|
12487
|
-
check = button("Check view", () => void this.checkView(), "
|
|
12482
|
+
toolbar = el3("div", "inspector-tools inspector-diagnostics-toolbar");
|
|
12483
|
+
filters = el3("div", "inspector-diagnostics-filters");
|
|
12484
|
+
summary = el3("div", "inspector-diagnostics-summary");
|
|
12485
|
+
list = el3("div", "inspector-scroll inspector-diagnostics-list");
|
|
12486
|
+
status = el3("div", "inspector-footer inspector-diagnostics-status");
|
|
12487
|
+
check = button("Check view", () => void this.checkView(), "inspector-diagnostics-check");
|
|
12488
12488
|
copy = button("Copy findings", () => void this.copyReport());
|
|
12489
12489
|
cancelButton = button("Cancel", () => this.cancel());
|
|
12490
12490
|
filterButtons = /* @__PURE__ */ new Map();
|
|
@@ -12493,7 +12493,7 @@ var DiagnosticsPanel = class {
|
|
|
12493
12493
|
this.schedule();
|
|
12494
12494
|
};
|
|
12495
12495
|
sourceChanged = (event) => {
|
|
12496
|
-
if (event.sourceId?.startsWith("__tileflow-
|
|
12496
|
+
if (event.sourceId?.startsWith("__tileflow-inspector-")) return;
|
|
12497
12497
|
this.dataRevision++;
|
|
12498
12498
|
this.invalidate();
|
|
12499
12499
|
};
|
|
@@ -12564,7 +12564,7 @@ var DiagnosticsPanel = class {
|
|
|
12564
12564
|
dispose() {
|
|
12565
12565
|
this.disposed = true;
|
|
12566
12566
|
this.detach();
|
|
12567
|
-
this.root.classList.remove("
|
|
12567
|
+
this.root.classList.remove("inspector-diagnostics");
|
|
12568
12568
|
}
|
|
12569
12569
|
detach() {
|
|
12570
12570
|
this.cancel();
|
|
@@ -12701,9 +12701,9 @@ var DiagnosticsPanel = class {
|
|
|
12701
12701
|
const previousKey = this.styleKey;
|
|
12702
12702
|
this.styleKey = diagnosticFingerprint({
|
|
12703
12703
|
...style,
|
|
12704
|
-
layers: style.layers.filter((layer) => !layer.id.startsWith("__tileflow-
|
|
12704
|
+
layers: style.layers.filter((layer) => !layer.id.startsWith("__tileflow-inspector")),
|
|
12705
12705
|
sources: Object.fromEntries(
|
|
12706
|
-
Object.entries(style.sources).filter(([id]) => !id.startsWith("__tileflow-
|
|
12706
|
+
Object.entries(style.sources).filter(([id]) => !id.startsWith("__tileflow-inspector")).map(([id, source]) => [
|
|
12707
12707
|
id,
|
|
12708
12708
|
source.type === "geojson" && typeof source.data === "object" ? { ...source, data: "[inline data omitted from style identity]" } : source
|
|
12709
12709
|
])
|
|
@@ -12946,7 +12946,7 @@ var DiagnosticsPanel = class {
|
|
|
12946
12946
|
el3("span", "", `${problems} problem${problems === 1 ? "" : "s"} \xB7 ${reviews} to review`)
|
|
12947
12947
|
);
|
|
12948
12948
|
const scope = !this.map ? "Waiting for map" : moving ? "Map moving" : !styleCurrent ? "Style checks pending" : viewCurrent ? this.viewComplete ? "Current view" : "Current view \xB7 partial coverage" : this.viewSnapshot ? "Previous view \xB7 check again" : "Style checked \xB7 view not checked";
|
|
12949
|
-
this.summary.append(el3("span", "
|
|
12949
|
+
this.summary.append(el3("span", "inspector-diagnostics-scope", scope));
|
|
12950
12950
|
const hidden = entries.length - visible.length;
|
|
12951
12951
|
if (hidden)
|
|
12952
12952
|
this.summary.append(
|
|
@@ -12960,7 +12960,7 @@ var DiagnosticsPanel = class {
|
|
|
12960
12960
|
const scroll = this.list.scrollTop;
|
|
12961
12961
|
if (filtered.length) this.list.replaceChildren(...filtered.map((entry) => this.row(entry)));
|
|
12962
12962
|
else {
|
|
12963
|
-
const empty = el3("div", "
|
|
12963
|
+
const empty = el3("div", "inspector-diagnostics-empty");
|
|
12964
12964
|
const title = !this.map ? "Waiting for the map" : !styleCurrent ? "Style checks are pending" : this.filter !== "all" ? `No ${categories[this.filter].toLowerCase()} findings in this list` : hidden ? "All current findings are dismissed" : viewCurrent ? "No issues found in completed checks" : "No style issues detected";
|
|
12965
12965
|
const detail = !this.map ? "Diagnostics will be available when the preview connects." : !styleCurrent ? "Configuration and resource checks run automatically after the map settles." : viewCurrent ? "This result applies to the current view and variant." : "Check this view to examine sampled label contrast and rendering work. Other locations and variants are not inferred.";
|
|
12966
12966
|
empty.append(el3("strong", "", title), el3("p", "", detail));
|
|
@@ -12974,7 +12974,7 @@ var DiagnosticsPanel = class {
|
|
|
12974
12974
|
const { finding, snapshot } = entry;
|
|
12975
12975
|
const current = this.entryCurrent(entry);
|
|
12976
12976
|
const key = `${finding.id}:${finding.fingerprint}`;
|
|
12977
|
-
const row = el3("details", "
|
|
12977
|
+
const row = el3("details", "inspector-diagnostic");
|
|
12978
12978
|
row.dataset.kind = finding.kind;
|
|
12979
12979
|
row.dataset.stale = String(!current);
|
|
12980
12980
|
row.open = this.expanded.has(key);
|
|
@@ -12984,41 +12984,49 @@ var DiagnosticsPanel = class {
|
|
|
12984
12984
|
);
|
|
12985
12985
|
const summary = el3("summary");
|
|
12986
12986
|
summary.dataset.diagnosticFocus = key;
|
|
12987
|
-
const indicator = el3(
|
|
12987
|
+
const indicator = el3(
|
|
12988
|
+
"span",
|
|
12989
|
+
"inspector-diagnostic-indicator",
|
|
12990
|
+
finding.kind === "problem" ? "\u25CF" : "\u25D0"
|
|
12991
|
+
);
|
|
12988
12992
|
indicator.setAttribute("aria-label", finding.kind === "problem" ? "Problem" : "Review");
|
|
12989
12993
|
const title = el3("span");
|
|
12990
12994
|
title.append(
|
|
12991
|
-
el3("span", "
|
|
12992
|
-
el3("span", "
|
|
12995
|
+
el3("span", "inspector-diagnostic-title", finding.title),
|
|
12996
|
+
el3("span", "inspector-diagnostic-subtitle", finding.summary)
|
|
12993
12997
|
);
|
|
12994
12998
|
const context = finding.scope === "view" ? `${snapshot.themeLabel ? `${snapshot.themeLabel} \xB7 ` : ""}z${snapshot.camera.zoom.toFixed(2)}` : "Style configuration";
|
|
12995
12999
|
title.append(
|
|
12996
|
-
el3(
|
|
13000
|
+
el3(
|
|
13001
|
+
"span",
|
|
13002
|
+
"inspector-diagnostic-context",
|
|
13003
|
+
`${context}${current ? "" : " \xB7 earlier observation"}`
|
|
13004
|
+
)
|
|
12997
13005
|
);
|
|
12998
13006
|
summary.append(
|
|
12999
13007
|
indicator,
|
|
13000
13008
|
title,
|
|
13001
|
-
el3("span", "
|
|
13009
|
+
el3("span", "inspector-diagnostic-category", categories[finding.category])
|
|
13002
13010
|
);
|
|
13003
|
-
const body = el3("div", "
|
|
13011
|
+
const body = el3("div", "inspector-diagnostic-detail");
|
|
13004
13012
|
body.append(el3("p", "", finding.detail));
|
|
13005
13013
|
if (!current)
|
|
13006
13014
|
body.append(
|
|
13007
13015
|
el3(
|
|
13008
13016
|
"p",
|
|
13009
|
-
"
|
|
13017
|
+
"inspector-diagnostic-state",
|
|
13010
13018
|
entry.pendingReason ?? "This finding belongs to an earlier view or style. Check again before treating it as resolved."
|
|
13011
13019
|
)
|
|
13012
13020
|
);
|
|
13013
13021
|
if (finding.evidence.length) {
|
|
13014
|
-
const evidence = el3("dl", "
|
|
13022
|
+
const evidence = el3("dl", "inspector-diagnostic-evidence");
|
|
13015
13023
|
for (const item of finding.evidence)
|
|
13016
13024
|
evidence.append(el3("dt", "", item.label), el3("dd", "", String(item.value)));
|
|
13017
13025
|
body.append(evidence);
|
|
13018
13026
|
}
|
|
13019
13027
|
const canReveal = this.sameMap(snapshot);
|
|
13020
13028
|
if (finding.layers.length > 1) {
|
|
13021
|
-
const layers = el3("div", "
|
|
13029
|
+
const layers = el3("div", "inspector-diagnostic-layers");
|
|
13022
13030
|
for (const layer of finding.layers.slice(0, 8)) {
|
|
13023
13031
|
const link = button(
|
|
13024
13032
|
layer,
|
|
@@ -13041,7 +13049,7 @@ var DiagnosticsPanel = class {
|
|
|
13041
13049
|
body.append(layers);
|
|
13042
13050
|
}
|
|
13043
13051
|
if (finding.samples?.length) {
|
|
13044
|
-
const samples = el3("div", "
|
|
13052
|
+
const samples = el3("div", "inspector-diagnostic-samples");
|
|
13045
13053
|
for (const sample of finding.samples.slice(0, 4)) {
|
|
13046
13054
|
const sampleFinding = {
|
|
13047
13055
|
...finding,
|
|
@@ -13058,11 +13066,11 @@ var DiagnosticsPanel = class {
|
|
|
13058
13066
|
body.append(samples);
|
|
13059
13067
|
}
|
|
13060
13068
|
if (finding.limitations.length) {
|
|
13061
|
-
const limitations = el3("ul", "
|
|
13069
|
+
const limitations = el3("ul", "inspector-diagnostic-limitations");
|
|
13062
13070
|
for (const text of finding.limitations) limitations.append(el3("li", "", text));
|
|
13063
13071
|
body.append(limitations);
|
|
13064
13072
|
}
|
|
13065
|
-
const actions = el3("div", "
|
|
13073
|
+
const actions = el3("div", "inspector-diagnostic-links");
|
|
13066
13074
|
if (finding.layers.length) {
|
|
13067
13075
|
const open = button(
|
|
13068
13076
|
finding.target ? "Open rule" : "Open layer",
|
|
@@ -13098,7 +13106,7 @@ var DiagnosticsPanel = class {
|
|
|
13098
13106
|
this.dismissed.set(this.dismissKey(entry), finding.fingerprint);
|
|
13099
13107
|
this.render(true);
|
|
13100
13108
|
},
|
|
13101
|
-
"
|
|
13109
|
+
"inspector-diagnostic-dismiss"
|
|
13102
13110
|
)
|
|
13103
13111
|
);
|
|
13104
13112
|
body.append(actions);
|
|
@@ -13206,7 +13214,7 @@ var DiagnosticsPanel = class {
|
|
|
13206
13214
|
}
|
|
13207
13215
|
};
|
|
13208
13216
|
|
|
13209
|
-
// src/
|
|
13217
|
+
// src/inspector/geometry.ts
|
|
13210
13218
|
function geometryVertices(geometry) {
|
|
13211
13219
|
const result = [];
|
|
13212
13220
|
function visit(value, path) {
|
|
@@ -13291,7 +13299,7 @@ var GeometryEditor = class {
|
|
|
13291
13299
|
})
|
|
13292
13300
|
);
|
|
13293
13301
|
this.handles = map.getContainer().ownerDocument.createElement("div");
|
|
13294
|
-
this.handles.className = "
|
|
13302
|
+
this.handles.className = "inspector-geometry-handles";
|
|
13295
13303
|
this.handles.style.cssText = "position:absolute;inset:0;pointer-events:none;z-index:5;overflow:hidden";
|
|
13296
13304
|
map.getContainer().append(this.handles);
|
|
13297
13305
|
map.on("move", this.draw);
|
|
@@ -13305,7 +13313,7 @@ var GeometryEditor = class {
|
|
|
13305
13313
|
undoStack = [];
|
|
13306
13314
|
redoStack = [];
|
|
13307
13315
|
handles;
|
|
13308
|
-
source = `__tileflow-
|
|
13316
|
+
source = `__tileflow-inspector-geometry-${Math.random().toString(36).slice(2)}`;
|
|
13309
13317
|
drag;
|
|
13310
13318
|
get canUndo() {
|
|
13311
13319
|
return this.undoStack.length > 0;
|
|
@@ -13420,7 +13428,7 @@ var GeometryEditor = class {
|
|
|
13420
13428
|
}
|
|
13421
13429
|
};
|
|
13422
13430
|
|
|
13423
|
-
// src/
|
|
13431
|
+
// src/inspector/live-color.ts
|
|
13424
13432
|
var colorPreviewInterval = 120;
|
|
13425
13433
|
function bindLiveColorInput(input, apply, isCurrent) {
|
|
13426
13434
|
let timer;
|
|
@@ -13461,7 +13469,7 @@ function bindLiveColorInput(input, apply, isCurrent) {
|
|
|
13461
13469
|
};
|
|
13462
13470
|
}
|
|
13463
13471
|
|
|
13464
|
-
// src/
|
|
13472
|
+
// src/inspector/layers/explain.ts
|
|
13465
13473
|
function explainFeatureVisibility(map, layer, feature) {
|
|
13466
13474
|
if (layer.type === "custom") return [];
|
|
13467
13475
|
const evidence = [];
|
|
@@ -13551,8 +13559,8 @@ function explainFeatureVisibility(map, layer, feature) {
|
|
|
13551
13559
|
return evidence;
|
|
13552
13560
|
}
|
|
13553
13561
|
|
|
13554
|
-
// src/
|
|
13555
|
-
var sourceId = "__tileflow-
|
|
13562
|
+
// src/inspector/layers/highlight.ts
|
|
13563
|
+
var sourceId = "__tileflow-inspector-layers-preview";
|
|
13556
13564
|
var layerIds = ["area", "line", "point"].map((part) => `${sourceId}-${part}`);
|
|
13557
13565
|
var LayerHighlight = class {
|
|
13558
13566
|
map;
|
|
@@ -13638,7 +13646,7 @@ var LayerHighlight = class {
|
|
|
13638
13646
|
}
|
|
13639
13647
|
};
|
|
13640
13648
|
|
|
13641
|
-
// src/
|
|
13649
|
+
// src/inspector/layers/preview.ts
|
|
13642
13650
|
var LayerPreview = class {
|
|
13643
13651
|
constructor(show, hide) {
|
|
13644
13652
|
this.show = show;
|
|
@@ -13688,100 +13696,100 @@ var LayerPreview = class {
|
|
|
13688
13696
|
}
|
|
13689
13697
|
};
|
|
13690
13698
|
|
|
13691
|
-
// src/
|
|
13699
|
+
// src/inspector/layers/styles.ts
|
|
13692
13700
|
var layersStyles = `
|
|
13693
|
-
.
|
|
13694
|
-
.
|
|
13695
|
-
.
|
|
13696
|
-
.
|
|
13697
|
-
.
|
|
13698
|
-
.
|
|
13699
|
-
.
|
|
13700
|
-
.
|
|
13701
|
-
.
|
|
13702
|
-
.
|
|
13703
|
-
.
|
|
13704
|
-
.
|
|
13705
|
-
.
|
|
13706
|
-
.
|
|
13707
|
-
.
|
|
13708
|
-
.
|
|
13709
|
-
.
|
|
13710
|
-
.
|
|
13711
|
-
.
|
|
13712
|
-
.
|
|
13713
|
-
.
|
|
13714
|
-
.
|
|
13715
|
-
.
|
|
13716
|
-
.
|
|
13717
|
-
.
|
|
13718
|
-
.
|
|
13719
|
-
.
|
|
13720
|
-
.
|
|
13721
|
-
.
|
|
13722
|
-
.
|
|
13723
|
-
.
|
|
13724
|
-
.
|
|
13725
|
-
.
|
|
13726
|
-
.
|
|
13727
|
-
.
|
|
13728
|
-
.
|
|
13729
|
-
.
|
|
13730
|
-
.
|
|
13731
|
-
.
|
|
13732
|
-
.
|
|
13733
|
-
.
|
|
13734
|
-
.
|
|
13735
|
-
.
|
|
13736
|
-
.
|
|
13737
|
-
.
|
|
13738
|
-
.
|
|
13739
|
-
.
|
|
13740
|
-
.
|
|
13741
|
-
.
|
|
13742
|
-
.
|
|
13743
|
-
.
|
|
13744
|
-
.
|
|
13745
|
-
.
|
|
13746
|
-
.
|
|
13747
|
-
.
|
|
13748
|
-
.
|
|
13749
|
-
.
|
|
13750
|
-
.
|
|
13751
|
-
.
|
|
13752
|
-
.
|
|
13753
|
-
.
|
|
13754
|
-
.
|
|
13755
|
-
.
|
|
13756
|
-
.
|
|
13757
|
-
.
|
|
13758
|
-
.
|
|
13759
|
-
.
|
|
13760
|
-
.
|
|
13761
|
-
.
|
|
13762
|
-
.
|
|
13763
|
-
.
|
|
13764
|
-
.
|
|
13765
|
-
.
|
|
13766
|
-
.
|
|
13767
|
-
.
|
|
13768
|
-
.
|
|
13769
|
-
.
|
|
13770
|
-
.
|
|
13771
|
-
.
|
|
13772
|
-
.
|
|
13773
|
-
.
|
|
13774
|
-
.
|
|
13775
|
-
.
|
|
13776
|
-
.
|
|
13701
|
+
.inspector-layer-tools { gap:8px; padding:5px 8px; background:var(--surface); }
|
|
13702
|
+
.inspector-layer-modes { display:flex; flex:none; border:1px solid var(--border); border-radius:3px; overflow:hidden; }
|
|
13703
|
+
.inspector-layer-modes button { border:0; border-radius:0; padding:3px 9px; white-space:nowrap; }
|
|
13704
|
+
.inspector-layer-modes button + button { border-left:1px solid var(--border); }
|
|
13705
|
+
.inspector-layer-visible { flex:none; cursor:pointer; }
|
|
13706
|
+
.inspector-layer-visible input { width:13px; height:13px; cursor:pointer; }
|
|
13707
|
+
.inspector-layer-total { color:var(--muted); font:11px ui-monospace,monospace; white-space:nowrap; }
|
|
13708
|
+
.inspector-ready .inspector-layer-copy { border:1px solid var(--accent); color:var(--accent); background:var(--paper); white-space:nowrap; }
|
|
13709
|
+
.inspector-layer-split { display:grid; grid-template-columns:minmax(270px,34%) minmax(0,1fr); flex:1; min-height:0; }
|
|
13710
|
+
.inspector-layer-list { min-height:0; overflow:auto; border-right:1px solid var(--border); padding-bottom:10px; }
|
|
13711
|
+
.inspector-layer-group-title { display:flex; align-items:center; gap:7px; width:100%; border:0; border-bottom:1px solid var(--border); background:var(--surface) !important; border-radius:0 !important; padding:5px 9px !important; text-align:left; position:sticky; top:0; z-index:1; }
|
|
13712
|
+
.inspector-layer-group-title strong { font-size:11px; text-transform:capitalize; font-weight:600; }
|
|
13713
|
+
.inspector-layer-count { color:var(--muted); margin-left:auto; font-size:10px; }
|
|
13714
|
+
.inspector-ready .inspector-layer-row { display:flex; align-items:center; gap:8px; width:100%; padding:5px 9px 5px 18px; text-align:left; border:0; border-left:2px solid transparent; border-radius:0; min-height:29px; }
|
|
13715
|
+
.inspector-layer-row[aria-pressed=true] { border-left-color:var(--accent); }
|
|
13716
|
+
.inspector-layer-glyph { width:17px; flex:none; font:16px ui-monospace,monospace; text-align:center; color:var(--muted); }
|
|
13717
|
+
.inspector-layer-color { text-shadow:0 0 1px #777; }
|
|
13718
|
+
.inspector-layer-label { display:flex; flex-direction:column; min-width:0; flex:1; }
|
|
13719
|
+
.inspector-layer-label > * { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
13720
|
+
.inspector-layer-state { color:var(--muted); font-size:10px; white-space:nowrap; }
|
|
13721
|
+
.inspector-layer-state[data-state=Hidden],.inspector-layer-state[data-state="Outside zoom"] { color:light-dark(#93620b,#e9bd67); }
|
|
13722
|
+
.inspector-layer-state[data-state=Runtime] { color:light-dark(#7c3dc6,#c9a4f4); }
|
|
13723
|
+
.inspector-layer-detail { display:flex; flex-direction:column; min-width:0; min-height:0; }
|
|
13724
|
+
.inspector-layer-heading { padding:8px 12px 6px; border-bottom:1px solid var(--border); display:flex; align-items:center; flex-wrap:wrap; gap:8px; }
|
|
13725
|
+
.inspector-layer-title { display:flex; flex-direction:column; gap:2px; min-width:0; flex:1 0 200px; }
|
|
13726
|
+
.inspector-layer-title strong { font-size:13px; font-weight:500; overflow-wrap:anywhere; }
|
|
13727
|
+
.inspector-layer-title code { font:10px ui-monospace,monospace; overflow-wrap:anywhere; color:var(--muted); }
|
|
13728
|
+
.inspector-layer-content { padding:0; }
|
|
13729
|
+
.inspector-layer-evidence { padding:5px 12px; }
|
|
13730
|
+
.inspector-layer-evidence-row { display:grid; grid-template-columns:16px 115px minmax(0,1fr); gap:8px; padding:7px 0; border-bottom:1px solid var(--border); font-size:11px; align-items:baseline; }
|
|
13731
|
+
.inspector-layer-evidence-row strong { font-weight:500; }
|
|
13732
|
+
.inspector-layer-evidence-row > :last-child { overflow-wrap:anywhere; }
|
|
13733
|
+
.inspector-layer-indicator { font:13px ui-monospace,monospace; color:var(--muted); }
|
|
13734
|
+
.inspector-layer-evidence-row[data-state=pass] .inspector-layer-indicator { color:light-dark(#188038,#81c995); }
|
|
13735
|
+
.inspector-layer-evidence-row[data-state=warn] .inspector-layer-indicator { color:light-dark(#a15c00,#fdd663); }
|
|
13736
|
+
.inspector-layer-muted,.inspector-layer-dependency { color:var(--muted); font-size:11px; }
|
|
13737
|
+
.inspector-layer-neighbors { margin:7px 12px 12px; }
|
|
13738
|
+
.inspector-layer-neighbors > strong { font-weight:500; font-size:11px; }
|
|
13739
|
+
.inspector-layer-neighbors > div { display:flex; align-items:baseline; gap:8px; padding-top:3px; }
|
|
13740
|
+
.inspector-layer-neighbors > div > span:first-child { width:55px; flex:none; }
|
|
13741
|
+
.inspector-ready .inspector-layer-link { border:0; padding:2px 0; background:transparent; color:var(--accent); font-size:11px; text-align:left; overflow-wrap:anywhere; }
|
|
13742
|
+
.inspector-layer-rules { width:100%; border-collapse:collapse; table-layout:fixed; font-size:11px; }
|
|
13743
|
+
.inspector-layer-rules th { text-align:left; background:var(--surface); color:var(--muted); font-weight:500; padding:5px 12px; border-bottom:1px solid var(--border); }
|
|
13744
|
+
.inspector-layer-rules th:first-child { width:57%; }
|
|
13745
|
+
.inspector-layer-rules td { padding:5px 12px; border-bottom:1px solid var(--border); vertical-align:top; overflow-wrap:anywhere; }
|
|
13746
|
+
.inspector-layer-rules code { font:11px/1.6 ui-monospace,monospace; }
|
|
13747
|
+
.inspector-layer-rule-name { color:light-dark(#881391,#c58af9); }
|
|
13748
|
+
.inspector-layer-dependency { display:block; font-size:10px; }
|
|
13749
|
+
.inspector-layer-rule-editor { display:flex; align-items:center; gap:5px; min-width:0; }
|
|
13750
|
+
.inspector-layer-rule-editor input:not([type=color]):not([type=checkbox]),.inspector-layer-rule-editor select { width:100%; min-width:0; flex:1; padding:2px 4px; border:1px solid transparent; border-radius:2px; background:transparent; color:var(--ink); font:11px/1.6 ui-monospace,monospace; }
|
|
13751
|
+
.inspector-layer-rule-editor input[type=checkbox] { flex:none; width:13px; height:13px; margin:0 2px 0 0; accent-color:var(--accent); cursor:pointer; }
|
|
13752
|
+
.inspector-layer-rule-editor input[type=checkbox]:disabled { cursor:default; }
|
|
13753
|
+
.inspector-layer-rule-editor input:hover,.inspector-layer-rule-editor select:hover { border-color:var(--border); }
|
|
13754
|
+
.inspector-layer-rule-editor input:focus,.inspector-layer-rule-editor select:focus { border-color:var(--accent); outline:1px solid var(--accent); background:var(--paper); }
|
|
13755
|
+
.inspector-layer-rule-editor input[type=color] { flex:none; width:16px; height:20px; padding:0; border:0; background:transparent; cursor:pointer; }
|
|
13756
|
+
.inspector-layer-rule-editor input[type=color]::-webkit-color-swatch-wrapper { padding:3px 0; }
|
|
13757
|
+
.inspector-layer-rule-editor input[type=color]::-webkit-color-swatch { border:1px solid #8888; border-radius:2px; }
|
|
13758
|
+
.inspector-layer-rule-editor .inspector-layer-rule-reset { flex:none; padding:1px 4px; border:0; color:var(--accent); background:transparent; }
|
|
13759
|
+
.inspector-layer-rule-reset:disabled { visibility:hidden; }
|
|
13760
|
+
.inspector-layer-rules tr[data-modified=true] > td:first-child { box-shadow:inset 2px 0 var(--accent); }
|
|
13761
|
+
.inspector-layer-rules tr[data-disabled=true] .inspector-layer-rule-name,.inspector-layer-rules tr[data-disabled=true] input:not([type=checkbox]):not([type=color]),.inspector-layer-rules tr[data-disabled=true] select { color:var(--muted); text-decoration:line-through; }
|
|
13762
|
+
.inspector-layer-rules tr[data-disabled=true] input[type=color] { opacity:.45; cursor:default; }
|
|
13763
|
+
.inspector-layer-rule-error { display:block; padding-top:4px; color:light-dark(#b3261e,#f28b82); font-size:10px; }
|
|
13764
|
+
.inspector-layer-rule-error[hidden] { display:none; }
|
|
13765
|
+
.inspector-layer-rules tr[data-selected=true] { background:var(--inspector-selected); }
|
|
13766
|
+
.inspector-layer-content [data-diagnostic-target=true] { background:var(--inspector-selected); outline:1px solid var(--accent); outline-offset:-1px; }
|
|
13767
|
+
.inspector-layer-swatch { display:inline-block; width:11px; height:11px; border:1px solid #8888; border-radius:2px; margin-right:5px; vertical-align:middle; }
|
|
13768
|
+
.inspector-layer-json { margin:6px 0; font:11px/1.6 ui-monospace,SFMono-Regular,monospace; white-space:pre-wrap; overflow-wrap:anywhere; color:var(--inspector-string); max-height:300px; overflow:auto; }
|
|
13769
|
+
.inspector-layer-curve { display:flex; flex-wrap:wrap; gap:5px 10px; margin-top:6px; padding:6px; background:var(--surface); }
|
|
13770
|
+
.inspector-layer-curve span { flex-basis:100%; color:var(--muted); }
|
|
13771
|
+
.inspector-layer-section,.inspector-layer-origin { padding:9px 12px; border-bottom:1px solid var(--border); }
|
|
13772
|
+
.inspector-layer-section h4 { margin:0 0 7px; font-size:11px; font-weight:500; }
|
|
13773
|
+
.inspector-layer-origin > code { margin-left:10px; color:var(--accent); }
|
|
13774
|
+
.inspector-layer-origin dl { display:grid; grid-template-columns:110px minmax(0,1fr); gap:6px 10px; font-size:11px; }
|
|
13775
|
+
.inspector-layer-origin dt { color:var(--muted); }.inspector-layer-origin dd { margin:0; overflow-wrap:anywhere; }
|
|
13776
|
+
.inspector-layer-data-summary { margin:8px 12px; font-size:11px; }
|
|
13777
|
+
.inspector-layer-samples { max-height:180px; overflow:auto; border-bottom:1px solid var(--border); }
|
|
13778
|
+
.inspector-layer-notice { position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip-path:inset(50%); white-space:nowrap; }
|
|
13779
|
+
.inspector-layer-dialog { width:min(820px,90vw); height:min(680px,85vh); padding:16px; border:1px solid var(--border); border-radius:6px; color:var(--ink); background:var(--paper); box-shadow:0 15px 70px #0005; }
|
|
13780
|
+
.inspector-layer-dialog[open] { display:flex; flex-direction:column; gap:12px; }.inspector-layer-dialog::backdrop { background:#0005; }
|
|
13781
|
+
.inspector-layer-dialog-head { display:flex; align-items:center; justify-content:space-between; }.inspector-layer-dialog-head strong { font-size:14px; font-weight:500; }
|
|
13782
|
+
.inspector-layer-dialog label { display:flex; flex-direction:column; gap:5px; }.inspector-layer-dialog input { padding:7px; border:1px solid var(--border); background:var(--paper); color:var(--ink); }
|
|
13783
|
+
.inspector-layer-dialog textarea { flex:1; min-height:100px; resize:none; background:var(--surface); color:var(--ink); padding:10px; border:1px solid var(--border); font:11px/1.6 ui-monospace,monospace; }
|
|
13784
|
+
.inspector-layer-dialog .inspector-layer-copy { margin-left:auto; }
|
|
13777
13785
|
@container(max-width:700px) {
|
|
13778
|
-
.
|
|
13779
|
-
.
|
|
13780
|
-
.
|
|
13786
|
+
.inspector-layer-heading { padding:6px 9px; }.inspector-layer-title { flex-basis:100%; }
|
|
13787
|
+
.inspector-layer-tools input[type=search] { order:1; flex:1 0 100%; }.inspector-layer-tools .inspector-layer-copy { margin-left:auto; }
|
|
13788
|
+
.inspector-layer-evidence-row { grid-template-columns:12px 92px minmax(0,1fr); gap:5px; }
|
|
13781
13789
|
}
|
|
13782
13790
|
`;
|
|
13783
13791
|
|
|
13784
|
-
// src/
|
|
13792
|
+
// src/inspector/layers/visibility.ts
|
|
13785
13793
|
var featureTypes = /* @__PURE__ */ new Set(["fill", "line", "symbol", "circle", "fill-extrusion", "heatmap"]);
|
|
13786
13794
|
function layersInView(map, layers) {
|
|
13787
13795
|
const zoom = map.getZoom();
|
|
@@ -13804,7 +13812,7 @@ function layersInView(map, layers) {
|
|
|
13804
13812
|
}
|
|
13805
13813
|
}
|
|
13806
13814
|
|
|
13807
|
-
// src/
|
|
13815
|
+
// src/inspector/layers/panel.ts
|
|
13808
13816
|
function el4(tag, className = "", text = "") {
|
|
13809
13817
|
const node = document.createElement(tag);
|
|
13810
13818
|
node.className = className;
|
|
@@ -13843,8 +13851,8 @@ var LayersPanel = class {
|
|
|
13843
13851
|
style.nonce = document.querySelector("style[nonce]")?.nonce || "";
|
|
13844
13852
|
style.textContent = layersStyles;
|
|
13845
13853
|
root.append(style);
|
|
13846
|
-
const tools = el4("div", "
|
|
13847
|
-
const modes = el4("div", "
|
|
13854
|
+
const tools = el4("div", "inspector-tools inspector-layer-tools");
|
|
13855
|
+
const modes = el4("div", "inspector-layer-modes");
|
|
13848
13856
|
modes.setAttribute("aria-label", "Layer organization");
|
|
13849
13857
|
for (const [mode, label] of [
|
|
13850
13858
|
["module", "By module"],
|
|
@@ -13861,7 +13869,7 @@ var LayersPanel = class {
|
|
|
13861
13869
|
this.search.placeholder = "Filter layers, modules, sources\u2026";
|
|
13862
13870
|
this.search.setAttribute("aria-label", "Filter layers");
|
|
13863
13871
|
this.search.addEventListener("input", () => this.renderList(true));
|
|
13864
|
-
const visible = el4("label", "
|
|
13872
|
+
const visible = el4("label", "inspector-layer-visible");
|
|
13865
13873
|
this.visibleOnly.type = "checkbox";
|
|
13866
13874
|
this.visibleOnly.setAttribute("aria-label", "Visible only");
|
|
13867
13875
|
visible.title = "Hide hidden or out-of-zoom layers and layers without rendered features in this view. Custom and raster layers stay listed when visibility is unknown.";
|
|
@@ -13875,10 +13883,10 @@ var LayersPanel = class {
|
|
|
13875
13883
|
this.renderList();
|
|
13876
13884
|
this.scheduleMeasurement();
|
|
13877
13885
|
});
|
|
13878
|
-
const toolsRow = el4("div", "
|
|
13886
|
+
const toolsRow = el4("div", "inspector-layer-tools-row");
|
|
13879
13887
|
toolsRow.append(modes, visible, this.total);
|
|
13880
13888
|
tools.append(this.search, toolsRow);
|
|
13881
|
-
const split = el4("div", "
|
|
13889
|
+
const split = el4("div", "inspector-layer-split");
|
|
13882
13890
|
this.list.setAttribute("aria-label", "Map layers");
|
|
13883
13891
|
this.list.addEventListener("mouseleave", () => this.preview.hover());
|
|
13884
13892
|
this.list.addEventListener("focusout", (event) => {
|
|
@@ -13886,14 +13894,14 @@ var LayersPanel = class {
|
|
|
13886
13894
|
this.preview.hover();
|
|
13887
13895
|
});
|
|
13888
13896
|
this.list.addEventListener("keydown", (event) => this.navigate(event));
|
|
13889
|
-
const tabs = el4("div", "
|
|
13897
|
+
const tabs = el4("div", "inspector-subtabs inspector-layer-tabs");
|
|
13890
13898
|
tabs.setAttribute("role", "tablist");
|
|
13891
13899
|
tabs.setAttribute("aria-label", "Layer details");
|
|
13892
13900
|
for (const name of ["Rules", "Diagnosis", "Data", "Origin"]) {
|
|
13893
13901
|
const button4 = action(name, () => this.selectTab(name));
|
|
13894
|
-
button4.id = `
|
|
13902
|
+
button4.id = `inspector-layer-tab-${name.toLowerCase()}`;
|
|
13895
13903
|
button4.setAttribute("role", "tab");
|
|
13896
|
-
button4.setAttribute("aria-controls", "
|
|
13904
|
+
button4.setAttribute("aria-controls", "inspector-layer-details");
|
|
13897
13905
|
button4.addEventListener("keydown", (event) => {
|
|
13898
13906
|
const names = [...this.tabs.keys()];
|
|
13899
13907
|
const delta = event.key === "ArrowLeft" ? -1 : event.key === "ArrowRight" ? 1 : 0;
|
|
@@ -13906,11 +13914,11 @@ var LayersPanel = class {
|
|
|
13906
13914
|
this.tabs.set(name, button4);
|
|
13907
13915
|
tabs.append(button4);
|
|
13908
13916
|
}
|
|
13909
|
-
this.content.id = "
|
|
13917
|
+
this.content.id = "inspector-layer-details";
|
|
13910
13918
|
this.content.setAttribute("role", "tabpanel");
|
|
13911
13919
|
this.content.tabIndex = 0;
|
|
13912
13920
|
this.detail.append(this.heading, tabs, this.content);
|
|
13913
|
-
const sidebar = el4("div", "
|
|
13921
|
+
const sidebar = el4("div", "inspector-layer-sidebar");
|
|
13914
13922
|
sidebar.append(tools, this.list);
|
|
13915
13923
|
split.append(sidebar, this.detail);
|
|
13916
13924
|
this.notice.setAttribute("role", "status");
|
|
@@ -13922,15 +13930,15 @@ var LayersPanel = class {
|
|
|
13922
13930
|
search = el4("input");
|
|
13923
13931
|
visibleOnly = el4("input");
|
|
13924
13932
|
visibleIds;
|
|
13925
|
-
list = el4("div", "
|
|
13926
|
-
detail = el4("div", "
|
|
13927
|
-
content = el4("div", "
|
|
13928
|
-
heading = el4("div", "
|
|
13933
|
+
list = el4("div", "inspector-layer-list");
|
|
13934
|
+
detail = el4("div", "inspector-layer-detail");
|
|
13935
|
+
content = el4("div", "inspector-scroll inspector-layer-content");
|
|
13936
|
+
heading = el4("div", "inspector-layer-heading");
|
|
13929
13937
|
tabs = /* @__PURE__ */ new Map();
|
|
13930
13938
|
modes = /* @__PURE__ */ new Map();
|
|
13931
|
-
total = el4("span", "
|
|
13932
|
-
notice = el4("span", "
|
|
13933
|
-
copy = action("Copy context", () => this.openContext(), "
|
|
13939
|
+
total = el4("span", "inspector-layer-total");
|
|
13940
|
+
notice = el4("span", "inspector-layer-notice");
|
|
13941
|
+
copy = action("Copy context", () => this.openContext(), "inspector-layer-copy");
|
|
13934
13942
|
mode = "module";
|
|
13935
13943
|
tab = "Rules";
|
|
13936
13944
|
collapsed = /* @__PURE__ */ new Set();
|
|
@@ -13981,7 +13989,7 @@ var LayersPanel = class {
|
|
|
13981
13989
|
if (this.measurementDirty) this.scheduleMeasurement();
|
|
13982
13990
|
};
|
|
13983
13991
|
sourceChanged = (event) => {
|
|
13984
|
-
if (event.sourceId?.startsWith("__tileflow-
|
|
13992
|
+
if (event.sourceId?.startsWith("__tileflow-inspector-")) return;
|
|
13985
13993
|
this.cache.clear();
|
|
13986
13994
|
this.measurementDirty = true;
|
|
13987
13995
|
this.dirty = true;
|
|
@@ -14243,13 +14251,13 @@ var LayersPanel = class {
|
|
|
14243
14251
|
const label = layerLabel(layer), index = Math.max(label.lastIndexOf("."), label.lastIndexOf("/"));
|
|
14244
14252
|
const span = el4("span");
|
|
14245
14253
|
span.append(
|
|
14246
|
-
el4("span", "
|
|
14247
|
-
el4("span", "
|
|
14254
|
+
el4("span", "inspector-layer-prefix", label.slice(0, index + 1)),
|
|
14255
|
+
el4("span", "inspector-layer-name", label.slice(index + 1))
|
|
14248
14256
|
);
|
|
14249
14257
|
return span;
|
|
14250
14258
|
}
|
|
14251
14259
|
zoomRange(layer) {
|
|
14252
|
-
const range = el4("span", "
|
|
14260
|
+
const range = el4("span", "inspector-zrange"), bar = el4("i"), marker = el4("em");
|
|
14253
14261
|
const max = Math.max(22, this.map?.getMaxZoom() ?? 22), percent = (v) => Math.max(0, Math.min(100, v / max * 100));
|
|
14254
14262
|
bar.style.left = `${percent(layer.minzoom)}%`;
|
|
14255
14263
|
bar.style.width = `${Math.max(0, percent(layer.maxzoom) - percent(layer.minzoom))}%`;
|
|
@@ -14261,7 +14269,7 @@ var LayersPanel = class {
|
|
|
14261
14269
|
}
|
|
14262
14270
|
visibilityControl(layers, label) {
|
|
14263
14271
|
const hidden = layers.every((layer) => layer.layout.visibility === "none");
|
|
14264
|
-
const control = el4("span", "
|
|
14272
|
+
const control = el4("span", "inspector-eye");
|
|
14265
14273
|
control.tabIndex = 0;
|
|
14266
14274
|
control.setAttribute("role", "button");
|
|
14267
14275
|
control.setAttribute("aria-label", `${hidden ? "Show" : "Hide"} ${label}`);
|
|
@@ -14300,7 +14308,7 @@ var LayersPanel = class {
|
|
|
14300
14308
|
}
|
|
14301
14309
|
}
|
|
14302
14310
|
renderFilter(layer) {
|
|
14303
|
-
const section = el4("section", "
|
|
14311
|
+
const section = el4("section", "inspector-layer-section"), head = el4("div", "inspector-rule-toggle");
|
|
14304
14312
|
section.dataset.ruleSection = "filter";
|
|
14305
14313
|
section.dataset.ruleProperty = "filter";
|
|
14306
14314
|
const edits = this.options.editor(this.side), target = { layer: layer.id, section: "filter", property: "filter" };
|
|
@@ -14320,7 +14328,7 @@ var LayersPanel = class {
|
|
|
14320
14328
|
}
|
|
14321
14329
|
});
|
|
14322
14330
|
head.append(toggle, el4("h4", "", "Feature filter"));
|
|
14323
|
-
const chips = el4("div", "
|
|
14331
|
+
const chips = el4("div", "inspector-filter-chips");
|
|
14324
14332
|
const conditions = Array.isArray(raw) && raw[0] === "all" ? raw.slice(1) : raw ? [raw] : [];
|
|
14325
14333
|
const describe = (value) => {
|
|
14326
14334
|
if (!Array.isArray(value)) return String(value);
|
|
@@ -14333,9 +14341,9 @@ var LayersPanel = class {
|
|
|
14333
14341
|
return JSON.stringify(value);
|
|
14334
14342
|
};
|
|
14335
14343
|
for (const condition of conditions)
|
|
14336
|
-
chips.append(el4("span", "
|
|
14337
|
-
if (!conditions.length) chips.append(el4("span", "
|
|
14338
|
-
const code = el4("pre", "
|
|
14344
|
+
chips.append(el4("span", "inspector-filter-chip", describe(condition)));
|
|
14345
|
+
if (!conditions.length) chips.append(el4("span", "inspector-layer-muted", "No filter declared"));
|
|
14346
|
+
const code = el4("pre", "inspector-layer-json", json(raw));
|
|
14339
14347
|
code.hidden = true;
|
|
14340
14348
|
head.append(
|
|
14341
14349
|
action("Show JSON", () => {
|
|
@@ -14366,12 +14374,12 @@ var LayersPanel = class {
|
|
|
14366
14374
|
section.append(
|
|
14367
14375
|
el4(
|
|
14368
14376
|
"p",
|
|
14369
|
-
"
|
|
14377
|
+
"inspector-note",
|
|
14370
14378
|
`${count} of ${features.length}${features.length === 2e3 ? "+" : ""} sampled resident source features match`
|
|
14371
14379
|
)
|
|
14372
14380
|
);
|
|
14373
14381
|
} catch {
|
|
14374
|
-
section.append(el4("p", "
|
|
14382
|
+
section.append(el4("p", "inspector-note", "Source-feature match count unavailable."));
|
|
14375
14383
|
}
|
|
14376
14384
|
}
|
|
14377
14385
|
if (entry?.disabled) chips.style.opacity = ".4";
|
|
@@ -14403,7 +14411,7 @@ var LayersPanel = class {
|
|
|
14403
14411
|
this.total.title = "Matching layers / renderer layers";
|
|
14404
14412
|
const fragment = document.createDocumentFragment();
|
|
14405
14413
|
for (const [group, layers] of layerGroups(filtered, this.mode)) {
|
|
14406
|
-
const section = el4("section", "
|
|
14414
|
+
const section = el4("section", "inspector-layer-group");
|
|
14407
14415
|
const closed = this.collapsed.has(group) && !this.search.value;
|
|
14408
14416
|
const header = action(
|
|
14409
14417
|
"",
|
|
@@ -14412,31 +14420,35 @@ var LayersPanel = class {
|
|
|
14412
14420
|
else this.collapsed.add(group);
|
|
14413
14421
|
this.renderList(true);
|
|
14414
14422
|
},
|
|
14415
|
-
"
|
|
14423
|
+
"inspector-layer-group-title"
|
|
14416
14424
|
);
|
|
14417
14425
|
header.setAttribute("aria-expanded", String(!closed));
|
|
14418
14426
|
header.append(
|
|
14419
14427
|
el4("span", "", closed ? "\u25B8" : "\u25BE"),
|
|
14420
14428
|
el4("strong", "", group),
|
|
14421
|
-
el4("span", "
|
|
14429
|
+
el4("span", "inspector-layer-count", String(layers.length))
|
|
14422
14430
|
);
|
|
14423
14431
|
const owners = this.layers.filter((layer) => layers.some((item) => item.id === layer.id));
|
|
14424
14432
|
header.prepend(this.visibilityControl(owners, group));
|
|
14425
14433
|
section.append(header);
|
|
14426
14434
|
if (!closed)
|
|
14427
14435
|
for (const layer of layers) {
|
|
14428
|
-
const row = action("", () => this.select(layer.id), "
|
|
14436
|
+
const row = action("", () => this.select(layer.id), "inspector-layer-row");
|
|
14429
14437
|
row.dataset.layerId = layer.id;
|
|
14430
14438
|
row.setAttribute("aria-pressed", String(layer.id === this.selectedId));
|
|
14431
14439
|
row.setAttribute("aria-label", `${layer.id}, ${layer.type}, ${eligibility(layer, zoom)}`);
|
|
14432
14440
|
row.title = `${layer.id}
|
|
14433
14441
|
${layer.type}${layer.source ? ` \xB7 ${layer.source} / ${layer.sourceLayer ?? "\u2014"}` : ""}
|
|
14434
14442
|
Draw index ${layer.index}`;
|
|
14435
|
-
const glyph = el4("span", "
|
|
14436
|
-
const label = el4("span", "
|
|
14443
|
+
const glyph = el4("span", "inspector-layer-glyph", kinds[layer.type] ?? "\u25C7");
|
|
14444
|
+
const label = el4("span", "inspector-layer-label");
|
|
14437
14445
|
label.append(this.prettyName(layer));
|
|
14438
14446
|
const state = eligibility(layer, zoom);
|
|
14439
|
-
const badge = el4(
|
|
14447
|
+
const badge = el4(
|
|
14448
|
+
"span",
|
|
14449
|
+
"inspector-layer-state",
|
|
14450
|
+
state === "Enabled" ? layer.type : state
|
|
14451
|
+
);
|
|
14440
14452
|
badge.dataset.state = state;
|
|
14441
14453
|
row.append(
|
|
14442
14454
|
this.visibilityControl([layer], layerLabel(layer)),
|
|
@@ -14462,7 +14474,7 @@ Draw index ${layer.index}`;
|
|
|
14462
14474
|
fragment.append(
|
|
14463
14475
|
el4(
|
|
14464
14476
|
"p",
|
|
14465
|
-
"
|
|
14477
|
+
"inspector-empty",
|
|
14466
14478
|
this.map ? this.visibleOnly.checked ? "No layers match this view and filter." : "No layers match this filter." : "Waiting for map layers\u2026"
|
|
14467
14479
|
)
|
|
14468
14480
|
);
|
|
@@ -14514,7 +14526,7 @@ Draw index ${layer.index}`;
|
|
|
14514
14526
|
this.picked?.at
|
|
14515
14527
|
]);
|
|
14516
14528
|
if (!force && key === this.detailKey) return;
|
|
14517
|
-
if (!force && this.tab === "Rules" && this.content.contains(document.activeElement) && document.activeElement?.closest(".
|
|
14529
|
+
if (!force && this.tab === "Rules" && this.content.contains(document.activeElement) && document.activeElement?.closest(".inspector-layer-rule-editor"))
|
|
14518
14530
|
return;
|
|
14519
14531
|
this.detailKey = key;
|
|
14520
14532
|
this.copy.disabled = !this.map || !this.selectedId;
|
|
@@ -14526,17 +14538,21 @@ Draw index ${layer.index}`;
|
|
|
14526
14538
|
this.content.replaceChildren();
|
|
14527
14539
|
if (!this.selectedId || !this.map) {
|
|
14528
14540
|
this.content.append(
|
|
14529
|
-
el4(
|
|
14541
|
+
el4(
|
|
14542
|
+
"div",
|
|
14543
|
+
"inspector-empty",
|
|
14544
|
+
"Select a layer to inspect its rules, data and runtime evidence."
|
|
14545
|
+
)
|
|
14530
14546
|
);
|
|
14531
14547
|
return;
|
|
14532
14548
|
}
|
|
14533
|
-
const title = el4("div", "
|
|
14549
|
+
const title = el4("div", "inspector-layer-title");
|
|
14534
14550
|
title.append(
|
|
14535
14551
|
el4("strong", "", layer ? layerLabel(layer) : "Layer no longer present"),
|
|
14536
14552
|
el4("code", "", this.selectedId)
|
|
14537
14553
|
);
|
|
14538
14554
|
if (layer) {
|
|
14539
|
-
const status = el4("div", "
|
|
14555
|
+
const status = el4("div", "inspector-layer-status");
|
|
14540
14556
|
status.dataset.state = eligibility(layer, this.map.getZoom());
|
|
14541
14557
|
status.append(this.zoomRange(layer), el4("span", "", `z${layer.minzoom}\u2013${layer.maxzoom}`));
|
|
14542
14558
|
if (status.dataset.state === "Outside zoom")
|
|
@@ -14559,7 +14575,7 @@ Draw index ${layer.index}`;
|
|
|
14559
14575
|
this.content.append(
|
|
14560
14576
|
el4(
|
|
14561
14577
|
"p",
|
|
14562
|
-
"
|
|
14578
|
+
"inspector-note",
|
|
14563
14579
|
"The layer is absent from this renderer. Its ID will stay selected if it returns."
|
|
14564
14580
|
)
|
|
14565
14581
|
);
|
|
@@ -14567,18 +14583,18 @@ Draw index ${layer.index}`;
|
|
|
14567
14583
|
if (this.tab === "Rules") this.focusRuleTarget();
|
|
14568
14584
|
}
|
|
14569
14585
|
renderDiagnosis(layer) {
|
|
14570
|
-
const evidence = el4("div", "
|
|
14586
|
+
const evidence = el4("div", "inspector-layer-evidence");
|
|
14571
14587
|
const feature = this.picked?.feature ?? this.samples.features[this.sampleIndex];
|
|
14572
14588
|
for (const item of [
|
|
14573
14589
|
...diagnoseLayer(this.map, layer, this.samples),
|
|
14574
14590
|
...layer ? explainFeatureVisibility(this.map, layer, feature) : []
|
|
14575
14591
|
]) {
|
|
14576
|
-
const row = el4("div", "
|
|
14592
|
+
const row = el4("div", "inspector-layer-evidence-row");
|
|
14577
14593
|
row.dataset.state = item.state;
|
|
14578
14594
|
row.append(
|
|
14579
14595
|
el4(
|
|
14580
14596
|
"span",
|
|
14581
|
-
"
|
|
14597
|
+
"inspector-layer-indicator",
|
|
14582
14598
|
item.state === "pass" ? "\u2713" : item.state === "warn" ? "!" : "\xB7"
|
|
14583
14599
|
),
|
|
14584
14600
|
el4("strong", "", item.label),
|
|
@@ -14589,7 +14605,7 @@ Draw index ${layer.index}`;
|
|
|
14589
14605
|
this.content.append(evidence);
|
|
14590
14606
|
if (!layer) return;
|
|
14591
14607
|
if (layer.runtime) this.section("Runtime controller", layer.runtime);
|
|
14592
|
-
const neighbors = el4("div", "
|
|
14608
|
+
const neighbors = el4("div", "inspector-layer-neighbors");
|
|
14593
14609
|
neighbors.append(el4("strong", "", "Renderer sequence"));
|
|
14594
14610
|
for (const [label, entry] of [
|
|
14595
14611
|
["Earlier", this.layers[layer.index - 1]],
|
|
@@ -14597,9 +14613,9 @@ Draw index ${layer.index}`;
|
|
|
14597
14613
|
["Later", this.layers[layer.index + 1]]
|
|
14598
14614
|
]) {
|
|
14599
14615
|
const row = el4("div");
|
|
14600
|
-
row.append(el4("span", "
|
|
14616
|
+
row.append(el4("span", "inspector-layer-muted", label));
|
|
14601
14617
|
row.append(
|
|
14602
|
-
entry ? action(entry.id, () => this.select(entry.id), "
|
|
14618
|
+
entry ? action(entry.id, () => this.select(entry.id), "inspector-layer-link") : el4("span", "", "End of stack")
|
|
14603
14619
|
);
|
|
14604
14620
|
neighbors.append(row);
|
|
14605
14621
|
}
|
|
@@ -14610,14 +14626,14 @@ Draw index ${layer.index}`;
|
|
|
14610
14626
|
this.content.append(
|
|
14611
14627
|
el4(
|
|
14612
14628
|
"p",
|
|
14613
|
-
"
|
|
14629
|
+
"inspector-note",
|
|
14614
14630
|
"Custom rendering is controlled by its runtime. Style paint, layout and feature filters are unavailable. See Diagnosis and Origin."
|
|
14615
14631
|
)
|
|
14616
14632
|
);
|
|
14617
14633
|
return;
|
|
14618
14634
|
}
|
|
14619
|
-
const tools = el4("div", "
|
|
14620
|
-
const defaults = el4("label", "
|
|
14635
|
+
const tools = el4("div", "inspector-tools");
|
|
14636
|
+
const defaults = el4("label", "inspector-rule-defaults"), toggle = el4("input");
|
|
14621
14637
|
toggle.type = "checkbox";
|
|
14622
14638
|
toggle.setAttribute("role", "switch");
|
|
14623
14639
|
toggle.checked = this.showDefaults;
|
|
@@ -14631,7 +14647,7 @@ Draw index ${layer.index}`;
|
|
|
14631
14647
|
tools.append(
|
|
14632
14648
|
el4(
|
|
14633
14649
|
"span",
|
|
14634
|
-
"
|
|
14650
|
+
"inspector-layer-muted",
|
|
14635
14651
|
`At zoom ${this.map.getZoom().toFixed(2)}${this.picked ? " \xB7 picked feature" : sample ? ` \xB7 sample ${this.sampleIndex + 1}` : " \xB7 no feature sample"}`
|
|
14636
14652
|
)
|
|
14637
14653
|
);
|
|
@@ -14649,7 +14665,7 @@ Draw index ${layer.index}`;
|
|
|
14649
14665
|
...this.showDefaults ? Object.keys(specs) : []
|
|
14650
14666
|
])
|
|
14651
14667
|
];
|
|
14652
|
-
const table = el4("table", "
|
|
14668
|
+
const table = el4("table", "inspector-layer-rules");
|
|
14653
14669
|
const head = el4("thead"), header = el4("tr");
|
|
14654
14670
|
for (const text of [
|
|
14655
14671
|
section === "paint" ? `Paint \xB7 ${keys.length}` : `Layout \xB7 ${keys.length}`,
|
|
@@ -14666,10 +14682,10 @@ Draw index ${layer.index}`;
|
|
|
14666
14682
|
row.dataset.ruleSection = section;
|
|
14667
14683
|
row.dataset.ruleProperty = key;
|
|
14668
14684
|
rule.append(
|
|
14669
|
-
el4("code", "
|
|
14685
|
+
el4("code", "inspector-layer-rule-name", key),
|
|
14670
14686
|
el4(
|
|
14671
14687
|
"span",
|
|
14672
|
-
"
|
|
14688
|
+
"inspector-layer-dependency",
|
|
14673
14689
|
`${disabled ? "disabled \xB7 " : key in declared ? "" : "default \xB7 "}${expressionDependencies(raw).join(" + ")}`
|
|
14674
14690
|
)
|
|
14675
14691
|
);
|
|
@@ -14683,7 +14699,7 @@ Draw index ${layer.index}`;
|
|
|
14683
14699
|
disabled ? raw : void 0
|
|
14684
14700
|
);
|
|
14685
14701
|
if (key === "text-font" && Array.isArray(evaluated) && evaluated.every((v) => typeof v === "string")) {
|
|
14686
|
-
const preview = el4("div", "
|
|
14702
|
+
const preview = el4("div", "inspector-rule-font-preview"), controller = new AbortController();
|
|
14687
14703
|
rule.append(preview);
|
|
14688
14704
|
this.ruleCleanups.push(() => controller.abort());
|
|
14689
14705
|
void this.fontPreviews.render(evaluated.join(","), this.map.getStyle(), this.side, controller.signal).then((canvas) => {
|
|
@@ -14699,7 +14715,7 @@ Draw index ${layer.index}`;
|
|
|
14699
14715
|
);
|
|
14700
14716
|
if (points.every((point) => typeof point === "number" && Number.isFinite(point))) {
|
|
14701
14717
|
const nums = points, lo = Math.min(...nums), hi = Math.max(...nums);
|
|
14702
|
-
const spark = el4("div", "
|
|
14718
|
+
const spark = el4("div", "inspector-rule-spark");
|
|
14703
14719
|
spark.innerHTML = `<svg viewBox="0 0 130 26"><polyline fill="none" stroke="currentColor" stroke-width="1.5" points="${nums.map((n, z) => `${z / 22 * 130},${25 - (n - lo) / (hi - lo || 1) * 24}`).join(" ")}"/><line stroke="currentColor" stroke-dasharray="2 2" x1="${this.map.getZoom() / 22 * 130}" x2="${this.map.getZoom() / 22 * 130}" y1="0" y2="26"/></svg>`;
|
|
14704
14720
|
spark.append(
|
|
14705
14721
|
el4(
|
|
@@ -14714,23 +14730,31 @@ Draw index ${layer.index}`;
|
|
|
14714
14730
|
this.renderRuleInput(value, row, layer, section, key, evaluated);
|
|
14715
14731
|
if (key === "icon-image" && typeof evaluated === "string")
|
|
14716
14732
|
value.append(
|
|
14717
|
-
action(
|
|
14733
|
+
action(
|
|
14734
|
+
"Sprite \u2197",
|
|
14735
|
+
() => this.options.assets("Sprites", evaluated),
|
|
14736
|
+
"inspector-layer-link"
|
|
14737
|
+
)
|
|
14718
14738
|
);
|
|
14719
14739
|
if (key === "text-font")
|
|
14720
14740
|
value.append(
|
|
14721
|
-
action(
|
|
14741
|
+
action(
|
|
14742
|
+
"Font preview \u2197",
|
|
14743
|
+
() => this.options.assets("Fonts", ""),
|
|
14744
|
+
"inspector-layer-link"
|
|
14745
|
+
)
|
|
14722
14746
|
);
|
|
14723
14747
|
row.append(rule, value);
|
|
14724
14748
|
body.append(row);
|
|
14725
14749
|
}
|
|
14726
14750
|
if (!keys.length) {
|
|
14727
|
-
const row = el4("tr"), cell = el4("td", "
|
|
14751
|
+
const row = el4("tr"), cell = el4("td", "inspector-layer-muted", "No explicit rules. Renderer defaults apply.");
|
|
14728
14752
|
cell.colSpan = 2;
|
|
14729
14753
|
row.append(cell);
|
|
14730
14754
|
body.append(row);
|
|
14731
14755
|
}
|
|
14732
14756
|
table.append(body);
|
|
14733
|
-
const card = el4("div", "
|
|
14757
|
+
const card = el4("div", "inspector-card inspector-card-table");
|
|
14734
14758
|
card.append(table);
|
|
14735
14759
|
this.content.append(card);
|
|
14736
14760
|
}
|
|
@@ -14758,7 +14782,7 @@ Draw index ${layer.index}`;
|
|
|
14758
14782
|
const editKey = edits.key(target);
|
|
14759
14783
|
const format2 = (value) => typeof value === "string" ? value : JSON.stringify(value) ?? "";
|
|
14760
14784
|
let current = evaluated;
|
|
14761
|
-
const controls = el4("div", "
|
|
14785
|
+
const controls = el4("div", "inspector-layer-rule-editor");
|
|
14762
14786
|
const enabled = el4("input");
|
|
14763
14787
|
if (enabled) {
|
|
14764
14788
|
enabled.type = "checkbox";
|
|
@@ -14766,7 +14790,7 @@ Draw index ${layer.index}`;
|
|
|
14766
14790
|
queueMicrotask(() => {
|
|
14767
14791
|
if (row.isConnected) {
|
|
14768
14792
|
const rule = row.firstElementChild;
|
|
14769
|
-
const wrap = el4("label", "
|
|
14793
|
+
const wrap = el4("label", "inspector-rule-toggle");
|
|
14770
14794
|
wrap.append(enabled, rule.firstChild);
|
|
14771
14795
|
rule.prepend(wrap);
|
|
14772
14796
|
}
|
|
@@ -14786,7 +14810,7 @@ Draw index ${layer.index}`;
|
|
|
14786
14810
|
input.value = format2(current);
|
|
14787
14811
|
input.setAttribute("aria-label", property);
|
|
14788
14812
|
input.title = "Temporary override for the entire layer";
|
|
14789
|
-
const error2 = el4("span", "
|
|
14813
|
+
const error2 = el4("span", "inspector-layer-rule-error");
|
|
14790
14814
|
error2.setAttribute("role", "alert");
|
|
14791
14815
|
error2.hidden = true;
|
|
14792
14816
|
const isCurrent = () => this.active && controls.isConnected && side.map === map && this.side === side && this.selectedId === layer.id && side.loadEpoch === epoch && Boolean(map.getLayer(layer.id));
|
|
@@ -14910,7 +14934,7 @@ Draw index ${layer.index}`;
|
|
|
14910
14934
|
showError(cause instanceof Error ? cause.message : "Unable to restore this rule.");
|
|
14911
14935
|
}
|
|
14912
14936
|
},
|
|
14913
|
-
"
|
|
14937
|
+
"inspector-layer-rule-reset"
|
|
14914
14938
|
);
|
|
14915
14939
|
reset.title = "Restore original rule";
|
|
14916
14940
|
reset.setAttribute("aria-label", `Reset ${property}`);
|
|
@@ -14918,7 +14942,7 @@ Draw index ${layer.index}`;
|
|
|
14918
14942
|
controls.append(input);
|
|
14919
14943
|
if (spec.type === "enum") {
|
|
14920
14944
|
input.hidden = true;
|
|
14921
|
-
const choices = el4("div", "
|
|
14945
|
+
const choices = el4("div", "inspector-rule-choices");
|
|
14922
14946
|
for (const value of Object.keys(spec.values)) {
|
|
14923
14947
|
const choice = action(value, () => {
|
|
14924
14948
|
apply(value);
|
|
@@ -14958,7 +14982,7 @@ Draw index ${layer.index}`;
|
|
|
14958
14982
|
cell.append(controls, error2);
|
|
14959
14983
|
}
|
|
14960
14984
|
renderData(layer) {
|
|
14961
|
-
const toolbar = el4("div", "
|
|
14985
|
+
const toolbar = el4("div", "inspector-tools");
|
|
14962
14986
|
toolbar.append(
|
|
14963
14987
|
action("Refresh samples", () => {
|
|
14964
14988
|
this.cache.clear();
|
|
@@ -14968,7 +14992,7 @@ Draw index ${layer.index}`;
|
|
|
14968
14992
|
this.scheduleMeasurement();
|
|
14969
14993
|
})
|
|
14970
14994
|
);
|
|
14971
|
-
this.content.append(toolbar, el4("p", "
|
|
14995
|
+
this.content.append(toolbar, el4("p", "inspector-note", this.samples.reason));
|
|
14972
14996
|
if (this.picked)
|
|
14973
14997
|
this.section("Picked feature", {
|
|
14974
14998
|
coordinate: this.picked.coordinate,
|
|
@@ -14980,11 +15004,11 @@ Draw index ${layer.index}`;
|
|
|
14980
15004
|
this.content.append(
|
|
14981
15005
|
el4(
|
|
14982
15006
|
"p",
|
|
14983
|
-
"
|
|
15007
|
+
"inspector-layer-data-summary",
|
|
14984
15008
|
`${this.samples.total} returned fragments \xB7 ${this.samples.features.length} retained`
|
|
14985
15009
|
)
|
|
14986
15010
|
);
|
|
14987
|
-
const table = el4("table", "
|
|
15011
|
+
const table = el4("table", "inspector-layer-rules"), body = el4("tbody");
|
|
14988
15012
|
this.samples.features.forEach((feature2, index) => {
|
|
14989
15013
|
const row = el4("tr");
|
|
14990
15014
|
row.dataset.selected = String(this.sampleIndex === index);
|
|
@@ -15000,19 +15024,19 @@ Draw index ${layer.index}`;
|
|
|
15000
15024
|
this.renderDetail(true);
|
|
15001
15025
|
this.highlight.show(this.map, [feature2]);
|
|
15002
15026
|
},
|
|
15003
|
-
"
|
|
15027
|
+
"inspector-layer-link"
|
|
15004
15028
|
);
|
|
15005
15029
|
button4.title = `Sample ${index + 1} \xB7 ${feature2.geometry.type}`;
|
|
15006
15030
|
cell.append(button4);
|
|
15007
15031
|
const inspect = el4("td");
|
|
15008
15032
|
inspect.append(
|
|
15009
|
-
action("Use for rules \u2197", () => this.inspectFeature(feature2), "
|
|
15033
|
+
action("Use for rules \u2197", () => this.inspectFeature(feature2), "inspector-layer-link")
|
|
15010
15034
|
);
|
|
15011
15035
|
row.append(cell, el4("td", "", feature2.geometry.type), inspect);
|
|
15012
15036
|
body.append(row);
|
|
15013
15037
|
});
|
|
15014
15038
|
table.append(body);
|
|
15015
|
-
const samples = el4("div", "
|
|
15039
|
+
const samples = el4("div", "inspector-layer-samples");
|
|
15016
15040
|
samples.append(table);
|
|
15017
15041
|
this.content.append(samples);
|
|
15018
15042
|
const feature = this.samples.features[this.sampleIndex];
|
|
@@ -15043,12 +15067,12 @@ Draw index ${layer.index}`;
|
|
|
15043
15067
|
this.content.append(
|
|
15044
15068
|
el4(
|
|
15045
15069
|
"p",
|
|
15046
|
-
"
|
|
15070
|
+
"inspector-note",
|
|
15047
15071
|
layer.type === "custom" ? "Runtime layer. No compiler contribution is attached to this layer." : "Unattributed. No matching compiler sidecar contribution is available."
|
|
15048
15072
|
)
|
|
15049
15073
|
);
|
|
15050
15074
|
for (const contribution of layer.contributions) {
|
|
15051
|
-
const card = el4("section", "
|
|
15075
|
+
const card = el4("section", "inspector-layer-origin");
|
|
15052
15076
|
card.append(el4("strong", "", contribution.owner), el4("code", "", contribution.target));
|
|
15053
15077
|
const dl = el4("dl");
|
|
15054
15078
|
for (const [name, value] of [
|
|
@@ -15071,21 +15095,21 @@ Draw index ${layer.index}`;
|
|
|
15071
15095
|
dl.append(el4("dt", "", name), el4("dd", "", value));
|
|
15072
15096
|
card.append(dl);
|
|
15073
15097
|
if (contribution.operations?.length)
|
|
15074
|
-
card.append(el4("pre", "
|
|
15098
|
+
card.append(el4("pre", "inspector-layer-json", json(contribution.operations)));
|
|
15075
15099
|
this.content.append(card);
|
|
15076
15100
|
}
|
|
15077
15101
|
this.content.append(
|
|
15078
15102
|
el4(
|
|
15079
15103
|
"p",
|
|
15080
|
-
"
|
|
15104
|
+
"inspector-note",
|
|
15081
15105
|
"These are semantic owners and compiler operations, not exact file or line locations. Shared physical layers retain all contributions."
|
|
15082
15106
|
)
|
|
15083
15107
|
);
|
|
15084
15108
|
if (layer.runtime) this.section("Runtime capability", layer.runtime);
|
|
15085
15109
|
}
|
|
15086
15110
|
section(title, value) {
|
|
15087
|
-
const section = el4("section", "
|
|
15088
|
-
section.append(el4("h4", "", title), el4("pre", "
|
|
15111
|
+
const section = el4("section", "inspector-layer-section");
|
|
15112
|
+
section.append(el4("h4", "", title), el4("pre", "inspector-layer-json", json(value)));
|
|
15089
15113
|
this.content.append(section);
|
|
15090
15114
|
}
|
|
15091
15115
|
context() {
|
|
@@ -15133,10 +15157,10 @@ Draw index ${layer.index}`;
|
|
|
15133
15157
|
return;
|
|
15134
15158
|
}
|
|
15135
15159
|
this.dialog?.remove();
|
|
15136
|
-
const dialog = el4("dialog", "
|
|
15160
|
+
const dialog = el4("dialog", "inspector-layer-dialog");
|
|
15137
15161
|
this.dialog = dialog;
|
|
15138
15162
|
dialog.setAttribute("aria-label", "Layer context preview");
|
|
15139
|
-
const head = el4("div", "
|
|
15163
|
+
const head = el4("div", "inspector-layer-dialog-head");
|
|
15140
15164
|
head.append(
|
|
15141
15165
|
el4("strong", "", "Copy layer context"),
|
|
15142
15166
|
action("Close", () => dialog.close())
|
|
@@ -15150,7 +15174,7 @@ Draw index ${layer.index}`;
|
|
|
15150
15174
|
preview.readOnly = true;
|
|
15151
15175
|
preview.setAttribute("aria-label", "Context preview");
|
|
15152
15176
|
preview.spellcheck = false;
|
|
15153
|
-
const tools = el4("div", "
|
|
15177
|
+
const tools = el4("div", "inspector-tools");
|
|
15154
15178
|
let format2 = "Markdown";
|
|
15155
15179
|
const buttons = /* @__PURE__ */ new Map();
|
|
15156
15180
|
const render = () => {
|
|
@@ -15167,7 +15191,11 @@ Draw index ${layer.index}`;
|
|
|
15167
15191
|
tools.append(button4);
|
|
15168
15192
|
buttons.set(name, button4);
|
|
15169
15193
|
}
|
|
15170
|
-
const status = el4(
|
|
15194
|
+
const status = el4(
|
|
15195
|
+
"span",
|
|
15196
|
+
"inspector-layer-muted",
|
|
15197
|
+
"Snapshot frozen while this preview is open."
|
|
15198
|
+
);
|
|
15171
15199
|
status.setAttribute("role", "status");
|
|
15172
15200
|
const copy = action(
|
|
15173
15201
|
"Copy to clipboard",
|
|
@@ -15180,7 +15208,7 @@ Draw index ${layer.index}`;
|
|
|
15180
15208
|
status.textContent = "Clipboard unavailable. Copy the selected text manually.";
|
|
15181
15209
|
});
|
|
15182
15210
|
},
|
|
15183
|
-
"
|
|
15211
|
+
"inspector-layer-copy"
|
|
15184
15212
|
);
|
|
15185
15213
|
tools.append(copy);
|
|
15186
15214
|
question.addEventListener("input", render);
|
|
@@ -15191,7 +15219,7 @@ Draw index ${layer.index}`;
|
|
|
15191
15219
|
}
|
|
15192
15220
|
};
|
|
15193
15221
|
|
|
15194
|
-
// src/
|
|
15222
|
+
// src/inspector/tile-details.ts
|
|
15195
15223
|
function el5(tag, className = "", text = "") {
|
|
15196
15224
|
const node = document.createElement(tag);
|
|
15197
15225
|
node.className = className;
|
|
@@ -15205,7 +15233,7 @@ function button2(text, action2) {
|
|
|
15205
15233
|
return node;
|
|
15206
15234
|
}
|
|
15207
15235
|
function values(entries) {
|
|
15208
|
-
const list = el5("dl", "
|
|
15236
|
+
const list = el5("dl", "inspector-kv");
|
|
15209
15237
|
for (const [key, value] of Object.entries(entries)) {
|
|
15210
15238
|
if (value === void 0) continue;
|
|
15211
15239
|
list.append(el5("dt", "", key), el5("dd", "", String(value)));
|
|
@@ -15238,7 +15266,7 @@ var TileDetailsPanel = class {
|
|
|
15238
15266
|
tab = "Source layers";
|
|
15239
15267
|
layer = "";
|
|
15240
15268
|
page = 0;
|
|
15241
|
-
body = el5("div", "
|
|
15269
|
+
body = el5("div", "inspector-scroll inspector-tile-content");
|
|
15242
15270
|
update(map, tile) {
|
|
15243
15271
|
const contents = inspectTile(map, tile);
|
|
15244
15272
|
const signature = JSON.stringify([
|
|
@@ -15272,12 +15300,12 @@ var TileDetailsPanel = class {
|
|
|
15272
15300
|
}
|
|
15273
15301
|
render() {
|
|
15274
15302
|
const tile = this.tile;
|
|
15275
|
-
const header = el5("div", "
|
|
15303
|
+
const header = el5("div", "inspector-tools inspector-tile-heading");
|
|
15276
15304
|
header.append(el5("strong", "", `Tile ${tile.z}/${tile.x}/${tile.y}`));
|
|
15277
15305
|
const close = button2("\xD7", this.close);
|
|
15278
15306
|
close.setAttribute("aria-label", "Close tile details");
|
|
15279
15307
|
header.append(button2("Show on map", this.highlight), close);
|
|
15280
|
-
const tabs = el5("div", "
|
|
15308
|
+
const tabs = el5("div", "inspector-subtabs");
|
|
15281
15309
|
tabs.setAttribute("role", "tablist");
|
|
15282
15310
|
tabs.setAttribute("aria-label", "Tile detail views");
|
|
15283
15311
|
for (const name of ["Source layers", "Features", "Info"]) {
|
|
@@ -15287,8 +15315,8 @@ var TileDetailsPanel = class {
|
|
|
15287
15315
|
});
|
|
15288
15316
|
tab.setAttribute("role", "tab");
|
|
15289
15317
|
tab.setAttribute("aria-selected", String(this.tab === name));
|
|
15290
|
-
tab.id = `
|
|
15291
|
-
tab.setAttribute("aria-controls", "
|
|
15318
|
+
tab.id = `inspector-tile-tab-${name.toLowerCase().replaceAll(" ", "-")}`;
|
|
15319
|
+
tab.setAttribute("aria-controls", "inspector-tile-detail-content");
|
|
15292
15320
|
tab.tabIndex = this.tab === name ? 0 : -1;
|
|
15293
15321
|
tab.addEventListener("keydown", (event) => {
|
|
15294
15322
|
if (!["ArrowLeft", "ArrowRight", "Home", "End"].includes(event.key)) return;
|
|
@@ -15300,18 +15328,18 @@ var TileDetailsPanel = class {
|
|
|
15300
15328
|
});
|
|
15301
15329
|
tabs.append(tab);
|
|
15302
15330
|
}
|
|
15303
|
-
this.body = el5("div", "
|
|
15331
|
+
this.body = el5("div", "inspector-scroll inspector-tile-content");
|
|
15304
15332
|
this.body.setAttribute("role", "tabpanel");
|
|
15305
|
-
this.body.id = "
|
|
15333
|
+
this.body.id = "inspector-tile-detail-content";
|
|
15306
15334
|
this.body.setAttribute(
|
|
15307
15335
|
"aria-labelledby",
|
|
15308
|
-
`
|
|
15336
|
+
`inspector-tile-tab-${this.tab.toLowerCase().replaceAll(" ", "-")}`
|
|
15309
15337
|
);
|
|
15310
15338
|
this.body.setAttribute("aria-label", `Tile ${this.tab.toLowerCase().replaceAll(" ", "-")}`);
|
|
15311
15339
|
const count = Object.values(this.contents?.layers ?? {}).reduce((n, l) => n + l.length, 0);
|
|
15312
15340
|
const status = el5(
|
|
15313
15341
|
"div",
|
|
15314
|
-
"
|
|
15342
|
+
"inspector-tile-status",
|
|
15315
15343
|
`${tile.state} \xB7 ${size(tile.bytes)} raw \xB7 ${Object.keys(this.contents?.layers ?? {}).length} source layers \xB7 ${count} features`
|
|
15316
15344
|
);
|
|
15317
15345
|
this.root.replaceChildren(header, status, tabs, this.body);
|
|
@@ -15352,11 +15380,11 @@ var TileDetailsPanel = class {
|
|
|
15352
15380
|
this.body.append(
|
|
15353
15381
|
el5(
|
|
15354
15382
|
"p",
|
|
15355
|
-
"
|
|
15383
|
+
"inspector-note",
|
|
15356
15384
|
`${layers.length} source layers \xB7 ${layers.reduce((total, [, layer]) => total + layer.length, 0).toLocaleString()} features`
|
|
15357
15385
|
)
|
|
15358
15386
|
);
|
|
15359
|
-
const table = el5("table", "
|
|
15387
|
+
const table = el5("table", "inspector-table");
|
|
15360
15388
|
const head = el5("thead"), header = el5("tr");
|
|
15361
15389
|
for (const title of ["Source layer", "Features", "Used by"])
|
|
15362
15390
|
header.append(el5("th", "", title));
|
|
@@ -15370,7 +15398,7 @@ var TileDetailsPanel = class {
|
|
|
15370
15398
|
this.tab = "Features";
|
|
15371
15399
|
this.render();
|
|
15372
15400
|
});
|
|
15373
|
-
link.className = "
|
|
15401
|
+
link.className = "inspector-cell-button";
|
|
15374
15402
|
cell.append(link);
|
|
15375
15403
|
const used = el5("td");
|
|
15376
15404
|
const consumers = this.map.getStyle().layers.filter(
|
|
@@ -15378,19 +15406,19 @@ var TileDetailsPanel = class {
|
|
|
15378
15406
|
);
|
|
15379
15407
|
for (const l of consumers) {
|
|
15380
15408
|
const link2 = button2(l.id, () => this.revealLayer(l.id));
|
|
15381
|
-
link2.className = "
|
|
15409
|
+
link2.className = "inspector-tile-chip";
|
|
15382
15410
|
used.append(link2);
|
|
15383
15411
|
}
|
|
15384
15412
|
if (!consumers.length) used.textContent = "Unused \xB7 no style layer references this data";
|
|
15385
|
-
row.append(cell, el5("td", "
|
|
15413
|
+
row.append(cell, el5("td", "inspector-number", layer.length.toLocaleString()), used);
|
|
15386
15414
|
body.append(row);
|
|
15387
15415
|
}
|
|
15388
15416
|
table.append(head, body);
|
|
15389
|
-
const card = el5("div", "
|
|
15417
|
+
const card = el5("div", "inspector-card inspector-card-table");
|
|
15390
15418
|
card.append(table);
|
|
15391
15419
|
this.body.append(card);
|
|
15392
15420
|
}
|
|
15393
|
-
if (contents.message) this.body.append(el5("p", "
|
|
15421
|
+
if (contents.message) this.body.append(el5("p", "inspector-note", contents.message));
|
|
15394
15422
|
}
|
|
15395
15423
|
data() {
|
|
15396
15424
|
const contents = this.contents;
|
|
@@ -15398,7 +15426,7 @@ var TileDetailsPanel = class {
|
|
|
15398
15426
|
this.body.append(
|
|
15399
15427
|
el5(
|
|
15400
15428
|
"p",
|
|
15401
|
-
"
|
|
15429
|
+
"inspector-note",
|
|
15402
15430
|
contents.message ?? "This tile contains an elevation grid, not vector features. See Info for its terrain data."
|
|
15403
15431
|
)
|
|
15404
15432
|
);
|
|
@@ -15406,14 +15434,14 @@ var TileDetailsPanel = class {
|
|
|
15406
15434
|
}
|
|
15407
15435
|
const names = Object.keys(contents.layers);
|
|
15408
15436
|
if (!names.length) {
|
|
15409
|
-
this.body.append(el5("p", "
|
|
15437
|
+
this.body.append(el5("p", "inspector-note", "This vector tile contains no source layers."));
|
|
15410
15438
|
return;
|
|
15411
15439
|
}
|
|
15412
15440
|
if (!names.includes(this.layer)) {
|
|
15413
15441
|
this.layer = names[0];
|
|
15414
15442
|
this.page = 0;
|
|
15415
15443
|
}
|
|
15416
|
-
const toolbar = el5("div", "
|
|
15444
|
+
const toolbar = el5("div", "inspector-tools"), select = el5("select");
|
|
15417
15445
|
select.setAttribute("aria-label", "Tile source layer");
|
|
15418
15446
|
for (const name of names)
|
|
15419
15447
|
select.append(new Option(`${name} (${contents.layers[name].length.toLocaleString()})`, name));
|
|
@@ -15425,14 +15453,14 @@ var TileDetailsPanel = class {
|
|
|
15425
15453
|
});
|
|
15426
15454
|
select.hidden = true;
|
|
15427
15455
|
toolbar.append(select);
|
|
15428
|
-
toolbar.className = "
|
|
15456
|
+
toolbar.className = "inspector-tile-chip-list";
|
|
15429
15457
|
for (const name of names) {
|
|
15430
15458
|
const chip = button2(`${name} \xB7 ${contents.layers[name].length}`, () => {
|
|
15431
15459
|
this.layer = name;
|
|
15432
15460
|
this.page = 0;
|
|
15433
15461
|
this.render();
|
|
15434
15462
|
});
|
|
15435
|
-
chip.className = "
|
|
15463
|
+
chip.className = "inspector-tile-chip";
|
|
15436
15464
|
chip.setAttribute("aria-pressed", String(this.layer === name));
|
|
15437
15465
|
toolbar.append(chip);
|
|
15438
15466
|
}
|
|
@@ -15449,7 +15477,7 @@ var TileDetailsPanel = class {
|
|
|
15449
15477
|
this.render();
|
|
15450
15478
|
});
|
|
15451
15479
|
next.disabled = end >= layer.length;
|
|
15452
|
-
const paging = el5("div", "
|
|
15480
|
+
const paging = el5("div", "inspector-tools inspector-tile-paging");
|
|
15453
15481
|
paging.append(
|
|
15454
15482
|
previous,
|
|
15455
15483
|
el5("span", "", `${layer.length ? start + 1 : 0}\u2013${end} of ${layer.length.toLocaleString()}`),
|
|
@@ -15457,7 +15485,7 @@ var TileDetailsPanel = class {
|
|
|
15457
15485
|
);
|
|
15458
15486
|
this.body.append(
|
|
15459
15487
|
toolbar,
|
|
15460
|
-
el5("p", "
|
|
15488
|
+
el5("p", "inspector-note", `Whole tile \xB7 MVT v${layer.version} \xB7 extent ${layer.extent}`),
|
|
15461
15489
|
paging
|
|
15462
15490
|
);
|
|
15463
15491
|
for (let index = start; index < end; index++) {
|
|
@@ -15465,7 +15493,7 @@ var TileDetailsPanel = class {
|
|
|
15465
15493
|
const feature = layer.feature(index);
|
|
15466
15494
|
const name = feature.properties.name ?? feature.properties["name:en"] ?? feature.properties.class;
|
|
15467
15495
|
const kind = ["Unknown", "Point", "LineString", "Polygon"][feature.type];
|
|
15468
|
-
const row = el5("details", "
|
|
15496
|
+
const row = el5("details", "inspector-tile-feature");
|
|
15469
15497
|
row.append(
|
|
15470
15498
|
el5(
|
|
15471
15499
|
"summary",
|
|
@@ -15500,20 +15528,22 @@ var TileDetailsPanel = class {
|
|
|
15500
15528
|
)
|
|
15501
15529
|
);
|
|
15502
15530
|
} catch {
|
|
15503
|
-
geometry.append(
|
|
15531
|
+
geometry.append(
|
|
15532
|
+
el5("p", "inspector-note", "This feature geometry could not be decoded.")
|
|
15533
|
+
);
|
|
15504
15534
|
}
|
|
15505
15535
|
});
|
|
15506
15536
|
row.append(geometry);
|
|
15507
15537
|
});
|
|
15508
15538
|
this.body.append(row);
|
|
15509
15539
|
} catch {
|
|
15510
|
-
this.body.append(el5("p", "
|
|
15540
|
+
this.body.append(el5("p", "inspector-note", `Feature #${index + 1} could not be decoded.`));
|
|
15511
15541
|
}
|
|
15512
15542
|
}
|
|
15513
15543
|
}
|
|
15514
15544
|
};
|
|
15515
15545
|
|
|
15516
|
-
// src/
|
|
15546
|
+
// src/inspector/browser.ts
|
|
15517
15547
|
function element(tag, className = "", text = "") {
|
|
15518
15548
|
const result = document.createElement(tag);
|
|
15519
15549
|
result.className = className;
|
|
@@ -15542,7 +15572,7 @@ var paths = {
|
|
|
15542
15572
|
inspect: '<path d="M8 3H3v5m13-5h5v5M3 16v5h5m4-10 8 4-5 1-1 5z"/>'
|
|
15543
15573
|
};
|
|
15544
15574
|
function icon(name, label, action2) {
|
|
15545
|
-
const result = button3("", action2, "
|
|
15575
|
+
const result = button3("", action2, "inspector-icon");
|
|
15546
15576
|
result.title = label;
|
|
15547
15577
|
result.setAttribute("aria-label", label);
|
|
15548
15578
|
result.innerHTML = `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${paths[name]}</svg>`;
|
|
@@ -15566,11 +15596,11 @@ function safe(action2, report) {
|
|
|
15566
15596
|
report(error2 instanceof Error ? error2.message : String(error2));
|
|
15567
15597
|
}
|
|
15568
15598
|
}
|
|
15569
|
-
var
|
|
15599
|
+
var Inspector = class {
|
|
15570
15600
|
constructor(host) {
|
|
15571
15601
|
this.host = host;
|
|
15572
|
-
document.body.classList.add("
|
|
15573
|
-
this.shell.setAttribute("aria-label", "
|
|
15602
|
+
document.body.classList.add("inspector-ready");
|
|
15603
|
+
this.shell.setAttribute("aria-label", "Inspector");
|
|
15574
15604
|
this.restoreLayout();
|
|
15575
15605
|
this.buildShell();
|
|
15576
15606
|
this.buildInspect();
|
|
@@ -15651,7 +15681,7 @@ var Devtools = class {
|
|
|
15651
15681
|
});
|
|
15652
15682
|
this.workspace.append(this.shell);
|
|
15653
15683
|
this.applyLayout();
|
|
15654
|
-
window.
|
|
15684
|
+
window.__tileflowInspectorUI = {
|
|
15655
15685
|
show: (panel2) => this.show(panel2),
|
|
15656
15686
|
feedback: this.report,
|
|
15657
15687
|
selectionChanged: () => this.selectionChanged(),
|
|
@@ -15681,17 +15711,17 @@ var Devtools = class {
|
|
|
15681
15711
|
}
|
|
15682
15712
|
host;
|
|
15683
15713
|
workspace = document.querySelector(".workspace");
|
|
15684
|
-
shell = element("section", "
|
|
15685
|
-
body = element("div", "
|
|
15686
|
-
head = element("div", "
|
|
15687
|
-
tabs = element("div", "
|
|
15688
|
-
cameraControls = element("fieldset", "
|
|
15714
|
+
shell = element("section", "inspector-shell");
|
|
15715
|
+
body = element("div", "inspector-body");
|
|
15716
|
+
head = element("div", "inspector-head");
|
|
15717
|
+
tabs = element("div", "inspector-tabs");
|
|
15718
|
+
cameraControls = element("fieldset", "inspector-camera");
|
|
15689
15719
|
cameraFields = [];
|
|
15690
15720
|
initialCamera;
|
|
15691
15721
|
cameraFrame;
|
|
15692
15722
|
historyPending = false;
|
|
15693
15723
|
theme = "system";
|
|
15694
|
-
menu = element("div", "
|
|
15724
|
+
menu = element("div", "inspector-menu");
|
|
15695
15725
|
panels = /* @__PURE__ */ new Map();
|
|
15696
15726
|
tabButtons = /* @__PURE__ */ new Map();
|
|
15697
15727
|
activePanel = "layers";
|
|
@@ -15705,22 +15735,22 @@ var Devtools = class {
|
|
|
15705
15735
|
filter = "";
|
|
15706
15736
|
edits = /* @__PURE__ */ new Map();
|
|
15707
15737
|
geometries = /* @__PURE__ */ new Map();
|
|
15708
|
-
tree = element("div", "
|
|
15709
|
-
detail = element("div", "
|
|
15738
|
+
tree = element("div", "inspector-tree");
|
|
15739
|
+
detail = element("div", "inspector-scroll");
|
|
15710
15740
|
scopeSelect = element("select");
|
|
15711
|
-
curve = element("div", "
|
|
15741
|
+
curve = element("div", "inspector-zoom");
|
|
15712
15742
|
notice = document.getElementById("wb-notice");
|
|
15713
15743
|
noticeStore = element("div");
|
|
15714
15744
|
undoButton = icon("undo", "Undo", () => this.changeHistory("undo"));
|
|
15715
15745
|
redoButton = icon("redo", "Redo", () => this.changeHistory("redo"));
|
|
15716
15746
|
resetChangesButton = button3("Reset all changes", () => this.resetAll());
|
|
15717
|
-
message = element("div", "
|
|
15747
|
+
message = element("div", "inspector-status-message");
|
|
15718
15748
|
networkFilter = "";
|
|
15719
|
-
networkSidebar = element("div", "
|
|
15720
|
-
networkGrid = element("div", "
|
|
15721
|
-
networkLog = element("div", "
|
|
15722
|
-
networkDetail = element("div", "
|
|
15723
|
-
networkBody = element("div", "
|
|
15749
|
+
networkSidebar = element("div", "inspector-tiles-sidebar");
|
|
15750
|
+
networkGrid = element("div", "inspector-tiles-grid-wrap");
|
|
15751
|
+
networkLog = element("div", "inspector-scroll");
|
|
15752
|
+
networkDetail = element("div", "inspector-network-detail");
|
|
15753
|
+
networkBody = element("div", "inspector-network-body");
|
|
15724
15754
|
tileDetails = new TileDetailsPanel(
|
|
15725
15755
|
this.networkDetail,
|
|
15726
15756
|
() => {
|
|
@@ -15735,7 +15765,7 @@ var Devtools = class {
|
|
|
15735
15765
|
if (this.networkTile) this.showTile(this.host.active(), this.networkTile);
|
|
15736
15766
|
}
|
|
15737
15767
|
);
|
|
15738
|
-
networkSummary = element("div", "
|
|
15768
|
+
networkSummary = element("div", "inspector-footer");
|
|
15739
15769
|
networkKey = "";
|
|
15740
15770
|
sideMaps = /* @__PURE__ */ new Map();
|
|
15741
15771
|
networkSelection;
|
|
@@ -15757,13 +15787,13 @@ var Devtools = class {
|
|
|
15757
15787
|
guarded = (action2) => safe(action2, this.report);
|
|
15758
15788
|
buildShell() {
|
|
15759
15789
|
const inspect = document.getElementById("inspect-toggle");
|
|
15760
|
-
inspect.className = "
|
|
15790
|
+
inspect.className = "inspector-icon";
|
|
15761
15791
|
inspect.innerHTML = icon("inspect", "", () => {
|
|
15762
15792
|
}).innerHTML;
|
|
15763
15793
|
inspect.setAttribute("aria-label", "Select a map element (I)");
|
|
15764
|
-
const divider = element("span", "
|
|
15794
|
+
const divider = element("span", "inspector-divider");
|
|
15765
15795
|
this.tabs.setAttribute("role", "tablist");
|
|
15766
|
-
this.tabs.setAttribute("aria-label", "
|
|
15796
|
+
this.tabs.setAttribute("aria-label", "Inspector panels");
|
|
15767
15797
|
for (const [id, label] of Object.entries({
|
|
15768
15798
|
inspect: "Inspect",
|
|
15769
15799
|
scene: "Map",
|
|
@@ -15773,15 +15803,15 @@ var Devtools = class {
|
|
|
15773
15803
|
performance: "Debug",
|
|
15774
15804
|
diagnostics: "Diagnostics"
|
|
15775
15805
|
})) {
|
|
15776
|
-
const panel = element("section", "
|
|
15777
|
-
panel.id = `
|
|
15806
|
+
const panel = element("section", "inspector-panel");
|
|
15807
|
+
panel.id = `inspector-panel-${id}`;
|
|
15778
15808
|
panel.hidden = true;
|
|
15779
15809
|
panel.setAttribute("role", "tabpanel");
|
|
15780
|
-
panel.setAttribute("aria-labelledby", `
|
|
15810
|
+
panel.setAttribute("aria-labelledby", `inspector-tab-${id}`);
|
|
15781
15811
|
const tab = button3(label, () => {
|
|
15782
15812
|
this.show(id);
|
|
15783
15813
|
});
|
|
15784
|
-
tab.id = `
|
|
15814
|
+
tab.id = `inspector-tab-${id}`;
|
|
15785
15815
|
tab.setAttribute("role", "tab");
|
|
15786
15816
|
tab.setAttribute("aria-controls", panel.id);
|
|
15787
15817
|
if (id !== "inspect") this.tabButtons.set(id, tab);
|
|
@@ -15798,16 +15828,16 @@ var Devtools = class {
|
|
|
15798
15828
|
this.show(keys[next]);
|
|
15799
15829
|
this.tabButtons.get(keys[next]).focus();
|
|
15800
15830
|
});
|
|
15801
|
-
const more = icon("more", "Customize and control
|
|
15831
|
+
const more = icon("more", "Customize and control Inspector", () => {
|
|
15802
15832
|
this.menu.hidden = !this.menu.hidden;
|
|
15803
15833
|
more.setAttribute("aria-expanded", String(!this.menu.hidden));
|
|
15804
15834
|
});
|
|
15805
15835
|
more.setAttribute("aria-expanded", "false");
|
|
15806
|
-
more.setAttribute("aria-controls", "
|
|
15807
|
-
this.menu.id = "
|
|
15836
|
+
more.setAttribute("aria-controls", "inspector-menu");
|
|
15837
|
+
this.menu.id = "inspector-menu";
|
|
15808
15838
|
this.menu.hidden = true;
|
|
15809
|
-
this.menu.append(element("div", "
|
|
15810
|
-
const choices = element("div", "
|
|
15839
|
+
this.menu.append(element("div", "inspector-menu-label", "Dock side"));
|
|
15840
|
+
const choices = element("div", "inspector-dock-options");
|
|
15811
15841
|
for (const placement of ["left", "bottom", "right"]) {
|
|
15812
15842
|
const choice = icon(placement, `Dock to ${placement}`, () => {
|
|
15813
15843
|
this.dock = placement;
|
|
@@ -15824,9 +15854,9 @@ var Devtools = class {
|
|
|
15824
15854
|
more.setAttribute("aria-expanded", "false");
|
|
15825
15855
|
more.focus();
|
|
15826
15856
|
});
|
|
15827
|
-
const themes = element("div", "
|
|
15857
|
+
const themes = element("div", "inspector-segments");
|
|
15828
15858
|
try {
|
|
15829
|
-
const saved = localStorage.getItem("tileflow-devtools-theme");
|
|
15859
|
+
const saved = localStorage.getItem("tileflow-inspector-theme") ?? localStorage.getItem("tileflow-devtools-theme");
|
|
15830
15860
|
if (saved === "light" || saved === "dark") this.theme = saved;
|
|
15831
15861
|
} catch {
|
|
15832
15862
|
}
|
|
@@ -15835,7 +15865,7 @@ var Devtools = class {
|
|
|
15835
15865
|
for (const b of themes.querySelectorAll("button"))
|
|
15836
15866
|
b.setAttribute("aria-pressed", String(b.dataset.theme === this.theme));
|
|
15837
15867
|
try {
|
|
15838
|
-
localStorage.setItem("tileflow-
|
|
15868
|
+
localStorage.setItem("tileflow-inspector-theme", this.theme);
|
|
15839
15869
|
} catch {
|
|
15840
15870
|
}
|
|
15841
15871
|
};
|
|
@@ -15850,7 +15880,7 @@ var Devtools = class {
|
|
|
15850
15880
|
applyTheme();
|
|
15851
15881
|
this.menu.append(
|
|
15852
15882
|
choices,
|
|
15853
|
-
element("div", "
|
|
15883
|
+
element("div", "inspector-menu-label", "Theme"),
|
|
15854
15884
|
themes,
|
|
15855
15885
|
element("hr"),
|
|
15856
15886
|
button3("Restore default layout", () => {
|
|
@@ -15867,7 +15897,7 @@ var Devtools = class {
|
|
|
15867
15897
|
this.undoButton.title = "Undo last preview change (Ctrl/\u2318Z)";
|
|
15868
15898
|
this.redoButton.title = "Redo preview change (Ctrl/\u2318Shift+Z)";
|
|
15869
15899
|
this.syncHistoryControls();
|
|
15870
|
-
const navigation = element("div", "
|
|
15900
|
+
const navigation = element("div", "inspector-head-main");
|
|
15871
15901
|
this.buildCameraControls();
|
|
15872
15902
|
navigation.append(this.tabs);
|
|
15873
15903
|
this.head.append(
|
|
@@ -15877,7 +15907,7 @@ var Devtools = class {
|
|
|
15877
15907
|
this.undoButton,
|
|
15878
15908
|
this.redoButton,
|
|
15879
15909
|
more,
|
|
15880
|
-
icon("close", "Close
|
|
15910
|
+
icon("close", "Close Inspector", () => {
|
|
15881
15911
|
this.clearInspectHover();
|
|
15882
15912
|
this.cancelColorPreviews();
|
|
15883
15913
|
this.diagnostics?.setActive(false);
|
|
@@ -15886,10 +15916,10 @@ var Devtools = class {
|
|
|
15886
15916
|
this.host.inspect(false);
|
|
15887
15917
|
})
|
|
15888
15918
|
);
|
|
15889
|
-
const resize = element("div", "
|
|
15919
|
+
const resize = element("div", "inspector-resize");
|
|
15890
15920
|
resize.tabIndex = 0;
|
|
15891
15921
|
resize.setAttribute("role", "separator");
|
|
15892
|
-
resize.setAttribute("aria-label", "Resize
|
|
15922
|
+
resize.setAttribute("aria-label", "Resize Inspector");
|
|
15893
15923
|
this.installResize(resize);
|
|
15894
15924
|
this.message.hidden = true;
|
|
15895
15925
|
this.message.setAttribute("role", "status");
|
|
@@ -15904,9 +15934,9 @@ var Devtools = class {
|
|
|
15904
15934
|
this.message,
|
|
15905
15935
|
this.noticeStore
|
|
15906
15936
|
);
|
|
15907
|
-
const reopen = button3("
|
|
15908
|
-
reopen.id = "
|
|
15909
|
-
reopen.setAttribute("aria-label", "Open
|
|
15937
|
+
const reopen = button3("Inspector", () => this.show(this.activePanel));
|
|
15938
|
+
reopen.id = "inspector-reopen";
|
|
15939
|
+
reopen.setAttribute("aria-label", "Open Inspector");
|
|
15910
15940
|
this.workspace.append(reopen);
|
|
15911
15941
|
}
|
|
15912
15942
|
show(panel) {
|
|
@@ -15943,7 +15973,9 @@ var Devtools = class {
|
|
|
15943
15973
|
}
|
|
15944
15974
|
restoreLayout() {
|
|
15945
15975
|
try {
|
|
15946
|
-
const saved = JSON.parse(
|
|
15976
|
+
const saved = JSON.parse(
|
|
15977
|
+
localStorage.getItem("tileflow-inspector-layout-v1") ?? localStorage.getItem("tileflow-devtools-layout-v1") ?? "null"
|
|
15978
|
+
);
|
|
15947
15979
|
if (saved && ["bottom", "left", "right"].includes(saved.dock)) {
|
|
15948
15980
|
this.dock = saved.dock;
|
|
15949
15981
|
for (const key of Object.keys(this.layout))
|
|
@@ -15955,7 +15987,7 @@ var Devtools = class {
|
|
|
15955
15987
|
saveLayout() {
|
|
15956
15988
|
try {
|
|
15957
15989
|
localStorage.setItem(
|
|
15958
|
-
"tileflow-
|
|
15990
|
+
"tileflow-inspector-layout-v1",
|
|
15959
15991
|
JSON.stringify({ dock: this.dock, ...this.layout })
|
|
15960
15992
|
);
|
|
15961
15993
|
} catch {
|
|
@@ -15969,12 +16001,12 @@ var Devtools = class {
|
|
|
15969
16001
|
this.workspace.dataset.dock = this.dock;
|
|
15970
16002
|
for (const [key, value] of Object.entries(this.layout))
|
|
15971
16003
|
this.workspace.style.setProperty(
|
|
15972
|
-
"--
|
|
16004
|
+
"--inspector-" + key.replace(/[A-Z]/gu, (c) => "-" + c.toLowerCase()),
|
|
15973
16005
|
value + "px"
|
|
15974
16006
|
);
|
|
15975
16007
|
for (const b of this.menu.querySelectorAll("[data-dock-option]"))
|
|
15976
16008
|
b.setAttribute("aria-pressed", String(b.dataset.dockOption === this.dock));
|
|
15977
|
-
const resize = this.shell.querySelector(".
|
|
16009
|
+
const resize = this.shell.querySelector(".inspector-resize");
|
|
15978
16010
|
resize?.setAttribute(
|
|
15979
16011
|
"aria-orientation",
|
|
15980
16012
|
this.dock === "left" || this.dock === "right" ? "vertical" : "horizontal"
|
|
@@ -16006,7 +16038,7 @@ var Devtools = class {
|
|
|
16006
16038
|
});
|
|
16007
16039
|
}
|
|
16008
16040
|
pointerGesture(event, move, end) {
|
|
16009
|
-
const shield = element("div", "
|
|
16041
|
+
const shield = element("div", "inspector-resize-shield");
|
|
16010
16042
|
this.workspace.append(shield);
|
|
16011
16043
|
const owner = event.currentTarget;
|
|
16012
16044
|
owner.setPointerCapture(event.pointerId);
|
|
@@ -16025,7 +16057,7 @@ var Devtools = class {
|
|
|
16025
16057
|
if (event.target?.closest("input,select,textarea,[contenteditable]")) return;
|
|
16026
16058
|
if (event.key === "Escape") {
|
|
16027
16059
|
this.menu.hidden = true;
|
|
16028
|
-
this.head.querySelector('[aria-controls="
|
|
16060
|
+
this.head.querySelector('[aria-controls="inspector-menu"]')?.setAttribute("aria-expanded", "false");
|
|
16029
16061
|
}
|
|
16030
16062
|
if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === "z") {
|
|
16031
16063
|
event.preventDefault();
|
|
@@ -16033,13 +16065,13 @@ var Devtools = class {
|
|
|
16033
16065
|
}
|
|
16034
16066
|
};
|
|
16035
16067
|
buildInspect() {
|
|
16036
|
-
const grid = element("div", "
|
|
16068
|
+
const grid = element("div", "inspector-inspect-grid"), treeColumn = element("div", "inspector-tree-column"), details = element("div", "inspector-details");
|
|
16037
16069
|
this.curve.append(
|
|
16038
16070
|
document.getElementById("curve-property"),
|
|
16039
16071
|
document.getElementById("curve-output")
|
|
16040
16072
|
);
|
|
16041
16073
|
treeColumn.append(this.tree);
|
|
16042
|
-
const sub = element("div", "
|
|
16074
|
+
const sub = element("div", "inspector-subtabs");
|
|
16043
16075
|
sub.setAttribute("role", "tablist");
|
|
16044
16076
|
sub.setAttribute("aria-label", "Selected element details");
|
|
16045
16077
|
for (const label of ["Styles", "Properties", "Geometry", "Origin", "Zoom"]) {
|
|
@@ -16052,7 +16084,7 @@ var Devtools = class {
|
|
|
16052
16084
|
b.setAttribute("aria-selected", String(label === this.subtab));
|
|
16053
16085
|
sub.append(b);
|
|
16054
16086
|
}
|
|
16055
|
-
const tools = element("div", "
|
|
16087
|
+
const tools = element("div", "inspector-tools");
|
|
16056
16088
|
const search = element("input");
|
|
16057
16089
|
search.type = "search";
|
|
16058
16090
|
search.placeholder = "Filter";
|
|
@@ -16112,15 +16144,15 @@ var Devtools = class {
|
|
|
16112
16144
|
this.tree.replaceChildren();
|
|
16113
16145
|
const selection = this.host.selection(), { side, layer } = this.target();
|
|
16114
16146
|
if (selection?.features.length && !this.selectedLayer) {
|
|
16115
|
-
const source = element("div", "
|
|
16147
|
+
const source = element("div", "inspector-tree-row");
|
|
16116
16148
|
source.append(
|
|
16117
|
-
element("span", "
|
|
16118
|
-
element("span", "
|
|
16119
|
-
element("span", "
|
|
16149
|
+
element("span", "inspector-dim", "\u25BE"),
|
|
16150
|
+
element("span", "inspector-token", "rendered-features"),
|
|
16151
|
+
element("span", "inspector-dim", `(${selection.features.length})`)
|
|
16120
16152
|
);
|
|
16121
16153
|
this.tree.append(source);
|
|
16122
16154
|
selection.features.forEach((feature, index) => {
|
|
16123
|
-
const row = button3("", () => this.host.selectFeature(index), "
|
|
16155
|
+
const row = button3("", () => this.host.selectFeature(index), "inspector-tree-row");
|
|
16124
16156
|
const preview = () => {
|
|
16125
16157
|
this.clearInspectHover();
|
|
16126
16158
|
this.inspectHoverSide = side;
|
|
@@ -16134,23 +16166,26 @@ var Devtools = class {
|
|
|
16134
16166
|
row.setAttribute("aria-selected", String(index === selection.featureIndex));
|
|
16135
16167
|
row.title = `${feature.layerId} \xB7 ${feature.geometryType} \xB7 ${feature.id ?? "no feature ID"}`;
|
|
16136
16168
|
row.append(
|
|
16137
|
-
element("span", "
|
|
16138
|
-
element("span", "
|
|
16139
|
-
element("span", "
|
|
16140
|
-
element("span", "
|
|
16169
|
+
element("span", "inspector-dim", "\u203A"),
|
|
16170
|
+
element("span", "inspector-token", feature.geometryType),
|
|
16171
|
+
element("span", "inspector-attr", `"${nameOf(feature)}"`),
|
|
16172
|
+
element("span", "inspector-dim inspector-truncate", feature.layerId)
|
|
16141
16173
|
);
|
|
16142
16174
|
this.tree.append(row);
|
|
16143
16175
|
});
|
|
16144
16176
|
} else if (layer) {
|
|
16145
|
-
const row = element("div", "
|
|
16177
|
+
const row = element("div", "inspector-tree-row");
|
|
16146
16178
|
row.setAttribute("aria-selected", "true");
|
|
16147
|
-
row.append(
|
|
16179
|
+
row.append(
|
|
16180
|
+
element("span", "inspector-token", layer.type),
|
|
16181
|
+
element("span", "inspector-attr", layer.id)
|
|
16182
|
+
);
|
|
16148
16183
|
this.tree.append(row);
|
|
16149
16184
|
} else
|
|
16150
16185
|
this.tree.append(
|
|
16151
16186
|
element(
|
|
16152
16187
|
"div",
|
|
16153
|
-
"
|
|
16188
|
+
"inspector-empty",
|
|
16154
16189
|
"Select an element in the map to inspect its styles, data and geometry."
|
|
16155
16190
|
)
|
|
16156
16191
|
);
|
|
@@ -16170,12 +16205,14 @@ var Devtools = class {
|
|
|
16170
16205
|
this.scopeSelect.value = this.scope;
|
|
16171
16206
|
this.scopeSelect.hidden = this.subtab !== "Styles";
|
|
16172
16207
|
if (!map || !layer) {
|
|
16173
|
-
this.detail.append(
|
|
16208
|
+
this.detail.append(
|
|
16209
|
+
element("div", "inspector-empty", "Select a rendered element or a layer.")
|
|
16210
|
+
);
|
|
16174
16211
|
return;
|
|
16175
16212
|
}
|
|
16176
16213
|
if (this.subtab === "Zoom") {
|
|
16177
16214
|
this.detail.append(
|
|
16178
|
-
this.selectedLayer ? element("p", "
|
|
16215
|
+
this.selectedLayer ? element("p", "inspector-note", "Pick a rendered feature to explore its zoom curves.") : this.curve
|
|
16179
16216
|
);
|
|
16180
16217
|
return;
|
|
16181
16218
|
}
|
|
@@ -16211,7 +16248,7 @@ var Devtools = class {
|
|
|
16211
16248
|
this.detail.append(
|
|
16212
16249
|
element(
|
|
16213
16250
|
"p",
|
|
16214
|
-
"
|
|
16251
|
+
"inspector-note",
|
|
16215
16252
|
"Compiler attribution identifies semantic owners; exact source lines are not available."
|
|
16216
16253
|
)
|
|
16217
16254
|
);
|
|
@@ -16252,12 +16289,12 @@ var Devtools = class {
|
|
|
16252
16289
|
...section === "layout" ? ["visibility"] : []
|
|
16253
16290
|
])
|
|
16254
16291
|
].filter((name) => name.toLowerCase().includes(this.filter.toLowerCase()));
|
|
16255
|
-
const rule = element("div", "
|
|
16292
|
+
const rule = element("div", "inspector-rule"), title = element("div", "inspector-rule-title");
|
|
16256
16293
|
title.append(
|
|
16257
16294
|
element("span", "", section + " {"),
|
|
16258
16295
|
element(
|
|
16259
16296
|
"span",
|
|
16260
|
-
"
|
|
16297
|
+
"inspector-rule-origin",
|
|
16261
16298
|
this.scope === "feature" ? `feature #${selected?.id}` : layer.id
|
|
16262
16299
|
)
|
|
16263
16300
|
);
|
|
@@ -16274,9 +16311,9 @@ var Devtools = class {
|
|
|
16274
16311
|
const existing = edits.entries.get(edits.key(target));
|
|
16275
16312
|
const evaluated = evaluatedValue(map, layer.id, section, property, raw);
|
|
16276
16313
|
let current = existing?.value ?? (Array.isArray(authored[property]) ? evaluated : authored[property]) ?? spec.default;
|
|
16277
|
-
const row = element("div", "
|
|
16314
|
+
const row = element("div", "inspector-property");
|
|
16278
16315
|
row.dataset.modified = String(Boolean(existing));
|
|
16279
|
-
row.append(element("span", "
|
|
16316
|
+
row.append(element("span", "inspector-property-name", property + ":"));
|
|
16280
16317
|
const individualAllowed = this.scope !== "feature" || Boolean(spec.expression?.parameters.includes("feature"));
|
|
16281
16318
|
const apply = (value) => this.guarded(() => {
|
|
16282
16319
|
edits.set(target, value);
|
|
@@ -16356,7 +16393,7 @@ var Devtools = class {
|
|
|
16356
16393
|
this.renderDetails();
|
|
16357
16394
|
this.syncHistoryControls();
|
|
16358
16395
|
}),
|
|
16359
|
-
"
|
|
16396
|
+
"inspector-revert"
|
|
16360
16397
|
);
|
|
16361
16398
|
revert.title = "Restore original property";
|
|
16362
16399
|
revert.setAttribute("aria-label", `Reset ${property}`);
|
|
@@ -16364,7 +16401,7 @@ var Devtools = class {
|
|
|
16364
16401
|
row.append(revert);
|
|
16365
16402
|
rule.append(row);
|
|
16366
16403
|
if (Array.isArray(authored[property])) {
|
|
16367
|
-
const expression = element("details", "
|
|
16404
|
+
const expression = element("details", "inspector-expression");
|
|
16368
16405
|
expression.append(
|
|
16369
16406
|
element("summary", "", "Expression"),
|
|
16370
16407
|
element("code", "", format(existing ? edits.original(target) : authored[property]))
|
|
@@ -16378,13 +16415,13 @@ var Devtools = class {
|
|
|
16378
16415
|
this.detail.append(
|
|
16379
16416
|
element(
|
|
16380
16417
|
"p",
|
|
16381
|
-
"
|
|
16418
|
+
"inspector-note",
|
|
16382
16419
|
this.scope === "feature" ? "Changes affect this feature ID within the selected layer." : "Changes affect every feature drawn by this layer."
|
|
16383
16420
|
)
|
|
16384
16421
|
);
|
|
16385
16422
|
}
|
|
16386
16423
|
keyValues(values2, filter = "") {
|
|
16387
|
-
const dl = element("dl", "
|
|
16424
|
+
const dl = element("dl", "inspector-kv");
|
|
16388
16425
|
for (const [key, value] of Object.entries(values2))
|
|
16389
16426
|
if (key.toLowerCase().includes(filter.toLowerCase()))
|
|
16390
16427
|
dl.append(element("dt", "", key), element("dd", "", format(value)));
|
|
@@ -16467,11 +16504,11 @@ var Devtools = class {
|
|
|
16467
16504
|
this.detail.append(
|
|
16468
16505
|
element(
|
|
16469
16506
|
"p",
|
|
16470
|
-
"
|
|
16507
|
+
"inspector-note",
|
|
16471
16508
|
"Tiled geometry may be clipped or simplified. Edit a temporary copy; the original source stays unchanged."
|
|
16472
16509
|
)
|
|
16473
16510
|
);
|
|
16474
|
-
const tools = element("div", "
|
|
16511
|
+
const tools = element("div", "inspector-tools");
|
|
16475
16512
|
const start = button3(
|
|
16476
16513
|
editor ? "Replace with selected geometry" : "Edit temporary copy",
|
|
16477
16514
|
() => this.guarded(() => {
|
|
@@ -16515,11 +16552,11 @@ var Devtools = class {
|
|
|
16515
16552
|
area.append(
|
|
16516
16553
|
element(
|
|
16517
16554
|
"p",
|
|
16518
|
-
"
|
|
16555
|
+
"inspector-note",
|
|
16519
16556
|
editor ? `${geometryVertices(editor.geometry).length} vertices \xB7 ${geometryVertices(editor.geometry).length > 256 ? "edit coordinates (handles limited to 256 vertices)" : "drag handles or edit coordinates"}` : `${geometry.type} \xB7 rendered geometry`
|
|
16520
16557
|
)
|
|
16521
16558
|
);
|
|
16522
|
-
const text = element("textarea", "
|
|
16559
|
+
const text = element("textarea", "inspector-geometry-json");
|
|
16523
16560
|
text.setAttribute("aria-label", "GeoJSON geometry");
|
|
16524
16561
|
text.value = JSON.stringify(geometry, null, 2);
|
|
16525
16562
|
text.readOnly = !editor;
|
|
@@ -16551,7 +16588,7 @@ var Devtools = class {
|
|
|
16551
16588
|
}
|
|
16552
16589
|
buildNetwork() {
|
|
16553
16590
|
const panel = this.panels.get("network");
|
|
16554
|
-
const tools = element("div", "
|
|
16591
|
+
const tools = element("div", "inspector-tools"), search = element("input");
|
|
16555
16592
|
search.type = "search";
|
|
16556
16593
|
search.placeholder = "Filter by source, tile or state";
|
|
16557
16594
|
search.setAttribute("aria-label", "Filter tiles");
|
|
@@ -16571,9 +16608,9 @@ var Devtools = class {
|
|
|
16571
16608
|
bounds.append(toggle, document.createTextNode("Show tile boundaries on map"));
|
|
16572
16609
|
tools.append(search, bounds);
|
|
16573
16610
|
this.networkDetail.hidden = true;
|
|
16574
|
-
const list = element("div", "
|
|
16611
|
+
const list = element("div", "inspector-scroll");
|
|
16575
16612
|
list.append(this.networkGrid, this.networkLog);
|
|
16576
|
-
this.networkLog.classList.remove("
|
|
16613
|
+
this.networkLog.classList.remove("inspector-scroll");
|
|
16577
16614
|
this.networkSidebar.append(tools, list, this.networkSummary);
|
|
16578
16615
|
this.networkBody.append(this.networkSidebar, this.networkDetail);
|
|
16579
16616
|
panel.append(this.networkBody);
|
|
@@ -16610,13 +16647,13 @@ var Devtools = class {
|
|
|
16610
16647
|
this.networkLog.append(
|
|
16611
16648
|
element(
|
|
16612
16649
|
"div",
|
|
16613
|
-
"
|
|
16650
|
+
"inspector-empty",
|
|
16614
16651
|
map ? "Tile inspection is unavailable for this renderer version." : "Connecting to the map\u2026"
|
|
16615
16652
|
)
|
|
16616
16653
|
);
|
|
16617
16654
|
return;
|
|
16618
16655
|
}
|
|
16619
|
-
const table = element("table", "
|
|
16656
|
+
const table = element("table", "inspector-table");
|
|
16620
16657
|
table.innerHTML = "<thead><tr><th>Tile z/x/y</th><th>Size</th></tr></thead>";
|
|
16621
16658
|
const body = element("tbody"), filter = this.networkFilter.trim().toLowerCase();
|
|
16622
16659
|
const filtered = tiles.tiles.filter(
|
|
@@ -16634,7 +16671,7 @@ var Devtools = class {
|
|
|
16634
16671
|
const minX = Math.min(...group.map((t) => t.x)), minY = Math.min(...group.map((t) => t.y)), width = Math.max(...group.map((t) => t.x)) - minX + 1, height = Math.max(...group.map((t) => t.y)) - minY + 1;
|
|
16635
16672
|
if (width * height > 256 || width > 16) continue;
|
|
16636
16673
|
const xs = Array.from({ length: width }, (_, i) => minX + i), ys = Array.from({ length: height }, (_, i) => minY + i);
|
|
16637
|
-
const grid = element("div", "
|
|
16674
|
+
const grid = element("div", "inspector-tile-grid");
|
|
16638
16675
|
grid.style.gridTemplateColumns = `repeat(${xs.length},minmax(0,1fr))`;
|
|
16639
16676
|
const max = Math.max(1, ...group.map((t) => t.bytes ?? 0));
|
|
16640
16677
|
for (const y of ys)
|
|
@@ -16650,7 +16687,7 @@ var Devtools = class {
|
|
|
16650
16687
|
this.showTile(side, tile);
|
|
16651
16688
|
this.renderNetwork();
|
|
16652
16689
|
},
|
|
16653
|
-
"
|
|
16690
|
+
"inspector-tile-cell"
|
|
16654
16691
|
);
|
|
16655
16692
|
cell.style.setProperty(
|
|
16656
16693
|
"--weight",
|
|
@@ -16661,11 +16698,14 @@ var Devtools = class {
|
|
|
16661
16698
|
cell.setAttribute("aria-pressed", String(tile.key === this.networkSelection));
|
|
16662
16699
|
grid.append(cell);
|
|
16663
16700
|
}
|
|
16664
|
-
this.networkGrid.append(
|
|
16701
|
+
this.networkGrid.append(
|
|
16702
|
+
element("div", "inspector-tile-grid-title", `${name} \xB7 raw kB`),
|
|
16703
|
+
grid
|
|
16704
|
+
);
|
|
16665
16705
|
}
|
|
16666
16706
|
for (const tile of filtered) {
|
|
16667
16707
|
const row = element("tr");
|
|
16668
|
-
row.className = "
|
|
16708
|
+
row.className = "inspector-tile-row";
|
|
16669
16709
|
row.setAttribute("aria-selected", String(this.networkSelection === tile.key));
|
|
16670
16710
|
row.title = `${tile.source} \xB7 ${tile.state} \xB7 display z${tile.overscaledZ}`;
|
|
16671
16711
|
const select = () => {
|
|
@@ -16676,10 +16716,10 @@ var Devtools = class {
|
|
|
16676
16716
|
if (!event.target.closest("button")) select();
|
|
16677
16717
|
});
|
|
16678
16718
|
const cell = element("td");
|
|
16679
|
-
cell.append(button3(`${tile.z}/${tile.x}/${tile.y}`, select, "
|
|
16719
|
+
cell.append(button3(`${tile.z}/${tile.x}/${tile.y}`, select, "inspector-cell-button"));
|
|
16680
16720
|
row.append(
|
|
16681
16721
|
cell,
|
|
16682
|
-
element("td", "
|
|
16722
|
+
element("td", "inspector-number", bytes(tile.bytes))
|
|
16683
16723
|
);
|
|
16684
16724
|
body.append(row);
|
|
16685
16725
|
}
|
|
@@ -16689,7 +16729,7 @@ var Devtools = class {
|
|
|
16689
16729
|
this.networkLog.append(
|
|
16690
16730
|
element(
|
|
16691
16731
|
"div",
|
|
16692
|
-
"
|
|
16732
|
+
"inspector-empty",
|
|
16693
16733
|
tiles.tiles.length ? "No tiles match this filter." : "No tiles in view. Pan or zoom the map to load tiles."
|
|
16694
16734
|
)
|
|
16695
16735
|
);
|
|
@@ -16699,7 +16739,7 @@ var Devtools = class {
|
|
|
16699
16739
|
showTile(side, tile) {
|
|
16700
16740
|
this.guarded(() => {
|
|
16701
16741
|
this.clearTileHighlight();
|
|
16702
|
-
const map = side.map, id = "__tileflow-
|
|
16742
|
+
const map = side.map, id = "__tileflow-inspector-tile";
|
|
16703
16743
|
map.addSource(
|
|
16704
16744
|
id,
|
|
16705
16745
|
mapValue(map, {
|
|
@@ -16752,12 +16792,12 @@ var Devtools = class {
|
|
|
16752
16792
|
});
|
|
16753
16793
|
};
|
|
16754
16794
|
for (const key of ["zoom", "pitch", "bearing"]) {
|
|
16755
|
-
const field = element("div", "
|
|
16795
|
+
const field = element("div", "inspector-camera-field"), input = element("input");
|
|
16756
16796
|
const label = key[0].toUpperCase() + key.slice(1);
|
|
16757
16797
|
field.title = label;
|
|
16758
16798
|
field.setAttribute("role", "group");
|
|
16759
16799
|
field.setAttribute("aria-label", label);
|
|
16760
|
-
input.id = `
|
|
16800
|
+
input.id = `inspector-camera-${key}`;
|
|
16761
16801
|
input.type = "number";
|
|
16762
16802
|
input.step = key === "zoom" ? "0.1" : "1";
|
|
16763
16803
|
input.setAttribute("aria-label", label);
|
|
@@ -16782,7 +16822,7 @@ var Devtools = class {
|
|
|
16782
16822
|
const map = this.host.active().map;
|
|
16783
16823
|
if (map) apply(key, key === "pitch" ? Math.max(0, map.getMinPitch()) : 0);
|
|
16784
16824
|
});
|
|
16785
|
-
reset.classList.add("
|
|
16825
|
+
reset.classList.add("inspector-camera-reset");
|
|
16786
16826
|
reset.title = `Reset ${key} to 0\xB0`;
|
|
16787
16827
|
field.append(reset);
|
|
16788
16828
|
}
|
|
@@ -16814,7 +16854,7 @@ var Devtools = class {
|
|
|
16814
16854
|
() => this.report("Clipboard unavailable")
|
|
16815
16855
|
);
|
|
16816
16856
|
},
|
|
16817
|
-
"
|
|
16857
|
+
"inspector-copy-agent"
|
|
16818
16858
|
);
|
|
16819
16859
|
copy.title = "Copy map context for an AI agent";
|
|
16820
16860
|
this.cameraControls.append(copy);
|
|
@@ -16841,7 +16881,7 @@ var Devtools = class {
|
|
|
16841
16881
|
}
|
|
16842
16882
|
buildScene() {
|
|
16843
16883
|
const panel = this.panels.get("scene");
|
|
16844
|
-
const content = element("div", "
|
|
16884
|
+
const content = element("div", "inspector-scene-content");
|
|
16845
16885
|
content.append(document.getElementById("map-controls"));
|
|
16846
16886
|
panel.append(content);
|
|
16847
16887
|
}
|
|
@@ -16908,7 +16948,8 @@ var Devtools = class {
|
|
|
16908
16948
|
} catch {
|
|
16909
16949
|
}
|
|
16910
16950
|
this.clearTileHighlight();
|
|
16911
|
-
delete window.
|
|
16951
|
+
delete window.__tileflowInspectorUI;
|
|
16912
16952
|
}
|
|
16913
16953
|
};
|
|
16914
|
-
if (window.
|
|
16954
|
+
if (window.__tileflowInspectorHost?.schemaVersion === 1)
|
|
16955
|
+
new Inspector(window.__tileflowInspectorHost);
|