@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.
@@ -9013,7 +9013,7 @@ async function readBoundedTileflowResponse(response, maximumBytes) {
9013
9013
  return result;
9014
9014
  }
9015
9015
 
9016
- // src/devtools/font-preview.ts
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 = "dt-font-preview";
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() || "#30251F";
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/devtools/sprite-catalog.ts
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/devtools/theme-labels.ts
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/devtools/assets.ts
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", "dt-subtabs");
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 = `dt-assets-${category.toLowerCase()}`;
9336
+ tab.id = `inspector-assets-${category.toLowerCase()}`;
9337
9337
  tab.setAttribute("role", "tab");
9338
- tab.setAttribute("aria-controls", "dt-assets-content");
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 = "dt-assets-content";
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", "dt-asset-aside");
9400
+ assetAside = el("aside", "inspector-asset-aside");
9401
9401
  revealLayer;
9402
9402
  search = el("input");
9403
- toolbar = el("div", "dt-tools");
9404
- content = el("div", "dt-scroll dt-assets-content");
9405
- status = el("div", "dt-footer");
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", "dt-empty", "Waiting for map assets\u2026"));
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", "dt-kv");
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", "dt-font-list");
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", "dt-font-card");
9506
- const preview = el("div", "dt-font-sample");
9507
- preview.append(el("span", "dt-font-loading", "Loading preview\u2026"));
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?.__tileflowDevtoolsObserver?.records.filter((record) => record.kind === "Font") ?? [];
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", "dt-font-ranges");
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
- "dt-filter-chip",
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", "dt-tile-chip-list");
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", "dt-tile-chip", layer.id);
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", "dt-font-loading", "Preview unavailable"));
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", "dt-empty", "No static font stacks in this style."));
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
- "dt-empty",
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", "dt-sprite-grid");
9578
- const layout = el("div", "dt-asset-layout"), main = el("div", "dt-asset-main");
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", "dt-sprite-card");
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", "dt-sprite-preview"),
9617
+ el("div", "inspector-sprite-preview"),
9618
9618
  el("figcaption", "", name),
9619
- el("small", "dt-sprite-size")
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", "dt-asset-variants");
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", "dt-asset-variant");
9641
+ const cell = el("div", "inspector-asset-variant");
9642
9642
  cell.dataset.sprite = name;
9643
- cell.append(el("div", "dt-sprite-preview"), el("code", "", name), el("small"));
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", "dt-asset-variant");
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", "dt-sprite-preview", "\u2026"),
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(".dt-sprite-preview").textContent = "Missing";
9663
+ cell.querySelector(".inspector-sprite-preview").textContent = "Missing";
9664
9664
  return;
9665
9665
  }
9666
- cell.querySelector(".dt-sprite-preview").textContent = "";
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(".dt-sprite-preview").textContent = "Unavailable";
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", "dt-kv");
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", "dt-section-heading", "Used by"));
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", "dt-tile-chip", layer.id);
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
- "dt-note",
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
- "dt-empty",
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", "dt-asset-layout"), main = el("div", "dt-asset-main"), grid = el("div", "dt-model-grid");
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", "dt-kv");
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", "dt-model-card");
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(".dt-sprite-preview");
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/devtools/map-value.ts
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/devtools/style-edits.ts
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/devtools/tiles.ts
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-devtools-")) continue;
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/devtools/beacon/runner.ts
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 = { tileflowDevtools: true, ...userInput ? { tileflowUserCamera: true } : {} };
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/devtools/overdraw.ts
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/devtools/debug.ts
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", "dt-scroll dt-card-page");
10968
- const overlays = el2("section", "dt-card");
10969
- overlays.append(el2("div", "dt-section-heading", "Map overlays"));
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", "dt-debug-overlay"), preview2 = el2("span", "dt-debug-preview"), copy = el2("span"), toggle = el2("input");
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", "dt-overdraw-legend");
10989
+ const legend = el2("div", "inspector-overdraw-legend");
10990
10990
  for (const passes of [0, 1, 2, 4, 8]) {
10991
- const item = el2("span", "dt-overdraw-key"), swatch = el2("i", "dt-overdraw-swatch");
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", "dt-card");
11015
- scale.append(el2("div", "dt-section-heading", "Scale factor"));
11016
- const controls = el2("div", "dt-debug-scale");
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
- "dt-note",
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", "dt-debug-scale");
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", "dt-overdraw-help");
11071
- collisionHelp = el2("div", "dt-overdraw-help");
11072
- ratios = el2("div", "dt-segments");
11073
- specimen = el2("div", "dt-debug-specimen");
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/devtools/observer.ts
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/devtools/layers/model.ts
11140
+ // src/inspector/layers/model.ts
11141
11141
  var sampleLimit = 80;
11142
- var internalLayer = (id) => id.startsWith("__tileflow-devtools-");
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/devtools/diagnostics/model.ts
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/devtools/diagnostics/checks.ts
11530
- var internalLayer2 = (id) => id.startsWith("__tileflow-devtools-");
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/devtools/beacon/probes.ts
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-devtools")) continue;
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/devtools/diagnostics/performance.ts
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-devtools-"))) {
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/devtools/diagnostics/styles.ts
12354
+ // src/inspector/diagnostics/styles.ts
12355
12355
  var diagnosticsStyles = `
12356
- .dt-diagnostics{background:var(--paper);color:var(--ink);font:12px/1.45 var(--ui)}
12357
- .dt-diagnostics-toolbar{justify-content:space-between;gap:8px;padding:7px 10px}
12358
- .dt-diagnostics-actions,.dt-diagnostics-filters{display:flex;align-items:center;gap:5px;flex-wrap:wrap}
12359
- .dt-diagnostics-toolbar strong{font-size:12px;font-weight:600}
12360
- .dt-diagnostics-toolbar .dt-diagnostics-check{border:1px solid var(--border);background:var(--surface)}
12361
- .dt-diagnostics-filters{padding:6px 10px;border-bottom:1px solid var(--border);flex:none}
12362
- .dt-diagnostics-filters button{border:1px solid transparent;background:transparent;padding:3px 8px;border-radius:4px;font-size:11px}
12363
- .dt-diagnostics-filters button[aria-pressed=true]{color:var(--accent);background:var(--accent-soft);border-color:color-mix(in srgb,var(--accent) 25%,transparent)}
12364
- .dt-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
- .dt-diagnostics-summary .dt-diagnostics-scope{margin-left:auto;color:var(--faint)}
12366
- .dt-diagnostics-summary button{margin-left:auto;background:transparent;border:0;font-size:11px;color:var(--muted);padding:0}
12367
- .dt-diagnostics-list{flex:1;min-height:0;overflow:auto}
12368
- .dt-diagnostic{border-bottom:1px solid var(--border)}
12369
- .dt-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
- .dt-diagnostic>summary::-webkit-details-marker{display:none}
12371
- .dt-diagnostic>summary:hover{background:var(--hover)}
12372
- .dt-diagnostic>summary:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}
12373
- .dt-diagnostic-indicator{font-size:13px;line-height:18px;color:var(--warn)}
12374
- .dt-diagnostic[data-kind=problem] .dt-diagnostic-indicator{color:var(--danger)}
12375
- .dt-diagnostic-title{font-weight:500;font-size:12px;display:block;line-height:18px}
12376
- .dt-diagnostic-subtitle{display:block;color:var(--muted);font-size:11px;margin-top:2px;overflow-wrap:anywhere}
12377
- .dt-diagnostic-category{font-size:10px;line-height:18px;color:var(--muted);white-space:nowrap;text-align:right}
12378
- .dt-diagnostic-context{display:block;color:var(--faint);font-size:10px;margin-top:3px}
12379
- .dt-diagnostic[data-stale=true] .dt-diagnostic-context{color:var(--warn)}
12380
- .dt-diagnostic-detail{padding:0 12px 12px 37px;max-width:1040px;display:flex;flex-direction:column;gap:10px}
12381
- .dt-diagnostic-detail p{margin:0;color:var(--muted);font-size:12px;max-width:820px}
12382
- .dt-diagnostic-detail .dt-diagnostic-state{border-left:2px solid var(--warn);padding:4px 9px;background:var(--warn-soft);font-size:11px}
12383
- .dt-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
- .dt-diagnostic-evidence dt{color:var(--muted)}
12385
- .dt-diagnostic-evidence dd{margin:0;overflow-wrap:anywhere;font-family:var(--mono)}
12386
- .dt-diagnostic-links,.dt-diagnostic-layers{display:flex;flex-wrap:wrap;gap:5px;align-items:center}
12387
- .dt-diagnostic-links button{font-size:11px;min-height:25px;padding:3px 8px}
12388
- .dt-diagnostic-links .dt-diagnostic-dismiss{margin-left:auto;background:transparent;border-color:transparent;color:var(--muted)}
12389
- .dt-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
- .dt-diagnostic-layers span{font-size:11px;color:var(--muted)}
12391
- .dt-diagnostic-samples{display:flex;flex-direction:column;gap:5px}
12392
- .dt-diagnostic-samples button{text-align:left;background:transparent;border:1px solid var(--border);font-size:11px;padding:5px 8px;overflow-wrap:anywhere}
12393
- .dt-diagnostic-samples button::before{content:'\u2197';color:var(--muted);padding-right:6px}
12394
- .dt-diagnostic-limitations{margin:0;padding-left:16px;color:var(--muted);font-size:11px}
12395
- .dt-diagnostic-limitations li+li{margin-top:4px}
12396
- .dt-diagnostics-empty{padding:28px 20px;max-width:620px;display:flex;flex-direction:column;gap:7px;color:var(--muted)}
12397
- .dt-diagnostics-empty strong{font-size:13px;font-weight:500;color:var(--ink)}
12398
- .dt-diagnostics-empty p{margin:0;font-size:12px}
12399
- .dt-diagnostics-status{min-height:25px;align-items:center;font-size:11px}
12400
- .dt-diagnostics-status:empty{display:none}
12401
- @container(max-width:520px){.dt-diagnostic>summary{grid-template-columns:15px minmax(0,1fr);padding:9px}.dt-diagnostic-category{grid-column:2;text-align:left;font-size:10px}.dt-diagnostic-detail{padding-left:32px}.dt-diagnostic-evidence{grid-template-columns:minmax(0,1fr)}.dt-diagnostic-evidence dd+dt{margin-top:5px}.dt-diagnostics-filters{gap:2px}.dt-diagnostics-filters button{padding:3px 5px}}
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/devtools/diagnostics/panel.ts
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("dt-diagnostics");
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", "dt-diagnostics-actions");
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", "dt-tools dt-diagnostics-toolbar");
12483
- filters = el3("div", "dt-diagnostics-filters");
12484
- summary = el3("div", "dt-diagnostics-summary");
12485
- list = el3("div", "dt-scroll dt-diagnostics-list");
12486
- status = el3("div", "dt-footer dt-diagnostics-status");
12487
- check = button("Check view", () => void this.checkView(), "dt-diagnostics-check");
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-devtools-")) return;
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("dt-diagnostics");
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-devtools")),
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-devtools")).map(([id, source]) => [
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", "dt-diagnostics-scope", scope));
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", "dt-diagnostics-empty");
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", "dt-diagnostic");
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("span", "dt-diagnostic-indicator", finding.kind === "problem" ? "\u25CF" : "\u25D0");
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", "dt-diagnostic-title", finding.title),
12992
- el3("span", "dt-diagnostic-subtitle", finding.summary)
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("span", "dt-diagnostic-context", `${context}${current ? "" : " \xB7 earlier observation"}`)
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", "dt-diagnostic-category", categories[finding.category])
13009
+ el3("span", "inspector-diagnostic-category", categories[finding.category])
13002
13010
  );
13003
- const body = el3("div", "dt-diagnostic-detail");
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
- "dt-diagnostic-state",
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", "dt-diagnostic-evidence");
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", "dt-diagnostic-layers");
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", "dt-diagnostic-samples");
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", "dt-diagnostic-limitations");
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", "dt-diagnostic-links");
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
- "dt-diagnostic-dismiss"
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/devtools/geometry.ts
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 = "dt-geometry-handles";
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-devtools-geometry-${Math.random().toString(36).slice(2)}`;
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/devtools/live-color.ts
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/devtools/layers/explain.ts
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/devtools/layers/highlight.ts
13555
- var sourceId = "__tileflow-devtools-layers-preview";
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/devtools/layers/preview.ts
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/devtools/layers/styles.ts
13699
+ // src/inspector/layers/styles.ts
13692
13700
  var layersStyles = `
13693
- .dt-layer-tools { gap:8px; padding:5px 8px; background:var(--surface); }
13694
- .dt-layer-modes { display:flex; flex:none; border:1px solid var(--border); border-radius:3px; overflow:hidden; }
13695
- .dt-layer-modes button { border:0; border-radius:0; padding:3px 9px; white-space:nowrap; }
13696
- .dt-layer-modes button + button { border-left:1px solid var(--border); }
13697
- .dt-layer-visible { flex:none; cursor:pointer; }
13698
- .dt-layer-visible input { width:13px; height:13px; cursor:pointer; }
13699
- .dt-layer-total { color:var(--muted); font:11px ui-monospace,monospace; white-space:nowrap; }
13700
- .devtools-ready .dt-layer-copy { border:1px solid var(--accent); color:var(--accent); background:var(--paper); white-space:nowrap; }
13701
- .dt-layer-split { display:grid; grid-template-columns:minmax(270px,34%) minmax(0,1fr); flex:1; min-height:0; }
13702
- .dt-layer-list { min-height:0; overflow:auto; border-right:1px solid var(--border); padding-bottom:10px; }
13703
- .dt-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; }
13704
- .dt-layer-group-title strong { font-size:11px; text-transform:capitalize; font-weight:600; }
13705
- .dt-layer-count { color:var(--muted); margin-left:auto; font-size:10px; }
13706
- .devtools-ready .dt-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; }
13707
- .dt-layer-row[aria-pressed=true] { border-left-color:var(--accent); }
13708
- .dt-layer-glyph { width:17px; flex:none; font:16px ui-monospace,monospace; text-align:center; color:var(--muted); }
13709
- .dt-layer-color { text-shadow:0 0 1px #777; }
13710
- .dt-layer-label { display:flex; flex-direction:column; min-width:0; flex:1; }
13711
- .dt-layer-label > * { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
13712
- .dt-layer-state { color:var(--muted); font-size:10px; white-space:nowrap; }
13713
- .dt-layer-state[data-state=Hidden],.dt-layer-state[data-state="Outside zoom"] { color:light-dark(#93620b,#e9bd67); }
13714
- .dt-layer-state[data-state=Runtime] { color:light-dark(#7c3dc6,#c9a4f4); }
13715
- .dt-layer-detail { display:flex; flex-direction:column; min-width:0; min-height:0; }
13716
- .dt-layer-heading { padding:8px 12px 6px; border-bottom:1px solid var(--border); display:flex; align-items:center; flex-wrap:wrap; gap:8px; }
13717
- .dt-layer-title { display:flex; flex-direction:column; gap:2px; min-width:0; flex:1 0 200px; }
13718
- .dt-layer-title strong { font-size:13px; font-weight:500; overflow-wrap:anywhere; }
13719
- .dt-layer-title code { font:10px ui-monospace,monospace; overflow-wrap:anywhere; color:var(--muted); }
13720
- .dt-layer-content { padding:0; }
13721
- .dt-layer-evidence { padding:5px 12px; }
13722
- .dt-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; }
13723
- .dt-layer-evidence-row strong { font-weight:500; }
13724
- .dt-layer-evidence-row > :last-child { overflow-wrap:anywhere; }
13725
- .dt-layer-indicator { font:13px ui-monospace,monospace; color:var(--muted); }
13726
- .dt-layer-evidence-row[data-state=pass] .dt-layer-indicator { color:light-dark(#188038,#81c995); }
13727
- .dt-layer-evidence-row[data-state=warn] .dt-layer-indicator { color:light-dark(#a15c00,#fdd663); }
13728
- .dt-layer-muted,.dt-layer-dependency { color:var(--muted); font-size:11px; }
13729
- .dt-layer-neighbors { margin:7px 12px 12px; }
13730
- .dt-layer-neighbors > strong { font-weight:500; font-size:11px; }
13731
- .dt-layer-neighbors > div { display:flex; align-items:baseline; gap:8px; padding-top:3px; }
13732
- .dt-layer-neighbors > div > span:first-child { width:55px; flex:none; }
13733
- .devtools-ready .dt-layer-link { border:0; padding:2px 0; background:transparent; color:var(--accent); font-size:11px; text-align:left; overflow-wrap:anywhere; }
13734
- .dt-layer-rules { width:100%; border-collapse:collapse; table-layout:fixed; font-size:11px; }
13735
- .dt-layer-rules th { text-align:left; background:var(--surface); color:var(--muted); font-weight:500; padding:5px 12px; border-bottom:1px solid var(--border); }
13736
- .dt-layer-rules th:first-child { width:57%; }
13737
- .dt-layer-rules td { padding:5px 12px; border-bottom:1px solid var(--border); vertical-align:top; overflow-wrap:anywhere; }
13738
- .dt-layer-rules code { font:11px/1.6 ui-monospace,monospace; }
13739
- .dt-layer-rule-name { color:light-dark(#881391,#c58af9); }
13740
- .dt-layer-dependency { display:block; font-size:10px; }
13741
- .dt-layer-rule-editor { display:flex; align-items:center; gap:5px; min-width:0; }
13742
- .dt-layer-rule-editor input:not([type=color]):not([type=checkbox]),.dt-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; }
13743
- .dt-layer-rule-editor input[type=checkbox] { flex:none; width:13px; height:13px; margin:0 2px 0 0; accent-color:var(--accent); cursor:pointer; }
13744
- .dt-layer-rule-editor input[type=checkbox]:disabled { cursor:default; }
13745
- .dt-layer-rule-editor input:hover,.dt-layer-rule-editor select:hover { border-color:var(--border); }
13746
- .dt-layer-rule-editor input:focus,.dt-layer-rule-editor select:focus { border-color:var(--accent); outline:1px solid var(--accent); background:var(--paper); }
13747
- .dt-layer-rule-editor input[type=color] { flex:none; width:16px; height:20px; padding:0; border:0; background:transparent; cursor:pointer; }
13748
- .dt-layer-rule-editor input[type=color]::-webkit-color-swatch-wrapper { padding:3px 0; }
13749
- .dt-layer-rule-editor input[type=color]::-webkit-color-swatch { border:1px solid #8888; border-radius:2px; }
13750
- .dt-layer-rule-editor .dt-layer-rule-reset { flex:none; padding:1px 4px; border:0; color:var(--accent); background:transparent; }
13751
- .dt-layer-rule-reset:disabled { visibility:hidden; }
13752
- .dt-layer-rules tr[data-modified=true] > td:first-child { box-shadow:inset 2px 0 var(--accent); }
13753
- .dt-layer-rules tr[data-disabled=true] .dt-layer-rule-name,.dt-layer-rules tr[data-disabled=true] input:not([type=checkbox]):not([type=color]),.dt-layer-rules tr[data-disabled=true] select { color:var(--muted); text-decoration:line-through; }
13754
- .dt-layer-rules tr[data-disabled=true] input[type=color] { opacity:.45; cursor:default; }
13755
- .dt-layer-rule-error { display:block; padding-top:4px; color:light-dark(#b3261e,#f28b82); font-size:10px; }
13756
- .dt-layer-rule-error[hidden] { display:none; }
13757
- .dt-layer-rules tr[data-selected=true] { background:var(--dt-selected); }
13758
- .dt-layer-content [data-diagnostic-target=true] { background:var(--dt-selected); outline:1px solid var(--accent); outline-offset:-1px; }
13759
- .dt-layer-swatch { display:inline-block; width:11px; height:11px; border:1px solid #8888; border-radius:2px; margin-right:5px; vertical-align:middle; }
13760
- .dt-layer-json { margin:6px 0; font:11px/1.6 ui-monospace,SFMono-Regular,monospace; white-space:pre-wrap; overflow-wrap:anywhere; color:var(--dt-string); max-height:300px; overflow:auto; }
13761
- .dt-layer-curve { display:flex; flex-wrap:wrap; gap:5px 10px; margin-top:6px; padding:6px; background:var(--surface); }
13762
- .dt-layer-curve span { flex-basis:100%; color:var(--muted); }
13763
- .dt-layer-section,.dt-layer-origin { padding:9px 12px; border-bottom:1px solid var(--border); }
13764
- .dt-layer-section h4 { margin:0 0 7px; font-size:11px; font-weight:500; }
13765
- .dt-layer-origin > code { margin-left:10px; color:var(--accent); }
13766
- .dt-layer-origin dl { display:grid; grid-template-columns:110px minmax(0,1fr); gap:6px 10px; font-size:11px; }
13767
- .dt-layer-origin dt { color:var(--muted); }.dt-layer-origin dd { margin:0; overflow-wrap:anywhere; }
13768
- .dt-layer-data-summary { margin:8px 12px; font-size:11px; }
13769
- .dt-layer-samples { max-height:180px; overflow:auto; border-bottom:1px solid var(--border); }
13770
- .dt-layer-notice { position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip-path:inset(50%); white-space:nowrap; }
13771
- .dt-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; }
13772
- .dt-layer-dialog[open] { display:flex; flex-direction:column; gap:12px; }.dt-layer-dialog::backdrop { background:#0005; }
13773
- .dt-layer-dialog-head { display:flex; align-items:center; justify-content:space-between; }.dt-layer-dialog-head strong { font-size:14px; font-weight:500; }
13774
- .dt-layer-dialog label { display:flex; flex-direction:column; gap:5px; }.dt-layer-dialog input { padding:7px; border:1px solid var(--border); background:var(--paper); color:var(--ink); }
13775
- .dt-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; }
13776
- .dt-layer-dialog .dt-layer-copy { margin-left:auto; }
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
- .dt-layer-heading { padding:6px 9px; }.dt-layer-title { flex-basis:100%; }
13779
- .dt-layer-tools input[type=search] { order:1; flex:1 0 100%; }.dt-layer-tools .dt-layer-copy { margin-left:auto; }
13780
- .dt-layer-evidence-row { grid-template-columns:12px 92px minmax(0,1fr); gap:5px; }
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/devtools/layers/visibility.ts
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/devtools/layers/panel.ts
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", "dt-tools dt-layer-tools");
13847
- const modes = el4("div", "dt-layer-modes");
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", "dt-layer-visible");
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", "dt-layer-tools-row");
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", "dt-layer-split");
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", "dt-subtabs dt-layer-tabs");
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 = `dt-layer-tab-${name.toLowerCase()}`;
13902
+ button4.id = `inspector-layer-tab-${name.toLowerCase()}`;
13895
13903
  button4.setAttribute("role", "tab");
13896
- button4.setAttribute("aria-controls", "dt-layer-details");
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 = "dt-layer-details";
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", "dt-layer-sidebar");
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", "dt-layer-list");
13926
- detail = el4("div", "dt-layer-detail");
13927
- content = el4("div", "dt-scroll dt-layer-content");
13928
- heading = el4("div", "dt-layer-heading");
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", "dt-layer-total");
13932
- notice = el4("span", "dt-layer-notice");
13933
- copy = action("Copy context", () => this.openContext(), "dt-layer-copy");
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-devtools-")) return;
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", "dt-layer-prefix", label.slice(0, index + 1)),
14247
- el4("span", "dt-layer-name", label.slice(index + 1))
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", "dt-zrange"), bar = el4("i"), marker = el4("em");
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", "dt-eye");
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", "dt-layer-section"), head = el4("div", "dt-rule-toggle");
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", "dt-filter-chips");
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", "dt-filter-chip", describe(condition)));
14337
- if (!conditions.length) chips.append(el4("span", "dt-layer-muted", "No filter declared"));
14338
- const code = el4("pre", "dt-layer-json", json(raw));
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
- "dt-note",
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", "dt-note", "Source-feature match count unavailable."));
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", "dt-layer-group");
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
- "dt-layer-group-title"
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", "dt-layer-count", String(layers.length))
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), "dt-layer-row");
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", "dt-layer-glyph", kinds[layer.type] ?? "\u25C7");
14436
- const label = el4("span", "dt-layer-label");
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("span", "dt-layer-state", state === "Enabled" ? layer.type : state);
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
- "dt-empty",
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(".dt-layer-rule-editor"))
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("div", "dt-empty", "Select a layer to inspect its rules, data and runtime evidence.")
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", "dt-layer-title");
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", "dt-layer-status");
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
- "dt-note",
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", "dt-layer-evidence");
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", "dt-layer-evidence-row");
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
- "dt-layer-indicator",
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", "dt-layer-neighbors");
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", "dt-layer-muted", label));
14616
+ row.append(el4("span", "inspector-layer-muted", label));
14601
14617
  row.append(
14602
- entry ? action(entry.id, () => this.select(entry.id), "dt-layer-link") : el4("span", "", "End of stack")
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
- "dt-note",
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", "dt-tools");
14620
- const defaults = el4("label", "dt-rule-defaults"), toggle = el4("input");
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
- "dt-layer-muted",
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", "dt-layer-rules");
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", "dt-layer-rule-name", key),
14685
+ el4("code", "inspector-layer-rule-name", key),
14670
14686
  el4(
14671
14687
  "span",
14672
- "dt-layer-dependency",
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", "dt-rule-font-preview"), controller = new AbortController();
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", "dt-rule-spark");
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("Sprite \u2197", () => this.options.assets("Sprites", evaluated), "dt-layer-link")
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("Font preview \u2197", () => this.options.assets("Fonts", ""), "dt-layer-link")
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", "dt-layer-muted", "No explicit rules. Renderer defaults apply.");
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", "dt-card dt-card-table");
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", "dt-layer-rule-editor");
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", "dt-rule-toggle");
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", "dt-layer-rule-error");
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
- "dt-layer-rule-reset"
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", "dt-rule-choices");
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", "dt-tools");
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", "dt-note", this.samples.reason));
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
- "dt-layer-data-summary",
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", "dt-layer-rules"), body = el4("tbody");
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
- "dt-layer-link"
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), "dt-layer-link")
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", "dt-layer-samples");
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
- "dt-note",
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", "dt-layer-origin");
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", "dt-layer-json", json(contribution.operations)));
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
- "dt-note",
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", "dt-layer-section");
15088
- section.append(el4("h4", "", title), el4("pre", "dt-layer-json", json(value)));
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", "dt-layer-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", "dt-layer-dialog-head");
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", "dt-tools");
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("span", "dt-layer-muted", "Snapshot frozen while this preview is open.");
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
- "dt-layer-copy"
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/devtools/tile-details.ts
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", "dt-kv");
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", "dt-scroll dt-tile-content");
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", "dt-tools dt-tile-heading");
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", "dt-subtabs");
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 = `dt-tile-tab-${name.toLowerCase().replaceAll(" ", "-")}`;
15291
- tab.setAttribute("aria-controls", "dt-tile-detail-content");
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", "dt-scroll dt-tile-content");
15331
+ this.body = el5("div", "inspector-scroll inspector-tile-content");
15304
15332
  this.body.setAttribute("role", "tabpanel");
15305
- this.body.id = "dt-tile-detail-content";
15333
+ this.body.id = "inspector-tile-detail-content";
15306
15334
  this.body.setAttribute(
15307
15335
  "aria-labelledby",
15308
- `dt-tile-tab-${this.tab.toLowerCase().replaceAll(" ", "-")}`
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
- "dt-tile-status",
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
- "dt-note",
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", "dt-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 = "dt-cell-button";
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 = "dt-tile-chip";
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", "dt-number", layer.length.toLocaleString()), used);
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", "dt-card dt-card-table");
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", "dt-note", contents.message));
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
- "dt-note",
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", "dt-note", "This vector tile contains no source layers."));
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", "dt-tools"), select = el5("select");
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 = "dt-tile-chip-list";
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 = "dt-tile-chip";
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", "dt-tools dt-tile-paging");
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", "dt-note", `Whole tile \xB7 MVT v${layer.version} \xB7 extent ${layer.extent}`),
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", "dt-tile-feature");
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(el5("p", "dt-note", "This feature geometry could not be decoded."));
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", "dt-note", `Feature #${index + 1} could not be decoded.`));
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/devtools/browser.ts
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, "dt-icon");
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 Devtools = class {
15599
+ var Inspector = class {
15570
15600
  constructor(host) {
15571
15601
  this.host = host;
15572
- document.body.classList.add("devtools-ready");
15573
- this.shell.setAttribute("aria-label", "Map developer tools");
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.__tileflowDevtoolsUI = {
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", "dt-shell");
15685
- body = element("div", "dt-body");
15686
- head = element("div", "dt-head");
15687
- tabs = element("div", "dt-tabs");
15688
- cameraControls = element("fieldset", "dt-camera");
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", "dt-menu");
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", "dt-tree");
15709
- detail = element("div", "dt-scroll");
15738
+ tree = element("div", "inspector-tree");
15739
+ detail = element("div", "inspector-scroll");
15710
15740
  scopeSelect = element("select");
15711
- curve = element("div", "dt-zoom");
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", "dt-status-message");
15747
+ message = element("div", "inspector-status-message");
15718
15748
  networkFilter = "";
15719
- networkSidebar = element("div", "dt-tiles-sidebar");
15720
- networkGrid = element("div", "dt-tiles-grid-wrap");
15721
- networkLog = element("div", "dt-scroll");
15722
- networkDetail = element("div", "dt-network-detail");
15723
- networkBody = element("div", "dt-network-body");
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", "dt-footer");
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 = "dt-icon";
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", "dt-divider");
15794
+ const divider = element("span", "inspector-divider");
15765
15795
  this.tabs.setAttribute("role", "tablist");
15766
- this.tabs.setAttribute("aria-label", "Developer tools");
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", "dt-panel");
15777
- panel.id = `dt-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", `dt-tab-${id}`);
15810
+ panel.setAttribute("aria-labelledby", `inspector-tab-${id}`);
15781
15811
  const tab = button3(label, () => {
15782
15812
  this.show(id);
15783
15813
  });
15784
- tab.id = `dt-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 DevTools", () => {
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", "dt-menu");
15807
- this.menu.id = "dt-menu";
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", "dt-menu-label", "Dock side"));
15810
- const choices = element("div", "dt-dock-options");
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", "dt-segments");
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-devtools-theme", this.theme);
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", "dt-menu-label", "Theme"),
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", "dt-head-main");
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 DevTools", () => {
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", "dt-resize");
15919
+ const resize = element("div", "inspector-resize");
15890
15920
  resize.tabIndex = 0;
15891
15921
  resize.setAttribute("role", "separator");
15892
- resize.setAttribute("aria-label", "Resize developer tools");
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("DevTools", () => this.show(this.activePanel));
15908
- reopen.id = "dt-reopen";
15909
- reopen.setAttribute("aria-label", "Open developer tools");
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(localStorage.getItem("tileflow-devtools-layout-v1") || "null");
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-devtools-layout-v1",
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
- "--dt-" + key.replace(/[A-Z]/gu, (c) => "-" + c.toLowerCase()),
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(".dt-resize");
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", "dt-resize-shield");
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="dt-menu"]')?.setAttribute("aria-expanded", "false");
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", "dt-inspect-grid"), treeColumn = element("div", "dt-tree-column"), details = element("div", "dt-details");
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", "dt-subtabs");
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", "dt-tools");
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", "dt-tree-row");
16147
+ const source = element("div", "inspector-tree-row");
16116
16148
  source.append(
16117
- element("span", "dt-dim", "\u25BE"),
16118
- element("span", "dt-token", "rendered-features"),
16119
- element("span", "dt-dim", `(${selection.features.length})`)
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), "dt-tree-row");
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", "dt-dim", "\u203A"),
16138
- element("span", "dt-token", feature.geometryType),
16139
- element("span", "dt-attr", `"${nameOf(feature)}"`),
16140
- element("span", "dt-dim dt-truncate", feature.layerId)
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", "dt-tree-row");
16177
+ const row = element("div", "inspector-tree-row");
16146
16178
  row.setAttribute("aria-selected", "true");
16147
- row.append(element("span", "dt-token", layer.type), element("span", "dt-attr", layer.id));
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
- "dt-empty",
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(element("div", "dt-empty", "Select a rendered element or a layer."));
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", "dt-note", "Pick a rendered feature to explore its zoom curves.") : this.curve
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
- "dt-note",
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", "dt-rule"), title = element("div", "dt-rule-title");
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
- "dt-rule-origin",
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", "dt-property");
16314
+ const row = element("div", "inspector-property");
16278
16315
  row.dataset.modified = String(Boolean(existing));
16279
- row.append(element("span", "dt-property-name", property + ":"));
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
- "dt-revert"
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", "dt-expression");
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
- "dt-note",
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", "dt-kv");
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
- "dt-note",
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", "dt-tools");
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
- "dt-note",
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", "dt-geometry-json");
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", "dt-tools"), search = element("input");
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", "dt-scroll");
16611
+ const list = element("div", "inspector-scroll");
16575
16612
  list.append(this.networkGrid, this.networkLog);
16576
- this.networkLog.classList.remove("dt-scroll");
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
- "dt-empty",
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", "dt-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", "dt-tile-grid");
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
- "dt-tile-cell"
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(element("div", "dt-tile-grid-title", `${name} \xB7 raw kB`), grid);
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 = "dt-tile-row";
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, "dt-cell-button"));
16719
+ cell.append(button3(`${tile.z}/${tile.x}/${tile.y}`, select, "inspector-cell-button"));
16680
16720
  row.append(
16681
16721
  cell,
16682
- element("td", "dt-number", bytes(tile.bytes))
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
- "dt-empty",
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-devtools-tile";
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", "dt-camera-field"), input = element("input");
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 = `dt-camera-${key}`;
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("dt-camera-reset");
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
- "dt-copy-agent"
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", "dt-scene-content");
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.__tileflowDevtoolsUI;
16951
+ delete window.__tileflowInspectorUI;
16912
16952
  }
16913
16953
  };
16914
- if (window.__tileflowDevtoolsHost?.schemaVersion === 1) new Devtools(window.__tileflowDevtoolsHost);
16954
+ if (window.__tileflowInspectorHost?.schemaVersion === 1)
16955
+ new Inspector(window.__tileflowInspectorHost);