render.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. const getSprite = (() => {
  2. const stripForm = ["flabebe", "floette", "florges", "vivillon", "basculin", "furfrou", "magearna"];
  3. return pokemon => {
  4. pokemon = pokemon
  5. .replace("-alola", "-alolan")
  6. .replace("-galar", "-galarian")
  7. .replace("darmanitan-galarian", "darmanitan-galarian-standard");
  8. if (stripForm.find(s => pokemon.includes(s))) {
  9. pokemon = pokemon.replace(/-.*$/, "");
  10. }
  11. return `https://img.pokemondb.net/sprites/sword-shield/icon/${pokemon}.png`;
  12. }
  13. })();
  14. const renderPokemonTileCluster = (area, totalSize, { mu, nu }, scores) => String.raw`
  15. <div
  16. class="pkmn-tile_stats"
  17. style="grid-area: ${area}; color: ${getContrastingTextColor(hex2rgb(mu.hex))}; background-color: ${mu.hex};"
  18. >
  19. <div class="pkmn-tile_row" style="justify-content: center;">
  20. ${(100 * scores.size / totalSize).toFixed(2)}% ${mu.hex}
  21. </div>
  22. <div class="toggle-on">
  23. <div class="pkmn-tile_row">
  24. <span class="pkmn-tile_label">σ =</span>
  25. <span class="pkmn-tile_value">${scores.sigma.toFixed(2)}</span>
  26. </div>
  27. <div class="pkmn-tile_row">
  28. <span class="pkmn-tile_label">δ =</span>
  29. <span class="pkmn-tile_value">${scores.delta.toFixed(2)}</span>
  30. </div>
  31. <div class="pkmn-tile_row">
  32. <span class="pkmn-tile_label">Ч =</span>
  33. <span class="pkmn-tile_value">${scores.ch.toFixed(2)}</span>
  34. </div>
  35. <div class="pkmn-tile_row">
  36. <span class="pkmn-tile_label">Θ =</span>
  37. <span class="pkmn-tile_value">${scores.bigTheta.toFixed(2)}°</span>
  38. </div>
  39. <div class="pkmn-tile_row">
  40. <span class="pkmn-tile_label">θ =</span>
  41. <span class="pkmn-tile_value">${scores.theta.toFixed(2)}°</span>
  42. </div>
  43. <div class="pkmn-tile_row">
  44. <span class="pkmn-tile_label">ϕ =</span>
  45. <span class="pkmn-tile_value">${scores.phi.toFixed(2)}°</span>
  46. </div>
  47. <div class="pkmn-tile_row">
  48. <span class="pkmn-tile_label">μ =</span>
  49. <span class="pkmn-tile_vector">(${mu.vector.map(c => c.toFixed(2)).join(", ")})</span>
  50. </div>
  51. <div class="pkmn-tile_row">
  52. <span class="pkmn-tile_label">I =</span>
  53. <span class="pkmn-tile_value">${scores.inertia.toFixed(2)}</span>
  54. </div>
  55. <div class="pkmn-tile_row">
  56. <span class="pkmn-tile_label">ν =</span>
  57. <span class="pkmn-tile_vector">(${nu.map(c => c.toFixed(2)).join(", ")})</span>
  58. </div>
  59. <div class="pkmn-tile_row">
  60. <span class="pkmn-tile_label">N =</span>
  61. <span class="pkmn-tile_value">${scores.size}px</span>
  62. </div>
  63. </div>
  64. </div>
  65. `
  66. const clusterToggles = {};
  67. const renderPokemonTile = (kind, name, { total: { mu, nu, size }, clusters }, scores) => {
  68. const clusterToggleId = `${name}-${kind}-pkmn-expand-toggle`;
  69. return String.raw`
  70. <div class="pkmn-tile toggle-box">
  71. <input
  72. autocomplete="off"
  73. type="checkbox"
  74. ${clusterToggles?.[clusterToggleId] ? "checked" : ""}
  75. id="${clusterToggleId}"
  76. onchange="clusterToggles['${clusterToggleId}'] = event.target.checked"
  77. class="toggle-button"
  78. role="button"
  79. >
  80. <label for="${clusterToggleId}" style="grid-area: togg; text-align: center; align-self: start;">
  81. <div class="toggle-off">►</div>
  82. <div class="toggle-on">▼</div>
  83. </label>
  84. <img style="grid-area: icon" src="${getSprite(name)}" />
  85. <span style="grid-area: name">
  86. ${name.split("-").map(part => part.charAt(0).toUpperCase() + part.substr(1)).join(" ")}
  87. </span>
  88. <div
  89. class="pkmn-tile_stats"
  90. style="grid-area: totl; color: ${getContrastingTextColor(hex2rgb(mu.hex))}; background-color: ${mu.hex};"
  91. >
  92. <div class="pkmn-tile_row" style="justify-content: center;">
  93. ${mu.hex}
  94. </div>
  95. <div class="toggle-on">
  96. <div class="pkmn-tile_row">
  97. <span class="pkmn-tile_label">σ =</span>
  98. <span class="pkmn-tile_value">${scores.total.sigma.toFixed(2)}</span>
  99. <span class="pkmn-tile_label">δ =</span>
  100. <span class="pkmn-tile_value">${scores.total.delta.toFixed(2)}</span>
  101. <span class="pkmn-tile_label">Ч =</span>
  102. <span class="pkmn-tile_value">${scores.total.ch.toFixed(2)}</span>
  103. </div>
  104. <div class="pkmn-tile_row">
  105. <span class="pkmn-tile_label">Θ =</span>
  106. <span class="pkmn-tile_value">${scores.total.bigTheta.toFixed(2)}°</span>
  107. <span class="pkmn-tile_label">θ =</span>
  108. <span class="pkmn-tile_value">${scores.total.theta.toFixed(2)}°</span>
  109. <span class="pkmn-tile_label">ϕ =</span>
  110. <span class="pkmn-tile_value">${scores.total.phi.toFixed(2)}°</span>
  111. </div>
  112. <div class="pkmn-tile_row">
  113. <span class="pkmn-tile_label">μ =</span>
  114. <span class="pkmn-tile_vector">(${mu.vector.map(c => c.toFixed(2)).join(", ")})</span>
  115. <span class="pkmn-tile_label">I =</span>
  116. <span class="pkmn-tile_value">${scores.total.inertia.toFixed(2)}</span>
  117. </div>
  118. <div class="pkmn-tile_row">
  119. <span class="pkmn-tile_label">ν =</span>
  120. <span class="pkmn-tile_vector">(${nu.map(c => c.toFixed(2)).join(", ")})</span>
  121. <span class="pkmn-tile_label">N =</span>
  122. <span class="pkmn-tile_value">${size}px</span>
  123. </div>
  124. </div>
  125. </div>
  126. ${clusters.map((c, i) => renderPokemonTileCluster(`cls${i+1}`, size, c, scores.clusters[i])).join("\n")}
  127. </div>
  128. `
  129. };