diff --git a/pilot/arc.tpl.html b/pilot/arc.tpl.html
index 5685b65..2a67690 100644
--- a/pilot/arc.tpl.html
+++ b/pilot/arc.tpl.html
@@ -365,6 +365,7 @@ body:not(.fx) .bench{display:none}
d.className = "slab";
d.style.backgroundImage = "url(" + u.flat.src + ")";
d.style.clipPath = "polygon(" + p.points.map(q => q[0] + "% " + q[1] + "%").join(",") + ")";
+ if (p.z) d.style.zIndex = String(p.z);
u.scene.appendChild(d);
return d;
});
diff --git a/pilot/manifest-gitops.json b/pilot/manifest-gitops.json
index 344c757..6b880cd 100644
--- a/pilot/manifest-gitops.json
+++ b/pilot/manifest-gitops.json
@@ -6,6 +6,7 @@
"name": "repo",
"title": "The repository",
"blurb": "Desired state lives here. The deploy button is a git commit; the audit log is git log.",
+ "z": 3,
"points": [
[
13.7,
@@ -147,6 +148,7 @@
"name": "engine",
"title": "ArgoCD",
"blurb": "Watches repo + path + revision, compares desired against actual, and syncs the difference.",
+ "z": 5,
"points": [
[
48.29,
@@ -288,6 +290,7 @@
"name": "sheets",
"title": "Rendered manifests",
"blurb": "What the repo's charts and manifests render to - build artefacts nobody hand-edits.",
+ "z": 2,
"points": [
[
39.57,
@@ -397,6 +400,7 @@
"name": "cluster",
"title": "The cluster",
"blurb": "Actual state. It pulls its own future - no CI system holds a credential that can touch it.",
+ "z": 1,
"points": [
[
52.8,
@@ -535,13 +539,14 @@
73.22
]
],
- "dx": -20.96,
- "dy": -19.23
+ "dx": -16.01,
+ "dy": -14.69
},
{
"name": "shard",
"title": "Drift",
"blurb": "A hand-edited live object. selfHeal puts it back; what leaves git leaves the cluster.",
+ "z": 4,
"points": [
[
80.04,
@@ -660,13 +665,14 @@
94.73
]
],
- "dx": -27.99,
- "dy": -32.13
+ "dx": -13.61,
+ "dy": -15.62
},
{
"name": "vault",
"title": "The vault",
"blurb": "Azure Key Vault in the worked example. Git carries the reference; the vault carries the value. Never absorbed into the pipeline.",
+ "z": 6,
"points": [
[
56.07,
diff --git a/pilot/manifest-helm.json b/pilot/manifest-helm.json
index 7ca4e2e..c43fcd7 100644
--- a/pilot/manifest-helm.json
+++ b/pilot/manifest-helm.json
@@ -6,6 +6,7 @@
"name": "press",
"title": "The chart",
"blurb": "A function with holes - the template owns every structural decision, and renders whatever fills it.",
+ "z": 0,
"points": [
[
28.09,
@@ -155,6 +156,7 @@
"name": "contexts",
"title": "Values contexts",
"blurb": "One small file per cluster - names, addresses, sizes. The cluster's whole voice, values only.",
+ "z": 0,
"points": [
[
24.11,
@@ -280,6 +282,7 @@
"name": "renders",
"title": "The renders",
"blurb": "Same framework, different numbers - one function, many clusters. Review the render, not just the template.",
+ "z": 0,
"points": [
[
54.4,
@@ -373,6 +376,7 @@
"name": "gate",
"title": "The schema gate",
"blurb": "values.schema.json + required: a context missing a value fails at render time, in the pipeline.",
+ "z": 0,
"points": [
[
52.58,
diff --git a/pilot/manifest-supply.json b/pilot/manifest-supply.json
index fcc55de..14943bf 100644
--- a/pilot/manifest-supply.json
+++ b/pilot/manifest-supply.json
@@ -6,6 +6,7 @@
"name": "image",
"title": "The image",
"blurb": "Course I's layers, shipped as one unit - the thing whose name we must say precisely.",
+ "z": 0,
"points": [
[
8.03,
@@ -107,6 +108,7 @@
"name": "registry",
"title": "Upstream registry",
"blurb": "The managed registry CI pushes to - Azure Container Registry in the worked example.",
+ "z": 0,
"points": [
[
31.21,
@@ -216,6 +218,7 @@
"name": "mirror",
"title": "The mirror",
"blurb": "zot, a pull-through cache: the fleet asks it, it asks upstream once, everything after is local.",
+ "z": 0,
"points": [
[
48.51,
@@ -305,6 +308,7 @@
"name": "core",
"title": "The node",
"blurb": "Pulls local. Boot, reschedule and recovery all lean on the mirror being there.",
+ "z": 0,
"points": [
[
75.83,
@@ -430,6 +434,7 @@
"name": "tag",
"title": "The tag",
"blurb": "A promise - a mutable pointer anyone with push rights can move, and nothing records that it moved.",
+ "z": 0,
"points": [
[
26.2,
@@ -539,6 +544,7 @@
"name": "digest",
"title": "The digest",
"blurb": "A fact - sha256 of the content. Same bytes, same digest, forever. The digest does the pulling.",
+ "z": 0,
"points": [
[
49.82,
diff --git a/tools/slice-arc.py b/tools/slice-arc.py
index 16dbb7a..8ba28e5 100644
--- a/tools/slice-arc.py
+++ b/tools/slice-arc.py
@@ -74,6 +74,7 @@ def emit(name, tag, spec):
poly = poly[::k]
parts.append(dict(
name=part["name"], title=part["title"], blurb=part["blurb"],
+ z=part.get("z", 0),
points=[[round(float(x) / W * 100, 2), round(float(y) / h * 100, 2)] for x, y in poly],
cx=round(float(np.mean(xs)) / W * 100, 2), cy=round(float(np.mean(ys)) / h * 100, 2)))
ax, ay = next((p["cx"], p["cy"]) for p in parts if p["name"] == spec["anchor"])