@@ -80,13 +86,16 @@
color: #ddd;
backdrop-filter: blur(6px);
}
- .title { font-size: 12px; opacity: 0.7; margin-bottom: 0.5rem; }
+ .group {
+ font-size: 12px; opacity: 0.7; margin: 0.6rem 0 0.35rem;
+ padding-bottom: 0.2rem; border-bottom: 1px solid rgba(255, 255, 255, 0.12);
+ }
+ .group:first-child { margin-top: 0; }
.row { display: flex; align-items: center; gap: 0.5rem; margin: 0.25rem 0; }
- .toggle { gap: 0.4rem; margin-bottom: 0.5rem; cursor: pointer; }
+ .toggle { gap: 0.4rem; cursor: pointer; }
.name { flex: 0 0 8.5rem; opacity: 0.85; }
.val { flex: 0 0 3.5rem; text-align: right; font-variant-numeric: tabular-nums; opacity: 0.7; }
input[type="range"] { flex: 1 1 auto; min-width: 0; }
- .sep { height: 1px; background: rgba(255, 255, 255, 0.12); margin: 0.6rem 0; }
.buttons { gap: 0.4rem; margin-top: 0.6rem; }
button {
flex: 1; padding: 0.35rem; font: inherit; color: #ddd; cursor: pointer;
diff --git a/src/ui/GenomePanel.svelte b/src/ui/GenomePanel.svelte
new file mode 100644
index 0000000..f59d14b
--- /dev/null
+++ b/src/ui/GenomePanel.svelte
@@ -0,0 +1,81 @@
+
+
+
+
Genome — CPPN (locus A)
+
+
+
+ Render Wild7 anchor (ignore genome)
+
+
+
+
generation {genome.generation}
+
seed {genome.seed}
+
hidden nodes {genome.hidden}
+
connections {genome.connections}
+
fit error {genome.fitError.toFixed(3)}
+
+
+
+ Mutate
+ Randomize
+ Reset
+
+
+
Mutate and watch — each step recompiles the rule and restarts the sim.
+
+
+
diff --git a/src/ui/LineagePanel.svelte b/src/ui/LineagePanel.svelte
new file mode 100644
index 0000000..e42364c
--- /dev/null
+++ b/src/ui/LineagePanel.svelte
@@ -0,0 +1,117 @@
+
+
+
+
Lineage — in-memory store
+
+
+ {#if parentSummaries.length === 0}
+ fresh lineage — next save is a root
+ {:else}
+ descends from
+ {#each parentSummaries as p (p.id)}
+ {p.name}
+ {/each}
+ {/if}
+
+
+
+
+ Save
+
+
+
+ {#if breeder.saved.length === 0}
+
nothing saved yet
+ {:else}
+ {#each breeder.saved as s (s.id)}
+
loadOrganism(s.id)}
+ title={s.parents.length ? `parents: ${s.parents.map(short).join(", ")}` : "root"}
+ >
+ {originGlyph[s.origin] ?? "·"}
+ {s.name}
+ d{s.depth}
+
+ {/each}
+ {/if}
+
+
+
+