diff --git a/gerbil-manager-web/public/farbschlaege/agouti-cp-hell.JPG b/gerbil-manager-web/public/farbschlaege/agouti-cp-hell.JPG new file mode 100644 index 0000000..59408a3 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/agouti-cp-hell.JPG differ diff --git a/gerbil-manager-web/public/farbschlaege/agouti-cp.jpg b/gerbil-manager-web/public/farbschlaege/agouti-cp.jpg new file mode 100644 index 0000000..36c9c58 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/agouti-cp.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/agouti-dd-cp.jpg b/gerbil-manager-web/public/farbschlaege/agouti-dd-cp.jpg new file mode 100644 index 0000000..b79a61d Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/agouti-dd-cp.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/agouti-dd.jpg b/gerbil-manager-web/public/farbschlaege/agouti-dd.jpg new file mode 100644 index 0000000..a736a00 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/agouti-dd.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/agouti-hell-dd-cp.jpg b/gerbil-manager-web/public/farbschlaege/agouti-hell-dd-cp.jpg new file mode 100644 index 0000000..af729ad Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/agouti-hell-dd-cp.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/agouti-mit-erklaerung-der-genloci.JPG b/gerbil-manager-web/public/farbschlaege/agouti-mit-erklaerung-der-genloci.JPG new file mode 100644 index 0000000..5c36632 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/agouti-mit-erklaerung-der-genloci.JPG differ diff --git a/gerbil-manager-web/public/farbschlaege/algierfuchs-cp.jpg b/gerbil-manager-web/public/farbschlaege/algierfuchs-cp.jpg new file mode 100644 index 0000000..34315fe Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/algierfuchs-cp.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/algierfuchs-hell-cp.jpg b/gerbil-manager-web/public/farbschlaege/algierfuchs-hell-cp.jpg new file mode 100644 index 0000000..cf5401d Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/algierfuchs-hell-cp.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/algierfuchs-hell.JPG b/gerbil-manager-web/public/farbschlaege/algierfuchs-hell.JPG new file mode 100644 index 0000000..189e43b Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/algierfuchs-hell.JPG differ diff --git a/gerbil-manager-web/public/farbschlaege/algierfuchs.jpg b/gerbil-manager-web/public/farbschlaege/algierfuchs.jpg new file mode 100644 index 0000000..2064b6f Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/algierfuchs.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/algierfuchsschimmel.jpg b/gerbil-manager-web/public/farbschlaege/algierfuchsschimmel.jpg new file mode 100644 index 0000000..fb5801e Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/algierfuchsschimmel.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/altweiss-rew.jpeg b/gerbil-manager-web/public/farbschlaege/altweiss-rew.jpeg new file mode 100644 index 0000000..b0061a9 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/altweiss-rew.jpeg differ diff --git a/gerbil-manager-web/public/farbschlaege/anthrazit-dd.jpg b/gerbil-manager-web/public/farbschlaege/anthrazit-dd.jpg new file mode 100644 index 0000000..f4f7cf8 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/anthrazit-dd.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/anthrazit.jpg b/gerbil-manager-web/public/farbschlaege/anthrazit.jpg new file mode 100644 index 0000000..1ba1316 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/anthrazit.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/apricot-blassfuchs.jpg b/gerbil-manager-web/public/farbschlaege/apricot-blassfuchs.jpg new file mode 100644 index 0000000..6b11db5 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/apricot-blassfuchs.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/blau-schwarz-dd.JPG b/gerbil-manager-web/public/farbschlaege/blau-schwarz-dd.JPG new file mode 100644 index 0000000..f4c1b21 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/blau-schwarz-dd.JPG differ diff --git a/gerbil-manager-web/public/farbschlaege/blaufuchs-cp.jpg b/gerbil-manager-web/public/farbschlaege/blaufuchs-cp.jpg new file mode 100644 index 0000000..986393c Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/blaufuchs-cp.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/blaufuchs-dd.jpg b/gerbil-manager-web/public/farbschlaege/blaufuchs-dd.jpg new file mode 100644 index 0000000..15ed4ad Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/blaufuchs-dd.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/blaufuchs-hell.jpeg b/gerbil-manager-web/public/farbschlaege/blaufuchs-hell.jpeg new file mode 100644 index 0000000..a037737 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/blaufuchs-hell.jpeg differ diff --git a/gerbil-manager-web/public/farbschlaege/blaufuchs.jpg b/gerbil-manager-web/public/farbschlaege/blaufuchs.jpg new file mode 100644 index 0000000..ccd0850 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/blaufuchs.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/blaufuchsschimmel.jpg b/gerbil-manager-web/public/farbschlaege/blaufuchsschimmel.jpg new file mode 100644 index 0000000..8aa95a0 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/blaufuchsschimmel.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/c-separator.jpg b/gerbil-manager-web/public/farbschlaege/c-separator.jpg new file mode 100644 index 0000000..10eac5d Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/c-separator.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/elfenbein.jpg b/gerbil-manager-web/public/farbschlaege/elfenbein.jpg new file mode 100644 index 0000000..d675299 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/elfenbein.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/gold-dd.jpg b/gerbil-manager-web/public/farbschlaege/gold-dd.jpg new file mode 100644 index 0000000..9ed72be Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/gold-dd.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/gold-hell.jpg b/gerbil-manager-web/public/farbschlaege/gold-hell.jpg new file mode 100644 index 0000000..697815c Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/gold-hell.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/gold.jpg b/gerbil-manager-web/public/farbschlaege/gold.jpg new file mode 100644 index 0000000..cab6e0b Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/gold.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/goldfuchs-hell.jpg b/gerbil-manager-web/public/farbschlaege/goldfuchs-hell.jpg new file mode 100644 index 0000000..ec47ba0 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/goldfuchs-hell.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/goldfuchs.jpg b/gerbil-manager-web/public/farbschlaege/goldfuchs.jpg new file mode 100644 index 0000000..4368416 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/goldfuchs.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/goldfuchsschimmel.jpg b/gerbil-manager-web/public/farbschlaege/goldfuchsschimmel.jpg new file mode 100644 index 0000000..a8676e0 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/goldfuchsschimmel.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/hermelin.jpeg b/gerbil-manager-web/public/farbschlaege/hermelin.jpeg new file mode 100644 index 0000000..6a5ed04 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/hermelin.jpeg differ diff --git a/gerbil-manager-web/public/farbschlaege/himalaya.jpg b/gerbil-manager-web/public/farbschlaege/himalaya.jpg new file mode 100644 index 0000000..33ab123 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/himalaya.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/kohlfuchs-cp.jpg b/gerbil-manager-web/public/farbschlaege/kohlfuchs-cp.jpg new file mode 100644 index 0000000..41b43f4 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/kohlfuchs-cp.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/kohlfuchs-dd.jpg b/gerbil-manager-web/public/farbschlaege/kohlfuchs-dd.jpg new file mode 100644 index 0000000..01192e6 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/kohlfuchs-dd.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/kohlfuchs-hell-2.jpg b/gerbil-manager-web/public/farbschlaege/kohlfuchs-hell-2.jpg new file mode 100644 index 0000000..af2bedb Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/kohlfuchs-hell-2.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/kohlfuchs-hell-cp.jpg b/gerbil-manager-web/public/farbschlaege/kohlfuchs-hell-cp.jpg new file mode 100644 index 0000000..bc2b9fc Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/kohlfuchs-hell-cp.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/kohlfuchs-hell.jpg b/gerbil-manager-web/public/farbschlaege/kohlfuchs-hell.jpg new file mode 100644 index 0000000..1a7ba7f Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/kohlfuchs-hell.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/kohlfuchs.jpg b/gerbil-manager-web/public/farbschlaege/kohlfuchs.jpg new file mode 100644 index 0000000..354077e Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/kohlfuchs.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/kohlfuchsschimmel-cp.JPG b/gerbil-manager-web/public/farbschlaege/kohlfuchsschimmel-cp.JPG new file mode 100644 index 0000000..843183b Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/kohlfuchsschimmel-cp.JPG differ diff --git a/gerbil-manager-web/public/farbschlaege/kohlfuchsschimmel-hell.jpg b/gerbil-manager-web/public/farbschlaege/kohlfuchsschimmel-hell.jpg new file mode 100644 index 0000000..be5de2b Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/kohlfuchsschimmel-hell.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/kohlfuchsschimmel.jpg b/gerbil-manager-web/public/farbschlaege/kohlfuchsschimmel.jpg new file mode 100644 index 0000000..f6281f6 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/kohlfuchsschimmel.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/marder-dd.jpg b/gerbil-manager-web/public/farbschlaege/marder-dd.jpg new file mode 100644 index 0000000..36356d0 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/marder-dd.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/marder.JPG b/gerbil-manager-web/public/farbschlaege/marder.JPG new file mode 100644 index 0000000..831a4ee Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/marder.JPG differ diff --git a/gerbil-manager-web/public/farbschlaege/platin-dd.jpg b/gerbil-manager-web/public/farbschlaege/platin-dd.jpg new file mode 100644 index 0000000..d4d4fb9 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/platin-dd.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/platin-hell.jpg b/gerbil-manager-web/public/farbschlaege/platin-hell.jpg new file mode 100644 index 0000000..dffaa1d Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/platin-hell.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/platin.JPG b/gerbil-manager-web/public/farbschlaege/platin.JPG new file mode 100644 index 0000000..6cbb813 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/platin.JPG differ diff --git a/gerbil-manager-web/public/farbschlaege/polarfuchs-cp.jpg b/gerbil-manager-web/public/farbschlaege/polarfuchs-cp.jpg new file mode 100644 index 0000000..c13cf27 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/polarfuchs-cp.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/polarfuchs-hell-cp.jpg b/gerbil-manager-web/public/farbschlaege/polarfuchs-hell-cp.jpg new file mode 100644 index 0000000..5846712 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/polarfuchs-hell-cp.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/polarfuchs-hell.jpeg b/gerbil-manager-web/public/farbschlaege/polarfuchs-hell.jpeg new file mode 100644 index 0000000..61b98ba Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/polarfuchs-hell.jpeg differ diff --git a/gerbil-manager-web/public/farbschlaege/polarfuchs.jpg b/gerbil-manager-web/public/farbschlaege/polarfuchs.jpg new file mode 100644 index 0000000..6d72b57 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/polarfuchs.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/polarfuchsschimmel.jpg b/gerbil-manager-web/public/farbschlaege/polarfuchsschimmel.jpg new file mode 100644 index 0000000..e22a585 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/polarfuchsschimmel.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/rotaugen-schimmel.jpg b/gerbil-manager-web/public/farbschlaege/rotaugen-schimmel.jpg new file mode 100644 index 0000000..bda3d96 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/rotaugen-schimmel.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/rotaugen-weiss-pew-d-sep-e-sep.jpg b/gerbil-manager-web/public/farbschlaege/rotaugen-weiss-pew-d-sep-e-sep.jpg new file mode 100644 index 0000000..f19a623 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/rotaugen-weiss-pew-d-sep-e-sep.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/rotfuchs-hell.jpg b/gerbil-manager-web/public/farbschlaege/rotfuchs-hell.jpg new file mode 100644 index 0000000..52e8284 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/rotfuchs-hell.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/rotfuchs.JPG b/gerbil-manager-web/public/farbschlaege/rotfuchs.JPG new file mode 100644 index 0000000..25de362 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/rotfuchs.JPG differ diff --git a/gerbil-manager-web/public/farbschlaege/rotfuchsschimmel.jpg b/gerbil-manager-web/public/farbschlaege/rotfuchsschimmel.jpg new file mode 100644 index 0000000..e9262c7 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/rotfuchsschimmel.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/saphir.jpg b/gerbil-manager-web/public/farbschlaege/saphir.jpg new file mode 100644 index 0000000..9c07d31 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/saphir.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/schimmel-orangeschimmel.jpg b/gerbil-manager-web/public/farbschlaege/schimmel-orangeschimmel.jpg new file mode 100644 index 0000000..2486a2a Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/schimmel-orangeschimmel.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/schwarz.jpg b/gerbil-manager-web/public/farbschlaege/schwarz.jpg new file mode 100644 index 0000000..e971395 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/schwarz.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/siam-marder-hell-dd.jpg b/gerbil-manager-web/public/farbschlaege/siam-marder-hell-dd.jpg new file mode 100644 index 0000000..8154a00 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/siam-marder-hell-dd.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/siam-marder-hell.JPG b/gerbil-manager-web/public/farbschlaege/siam-marder-hell.JPG new file mode 100644 index 0000000..9650fb8 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/siam-marder-hell.JPG differ diff --git a/gerbil-manager-web/public/farbschlaege/silberagouti-cp.JPG b/gerbil-manager-web/public/farbschlaege/silberagouti-cp.JPG new file mode 100644 index 0000000..bcf33de Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/silberagouti-cp.JPG differ diff --git a/gerbil-manager-web/public/farbschlaege/silberagouti-dd-cp.jpg b/gerbil-manager-web/public/farbschlaege/silberagouti-dd-cp.jpg new file mode 100644 index 0000000..f9dd1a4 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/silberagouti-dd-cp.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/silberagouti-dd.jpg b/gerbil-manager-web/public/farbschlaege/silberagouti-dd.jpg new file mode 100644 index 0000000..c8a3d08 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/silberagouti-dd.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/silberagouti-hell-dd-cp.jpg b/gerbil-manager-web/public/farbschlaege/silberagouti-hell-dd-cp.jpg new file mode 100644 index 0000000..9382c9d Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/silberagouti-hell-dd-cp.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/silberagouti.jpg b/gerbil-manager-web/public/farbschlaege/silberagouti.jpg new file mode 100644 index 0000000..435fd27 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/silberagouti.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/silberschimmel.jpg b/gerbil-manager-web/public/farbschlaege/silberschimmel.jpg new file mode 100644 index 0000000..64908a8 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/silberschimmel.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/topas-dd.jpg b/gerbil-manager-web/public/farbschlaege/topas-dd.jpg new file mode 100644 index 0000000..cb13e86 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/topas-dd.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/topas.jpg b/gerbil-manager-web/public/farbschlaege/topas.jpg new file mode 100644 index 0000000..1d8253f Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/topas.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/zobel-dd.jpg b/gerbil-manager-web/public/farbschlaege/zobel-dd.jpg new file mode 100644 index 0000000..f522f3d Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/zobel-dd.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/zobel-hell-dd.jpg b/gerbil-manager-web/public/farbschlaege/zobel-hell-dd.jpg new file mode 100644 index 0000000..988b250 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/zobel-hell-dd.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/zobel-hell.jpg b/gerbil-manager-web/public/farbschlaege/zobel-hell.jpg new file mode 100644 index 0000000..d96522b Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/zobel-hell.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/zobel.jpeg b/gerbil-manager-web/public/farbschlaege/zobel.jpeg new file mode 100644 index 0000000..c9cd8ac Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/zobel.jpeg differ diff --git a/gerbil-manager-web/public/farbschlaege/zur-scheckung1-punktschecken.jpg b/gerbil-manager-web/public/farbschlaege/zur-scheckung1-punktschecken.jpg new file mode 100644 index 0000000..96f368f Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/zur-scheckung1-punktschecken.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/zur-scheckung2-kragenschecken.jpg b/gerbil-manager-web/public/farbschlaege/zur-scheckung2-kragenschecken.jpg new file mode 100644 index 0000000..d4ed7a0 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/zur-scheckung2-kragenschecken.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/zur-scheckung3-starkschecken.jpg b/gerbil-manager-web/public/farbschlaege/zur-scheckung3-starkschecken.jpg new file mode 100644 index 0000000..b2a6f31 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/zur-scheckung3-starkschecken.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/zur-scheckung4-superschecken.jpg b/gerbil-manager-web/public/farbschlaege/zur-scheckung4-superschecken.jpg new file mode 100644 index 0000000..4167545 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/zur-scheckung4-superschecken.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/zur-scheckung5-dark-patch.jpg b/gerbil-manager-web/public/farbschlaege/zur-scheckung5-dark-patch.jpg new file mode 100644 index 0000000..fd336a7 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/zur-scheckung5-dark-patch.jpg differ diff --git a/gerbil-manager-web/public/farbschlaege/zur-scheckung6-minimalschecke-wp.jpeg b/gerbil-manager-web/public/farbschlaege/zur-scheckung6-minimalschecke-wp.jpeg new file mode 100644 index 0000000..424b745 Binary files /dev/null and b/gerbil-manager-web/public/farbschlaege/zur-scheckung6-minimalschecke-wp.jpeg differ diff --git a/gerbil-manager-web/src/genetics/__tests__/genetics.test.ts b/gerbil-manager-web/src/genetics/__tests__/genetics.test.ts index 7f761ea..af69e1a 100644 --- a/gerbil-manager-web/src/genetics/__tests__/genetics.test.ts +++ b/gerbil-manager-web/src/genetics/__tests__/genetics.test.ts @@ -17,6 +17,7 @@ import { wildType, } from '../genotype' import { combineLocus } from '../punnett' +import { LOCI, type LocusKey } from '../loci' import { farbschlagFor, genotypeToFarbschlag, @@ -25,6 +26,9 @@ import { CATALOG, CATALOG_SIZE, } from '../catalog' + +/** The first 18 entries are the frozen contract names (must round-trip exactly). */ +const FROZEN_COUNT = 18 import { breed } from '../breed' import { GeneticsWarningCode } from '../warnings' @@ -173,18 +177,38 @@ describe('Farbschlag catalog', () => { expect(match.name).toBe('Unbekannter Farbschlag') }) - it('has the expected catalogue coverage', () => { - expect(CATALOG_SIZE).toBe(18) + it('has the expected catalogue coverage (GEN-2: frozen 18 + 55 portal varieties)', () => { + expect(CATALOG_SIZE).toBe(73) }) - it('every catalog entry round-trips: its representative genotype maps back to its own name', () => { - // Guards the DB seed (DATA-2): a representative genotype that resolved to a - // DIFFERENT (earlier) variety would mean overlapping/mis-ordered patterns. - for (const entry of BASE_COLORS) { + it('frozen contract names round-trip to themselves (DB-key guard)', () => { + // The first 18 are the frozen ColorVariety keys — their representative + // genotype MUST resolve back to their own name, never a later variety. + for (const entry of BASE_COLORS.slice(0, FROZEN_COUNT)) { expect(genotypeToFarbschlag(representativeGenotype(entry))).toBe(entry.name) } }) + it('every entry resolves to a named variety (no self-Unbekannt)', () => { + // Each catalogued variety's representative genotype must resolve to SOME + // named variety — never "Unbekannt". Genotype-identical synonyms (e.g. + // "-hell") or entries that omit a locus may resolve to an earlier primary; + // that's expected first-match behaviour, not an error. + for (const entry of BASE_COLORS) { + expect(farbschlagFor(representativeGenotype(entry)).unknown).toBe(false) + } + }) + + it('has no duplicate variety names and only valid allele tokens', () => { + const names = BASE_COLORS.map((e) => e.name) + expect(new Set(names).size).toBe(names.length) + for (const entry of BASE_COLORS) { + for (const [locus, value] of Object.entries(entry.tokens)) { + expect(LOCI[locus as LocusKey].alleles).toContain(value) + } + } + }) + it('CATALOG seed view mirrors the ColorVariety table shape', () => { expect(CATALOG).toHaveLength(CATALOG_SIZE) expect(CATALOG[0]).toMatchObject({ name: 'Pink Eyed White (PEW)', sortOrder: 0 }) diff --git a/gerbil-manager-web/src/genetics/catalog.ts b/gerbil-manager-web/src/genetics/catalog.ts index 1865091..a9a5f3a 100644 --- a/gerbil-manager-web/src/genetics/catalog.ts +++ b/gerbil-manager-web/src/genetics/catalog.ts @@ -1,63 +1,122 @@ /** - * Farbschlag catalog: genotype -> German variety name. + * Farbschlag catalog: genotype -> German variety name + the full named catalog. * * A catalog entry matches when every locus it SPECIFIES equals the genotype's * phenotype token (see phenotype.ts). Unspecified loci are wildcards. The first - * matching base-colour entry wins; Schecke/Rex are appended as modifiers. + * matching entry wins; Schecke/Rex are appended as modifiers. * - * Coverage is partial by design — extend BASE_COLORS as more genotype tables - * are confirmed. Unknown genotypes fall back to "Unbekannter Farbschlag" plus - * the raw genotype string (handled by the caller / index.ts). + * Two roles, one list: + * - REVERSE MATCH (genotypeToFarbschlag): first match wins, so the frozen/base + * names are listed FIRST and win their token-set. Genotype-identical synonyms + * (e.g. "-hell" intensity variants) are listed after and simply won't be the + * reverse-match result — that's expected (shade isn't encoded in the 6 loci). + * - FULL NAMED LIST (CATALOG seed + dropdowns + images): every entry is a + * distinct user-pickable variety with its own image. * - * Sourced from the German gerbil-breeder community: - * - de.wikibooks.org/wiki/Die_Rennmaus/_Farbvarianten_und_Farbgenetik (black/red-eyed tables) - * - rennmaus-info.jimdoweb.com (loci & colourpoint series) - * - clan-of-topolino.ch, rennmauswelten.jimdofree.com (Zobel, Schimmel) + * Sources: + * - First 18: de.wikibooks Rennmaus-Farbgenetik, rennmaus-info, clan-of-topolino, + * rennmauswelten. These names are a FROZEN contract (DB keys) — never rename. + * - Remaining 55 (GEN-2): baseportal.de "Farben" DB (78 rows; 6 "zur Scheckung" + * meta rows dropped, 17 matched the frozen names). Genotypes normalized from + * portal notation (c[chm]->cchm, c[h]->ch, e[f]->ef, '-'/'--' = unknown). */ import { LOCUS_ORDER, type LocusKey } from './loci' import { makeGenotype, toDisplayString, wildType, type AllelePair, type Genotype } from './genotype' import { phenotypeTokens, type PhenotypeTokens } from './phenotype' export interface FarbschlagEntry { - /** German variety name. */ + /** German variety name. FROZEN for the original 18 (DB keys). */ readonly name: string /** Common English name (reference only; UI is German). */ readonly english?: string /** Required phenotype tokens; omitted loci are wildcards. */ readonly tokens: Partial> + /** Image filename under /farbschlaege/ (public), if available. */ + readonly image?: string } /** - * Base colours (the A/C/D/E/G/P phenotype). Ordered most-specific first so the - * earliest match wins. Colourpoint (C != "C") entries are naturally disjoint - * from full-colour ones because the C token differs. + * Ordered so the earliest match wins. The frozen 18 come first (they win their + * token-sets); the baseportal varieties follow, base before "-hell" within each + * portal collision group. */ export const BASE_COLORS: readonly FarbschlagEntry[] = [ - // ── Colourpoint / C-series (black & red eyed) ── - { name: 'Pink Eyed White (PEW)', english: 'Pink Eyed White', tokens: { C: 'ch', P: 'p' } }, - { name: 'Hermelin', english: 'Dark Tailed White', tokens: { A: 'a', C: 'ch', D: 'D', P: 'P' } }, - { name: 'Himalaya', english: 'Himalayan', tokens: { A: 'A', C: 'ch', D: 'D', P: 'P' } }, - { name: 'Zobel', english: 'Sable', tokens: { A: 'a', C: 'cchm', D: 'D', E: 'E', G: 'g', P: 'P' } }, - - // ── Schimmel / roan (ef ef) ── + // ── Frozen 18 (names are DB-key contract; do not rename) ── + { name: 'Pink Eyed White (PEW)', english: 'Pink Eyed White', tokens: { C: 'ch', P: 'p' }, image: 'rotaugen-weiss-pew-d-sep-e-sep.jpg' }, + { name: 'Hermelin', english: 'Dark Tailed White', tokens: { A: 'a', C: 'ch', D: 'D', P: 'P' }, image: 'hermelin.jpeg' }, + { name: 'Himalaya', english: 'Himalayan', tokens: { A: 'A', C: 'ch', D: 'D', P: 'P' }, image: 'himalaya.jpg' }, + { name: 'Zobel', english: 'Sable', tokens: { A: 'a', C: 'cchm', D: 'D', E: 'E', G: 'g', P: 'P' }, image: 'zobel.jpeg' }, { name: 'Schwarzschimmel', english: 'Black Roan', tokens: { C: 'C', D: 'D', E: 'ef', G: 'G', P: 'P' } }, - { name: 'Rotaugenschimmel', english: 'Red-Eyed Roan', tokens: { C: 'C', D: 'D', E: 'ef', G: 'G', P: 'p' } }, + { name: 'Rotaugenschimmel', english: 'Red-Eyed Roan', tokens: { C: 'C', D: 'D', E: 'ef', G: 'G', P: 'p' }, image: 'rotaugen-schimmel.jpg' }, + { name: 'Agouti', english: 'Golden Agouti', tokens: { A: 'A', C: 'C', D: 'D', E: 'E', G: 'G', P: 'P' }, image: 'agouti-mit-erklaerung-der-genloci.JPG' }, + { name: 'Schwarz', english: 'Black', tokens: { A: 'a', C: 'C', D: 'D', E: 'E', G: 'G', P: 'P' }, image: 'schwarz.jpg' }, + { name: 'Silberagouti', english: 'Grey Agouti', tokens: { A: 'A', C: 'C', D: 'D', E: 'E', G: 'g', P: 'P' }, image: 'silberagouti.jpg' }, + { name: 'Anthrazit', english: 'Slate', tokens: { A: 'a', C: 'C', D: 'D', E: 'E', G: 'g', P: 'P' }, image: 'anthrazit.jpg' }, + { name: 'Algierfuchs', english: 'Dark-Eyed Honey', tokens: { A: 'A', C: 'C', D: 'D', E: 'e', G: 'G', P: 'P' }, image: 'algierfuchs.jpg' }, + { name: 'Blau', english: 'Blue', tokens: { A: 'a', C: 'C', D: 'd', E: 'E', G: 'G', P: 'P' }, image: 'blau-schwarz-dd.JPG' }, + { name: 'Gold', english: 'Argente Golden', tokens: { A: 'A', C: 'C', D: 'D', E: 'E', G: 'G', P: 'p' }, image: 'gold.jpg' }, + { name: 'Platin', english: 'Lilac', tokens: { A: 'a', C: 'C', D: 'D', E: 'E', G: 'G', P: 'p' }, image: 'platin.JPG' }, + { name: 'Goldfuchs', english: 'Yellow Fox', tokens: { A: 'A', C: 'C', D: 'D', E: 'e', G: 'G', P: 'p' }, image: 'goldfuchs.jpg' }, + { name: 'Rotfuchs', english: 'Argente Nutmeg', tokens: { A: 'a', C: 'C', D: 'D', E: 'e', G: 'G', P: 'p' }, image: 'rotfuchs.JPG' }, + { name: 'dd Gold', english: 'dd Argente Golden', tokens: { A: 'A', C: 'C', D: 'd', E: 'E', G: 'G', P: 'p' }, image: 'gold-dd.jpg' }, + { name: 'dd Platin', english: 'dd Lilac', tokens: { A: 'a', C: 'C', D: 'd', E: 'E', G: 'G', P: 'p' }, image: 'platin-dd.jpg' }, - // ── Black-eyed full colour (P) ── - { name: 'Agouti', english: 'Golden Agouti', tokens: { A: 'A', C: 'C', D: 'D', E: 'E', G: 'G', P: 'P' } }, - { name: 'Schwarz', english: 'Black', tokens: { A: 'a', C: 'C', D: 'D', E: 'E', G: 'G', P: 'P' } }, - { name: 'Silberagouti', english: 'Grey Agouti', tokens: { A: 'A', C: 'C', D: 'D', E: 'E', G: 'g', P: 'P' } }, - { name: 'Anthrazit', english: 'Slate', tokens: { A: 'a', C: 'C', D: 'D', E: 'E', G: 'g', P: 'P' } }, - { name: 'Algierfuchs', english: 'Dark-Eyed Honey', tokens: { A: 'A', C: 'C', D: 'D', E: 'e', G: 'G', P: 'P' } }, - { name: 'Blau', english: 'Blue', tokens: { A: 'a', C: 'C', D: 'd', E: 'E', G: 'G', P: 'P' } }, - - // ── Red-eyed full colour (p) ── - { name: 'Gold', english: 'Argente Golden', tokens: { A: 'A', C: 'C', D: 'D', E: 'E', G: 'G', P: 'p' } }, - { name: 'Platin', english: 'Lilac', tokens: { A: 'a', C: 'C', D: 'D', E: 'E', G: 'G', P: 'p' } }, - { name: 'Goldfuchs', english: 'Yellow Fox', tokens: { A: 'A', C: 'C', D: 'D', E: 'e', G: 'G', P: 'p' } }, - { name: 'Rotfuchs', english: 'Argente Nutmeg', tokens: { A: 'a', C: 'C', D: 'D', E: 'e', G: 'G', P: 'p' } }, - { name: 'dd Gold', english: 'dd Argente Golden', tokens: { A: 'A', C: 'C', D: 'd', E: 'E', G: 'G', P: 'p' } }, - { name: 'dd Platin', english: 'dd Lilac', tokens: { A: 'a', C: 'C', D: 'd', E: 'E', G: 'G', P: 'p' } }, + // ── baseportal.de varieties (GEN-2), normalized to the frozen allele table ── + { name: 'Altweiss (REW)', tokens: { A: 'a', C: 'C', D: 'D', E: 'E', G: 'g', P: 'p' }, image: 'altweiss-rew.jpeg' }, + { name: 'Apricot (Blassfuchs)', tokens: { A: 'A', C: 'C', D: 'D', E: 'e', G: 'g', P: 'p' }, image: 'apricot-blassfuchs.jpg' }, + { name: 'Blaufuchs', tokens: { A: 'a', C: 'C', D: 'D', E: 'e', G: 'g', P: 'P' }, image: 'blaufuchs.jpg' }, + { name: 'C-Separator', tokens: { A: 'a', C: 'C', D: 'D', E: 'e', G: 'g', P: 'p' }, image: 'c-separator.jpg' }, + { name: 'Elfenbein', tokens: { A: 'A', C: 'C', D: 'D', E: 'E', G: 'g', P: 'p' }, image: 'elfenbein.jpg' }, + { name: 'Kohlfuchs', tokens: { A: 'a', C: 'C', D: 'D', E: 'e', G: 'G', P: 'P' }, image: 'kohlfuchs.jpg' }, + { name: 'Marder', tokens: { A: 'a', C: 'cchm', D: 'D', E: 'E', G: 'G', P: 'P' }, image: 'marder.JPG' }, + { name: 'Siam (Marder-Hell)', tokens: { A: 'a', C: 'cchm', D: 'D', E: 'E', G: 'G', P: 'P' }, image: 'siam-marder-hell.JPG' }, + { name: 'Polarfuchs', tokens: { A: 'A', C: 'C', D: 'D', E: 'e', G: 'g', P: 'P' }, image: 'polarfuchs.jpg' }, + { name: 'Saphir', tokens: { A: 'a', C: 'C', D: 'D', E: 'E', G: 'G', P: 'p' }, image: 'saphir.jpg' }, + { name: 'Schimmel (Orangeschimmel)', tokens: { C: 'C', D: 'D', E: 'ef', G: 'G', P: 'P' }, image: 'schimmel-orangeschimmel.jpg' }, + { name: 'Topas', tokens: { A: 'A', C: 'C', D: 'D', E: 'E', G: 'G', P: 'p' }, image: 'topas.jpg' }, + { name: 'Platin-Hell', tokens: { A: 'a', C: 'C', D: 'D', E: 'E', G: 'G', P: 'p' }, image: 'platin-hell.jpg' }, + { name: 'Agouti dd', tokens: { A: 'A', C: 'C', D: 'd', E: 'E', G: 'G', P: 'P' }, image: 'agouti-dd.jpg' }, + { name: 'Silberagouti dd', tokens: { A: 'A', C: 'C', D: 'd', E: 'E', G: 'g', P: 'P' }, image: 'silberagouti-dd.jpg' }, + { name: 'Kohlfuchs dd', tokens: { A: 'a', C: 'C', D: 'd', E: 'e', G: 'G', P: 'P' }, image: 'kohlfuchs-dd.jpg' }, + { name: 'Anthrazit dd', tokens: { A: 'a', C: 'C', D: 'd', E: 'E', G: 'g', P: 'P' }, image: 'anthrazit-dd.jpg' }, + { name: 'Agouti CP-Hell', tokens: { A: 'A', C: 'cchm', D: 'D', E: 'E', G: 'G', P: 'P' }, image: 'agouti-cp-hell.JPG' }, + { name: 'Blaufuchs CP', tokens: { A: 'a', C: 'cchm', D: 'D', E: 'e', G: 'g', P: 'P' }, image: 'blaufuchs-cp.jpg' }, + { name: 'Polarfuchsschimmel', tokens: { A: 'A', C: 'C', D: 'D', E: 'ef', G: 'g', P: 'P' }, image: 'polarfuchsschimmel.jpg' }, + { name: 'Silberschimmel', tokens: { C: 'C', D: 'D', E: 'ef', G: 'g', P: 'P' }, image: 'silberschimmel.jpg' }, + { name: 'Algierfuchsschimmel', tokens: { A: 'A', C: 'C', D: 'D', E: 'ef', G: 'G', P: 'P' }, image: 'algierfuchsschimmel.jpg' }, + { name: 'Polarfuchs-Hell CP', tokens: { A: 'A', C: 'cchm', D: 'D', E: 'e', G: 'g', P: 'P' }, image: 'polarfuchs-hell-cp.jpg' }, + { name: 'Kohlfuchsschimmel', tokens: { A: 'a', C: 'C', D: 'D', E: 'ef', G: 'G', P: 'P' }, image: 'kohlfuchsschimmel.jpg' }, + { name: 'Blaufuchsschimmel', tokens: { A: 'a', C: 'C', D: 'D', E: 'ef', G: 'g', P: 'P' }, image: 'blaufuchsschimmel.jpg' }, + { name: 'Kohlfuchs, hell', tokens: { A: 'a', C: 'C', D: 'D', E: 'e', G: 'G', P: 'P' }, image: 'kohlfuchs-hell.jpg' }, + { name: 'Goldfuchs, hell', tokens: { A: 'A', C: 'C', D: 'D', E: 'e', G: 'G', P: 'p' }, image: 'goldfuchs-hell.jpg' }, + { name: 'Goldfuchsschimmel', tokens: { A: 'A', C: 'C', D: 'D', E: 'ef', G: 'G', P: 'p' }, image: 'goldfuchsschimmel.jpg' }, + { name: 'Gold-Hell', tokens: { A: 'A', C: 'C', D: 'D', E: 'E', G: 'G', P: 'p' }, image: 'gold-hell.jpg' }, + { name: 'Siam (Marder-Hell) dd', tokens: { A: 'a', C: 'cchm', D: 'd', E: 'E', G: 'G', P: 'P' }, image: 'siam-marder-hell-dd.jpg' }, + { name: 'Marder dd', tokens: { A: 'a', C: 'cchm', D: 'd', E: 'E', G: 'G', P: 'P' }, image: 'marder-dd.jpg' }, + { name: 'Zobel-Hell', tokens: { A: 'a', C: 'cchm', D: 'D', E: 'E', G: 'g', P: 'P' }, image: 'zobel-hell.jpg' }, + { name: 'Silberagouti dd CP', tokens: { A: 'A', C: 'cchm', D: 'd', E: 'E', G: 'g', P: 'P' }, image: 'silberagouti-dd-cp.jpg' }, + { name: 'Silberagouti-Hell dd CP', tokens: { A: 'A', C: 'cchm', D: 'd', E: 'E', G: 'g', P: 'P' }, image: 'silberagouti-hell-dd-cp.jpg' }, + { name: 'Agouti dd CP', tokens: { A: 'A', C: 'cchm', D: 'd', E: 'E', G: 'G', P: 'P' }, image: 'agouti-dd-cp.jpg' }, + { name: 'Agouti-Hell dd CP', tokens: { A: 'A', C: 'cchm', D: 'd', E: 'E', G: 'G', P: 'P' }, image: 'agouti-hell-dd-cp.jpg' }, + { name: 'Blaufuchs, hell', tokens: { A: 'a', C: 'C', D: 'D', E: 'e', G: 'g', P: 'P' }, image: 'blaufuchs-hell.jpeg' }, + { name: 'Rotfuchsschimmel', tokens: { A: 'a', C: 'C', D: 'D', E: 'ef', G: 'G', P: 'p' }, image: 'rotfuchsschimmel.jpg' }, + { name: 'Polarfuchs, hell', tokens: { A: 'A', C: 'C', D: 'D', E: 'e', G: 'g', P: 'P' }, image: 'polarfuchs-hell.jpeg' }, + { name: 'Kohlfuchsschimmel, hell', tokens: { A: 'a', C: 'C', D: 'D', E: 'ef', G: 'G', P: 'P' }, image: 'kohlfuchsschimmel-hell.jpg' }, + { name: 'Rotfuchs, hell', tokens: { A: 'a', C: 'C', D: 'D', E: 'e', G: 'G', P: 'p' }, image: 'rotfuchs-hell.jpg' }, + { name: 'Zobel dd', tokens: { A: 'a', C: 'cchm', D: 'd', E: 'E', G: 'g', P: 'P' }, image: 'zobel-dd.jpg' }, + { name: 'Kohlfuchs-Hell', tokens: { A: 'a', C: 'C', D: 'D', E: 'e', G: 'G', P: 'P' }, image: 'kohlfuchs-hell-2.jpg' }, + { name: 'Kohlfuchs CP', tokens: { A: 'a', C: 'cchm', D: 'D', E: 'e', G: 'G', P: 'P' }, image: 'kohlfuchs-cp.jpg' }, + { name: 'Algierfuchs CP', tokens: { A: 'A', C: 'cchm', D: 'D', E: 'e', G: 'G', P: 'P' }, image: 'algierfuchs-cp.jpg' }, + { name: 'Silberagouti CP', tokens: { A: 'A', C: 'cchm', D: 'D', E: 'E', G: 'g', P: 'P' }, image: 'silberagouti-cp.JPG' }, + { name: 'Agouti CP', tokens: { A: 'A', C: 'cchm', D: 'D', E: 'E', G: 'G', P: 'P' }, image: 'agouti-cp.jpg' }, + { name: 'Algierfuchs-Hell CP', tokens: { A: 'A', C: 'cchm', D: 'D', E: 'e', G: 'G', P: 'P' }, image: 'algierfuchs-hell-cp.jpg' }, + { name: 'Kohlfuchs,hell CP', tokens: { A: 'a', C: 'cchm', D: 'D', E: 'e', G: 'G', P: 'P' }, image: 'kohlfuchs-hell-cp.jpg' }, + { name: 'Polarfuchs CP', tokens: { A: 'A', C: 'cchm', D: 'D', E: 'e', G: 'g', P: 'P' }, image: 'polarfuchs-cp.jpg' }, + { name: 'Algierfuchs, hell', tokens: { A: 'A', C: 'C', D: 'D', E: 'e', G: 'G', P: 'P' }, image: 'algierfuchs-hell.JPG' }, + { name: 'Topas dd', tokens: { A: 'A', C: 'C', D: 'd', E: 'E', G: 'G', P: 'p' }, image: 'topas-dd.jpg' }, + { name: 'Zobel-Hell dd', tokens: { A: 'a', C: 'cchm', D: 'd', E: 'E', G: 'g', P: 'P' }, image: 'zobel-hell-dd.jpg' }, + { name: 'Kohlfuchsschimmel CP', tokens: { A: 'a', C: 'cchm', D: 'D', E: 'ef', G: 'G', P: 'P' }, image: 'kohlfuchsschimmel-cp.JPG' }, + { name: 'Blaufuchs dd', tokens: { A: 'a', C: 'C', D: 'd', E: 'e', G: 'g', P: 'p' }, image: 'blaufuchs-dd.jpg' }, ] export const UNKNOWN_FARBSCHLAG = 'Unbekannter Farbschlag' @@ -122,7 +181,7 @@ export function representativeGenotype(entry: FarbschlagEntry): Genotype { /** * DB seed view for DATA-2's ColorVariety table. Each row mirrors the table - * shape (Name, CanonicalGenotype, SortOrder). SortOrder = catalog position. + * shape (Name, CanonicalGenotype, SortOrder, ImageFile). SortOrder = position. * * IMPORTANT: `name` values become DB keys the UI filters on — renames are * BREAKING changes and must be routed through god. Adding new varieties is safe. @@ -132,6 +191,7 @@ export interface ColorVarietySeed { readonly english?: string readonly canonicalGenotype: string readonly sortOrder: number + readonly image?: string } export const CATALOG: readonly ColorVarietySeed[] = BASE_COLORS.map((entry, i) => ({ @@ -139,7 +199,18 @@ export const CATALOG: readonly ColorVarietySeed[] = BASE_COLORS.map((entry, i) = english: entry.english, canonicalGenotype: toDisplayString(representativeGenotype(entry)), sortOrder: i, + image: entry.image, })) -/** Number of base-colour varieties currently catalogued. */ +/** Number of catalogued varieties. */ export const CATALOG_SIZE = BASE_COLORS.length + +/** Public path to a Farbschlag image (served from gerbil-manager-web/public). */ +export function farbschlagImageUrl(image: string | undefined): string | null { + return image ? `/farbschlaege/${image}` : null +} + +/** Look up a catalog entry by exact variety name. */ +export function findVariety(name: string): FarbschlagEntry | undefined { + return BASE_COLORS.find((e) => e.name === name) +} diff --git a/gerbil-manager-web/src/genetics/index.ts b/gerbil-manager-web/src/genetics/index.ts index 97801e0..bff8454 100644 --- a/gerbil-manager-web/src/genetics/index.ts +++ b/gerbil-manager-web/src/genetics/index.ts @@ -34,6 +34,8 @@ export { farbschlagFor, genotypeToFarbschlag, representativeGenotype, + farbschlagImageUrl, + findVariety, BASE_COLORS, CATALOG, CATALOG_SIZE,