From 29207e41dac9a5c2f2ebf8cde8613ee790986297 Mon Sep 17 00:00:00 2001 From: Gulum Date: Sat, 6 Jun 2026 19:47:27 +0200 Subject: [PATCH 1/2] AR-5: Committed Katalog-Generator + Drift-Guard + Backend-Artefakt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - gen-seed.mts: deterministischer Generator aus catalog.ts (Single Source); emittiert BEIDE Artefakte: generated.json (Klammer-Notation, Display) + backend.json (frozen ef/cchm/ch, für Pam EF-Migrationen). Kein magisches Artefakt mehr. - package.json: npm run gen:catalog (npx tsx gen-seed.mts) - catalog-drift.test.ts: Drift-Guard — liest generated.json von Disk via import.meta.url + readFileSync, vergleicht mit live CATALOG; Fail-Meldung zeigt 'npm run gen:catalog'. 5 Test-Files, 93 Tests grün. - colorVarietySeed.backend.json: 66 Zeilen frozen symbols (ef/cchm/ch), kein sofortiger Backend-Eingriff (AR-5 Guardrail; Pam konsumiert bei nächster Reseed-Migration). - README.md: Katalog-Generator-Doku (wann laufen, was erzeugt wird). Gate: build ✓ eslint ✓ vitest 93/93 ✓ --- gerbil-manager-web/README.md | 21 +- gerbil-manager-web/gen-seed.mts | 49 +++ gerbil-manager-web/package.json | 3 +- .../genetics/__tests__/catalog-drift.test.ts | 24 ++ .../genetics/colorVarietySeed.backend.json | 406 ++++++++++++++++++ 5 files changed, 501 insertions(+), 2 deletions(-) create mode 100644 gerbil-manager-web/gen-seed.mts create mode 100644 gerbil-manager-web/src/genetics/__tests__/catalog-drift.test.ts create mode 100644 gerbil-manager-web/src/genetics/colorVarietySeed.backend.json diff --git a/gerbil-manager-web/README.md b/gerbil-manager-web/README.md index b3e1ab8..b1d4505 100644 --- a/gerbil-manager-web/README.md +++ b/gerbil-manager-web/README.md @@ -40,6 +40,25 @@ npm run build npm run preview ``` +## Farbschlag-Katalog (AR-5) + +Der Katalog lebt in `src/genetics/catalog.ts` (Single Source of Truth). +Nach jeder Änderung dort den Generator laufen lassen: + +```bash +npm run gen:catalog +``` + +Erzeugt zwei Artefakte und committet beide: + +| Datei | Notation | Verwendung | +|---|---|---| +| `src/genetics/colorVarietySeed.generated.json` | Klammer (`e[f]`, `c[chm]`) | UI-Dropdowns, Frontend-Suche | +| `src/genetics/colorVarietySeed.backend.json` | Frozen symbols (`ef`, `cchm`) | EF-Seed-Migrationen (Pam, DATA-Lane) | + +Der vitest-Drift-Guard (`catalog-drift.test.ts`) schlägt fehl, wenn +`generated.json` nach einer Katalog-Änderung nicht aktualisiert wurde. + ## E2E-Tests (QA-1, Playwright) ```bash @@ -56,4 +75,4 @@ npx playwright test --project=phone # nur Smartphone-Viewport (390px) überspringen sich selbst; die übrigen legen eigene Datensätze an. - Beide Viewports (Smartphone 390px, Laptop 1280px) laufen für jede Spec; alle Assertions prüfen die deutschen Oberflächentexte direkt aus - `src/strings/de.ts`. + `src/strings/de.ts`. diff --git a/gerbil-manager-web/gen-seed.mts b/gerbil-manager-web/gen-seed.mts new file mode 100644 index 0000000..b39a116 --- /dev/null +++ b/gerbil-manager-web/gen-seed.mts @@ -0,0 +1,49 @@ +/** + * Katalog-Generator — AR-5 + * + * Erzeugt zwei Artefakte aus catalog.ts (Single Source of Truth): + * + * colorVarietySeed.generated.json — Display-Notation (Klammer: e[f]/c[chm]/c[h]) + * → Quelle für UI-Dropdowns, Frontend-Suche. + * + * colorVarietySeed.backend.json — Frozen internal symbols (ef/cchm/ch) + * → Quelle für künftige EF-Seed-Migrationen (Pam). + * NICHT in Bracket-Notation ändern — Backend-Parser + * erwartet frozen symbols (CR-11-Matcher-Guardrail). + * + * Ausführen nach jeder Änderung an catalog.ts: + * npm run gen:catalog + * + * Der vitest-Drift-Guard (catalog-drift.test.ts) schlägt fehl, wenn + * generated.json veraltet ist — Fehler macht den fehlenden Generator-Lauf sichtbar. + */ +import { BASE_COLORS, CATALOG, representativeGenotype } from './src/genetics/catalog.ts' +import { LOCUS_ORDER } from './src/genetics/loci.ts' +import type { Genotype } from './src/genetics/genotype.ts' +import { writeFileSync } from 'fs' + +/** Internal (frozen) display string — concatenates canonical allele symbols without bracket mapping. */ +function toInternalString(g: Genotype): string { + return LOCUS_ORDER.filter( + (locus) => locus !== 'Sls' || !(g.Sls[0] === 'sl' && g.Sls[1] === 'sl'), + ) + .map((locus) => (g[locus][0] + g[locus][1]).replace(/\?/g, '-')) + .join(' ') +} + +// ── Display artefact (bracket notation) ───────────────────────────────────── +const displayPath = './src/genetics/colorVarietySeed.generated.json' +writeFileSync(displayPath, JSON.stringify(CATALOG, null, 2) + '\n') +console.log(`[gen:catalog] display → ${displayPath} (${CATALOG.length} rows)`) + +// ── Backend artefact (frozen internal symbols) ─────────────────────────────── +const backendSeed = BASE_COLORS.map((entry, i) => ({ + name: entry.name, + ...(entry.english !== undefined ? { english: entry.english } : {}), + canonicalGenotype: toInternalString(representativeGenotype(entry)), + sortOrder: i, + ...(entry.image !== undefined ? { image: entry.image } : {}), +})) +const backendPath = './src/genetics/colorVarietySeed.backend.json' +writeFileSync(backendPath, JSON.stringify(backendSeed, null, 2) + '\n') +console.log(`[gen:catalog] backend → ${backendPath} (${backendSeed.length} rows)`) diff --git a/gerbil-manager-web/package.json b/gerbil-manager-web/package.json index 1d8f38d..47bb3b6 100644 --- a/gerbil-manager-web/package.json +++ b/gerbil-manager-web/package.json @@ -10,7 +10,8 @@ "preview": "vite preview", "test": "vitest run", "test:watch": "vitest", - "e2e": "playwright test" + "e2e": "playwright test", + "gen:catalog": "npx tsx gen-seed.mts" }, "dependencies": { "jszip": "^3.10.1", diff --git a/gerbil-manager-web/src/genetics/__tests__/catalog-drift.test.ts b/gerbil-manager-web/src/genetics/__tests__/catalog-drift.test.ts new file mode 100644 index 0000000..4c61b2d --- /dev/null +++ b/gerbil-manager-web/src/genetics/__tests__/catalog-drift.test.ts @@ -0,0 +1,24 @@ +/** + * AR-5 Drift-Guard: colorVarietySeed.generated.json muss mit dem Live-Output + * aus catalog.ts übereinstimmen. + * + * Schlägt dieser Test fehl, wurde catalog.ts verändert ohne danach + * `npm run gen:catalog` auszuführen. Fix: `npm run gen:catalog` laufen lassen + * und die geänderten JSON-Dateien committen. + */ +import { readFileSync } from 'fs' +import { fileURLToPath } from 'url' +import { dirname, join } from 'path' +import { describe, it, expect } from 'vitest' +import { CATALOG } from '../catalog' + +const __dir = dirname(fileURLToPath(import.meta.url)) + +describe('AR-5 Catalog drift-guard', () => { + it('colorVarietySeed.generated.json stimmt mit catalog.ts überein (sonst: npm run gen:catalog)', () => { + const jsonPath = join(__dir, '..', 'colorVarietySeed.generated.json') + const committed = JSON.parse(readFileSync(jsonPath, 'utf-8')) + // CATALOG is readonly — deep equality against the plain parsed array is sufficient. + expect(committed).toEqual(Array.from(CATALOG)) + }) +}) diff --git a/gerbil-manager-web/src/genetics/colorVarietySeed.backend.json b/gerbil-manager-web/src/genetics/colorVarietySeed.backend.json new file mode 100644 index 0000000..c696cbc --- /dev/null +++ b/gerbil-manager-web/src/genetics/colorVarietySeed.backend.json @@ -0,0 +1,406 @@ +[ + { + "name": "Pink Eyed White (PEW)", + "english": "Pink Eyed White", + "canonicalGenotype": "AA chch DD EE GG pp spsp rere", + "sortOrder": 0, + "image": "rotaugen-weiss-pew-d-sep-e-sep.jpg" + }, + { + "name": "Hermelin", + "english": "Dark Tailed White", + "canonicalGenotype": "aa chch DD EE GG PP spsp rere", + "sortOrder": 1, + "image": "hermelin.jpeg" + }, + { + "name": "Himalaya", + "english": "Himalayan", + "canonicalGenotype": "AA chch DD EE GG PP spsp rere", + "sortOrder": 2, + "image": "himalaya.jpg" + }, + { + "name": "Zobel", + "english": "Sable", + "canonicalGenotype": "aa cchmcchm DD EE gg PP spsp rere", + "sortOrder": 3, + "image": "zobel.jpeg" + }, + { + "name": "Rotaugenschimmel", + "english": "Red-Eyed Roan", + "canonicalGenotype": "AA CC DD efef GG pp spsp rere", + "sortOrder": 4, + "image": "rotaugen-schimmel.jpg" + }, + { + "name": "Agouti", + "english": "Golden Agouti", + "canonicalGenotype": "AA CC DD EE GG PP spsp rere", + "sortOrder": 5, + "image": "agouti-mit-erklaerung-der-genloci.JPG" + }, + { + "name": "Schwarz", + "english": "Black", + "canonicalGenotype": "aa CC DD EE GG PP spsp rere", + "sortOrder": 6, + "image": "schwarz.jpg" + }, + { + "name": "Silberagouti", + "english": "Grey Agouti", + "canonicalGenotype": "AA CC DD EE gg PP spsp rere", + "sortOrder": 7, + "image": "silberagouti.jpg" + }, + { + "name": "Anthrazit", + "english": "Slate", + "canonicalGenotype": "aa CC DD EE gg PP spsp rere", + "sortOrder": 8, + "image": "anthrazit.jpg" + }, + { + "name": "Algierfuchs", + "english": "Dark-Eyed Honey", + "canonicalGenotype": "AA CC DD ee GG PP spsp rere", + "sortOrder": 9, + "image": "algierfuchs.jpg" + }, + { + "name": "Blau", + "english": "Blue", + "canonicalGenotype": "aa CC dd EE GG PP spsp rere", + "sortOrder": 10, + "image": "blau-schwarz-dd.JPG" + }, + { + "name": "Gold", + "english": "Argente Golden", + "canonicalGenotype": "AA CC DD EE GG pp spsp rere", + "sortOrder": 11, + "image": "gold.jpg" + }, + { + "name": "Platin", + "english": "Lilac", + "canonicalGenotype": "aa CC DD EE GG pp spsp rere", + "sortOrder": 12, + "image": "platin.JPG" + }, + { + "name": "Goldfuchs", + "english": "Yellow Fox", + "canonicalGenotype": "AA CC DD ee GG pp spsp rere", + "sortOrder": 13, + "image": "goldfuchs.jpg" + }, + { + "name": "Rotfuchs", + "english": "Argente Nutmeg", + "canonicalGenotype": "aa CC DD ee GG pp spsp rere", + "sortOrder": 14, + "image": "rotfuchs.JPG" + }, + { + "name": "dd Gold", + "english": "dd Argente Golden", + "canonicalGenotype": "AA CC dd EE GG pp spsp rere", + "sortOrder": 15, + "image": "gold-dd.jpg" + }, + { + "name": "dd Platin", + "english": "dd Lilac", + "canonicalGenotype": "aa CC dd EE GG pp spsp rere", + "sortOrder": 16, + "image": "platin-dd.jpg" + }, + { + "name": "Altweiss (REW)", + "canonicalGenotype": "aa CC DD EE gg pp spsp rere", + "sortOrder": 17, + "image": "altweiss-rew.jpeg" + }, + { + "name": "Apricot (Blassfuchs)", + "canonicalGenotype": "AA CC DD ee gg pp spsp rere", + "sortOrder": 18, + "image": "apricot-blassfuchs.jpg" + }, + { + "name": "Blaufuchs", + "canonicalGenotype": "aa CC DD ee gg PP spsp rere", + "sortOrder": 19, + "image": "blaufuchs.jpg" + }, + { + "name": "C-Separator", + "canonicalGenotype": "aa CC DD ee gg pp spsp rere", + "sortOrder": 20, + "image": "c-separator.jpg" + }, + { + "name": "Elfenbein", + "canonicalGenotype": "AA CC DD EE gg pp spsp rere", + "sortOrder": 21, + "image": "elfenbein.jpg" + }, + { + "name": "Kohlfuchs", + "canonicalGenotype": "aa CC DD ee GG PP spsp rere", + "sortOrder": 22, + "image": "kohlfuchs.jpg" + }, + { + "name": "Polarfuchs", + "canonicalGenotype": "AA CC DD ee gg PP spsp rere", + "sortOrder": 23, + "image": "polarfuchs.jpg" + }, + { + "name": "Saphir", + "canonicalGenotype": "aa CC DD EE GG pp spsp rere", + "sortOrder": 24, + "image": "saphir.jpg" + }, + { + "name": "Orangeschimmel", + "canonicalGenotype": "AA CC DD efef GG PP spsp rere", + "sortOrder": 25, + "image": "schimmel-orangeschimmel.jpg" + }, + { + "name": "Topas", + "canonicalGenotype": "AA CC DD EE GG pp spsp rere", + "sortOrder": 26, + "image": "topas.jpg" + }, + { + "name": "Platin-Hell", + "canonicalGenotype": "aa CC DD EE GG pp spsp rere", + "sortOrder": 27, + "image": "platin-hell.jpg" + }, + { + "name": "Agouti dd", + "canonicalGenotype": "AA CC dd EE GG PP spsp rere", + "sortOrder": 28, + "image": "agouti-dd.jpg" + }, + { + "name": "Silberagouti dd", + "canonicalGenotype": "AA CC dd EE gg PP spsp rere", + "sortOrder": 29, + "image": "silberagouti-dd.jpg" + }, + { + "name": "Kohlfuchs dd", + "canonicalGenotype": "aa CC dd ee GG PP spsp rere", + "sortOrder": 30, + "image": "kohlfuchs-dd.jpg" + }, + { + "name": "Anthrazit dd", + "canonicalGenotype": "aa CC dd EE gg PP spsp rere", + "sortOrder": 31, + "image": "anthrazit-dd.jpg" + }, + { + "name": "Silberschimmel", + "canonicalGenotype": "AA CC DD efef gg PP spsp rere", + "sortOrder": 32, + "image": "silberschimmel.jpg" + }, + { + "name": "Polarfuchsschimmel", + "canonicalGenotype": "AA CC DD efef gg PP spsp rere", + "sortOrder": 33, + "image": "polarfuchsschimmel.jpg" + }, + { + "name": "Algierfuchsschimmel", + "canonicalGenotype": "AA CC DD efef GG PP spsp rere", + "sortOrder": 34, + "image": "algierfuchsschimmel.jpg" + }, + { + "name": "Kohlfuchsschimmel", + "canonicalGenotype": "aa CC DD efef GG PP spsp rere", + "sortOrder": 35, + "image": "kohlfuchsschimmel.jpg" + }, + { + "name": "Blaufuchsschimmel", + "canonicalGenotype": "aa CC DD efef gg PP spsp rere", + "sortOrder": 36, + "image": "blaufuchsschimmel.jpg" + }, + { + "name": "Kohlfuchs, hell", + "canonicalGenotype": "aa CC DD ee GG PP spsp rere", + "sortOrder": 37, + "image": "kohlfuchs-hell.jpg" + }, + { + "name": "Goldfuchs, hell", + "canonicalGenotype": "AA CC DD ee GG pp spsp rere", + "sortOrder": 38, + "image": "goldfuchs-hell.jpg" + }, + { + "name": "Goldfuchsschimmel", + "canonicalGenotype": "AA CC DD efef GG pp spsp rere", + "sortOrder": 39, + "image": "goldfuchsschimmel.jpg" + }, + { + "name": "Gold-Hell", + "canonicalGenotype": "AA CC DD EE GG pp spsp rere", + "sortOrder": 40, + "image": "gold-hell.jpg" + }, + { + "name": "Blaufuchs, hell", + "canonicalGenotype": "aa CC DD ee gg PP spsp rere", + "sortOrder": 41, + "image": "blaufuchs-hell.jpeg" + }, + { + "name": "Rotfuchsschimmel", + "canonicalGenotype": "aa CC DD efef GG pp spsp rere", + "sortOrder": 42, + "image": "rotfuchsschimmel.jpg" + }, + { + "name": "Polarfuchs, hell", + "canonicalGenotype": "AA CC DD ee gg PP spsp rere", + "sortOrder": 43, + "image": "polarfuchs-hell.jpeg" + }, + { + "name": "Kohlfuchsschimmel, hell", + "canonicalGenotype": "aa CC DD efef GG PP spsp rere", + "sortOrder": 44, + "image": "kohlfuchsschimmel-hell.jpg" + }, + { + "name": "Rotfuchs, hell", + "canonicalGenotype": "aa CC DD ee GG pp spsp rere", + "sortOrder": 45, + "image": "rotfuchs-hell.jpg" + }, + { + "name": "Kohlfuchs-Hell", + "canonicalGenotype": "aa CC DD ee GG PP spsp rere", + "sortOrder": 46, + "image": "kohlfuchs-hell-2.jpg" + }, + { + "name": "Algierfuchs, hell", + "canonicalGenotype": "AA CC DD ee GG PP spsp rere", + "sortOrder": 47, + "image": "algierfuchs-hell.JPG" + }, + { + "name": "Topas dd", + "canonicalGenotype": "AA CC dd EE GG pp spsp rere", + "sortOrder": 48, + "image": "topas-dd.jpg" + }, + { + "name": "Blaufuchs dd", + "canonicalGenotype": "aa CC dd ee gg pp spsp rere", + "sortOrder": 49, + "image": "blaufuchs-dd.jpg" + }, + { + "name": "Marder", + "canonicalGenotype": "aa cchmcchm DD EE GG PP spsp rere", + "sortOrder": 50, + "image": "marder.JPG" + }, + { + "name": "Siam", + "canonicalGenotype": "aa cchmch DD EE GG PP spsp rere", + "sortOrder": 51, + "image": "siam-marder-hell.JPG" + }, + { + "name": "Zobel-Hell", + "canonicalGenotype": "aa cchmch DD EE gg PP spsp rere", + "sortOrder": 52, + "image": "zobel-hell.jpg" + }, + { + "name": "CP-Agouti", + "canonicalGenotype": "AA cchmcchm DD EE GG PP spsp rere", + "sortOrder": 53, + "image": "agouti-cp.jpg" + }, + { + "name": "CP-Agouti-Hell", + "canonicalGenotype": "AA cchmch DD EE GG PP spsp rere", + "sortOrder": 54 + }, + { + "name": "CP-Silberagouti", + "canonicalGenotype": "AA cchmcchm DD EE gg PP spsp rere", + "sortOrder": 55, + "image": "silberagouti-cp.JPG" + }, + { + "name": "CP-Silberagouti-Hell", + "canonicalGenotype": "AA cchmch DD EE gg PP spsp rere", + "sortOrder": 56 + }, + { + "name": "CP-Algierfuchs", + "canonicalGenotype": "AA cchmcchm DD ee GG PP spsp rere", + "sortOrder": 57, + "image": "algierfuchs-cp.jpg" + }, + { + "name": "CP-Algierfuchs-Hell", + "canonicalGenotype": "AA cchmch DD ee GG PP spsp rere", + "sortOrder": 58 + }, + { + "name": "CP-Polarfuchs", + "canonicalGenotype": "AA cchmcchm DD ee gg PP spsp rere", + "sortOrder": 59, + "image": "polarfuchs-cp.jpg" + }, + { + "name": "CP-Polarfuchs-Hell", + "canonicalGenotype": "AA cchmch DD ee gg PP spsp rere", + "sortOrder": 60 + }, + { + "name": "CP-Fuchs", + "canonicalGenotype": "AA cchmcchm dd ee GG PP spsp rere", + "sortOrder": 61 + }, + { + "name": "CP-Fuchs-Hell", + "canonicalGenotype": "AA cchmch dd ee GG PP spsp rere", + "sortOrder": 62 + }, + { + "name": "CP-Blaufuchs", + "canonicalGenotype": "AA cchmcchm dd ee gg PP spsp rere", + "sortOrder": 63 + }, + { + "name": "CP-Orangeschimmel", + "canonicalGenotype": "AA cchmcchm DD efef GG PP spsp rere", + "sortOrder": 64 + }, + { + "name": "CP-Orangeschimmel-Hell", + "canonicalGenotype": "AA cchmch DD efef GG PP spsp rere", + "sortOrder": 65 + } +] From 30ee7b6198c30617c65c0704cdd5a9b20a05ab4b Mon Sep 17 00:00:00 2001 From: Gulum Date: Sat, 6 Jun 2026 21:52:44 +0200 Subject: [PATCH 2/2] AR-5: Seed-Artefakte auf finalem Katalog regeneriert (70 Eintraege, GEN-4/4b) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit npm run gen:catalog lief auf rebased HEAD (post-GEN-4b, main 7fe538d). Beide Artefakte aktualisiert: - colorVarietySeed.generated.json: 70 Zeilen, Klammer-Notation (Display) Neue Namen: Dilute Gold/Platin/Agouti/Silberagouti/Kohlfuchs/Anthrazit/ Topas/Blaufuchs + Dilute Fuchs-Varianten (Algierfuchs/Goldfuchs/Rotfuchs/Polarfuchs) - colorVarietySeed.backend.json: 70 Zeilen, frozen symbols (ef/cchm/ch) Quelle fuer Pams Backend-Re-Seed-Migration (Guardrail: nie Klammern) Drift-Guard (catalog-drift.test.ts) laeuft gruen. Gate: build ✓ eslint ✓ vitest 109/109 ✓ --- .../genetics/colorVarietySeed.backend.json | 104 +++++++++++------- .../genetics/colorVarietySeed.generated.json | 104 +++++++++++------- 2 files changed, 124 insertions(+), 84 deletions(-) diff --git a/gerbil-manager-web/src/genetics/colorVarietySeed.backend.json b/gerbil-manager-web/src/genetics/colorVarietySeed.backend.json index c696cbc..545e42b 100644 --- a/gerbil-manager-web/src/genetics/colorVarietySeed.backend.json +++ b/gerbil-manager-web/src/genetics/colorVarietySeed.backend.json @@ -105,14 +105,14 @@ "image": "rotfuchs.JPG" }, { - "name": "dd Gold", + "name": "Dilute Gold", "english": "dd Argente Golden", "canonicalGenotype": "AA CC dd EE GG pp spsp rere", "sortOrder": 15, "image": "gold-dd.jpg" }, { - "name": "dd Platin", + "name": "Dilute Platin", "english": "dd Lilac", "canonicalGenotype": "aa CC dd EE GG pp spsp rere", "sortOrder": 16, @@ -185,222 +185,242 @@ "image": "platin-hell.jpg" }, { - "name": "Agouti dd", + "name": "Dilute Agouti", "canonicalGenotype": "AA CC dd EE GG PP spsp rere", "sortOrder": 28, "image": "agouti-dd.jpg" }, { - "name": "Silberagouti dd", + "name": "Dilute Silberagouti", "canonicalGenotype": "AA CC dd EE gg PP spsp rere", "sortOrder": 29, "image": "silberagouti-dd.jpg" }, { - "name": "Kohlfuchs dd", + "name": "Dilute Kohlfuchs", "canonicalGenotype": "aa CC dd ee GG PP spsp rere", "sortOrder": 30, "image": "kohlfuchs-dd.jpg" }, { - "name": "Anthrazit dd", + "name": "Dilute Anthrazit", "canonicalGenotype": "aa CC dd EE gg PP spsp rere", "sortOrder": 31, "image": "anthrazit-dd.jpg" }, + { + "name": "Dilute Algierfuchs", + "canonicalGenotype": "AA CC dd ee GG PP spsp rere", + "sortOrder": 32 + }, + { + "name": "Dilute Goldfuchs", + "canonicalGenotype": "AA CC dd ee GG pp spsp rere", + "sortOrder": 33 + }, + { + "name": "Dilute Rotfuchs", + "canonicalGenotype": "aa CC dd ee GG pp spsp rere", + "sortOrder": 34 + }, + { + "name": "Dilute Polarfuchs", + "canonicalGenotype": "AA CC dd ee gg PP spsp rere", + "sortOrder": 35 + }, { "name": "Silberschimmel", "canonicalGenotype": "AA CC DD efef gg PP spsp rere", - "sortOrder": 32, + "sortOrder": 36, "image": "silberschimmel.jpg" }, { "name": "Polarfuchsschimmel", "canonicalGenotype": "AA CC DD efef gg PP spsp rere", - "sortOrder": 33, + "sortOrder": 37, "image": "polarfuchsschimmel.jpg" }, { "name": "Algierfuchsschimmel", "canonicalGenotype": "AA CC DD efef GG PP spsp rere", - "sortOrder": 34, + "sortOrder": 38, "image": "algierfuchsschimmel.jpg" }, { "name": "Kohlfuchsschimmel", "canonicalGenotype": "aa CC DD efef GG PP spsp rere", - "sortOrder": 35, + "sortOrder": 39, "image": "kohlfuchsschimmel.jpg" }, { "name": "Blaufuchsschimmel", "canonicalGenotype": "aa CC DD efef gg PP spsp rere", - "sortOrder": 36, + "sortOrder": 40, "image": "blaufuchsschimmel.jpg" }, { "name": "Kohlfuchs, hell", "canonicalGenotype": "aa CC DD ee GG PP spsp rere", - "sortOrder": 37, + "sortOrder": 41, "image": "kohlfuchs-hell.jpg" }, { "name": "Goldfuchs, hell", "canonicalGenotype": "AA CC DD ee GG pp spsp rere", - "sortOrder": 38, + "sortOrder": 42, "image": "goldfuchs-hell.jpg" }, { "name": "Goldfuchsschimmel", "canonicalGenotype": "AA CC DD efef GG pp spsp rere", - "sortOrder": 39, + "sortOrder": 43, "image": "goldfuchsschimmel.jpg" }, { "name": "Gold-Hell", "canonicalGenotype": "AA CC DD EE GG pp spsp rere", - "sortOrder": 40, + "sortOrder": 44, "image": "gold-hell.jpg" }, { "name": "Blaufuchs, hell", "canonicalGenotype": "aa CC DD ee gg PP spsp rere", - "sortOrder": 41, + "sortOrder": 45, "image": "blaufuchs-hell.jpeg" }, { "name": "Rotfuchsschimmel", "canonicalGenotype": "aa CC DD efef GG pp spsp rere", - "sortOrder": 42, + "sortOrder": 46, "image": "rotfuchsschimmel.jpg" }, { "name": "Polarfuchs, hell", "canonicalGenotype": "AA CC DD ee gg PP spsp rere", - "sortOrder": 43, + "sortOrder": 47, "image": "polarfuchs-hell.jpeg" }, { "name": "Kohlfuchsschimmel, hell", "canonicalGenotype": "aa CC DD efef GG PP spsp rere", - "sortOrder": 44, + "sortOrder": 48, "image": "kohlfuchsschimmel-hell.jpg" }, { "name": "Rotfuchs, hell", "canonicalGenotype": "aa CC DD ee GG pp spsp rere", - "sortOrder": 45, + "sortOrder": 49, "image": "rotfuchs-hell.jpg" }, { "name": "Kohlfuchs-Hell", "canonicalGenotype": "aa CC DD ee GG PP spsp rere", - "sortOrder": 46, + "sortOrder": 50, "image": "kohlfuchs-hell-2.jpg" }, { "name": "Algierfuchs, hell", "canonicalGenotype": "AA CC DD ee GG PP spsp rere", - "sortOrder": 47, + "sortOrder": 51, "image": "algierfuchs-hell.JPG" }, { - "name": "Topas dd", + "name": "Dilute Topas", "canonicalGenotype": "AA CC dd EE GG pp spsp rere", - "sortOrder": 48, + "sortOrder": 52, "image": "topas-dd.jpg" }, { - "name": "Blaufuchs dd", + "name": "Dilute Blaufuchs", "canonicalGenotype": "aa CC dd ee gg pp spsp rere", - "sortOrder": 49, + "sortOrder": 53, "image": "blaufuchs-dd.jpg" }, { "name": "Marder", "canonicalGenotype": "aa cchmcchm DD EE GG PP spsp rere", - "sortOrder": 50, + "sortOrder": 54, "image": "marder.JPG" }, { "name": "Siam", "canonicalGenotype": "aa cchmch DD EE GG PP spsp rere", - "sortOrder": 51, + "sortOrder": 55, "image": "siam-marder-hell.JPG" }, { "name": "Zobel-Hell", "canonicalGenotype": "aa cchmch DD EE gg PP spsp rere", - "sortOrder": 52, + "sortOrder": 56, "image": "zobel-hell.jpg" }, { "name": "CP-Agouti", "canonicalGenotype": "AA cchmcchm DD EE GG PP spsp rere", - "sortOrder": 53, + "sortOrder": 57, "image": "agouti-cp.jpg" }, { "name": "CP-Agouti-Hell", "canonicalGenotype": "AA cchmch DD EE GG PP spsp rere", - "sortOrder": 54 + "sortOrder": 58 }, { "name": "CP-Silberagouti", "canonicalGenotype": "AA cchmcchm DD EE gg PP spsp rere", - "sortOrder": 55, + "sortOrder": 59, "image": "silberagouti-cp.JPG" }, { "name": "CP-Silberagouti-Hell", "canonicalGenotype": "AA cchmch DD EE gg PP spsp rere", - "sortOrder": 56 + "sortOrder": 60 }, { "name": "CP-Algierfuchs", "canonicalGenotype": "AA cchmcchm DD ee GG PP spsp rere", - "sortOrder": 57, + "sortOrder": 61, "image": "algierfuchs-cp.jpg" }, { "name": "CP-Algierfuchs-Hell", "canonicalGenotype": "AA cchmch DD ee GG PP spsp rere", - "sortOrder": 58 + "sortOrder": 62 }, { "name": "CP-Polarfuchs", "canonicalGenotype": "AA cchmcchm DD ee gg PP spsp rere", - "sortOrder": 59, + "sortOrder": 63, "image": "polarfuchs-cp.jpg" }, { "name": "CP-Polarfuchs-Hell", "canonicalGenotype": "AA cchmch DD ee gg PP spsp rere", - "sortOrder": 60 + "sortOrder": 64 }, { "name": "CP-Fuchs", "canonicalGenotype": "AA cchmcchm dd ee GG PP spsp rere", - "sortOrder": 61 + "sortOrder": 65 }, { "name": "CP-Fuchs-Hell", "canonicalGenotype": "AA cchmch dd ee GG PP spsp rere", - "sortOrder": 62 + "sortOrder": 66 }, { "name": "CP-Blaufuchs", "canonicalGenotype": "AA cchmcchm dd ee gg PP spsp rere", - "sortOrder": 63 + "sortOrder": 67 }, { "name": "CP-Orangeschimmel", "canonicalGenotype": "AA cchmcchm DD efef GG PP spsp rere", - "sortOrder": 64 + "sortOrder": 68 }, { "name": "CP-Orangeschimmel-Hell", "canonicalGenotype": "AA cchmch DD efef GG PP spsp rere", - "sortOrder": 65 + "sortOrder": 69 } ] diff --git a/gerbil-manager-web/src/genetics/colorVarietySeed.generated.json b/gerbil-manager-web/src/genetics/colorVarietySeed.generated.json index c6e634f..56ccef7 100644 --- a/gerbil-manager-web/src/genetics/colorVarietySeed.generated.json +++ b/gerbil-manager-web/src/genetics/colorVarietySeed.generated.json @@ -105,14 +105,14 @@ "image": "rotfuchs.JPG" }, { - "name": "dd Gold", + "name": "Dilute Gold", "english": "dd Argente Golden", "canonicalGenotype": "AA CC dd EE GG pp spsp rere", "sortOrder": 15, "image": "gold-dd.jpg" }, { - "name": "dd Platin", + "name": "Dilute Platin", "english": "dd Lilac", "canonicalGenotype": "aa CC dd EE GG pp spsp rere", "sortOrder": 16, @@ -185,222 +185,242 @@ "image": "platin-hell.jpg" }, { - "name": "Agouti dd", + "name": "Dilute Agouti", "canonicalGenotype": "AA CC dd EE GG PP spsp rere", "sortOrder": 28, "image": "agouti-dd.jpg" }, { - "name": "Silberagouti dd", + "name": "Dilute Silberagouti", "canonicalGenotype": "AA CC dd EE gg PP spsp rere", "sortOrder": 29, "image": "silberagouti-dd.jpg" }, { - "name": "Kohlfuchs dd", + "name": "Dilute Kohlfuchs", "canonicalGenotype": "aa CC dd ee GG PP spsp rere", "sortOrder": 30, "image": "kohlfuchs-dd.jpg" }, { - "name": "Anthrazit dd", + "name": "Dilute Anthrazit", "canonicalGenotype": "aa CC dd EE gg PP spsp rere", "sortOrder": 31, "image": "anthrazit-dd.jpg" }, + { + "name": "Dilute Algierfuchs", + "canonicalGenotype": "AA CC dd ee GG PP spsp rere", + "sortOrder": 32 + }, + { + "name": "Dilute Goldfuchs", + "canonicalGenotype": "AA CC dd ee GG pp spsp rere", + "sortOrder": 33 + }, + { + "name": "Dilute Rotfuchs", + "canonicalGenotype": "aa CC dd ee GG pp spsp rere", + "sortOrder": 34 + }, + { + "name": "Dilute Polarfuchs", + "canonicalGenotype": "AA CC dd ee gg PP spsp rere", + "sortOrder": 35 + }, { "name": "Silberschimmel", "canonicalGenotype": "AA CC DD e[f]e[f] gg PP spsp rere", - "sortOrder": 32, + "sortOrder": 36, "image": "silberschimmel.jpg" }, { "name": "Polarfuchsschimmel", "canonicalGenotype": "AA CC DD e[f]e[f] gg PP spsp rere", - "sortOrder": 33, + "sortOrder": 37, "image": "polarfuchsschimmel.jpg" }, { "name": "Algierfuchsschimmel", "canonicalGenotype": "AA CC DD e[f]e[f] GG PP spsp rere", - "sortOrder": 34, + "sortOrder": 38, "image": "algierfuchsschimmel.jpg" }, { "name": "Kohlfuchsschimmel", "canonicalGenotype": "aa CC DD e[f]e[f] GG PP spsp rere", - "sortOrder": 35, + "sortOrder": 39, "image": "kohlfuchsschimmel.jpg" }, { "name": "Blaufuchsschimmel", "canonicalGenotype": "aa CC DD e[f]e[f] gg PP spsp rere", - "sortOrder": 36, + "sortOrder": 40, "image": "blaufuchsschimmel.jpg" }, { "name": "Kohlfuchs, hell", "canonicalGenotype": "aa CC DD ee GG PP spsp rere", - "sortOrder": 37, + "sortOrder": 41, "image": "kohlfuchs-hell.jpg" }, { "name": "Goldfuchs, hell", "canonicalGenotype": "AA CC DD ee GG pp spsp rere", - "sortOrder": 38, + "sortOrder": 42, "image": "goldfuchs-hell.jpg" }, { "name": "Goldfuchsschimmel", "canonicalGenotype": "AA CC DD e[f]e[f] GG pp spsp rere", - "sortOrder": 39, + "sortOrder": 43, "image": "goldfuchsschimmel.jpg" }, { "name": "Gold-Hell", "canonicalGenotype": "AA CC DD EE GG pp spsp rere", - "sortOrder": 40, + "sortOrder": 44, "image": "gold-hell.jpg" }, { "name": "Blaufuchs, hell", "canonicalGenotype": "aa CC DD ee gg PP spsp rere", - "sortOrder": 41, + "sortOrder": 45, "image": "blaufuchs-hell.jpeg" }, { "name": "Rotfuchsschimmel", "canonicalGenotype": "aa CC DD e[f]e[f] GG pp spsp rere", - "sortOrder": 42, + "sortOrder": 46, "image": "rotfuchsschimmel.jpg" }, { "name": "Polarfuchs, hell", "canonicalGenotype": "AA CC DD ee gg PP spsp rere", - "sortOrder": 43, + "sortOrder": 47, "image": "polarfuchs-hell.jpeg" }, { "name": "Kohlfuchsschimmel, hell", "canonicalGenotype": "aa CC DD e[f]e[f] GG PP spsp rere", - "sortOrder": 44, + "sortOrder": 48, "image": "kohlfuchsschimmel-hell.jpg" }, { "name": "Rotfuchs, hell", "canonicalGenotype": "aa CC DD ee GG pp spsp rere", - "sortOrder": 45, + "sortOrder": 49, "image": "rotfuchs-hell.jpg" }, { "name": "Kohlfuchs-Hell", "canonicalGenotype": "aa CC DD ee GG PP spsp rere", - "sortOrder": 46, + "sortOrder": 50, "image": "kohlfuchs-hell-2.jpg" }, { "name": "Algierfuchs, hell", "canonicalGenotype": "AA CC DD ee GG PP spsp rere", - "sortOrder": 47, + "sortOrder": 51, "image": "algierfuchs-hell.JPG" }, { - "name": "Topas dd", + "name": "Dilute Topas", "canonicalGenotype": "AA CC dd EE GG pp spsp rere", - "sortOrder": 48, + "sortOrder": 52, "image": "topas-dd.jpg" }, { - "name": "Blaufuchs dd", + "name": "Dilute Blaufuchs", "canonicalGenotype": "aa CC dd ee gg pp spsp rere", - "sortOrder": 49, + "sortOrder": 53, "image": "blaufuchs-dd.jpg" }, { "name": "Marder", "canonicalGenotype": "aa c[chm]c[chm] DD EE GG PP spsp rere", - "sortOrder": 50, + "sortOrder": 54, "image": "marder.JPG" }, { "name": "Siam", "canonicalGenotype": "aa c[chm]c[h] DD EE GG PP spsp rere", - "sortOrder": 51, + "sortOrder": 55, "image": "siam-marder-hell.JPG" }, { "name": "Zobel-Hell", "canonicalGenotype": "aa c[chm]c[h] DD EE gg PP spsp rere", - "sortOrder": 52, + "sortOrder": 56, "image": "zobel-hell.jpg" }, { "name": "CP-Agouti", "canonicalGenotype": "AA c[chm]c[chm] DD EE GG PP spsp rere", - "sortOrder": 53, + "sortOrder": 57, "image": "agouti-cp.jpg" }, { "name": "CP-Agouti-Hell", "canonicalGenotype": "AA c[chm]c[h] DD EE GG PP spsp rere", - "sortOrder": 54 + "sortOrder": 58 }, { "name": "CP-Silberagouti", "canonicalGenotype": "AA c[chm]c[chm] DD EE gg PP spsp rere", - "sortOrder": 55, + "sortOrder": 59, "image": "silberagouti-cp.JPG" }, { "name": "CP-Silberagouti-Hell", "canonicalGenotype": "AA c[chm]c[h] DD EE gg PP spsp rere", - "sortOrder": 56 + "sortOrder": 60 }, { "name": "CP-Algierfuchs", "canonicalGenotype": "AA c[chm]c[chm] DD ee GG PP spsp rere", - "sortOrder": 57, + "sortOrder": 61, "image": "algierfuchs-cp.jpg" }, { "name": "CP-Algierfuchs-Hell", "canonicalGenotype": "AA c[chm]c[h] DD ee GG PP spsp rere", - "sortOrder": 58 + "sortOrder": 62 }, { "name": "CP-Polarfuchs", "canonicalGenotype": "AA c[chm]c[chm] DD ee gg PP spsp rere", - "sortOrder": 59, + "sortOrder": 63, "image": "polarfuchs-cp.jpg" }, { "name": "CP-Polarfuchs-Hell", "canonicalGenotype": "AA c[chm]c[h] DD ee gg PP spsp rere", - "sortOrder": 60 + "sortOrder": 64 }, { "name": "CP-Fuchs", "canonicalGenotype": "AA c[chm]c[chm] dd ee GG PP spsp rere", - "sortOrder": 61 + "sortOrder": 65 }, { "name": "CP-Fuchs-Hell", "canonicalGenotype": "AA c[chm]c[h] dd ee GG PP spsp rere", - "sortOrder": 62 + "sortOrder": 66 }, { "name": "CP-Blaufuchs", "canonicalGenotype": "AA c[chm]c[chm] dd ee gg PP spsp rere", - "sortOrder": 63 + "sortOrder": 67 }, { "name": "CP-Orangeschimmel", "canonicalGenotype": "AA c[chm]c[chm] DD e[f]e[f] GG PP spsp rere", - "sortOrder": 64 + "sortOrder": 68 }, { "name": "CP-Orangeschimmel-Hell", "canonicalGenotype": "AA c[chm]c[h] DD e[f]e[f] GG PP spsp rere", - "sortOrder": 65 + "sortOrder": 69 } ]