1const CURATED_ANIMAL_VARIANTS = { 2 // 1. FOX (Guitar Family) 3 fox: [ 4 { 5 id: "fox_0", 6 variantIndex: 0, 7 label: "Red Fox (First Chair / Lead)", 8 furColor: "#eb6a24", 9 sleeveColor: "#eb6a24", 10 strokeColor: "#3d180a", 11 strokeWidth: 2.5, 12 hueShift: 0, 13 saturate: 1, 14 brightness: 1, 15 costumeIds: ["cool_sunglasses", "brown_vest"], 16 scaleMultiplier: 1, 17 hatTilt: 0 18 }, 19 { 20 id: "fox_1", 21 variantIndex: 1, 22 label: "Silver / Charcoal Fox (Rhythm)", 23 furColor: "#4b5563", 24 sleeveColor: "#4b5563", 25 strokeColor: "#1e293b", 26 strokeWidth: 2.5, 27 hueShift: 195, 28 saturate: 0.35, 29 brightness: 0.75, 30 costumeIds: ["sp_stan_beanie", "striped_scarf"], 31 scaleMultiplier: 1.04, 32 hatTilt: -3 33 }, 34 { 35 id: "fox_2", 36 variantIndex: 2, 37 label: "Arctic Sand Fox (Acoustic)", 38 furColor: "#e2d5c3", 39 sleeveColor: "#e2d5c3", 40 strokeColor: "#634b35", 41 strokeWidth: 2.5, 42 hueShift: 35, 43 saturate: 0.65, 44 brightness: 1.25, 45 costumeIds: ["red_bow_tie", "nerd_glasses"], 46 scaleMultiplier: 0.96, 47 hatTilt: 3 48 } 49 ], 50 // 2. BEAR (Organ Family) 51 bear: [ 52 { 53 id: "bear_0", 54 variantIndex: 0, 55 label: "Grizzly Brown Bear (Primary)", 56 furColor: "#8c5c3e", 57 sleeveColor: "#8c5c3e", 58 strokeColor: "#382012", 59 strokeWidth: 2.5, 60 hueShift: 0, 61 saturate: 1, 62 brightness: 1, 63 costumeIds: ["sp_top_hat", "red_bow_tie"], 64 scaleMultiplier: 1, 65 hatTilt: 0 66 }, 67 { 68 id: "bear_1", 69 variantIndex: 1, 70 label: "Black Forest Bear (Shadow)", 71 furColor: "#292524", 72 sleeveColor: "#292524", 73 strokeColor: "#12100e", 74 strokeWidth: 2.5, 75 hueShift: 0, 76 saturate: 0.3, 77 brightness: 0.52, 78 costumeIds: ["cool_sunglasses", "gold_chain"], 79 scaleMultiplier: 1.05, 80 hatTilt: -4 81 }, 82 { 83 id: "bear_2", 84 variantIndex: 2, 85 label: "Cinnamon Blonde Bear (Honey)", 86 furColor: "#b45309", 87 sleeveColor: "#b45309", 88 strokeColor: "#451a03", 89 strokeWidth: 2.5, 90 hueShift: 25, 91 saturate: 1.3, 92 brightness: 1.15, 93 costumeIds: ["sp_cowboy_hat", "bandana"], 94 scaleMultiplier: 0.96, 95 hatTilt: 4 96 } 97 ], 98 // 3. WOLF (Bass Family) 99 wolf: [ 100 { 101 id: "wolf_0", 102 variantIndex: 0, 103 label: "Timber Wolf (Upright / Lead Bass)", 104 furColor: "#7d8692", 105 sleeveColor: "#7d8692", 106 strokeColor: "#242930", 107 strokeWidth: 2.5, 108 hueShift: 0, 109 saturate: 1, 110 brightness: 1, 111 costumeIds: ["cool_sunglasses"], 112 scaleMultiplier: 1, 113 hatTilt: 0 114 }, 115 { 116 id: "wolf_1", 117 variantIndex: 1, 118 label: "Midnight Shadow Wolf (Synth Bass)", 119 furColor: "#27272a", 120 sleeveColor: "#27272a", 121 strokeColor: "#09090b", 122 strokeWidth: 2.5, 123 hueShift: 0, 124 saturate: 0.2, 125 brightness: 0.48, 126 costumeIds: ["villain_goatee", "gold_chain"], 127 scaleMultiplier: 1.04, 128 hatTilt: -3 129 }, 130 { 131 id: "wolf_2", 132 variantIndex: 2, 133 label: "Arctic White Wolf (Slap Bass)", 134 furColor: "#e2e8f0", 135 sleeveColor: "#e2e8f0", 136 strokeColor: "#475569", 137 strokeWidth: 2.5, 138 hueShift: 210, 139 saturate: 0.25, 140 brightness: 1.32, 141 costumeIds: ["sp_kyle_ushanka", "striped_scarf"], 142 scaleMultiplier: 0.96, 143 hatTilt: 3 144 } 145 ], 146 // 4. LION (Brass Family) 147 lion: [ 148 { 149 id: "lion_0", 150 variantIndex: 0, 151 label: "Savanna Gold Lion (1st Trumpet)", 152 furColor: "#e09f3e", 153 sleeveColor: "#e09f3e", 154 strokeColor: "#52320b", 155 strokeWidth: 2.5, 156 hueShift: 0, 157 saturate: 1, 158 brightness: 1, 159 costumeIds: ["gold_chain"], 160 scaleMultiplier: 1, 161 hatTilt: 0 162 }, 163 { 164 id: "lion_1", 165 variantIndex: 1, 166 label: "White Platinum Lion (Trombone)", 167 furColor: "#dcd3c2", 168 sleeveColor: "#dcd3c2", 169 strokeColor: "#574c38", 170 strokeWidth: 2.5, 171 hueShift: 30, 172 saturate: 0.4, 173 brightness: 1.25, 174 costumeIds: ["sp_top_hat", "black_bow_tie"], 175 scaleMultiplier: 1.04, 176 hatTilt: -3 177 }, 178 { 179 id: "lion_2", 180 variantIndex: 2, 181 label: "Dark Mane Russet Lion (French Horn)", 182 furColor: "#92400e", 183 sleeveColor: "#92400e", 184 strokeColor: "#381604", 185 strokeWidth: 2.5, 186 hueShift: -18, 187 saturate: 1.2, 188 brightness: 0.85, 189 costumeIds: ["sp_cowboy_hat", "bandana"], 190 scaleMultiplier: 0.97, 191 hatTilt: 3 192 } 193 ], 194 // 5. OWL (Pipe / Flute Family) 195 owl: [ 196 { 197 id: "owl_0", 198 variantIndex: 0, 199 label: "Barn Owl (Concert Flute)", 200 furColor: "#8b5a2b", 201 sleeveColor: "#8b5a2b", 202 strokeColor: "#36210c", 203 strokeWidth: 2.5, 204 hueShift: 0, 205 saturate: 1, 206 brightness: 1, 207 costumeIds: ["nerd_glasses"], 208 scaleMultiplier: 1, 209 hatTilt: 0 210 }, 211 { 212 id: "owl_1", 213 variantIndex: 1, 214 label: "Snowy Arctic Owl (Piccolo)", 215 furColor: "#e2e8f0", 216 sleeveColor: "#e2e8f0", 217 strokeColor: "#475569", 218 strokeWidth: 2.5, 219 hueShift: 180, 220 saturate: 0.2, 221 brightness: 1.35, 222 costumeIds: ["sp_wizard_hat", "red_bow_tie"], 223 scaleMultiplier: 0.95, 224 hatTilt: -4 225 }, 226 { 227 id: "owl_2", 228 variantIndex: 2, 229 label: "Great Horned Owl (Pan Flute)", 230 furColor: "#52433d", 231 sleeveColor: "#52433d", 232 strokeColor: "#201815", 233 strokeWidth: 2.5, 234 hueShift: -25, 235 saturate: 0.7, 236 brightness: 0.78, 237 costumeIds: ["monocle", "brown_vest"], 238 scaleMultiplier: 1.03, 239 hatTilt: 3 240 } 241 ], 242 // 6. RACCOON (Drum / Percussion Family) 243 raccoon: [ 244 { 245 id: "raccoon_0", 246 variantIndex: 0, 247 label: "Bandit Mask Raccoon (Drum Kit)", 248 furColor: "#757575", 249 sleeveColor: "#757575", 250 strokeColor: "#262626", 251 strokeWidth: 2.5, 252 hueShift: 0, 253 saturate: 1, 254 brightness: 1, 255 costumeIds: ["sp_cartman_beanie"], 256 scaleMultiplier: 1, 257 hatTilt: 0 258 }, 259 { 260 id: "raccoon_1", 261 variantIndex: 1, 262 label: "Slate Shadow Raccoon (Rock Drums)", 263 furColor: "#3f3f46", 264 sleeveColor: "#3f3f46", 265 strokeColor: "#18181b", 266 strokeWidth: 2.5, 267 hueShift: 0, 268 saturate: 0.25, 269 brightness: 0.65, 270 costumeIds: ["pirate_eyepatch", "bandana"], 271 scaleMultiplier: 1.03, 272 hatTilt: -4 273 }, 274 { 275 id: "raccoon_2", 276 variantIndex: 2, 277 label: "Toasted Cinnamon Raccoon (Percussion Fill)", 278 furColor: "#c2a68c", 279 sleeveColor: "#c2a68c", 280 strokeColor: "#4f3c2c", 281 strokeWidth: 2.5, 282 hueShift: 40, 283 saturate: 1.1, 284 brightness: 1.18, 285 costumeIds: ["sp_stan_beanie", "red_bow_tie"], 286 scaleMultiplier: 0.97, 287 hatTilt: 3 288 } 289 ], 290 // 7. HAMSTER (Piano / Keyboard Family) 291 hamster: [ 292 { 293 id: "hamster_0", 294 variantIndex: 0, 295 label: "Syrian Golden Hamster (Grand Piano)", 296 furColor: "#d99d5a", 297 sleeveColor: "#d99d5a", 298 strokeColor: "#6c412c", 299 strokeWidth: 1.3, 300 hueShift: 0, 301 saturate: 1, 302 brightness: 1, 303 costumeIds: ["sp_top_hat", "red_bow_tie"], 304 scaleMultiplier: 1, 305 hatTilt: 0 306 }, 307 { 308 id: "hamster_1", 309 variantIndex: 1, 310 label: "Roborovski Cream Hamster (Rhodes)", 311 furColor: "#f5e6ca", 312 sleeveColor: "#f5e6ca", 313 strokeColor: "#785b37", 314 strokeWidth: 1.3, 315 hueShift: 20, 316 saturate: 0.75, 317 brightness: 1.28, 318 costumeIds: ["nerd_glasses", "black_bow_tie"], 319 scaleMultiplier: 0.95, 320 hatTilt: -3 321 }, 322 { 323 id: "hamster_2", 324 variantIndex: 2, 325 label: "Panda Dwarf Hamster (Clavinet)", 326 furColor: "#334155", 327 sleeveColor: "#334155",
328 strokeColor: "#0f172a", 329 strokeWidth: 1.3, 330 hueShift: 205, 331 saturate: 0.45, 332 brightness: 0.65, 333 costumeIds: ["cool_sunglasses", "gold_chain"], 334 scaleMultiplier: 1.04, 335 hatTilt: 4 336 } 337 ], 338 // 8. OTTER (Chromatic Mallet Family) 339 otter: [ 340 { 341 id: "otter_0", 342 variantIndex: 0, 343 label: "River Otter (Vibraphone)", 344 furColor: "#ad7557", 345 sleeveColor: "#ad7557", 346 strokeColor: "#422617", 347 strokeWidth: 1.3, 348 hueShift: 0, 349 saturate: 1, 350 brightness: 1, 351 costumeIds: ["striped_scarf"], 352 scaleMultiplier: 1, 353 hatTilt: 0 354 }, 355 { 356 id: "otter_1", 357 variantIndex: 1, 358 label: "Sea Otter Dark Seal (Marimba)", 359 furColor: "#452c1e", 360 sleeveColor: "#452c1e", 361 strokeColor: "#1a0e08", 362 strokeWidth: 1.3, 363 hueShift: 0, 364 saturate: 0.5, 365 brightness: 0.58, 366 costumeIds: ["nerd_glasses", "brown_vest"], 367 scaleMultiplier: 1.04, 368 hatTilt: -4 369 }, 370 { 371 id: "otter_2", 372 variantIndex: 2, 373 label: "Amber River Otter (Xylophone)", 374 furColor: "#c99a6b", 375 sleeveColor: "#c99a6b", 376 strokeColor: "#573d23", 377 strokeWidth: 1.3, 378 hueShift: 28, 379 saturate: 1.25, 380 brightness: 1.2, 381 costumeIds: ["sp_cowboy_hat", "red_bow_tie"], 382 scaleMultiplier: 0.96, 383 hatTilt: 4 384 } 385 ], 386 // 9. DEER (Strings / Violins Family) 387 deer: [ 388 { 389 id: "deer_0", 390 variantIndex: 0, 391 label: "Fawn Tan Deer (1st Violin / Concertmaster)", 392 furColor: "#ebbe6c", 393 sleeveColor: "#ebbe6c", 394 strokeColor: "#5c371e", 395 strokeWidth: 1.3, 396 hueShift: 0, 397 saturate: 1, 398 brightness: 1, 399 costumeIds: ["sp_top_hat", "red_bow_tie"], 400 scaleMultiplier: 1, 401 hatTilt: 0 402 }, 403 { 404 id: "deer_1", 405 variantIndex: 1, 406 label: "Red Chestnut Deer (2nd Violin)", 407 furColor: "#a14e28", 408 sleeveColor: "#a14e28", 409 strokeColor: "#421a0a", 410 strokeWidth: 1.3, 411 hueShift: -15, 412 saturate: 1.25, 413 brightness: 0.88, 414 costumeIds: ["green_jacket", "black_bow_tie"], 415 scaleMultiplier: 1.04, 416 hatTilt: -3 417 }, 418 { 419 id: "deer_2", 420 variantIndex: 2, 421 label: "Frost Piebald Deer (Viola)", 422 furColor: "#ded4c3", 423 sleeveColor: "#ded4c3", 424 strokeColor: "#5c5243", 425 strokeWidth: 1.3, 426 hueShift: 35, 427 saturate: 0.45, 428 brightness: 1.24, 429 costumeIds: ["striped_scarf", "nerd_glasses"], 430 scaleMultiplier: 0.96, 431 hatTilt: 3 432 } 433 ], 434 // 10. PENGUIN (Ensemble / Choirs Family) 435 penguin: [ 436 { 437 id: "penguin_0", 438 variantIndex: 0, 439 label: "Emperor Classic Penguin (Choir A)", 440 furColor: "#7d7c7e", 441 sleeveColor: "#7d7c7e", 442 strokeColor: "#1a202c", 443 strokeWidth: 1.3, 444 hueShift: 0, 445 saturate: 1, 446 brightness: 1, 447 costumeIds: ["black_bow_tie"], 448 scaleMultiplier: 1, 449 hatTilt: 0 450 }, 451 { 452 id: "penguin_1", 453 variantIndex: 1, 454 label: "Blue Fairy Penguin (Choir B)", 455 furColor: "#334155", 456 sleeveColor: "#334155", 457 strokeColor: "#0f172a", 458 strokeWidth: 1.3, 459 hueShift: 215, 460 saturate: 0.85, 461 brightness: 0.78, 462 costumeIds: ["cool_sunglasses", "striped_scarf"], 463 scaleMultiplier: 0.94, 464 hatTilt: -4 465 }, 466 { 467 id: "penguin_2", 468 variantIndex: 2, 469 label: "Gentoo Midnight Penguin (Orchestra Hit)", 470 furColor: "#1e293b", 471 sleeveColor: "#1e293b", 472 strokeColor: "#020617", 473 strokeWidth: 1.3, 474 hueShift: 0, 475 saturate: 0.2, 476 brightness: 0.45, 477 costumeIds: ["sp_top_hat", "gold_chain"], 478 scaleMultiplier: 1.04, 479 hatTilt: 4 480 } 481 ], 482 // 11. BADGER (Reed / Saxophone Family) 483 badger: [ 484 { 485 id: "badger_0", 486 variantIndex: 0, 487 label: "European Badger (Tenor Sax)", 488 furColor: "#807f7e", 489 sleeveColor: "#807f7e", 490 strokeColor: "#242c38", 491 strokeWidth: 1.3, 492 hueShift: 0, 493 saturate: 1, 494 brightness: 1, 495 costumeIds: ["green_jacket"], 496 scaleMultiplier: 1, 497 hatTilt: 0 498 }, 499 { 500 id: "badger_1", 501 variantIndex: 1, 502 label: "Honey Blonde Badger (Alto Sax)", 503 furColor: "#d4af7a", 504 sleeveColor: "#d4af7a", 505 strokeColor: "#5e482b", 506 strokeWidth: 1.3, 507 hueShift: 38, 508 saturate: 1.25, 509 brightness: 1.25, 510 costumeIds: ["sp_cowboy_hat", "bandana"], 511 scaleMultiplier: 0.98, 512 hatTilt: -3 513 }, 514 { 515 id: "badger_2", 516 variantIndex: 2, 517 label: "Graphite Silver Badger (Baritone Sax)", 518 furColor: "#475569", 519 sleeveColor: "#475569", 520 strokeColor: "#1e293b", 521 strokeWidth: 1.3, 522 hueShift: 200, 523 saturate: 0.45, 524 brightness: 0.72, 525 costumeIds: ["monocle", "red_bow_tie"], 526 scaleMultiplier: 1.04, 527 hatTilt: 3 528 } 529 ], 530 // 12. RABBIT (Synth Lead Family) 531 rabbit: [ 532 { 533 id: "rabbit_0", 534 variantIndex: 0, 535 label: "Cinnamon Cottontail (Square Lead)", 536 furColor: "#d7a666", 537 sleeveColor: "#d7a666", 538 strokeColor: "#735e52", 539 strokeWidth: 1.3, 540 hueShift: 0, 541 saturate: 1, 542 brightness: 1, 543 costumeIds: ["sp_wizard_hat"], 544 scaleMultiplier: 1, 545 hatTilt: 0 546 }, 547 { 548 id: "rabbit_1", 549 variantIndex: 1, 550 label: "Snowshoe White Hare (Sawtooth Lead)", 551 furColor: "#f1f5f9", 552 sleeveColor: "#f1f5f9", 553 strokeColor: "#475569", 554 strokeWidth: 1.3, 555 hueShift: 180, 556 saturate: 0.15, 557 brightness: 1.35, 558 costumeIds: ["sp_kyle_ushanka", "red_bow_tie"], 559 scaleMultiplier: 0.95, 560 hatTilt: -4 561 }, 562 { 563 id: "rabbit_2", 564 variantIndex: 2, 565 label: "Dutch Charcoal Lop (Sync Lead)", 566 furColor: "#374151", 567 sleeveColor: "#374151", 568 strokeColor: "#111827", 569 strokeWidth: 1.3, 570 hueShift: 0, 571 saturate: 0.25, 572 brightness: 0.6, 573 costumeIds: ["cool_sunglasses", "gold_chain"], 574 scaleMultiplier: 1.04, 575 hatTilt: 4 576 } 577 ], 578 // 13. KOALA (Synth Pad Family) 579 koala: [ 580 { 581 id: "koala_0", 582 variantIndex: 0, 583 label: "Eucalyptus Grey Koala (Warm Pad)", 584 furColor: "#b4a696", 585 sleeveColor: "#b4a696", 586 strokeColor: "#474440", 587 strokeWidth: 1.3, 588 hueShift: 0, 589 saturate: 1, 590 brightness: 1, 591 costumeIds: ["nerd_glasses"], 592 scaleMultiplier: 1, 593 hatTilt: 0 594 }, 595 { 596 id: "koala_1", 597 variantIndex: 1, 598 label: "Silver Ash Koala (Bowed Glass)", 599 furColor: "#64748b", 600 sleeveColor: "#64748b", 601 strokeColor: "#1e293b", 602 strokeWidth: 1.3, 603 hueShift: 210, 604 saturate: 0.6, 605 brightness: 0.82, 606 costumeIds: ["sp_cartman_beanie", "striped_scarf"], 607 scaleMultiplier: 1.04, 608 hatTilt: -3 609 }, 610 { 611 id: "koala_2", 612 variantIndex: 2, 613 label: "Sunlit Bush Koala (Halo Pad)", 614 furColor: "#cfbeaa", 615 sleeveColor: "#cfbeaa", 616 strokeColor: "#5c4e3f", 617 strokeWidth: 1.3, 618 hueShift: 30, 619 saturate: 0.85, 620 brightness: 1.22, 621 costumeIds: ["red_bow_tie", "brown_vest"], 622 scaleMultiplier: 0.96, 623 hatTilt: 3 624 } 625 ], 626 // 14. BAT (Synth Effects Family) 627 bat: [ 628 { 629 id: "bat_0", 630 variantIndex: 0, 631 label: "Twilight Purple Bat (Sci-Fi FX)",
632 furColor: "#836174", 633 sleeveColor: "#836174", 634 strokeColor: "#2e1b36", 635 strokeWidth: 1.3, 636 hueShift: 0, 637 saturate: 1, 638 brightness: 1, 639 costumeIds: ["superhero_cape"], 640 scaleMultiplier: 1, 641 hatTilt: 0 642 }, 643 { 644 id: "bat_1", 645 variantIndex: 1, 646 label: "Midnight Raven Bat (Goblins / Echo)", 647 furColor: "#1f242d", 648 sleeveColor: "#1f242d", 649 strokeColor: "#090b10", 650 strokeWidth: 1.3, 651 hueShift: 240, 652 saturate: 0.35, 653 brightness: 0.45, 654 costumeIds: ["sp_top_hat", "villain_goatee"], 655 scaleMultiplier: 1.05, 656 hatTilt: -4 657 }, 658 { 659 id: "bat_2", 660 variantIndex: 2, 661 label: "Golden Flying Fox (Atmosphere)", 662 furColor: "#a16207", 663 sleeveColor: "#a16207", 664 strokeColor: "#451a03", 665 strokeWidth: 1.3, 666 hueShift: 65, 667 saturate: 1.35, 668 brightness: 1.15, 669 costumeIds: ["monocle", "gold_chain"], 670 scaleMultiplier: 0.96, 671 hatTilt: 4 672 } 673 ], 674 // 15. LLAMA (Ethnic Family) 675 llama: [ 676 { 677 id: "llama_0", 678 variantIndex: 0, 679 label: "Alpaca Cream Llama (Sitar / Banjo)", 680 furColor: "#ebe3d1", 681 sleeveColor: "#ebe3d1", 682 strokeColor: "#75644d", 683 strokeWidth: 1.3, 684 hueShift: 0, 685 saturate: 1, 686 brightness: 1, 687 costumeIds: ["cool_sunglasses"], 688 scaleMultiplier: 1, 689 hatTilt: 0 690 }, 691 { 692 id: "llama_1", 693 variantIndex: 1, 694 label: "Andean Mocha Llama (Koto / Shamisen)", 695 furColor: "#784c32", 696 sleeveColor: "#784c32", 697 strokeColor: "#361e11", 698 strokeWidth: 1.3, 699 hueShift: -25, 700 saturate: 1.1, 701 brightness: 0.72, 702 costumeIds: ["bandana", "sp_cowboy_hat"], 703 scaleMultiplier: 1.04, 704 hatTilt: -3 705 }, 706 { 707 id: "llama_2", 708 variantIndex: 2, 709 label: "Midnight Slate Llama (Bagpipe / Kalimba)", 710 furColor: "#334155", 711 sleeveColor: "#334155", 712 strokeColor: "#0f172a", 713 strokeWidth: 1.3, 714 hueShift: 210, 715 saturate: 0.4, 716 brightness: 0.62, 717 costumeIds: ["striped_scarf", "nerd_glasses"], 718 scaleMultiplier: 0.97, 719 hatTilt: 3 720 } 721 ], 722 // 16. GORILLA (Percussive / Drums Family) 723 gorilla: [ 724 { 725 id: "gorilla_0", 726 variantIndex: 0, 727 label: "Silverback Granite Gorilla (Timpani)", 728 furColor: "#606369", 729 sleeveColor: "#606369", 730 strokeColor: "#1c1d22", 731 strokeWidth: 1.3, 732 hueShift: 0, 733 saturate: 1, 734 brightness: 1, 735 costumeIds: ["brown_vest"], 736 scaleMultiplier: 1, 737 hatTilt: 0 738 }, 739 { 740 id: "gorilla_1", 741 variantIndex: 1, 742 label: "Lowland Obsidian Gorilla (Taiko)", 743 furColor: "#18181b", 744 sleeveColor: "#18181b", 745 strokeColor: "#09090b", 746 strokeWidth: 1.3, 747 hueShift: 0, 748 saturate: 0.15, 749 brightness: 0.42, 750 costumeIds: ["gold_chain", "cool_sunglasses"], 751 scaleMultiplier: 1.06, 752 hatTilt: -4 753 }, 754 { 755 id: "gorilla_2", 756 variantIndex: 2, 757 label: "Aged Mountain Frost Gorilla (Steel Drums)", 758 furColor: "#94a3b8", 759 sleeveColor: "#94a3b8", 760 strokeColor: "#334155", 761 strokeWidth: 1.3, 762 hueShift: 205, 763 saturate: 0.35, 764 brightness: 1.28, 765 costumeIds: ["sp_top_hat", "black_bow_tie"], 766 scaleMultiplier: 0.98, 767 hatTilt: 4 768 } 769 ], 770 // 17. PARROT (Sound Effects Family) 771 parrot: [ 772 { 773 id: "parrot_0", 774 variantIndex: 0, 775 label: "Scarlet Crimson Macaw (Primary SFX)", 776 furColor: "#b63e43", 777 sleeveColor: "#b63e43", 778 strokeColor: "#68181a", 779 strokeWidth: 1.3, 780 hueShift: 0, 781 saturate: 1, 782 brightness: 1, 783 costumeIds: ["striped_scarf"], 784 scaleMultiplier: 1, 785 hatTilt: 0 786 }, 787 { 788 id: "parrot_1", 789 variantIndex: 1, 790 label: "Hyacinth Cobalt Macaw (Laser / Breath)", 791 furColor: "#2563eb", 792 sleeveColor: "#2563eb", 793 strokeColor: "#1e3a8a", 794 strokeWidth: 1.3, 795 hueShift: 220, 796 saturate: 1.4, 797 brightness: 1.1, 798 costumeIds: ["pirate_eyepatch", "bandana"], 799 scaleMultiplier: 1.03, 800 hatTilt: -4 801 }, 802 { 803 id: "parrot_2", 804 variantIndex: 2, 805 label: "Amazon Emerald Conure (Applause / Bird Tweet)", 806 furColor: "#16a34a", 807 sleeveColor: "#16a34a", 808 strokeColor: "#14532d", 809 strokeWidth: 1.3, 810 hueShift: 115, 811 saturate: 1.3, 812 brightness: 1.05, 813 costumeIds: ["sp_stan_beanie", "red_bow_tie"], 814 scaleMultiplier: 0.96, 815 hatTilt: 3 816 } 817 ] 818}; 819const EXTENDED_COSTUME_ROTATIONS = [ 820 ["sp_cartman_beanie", "red_bow_tie"], 821 ["nerd_glasses", "brown_vest"], 822 ["sp_kyle_ushanka", "striped_scarf"], 823 ["sp_cowboy_hat", "bandana"], 824 ["sp_wizard_hat", "gold_chain"], 825 ["sp_top_hat", "black_bow_tie"], 826 ["cool_sunglasses", "green_jacket"], 827 ["monocle", "tuxedo_suit"], 828 ["pirate_eyepatch", "superhero_cape"] 829]; 830function hslToHex(h, s, l) { 831 l /= 100; 832 const a = s * Math.min(l, 1 - l) / 100; 833 const f = (n) => {
834 const k = (n + h / 30) % 12; 835 const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1); 836 return Math.round(255 * color).toString(16).padStart(2, "0"); 837 }; 838 return `#${f(0)}${f(8)}${f(4)}`; 839} 840function getProceduralAnimalVariant(animalId, instanceIndex, baseFurColor) { 841 const hueShift = Math.round((instanceIndex * 67 + 43) % 360); 842 const cycle = instanceIndex % 3; 843 const saturate = cycle === 0 ? 1.25 : cycle === 1 ? 0.75 : 0.45; 844 const brightness = cycle === 0 ? 1.15 : cycle === 1 ? 0.85 : 0.65; 845 const proceduralHex = hslToHex(hueShift, Math.round(saturate * 60), Math.round(brightness * 50)); 846 const costumeIdx = (instanceIndex - 3) % EXTENDED_COSTUME_ROTATIONS.length; 847 const costumeIds = EXTENDED_COSTUME_ROTATIONS[costumeIdx] || ["cool_sunglasses"]; 848 const scaleJitter = 0.95 + instanceIndex * 17 % 11 * 0.01; 849 const hatTilt = instanceIndex * 3 % 11 - 5; 850 return { 851 id: `${animalId}_${instanceIndex}`, 852 variantIndex: instanceIndex, 853 label: `${animalId.toUpperCase()} Variant #${instanceIndex + 1} (Procedural)`, 854 furColor: proceduralHex, 855 sleeveColor: proceduralHex, 856 strokeColor: "#1e1b18", 857 strokeWidth: 2, 858 hueShift, 859 saturate, 860 brightness, 861 costumeIds, 862 scaleMultiplier: scaleJitter, 863 hatTilt 864 }; 865} 866function getAnimalVariant(animalId, instanceIndex, defaultFurColor = "#eb6a24") { 867 const list = CURATED_ANIMAL_VARIANTS[animalId]; 868 if (list && instanceIndex < list.length) { 869 return list[instanceIndex]; 870 } 871 return getProceduralAnimalVariant(animalId, instanceIndex); 872} 873function getVariantFilterId(animalId, instanceIndex) { 874 return `sp-filter-${animalId}-v${instanceIndex}`; 875}
876function renderSvgVariantFilter(filterId, hueShift, saturate, brightness) { 877 if (hueShift === 0 && saturate === 1 && brightness === 1) { 878 return ""; 879 } 880 const rad = hueShift * Math.PI / 180; 881 const cosVal = Math.cos(rad); 882 const sinVal = Math.sin(rad); 883 const lumR = 0.213; 884 const lumG = 0.715; 885 const lumB = 0.072; 886 const h00 = lumR + cosVal * (1 - lumR) + sinVal * -lumR; 887 const h01 = lumG + cosVal * -lumG + sinVal * -lumG; 888 const h02 = lumB + cosVal * -lumB + sinVal * (1 - lumB); 889 const h10 = lumR + cosVal * -lumR + sinVal * 0.143; 890 const h11 = lumG + cosVal * (1 - lumG) + sinVal * 0.14; 891 const h12 = lumB + cosVal * -lumB + sinVal * -0.283; 892 const h20 = lumR + cosVal * -lumR + sinVal * -0.787; 893 const h21 = lumG + cosVal * -lumG + sinVal * lumG; 894 const h22 = lumB + cosVal * (1 - lumB) + sinVal * lumB; 895 const s = saturate; 896 const b = brightness; 897 const m00 = (lumR * (1 - s) + s * h00) * b; 898 const m01 = (lumG * (1 - s) + s * h01) * b; 899 const m02 = (lumB * (1 - s) + s * h02) * b; 900 const m10 = (lumR * (1 - s) + s * h10) * b; 901 const m11 = (lumG * (1 - s) + s * h11) * b; 902 const m12 = (lumB * (1 - s) + s * h12) * b; 903 const m20 = (lumR * (1 - s) + s * h20) * b; 904 const m21 = (lumG * (1 - s) + s * h21) * b; 905 const m22 = (lumB * (1 - s) + s * h22) * b; 906 const matrixStr = ` 907 ${m00.toFixed(3)} ${m01.toFixed(3)} ${m02.toFixed(3)} 0 0 908 ${m10.toFixed(3)} ${m11.toFixed(3)} ${m12.toFixed(3)} 0 0 909 ${m20.toFixed(3)} ${m21.toFixed(3)} ${m22.toFixed(3)} 0 0 910 0 0 0 1 0 911 `.trim().replace(/\s+/g, " "); 912 return ` 913 <filter id="${filterId}" color-interpolation-filters="sRGB"> 914 <feColorMatrix type="matrix" values="${matrixStr}" /> 915 </filter> 916 `.trim(); 917} 918function getVariantFilterSvg(filterId, variant) { 919 return renderSvgVariantFilter(filterId, variant.hueShift, variant.saturate, variant.brightness); 920} 921export { 922 getVariantFilterId as a, 923 getVariantFilterSvg as b, 924 getAnimalVariant as g, 925 renderSvgVariantFilter as r 926};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.