render.js 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  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) => {
  15. const textColor = getContrastingTextColor(mu.hex);
  16. return String.raw`
  17. <div
  18. class="pkmn-tile_stats"
  19. style="grid-area: ${area}; color: ${textColor}; background-color: ${mu.hex};"
  20. >
  21. <div class="pkmn-tile_row" style="justify-content: center;">
  22. ${(100 * scores.size / totalSize).toFixed(2)}% ${mu.hex}
  23. </div>
  24. <div class="toggle-on">
  25. <div class="pkmn-tile_row">
  26. <span class="pkmn-tile_label">σ =</span>
  27. <span class="pkmn-tile_value">${scores.sigma.toFixed(2)}</span>
  28. </div>
  29. <div class="pkmn-tile_row">
  30. <span class="pkmn-tile_label">δ =</span>
  31. <span class="pkmn-tile_value">${scores.delta.toFixed(2)}</span>
  32. </div>
  33. <div class="pkmn-tile_row">
  34. <span class="pkmn-tile_label">M =</span>
  35. <span class="pkmn-tile_value">${scores.manhattan.toFixed(2)}</span>
  36. </div>
  37. <div class="pkmn-tile_row">
  38. <span class="pkmn-tile_label">Ч =</span>
  39. <span class="pkmn-tile_value">${scores.ch.toFixed(2)}</span>
  40. </div>
  41. <div class="pkmn-tile_row">
  42. <span class="pkmn-tile_label">Θ =</span>
  43. <span class="pkmn-tile_value">${scores.bigTheta.toFixed(2)}°</span>
  44. </div>
  45. <div class="pkmn-tile_row">
  46. <span class="pkmn-tile_label">θ =</span>
  47. <span class="pkmn-tile_value">${scores.theta.toFixed(2)}°</span>
  48. </div>
  49. <div class="pkmn-tile_row">
  50. <span class="pkmn-tile_label">ϕ =</span>
  51. <span class="pkmn-tile_value">${scores.phi.toFixed(2)}°</span>
  52. </div>
  53. <div class="pkmn-tile_row">
  54. <span class="pkmn-tile_label">ℓ =</span>
  55. <span class="pkmn-tile_value">${scores.lightnessDiff.toFixed(2)}</span>
  56. </div>
  57. <hr style="width: 80%; color: ${textColor}"/>
  58. <div class="pkmn-tile_row">
  59. <span class="pkmn-tile_label">μ =</span>
  60. <span class="pkmn-tile_value">(${mu.vector[0].toFixed(2)},</span>
  61. </div>
  62. <div class="pkmn-tile_row">
  63. <span class="pkmn-tile_label"></span>
  64. <span class="pkmn-tile_value">${mu.vector[1].toFixed(2)},</span>
  65. </div>
  66. <div class="pkmn-tile_row">
  67. <span class="pkmn-tile_label"></span>
  68. <span class="pkmn-tile_value">${mu.vector[2].toFixed(2)})</span>
  69. </div>
  70. <div class="pkmn-tile_row">
  71. <span class="pkmn-tile_label">I =</span>
  72. <span class="pkmn-tile_value">${scores.inertia.toFixed(2)}</span>
  73. </div>
  74. <div class="pkmn-tile_row">
  75. <span class="pkmn-tile_label">ℒ =</span>
  76. <span class="pkmn-tile_value">${scores.lightness.toFixed(2)}</span>
  77. </div>
  78. <div class="pkmn-tile_row">
  79. <span class="pkmn-tile_label">ν =</span>
  80. <span class="pkmn-tile_value">(${nu[0].toFixed(2)},</span>
  81. </div>
  82. <div class="pkmn-tile_row">
  83. <span class="pkmn-tile_label"></span>
  84. <span class="pkmn-tile_value">${nu[1].toFixed(2)},</span>
  85. </div>
  86. <div class="pkmn-tile_row">
  87. <span class="pkmn-tile_label"></span>
  88. <span class="pkmn-tile_value">${nu[2].toFixed(2)})</span>
  89. </div>
  90. <div class="pkmn-tile_row">
  91. <span class="pkmn-tile_label">V =</span>
  92. <span class="pkmn-tile_value">${scores.muNuAngle.toFixed(2)}°</span>
  93. </div>
  94. <div class="pkmn-tile_row">
  95. <span class="pkmn-tile_label">N =</span>
  96. <span class="pkmn-tile_value">${scores.size}px</span>
  97. </div>
  98. </div>
  99. </div>
  100. `
  101. };
  102. const clusterToggles = {};
  103. const renderPokemonTile = (kind, name, { total: { mu, nu, size }, clusters }, scores) => {
  104. const clusterToggleId = `${name}-${kind}-pkmn-expand-toggle`;
  105. const textColor = getContrastingTextColor(mu.hex);
  106. return String.raw`
  107. <div class="pkmn-tile toggle-box">
  108. <input
  109. autocomplete="off"
  110. type="checkbox"
  111. ${clusterToggles?.[clusterToggleId] ? "checked" : ""}
  112. id="${clusterToggleId}"
  113. onchange="clusterToggles['${clusterToggleId}'] = event.target.checked"
  114. class="toggle-button"
  115. role="button"
  116. >
  117. <label for="${clusterToggleId}" style="grid-area: togg; text-align: center; align-self: start;">
  118. <div class="toggle-off">►</div>
  119. <div class="toggle-on">▼</div>
  120. </label>
  121. <img style="grid-area: icon" src="${getSprite(name)}" />
  122. <span style="grid-area: name">
  123. ${name.split("-").map(part => part.charAt(0).toUpperCase() + part.substr(1)).join(" ")}
  124. </span>
  125. <div
  126. class="pkmn-tile_stats"
  127. style="grid-area: totl; color: ${textColor}; background-color: ${mu.hex};"
  128. >
  129. <div class="pkmn-tile_row" style="justify-content: center;">
  130. ${mu.hex}
  131. </div>
  132. <div class="toggle-on">
  133. <div class="pkmn-tile_row">
  134. <span class="pkmn-tile_label">σ =</span>
  135. <span class="pkmn-tile_value">${scores.total.sigma.toFixed(2)}</span>
  136. <span class="pkmn-tile_label">δ =</span>
  137. <span class="pkmn-tile_value">${scores.total.delta.toFixed(2)}</span>
  138. <span class="pkmn-tile_label">M =</span>
  139. <span class="pkmn-tile_value">${scores.total.manhattan.toFixed(2)}</span>
  140. <span class="pkmn-tile_label">Ч =</span>
  141. <span class="pkmn-tile_value">${scores.total.ch.toFixed(2)}</span>
  142. </div>
  143. <div class="pkmn-tile_row">
  144. <span class="pkmn-tile_label">Θ =</span>
  145. <span class="pkmn-tile_value">${scores.total.bigTheta.toFixed(2)}°</span>
  146. <span class="pkmn-tile_label">θ =</span>
  147. <span class="pkmn-tile_value">${scores.total.theta.toFixed(2)}°</span>
  148. <span class="pkmn-tile_label">ϕ =</span>
  149. <span class="pkmn-tile_value">${scores.total.phi.toFixed(2)}°</span>
  150. <span class="pkmn-tile_label">ℓ =</span>
  151. <span class="pkmn-tile_value">${scores.total.lightnessDiff.toFixed(2)}</span>
  152. </div>
  153. <hr style="width: 80%; color: ${textColor}"/>
  154. <div class="pkmn-tile_row">
  155. <span class="pkmn-tile_label">μ =</span>
  156. <span class="pkmn-tile_vector">(${mu.vector.map(c => c.toFixed(2)).join(", ")})</span>
  157. <span class="pkmn-tile_label">I =</span>
  158. <span class="pkmn-tile_value">${scores.total.inertia.toFixed(2)}</span>
  159. <span class="pkmn-tile_label">ℒ =</span>
  160. <span class="pkmn-tile_value">${scores.total.lightness.toFixed(2)}</span>
  161. </div>
  162. <div class="pkmn-tile_row">
  163. <span class="pkmn-tile_label">ν =</span>
  164. <span class="pkmn-tile_vector">(${nu.map(c => c.toFixed(2)).join(", ")})</span>
  165. <span class="pkmn-tile_label">V =</span>
  166. <span class="pkmn-tile_value">${scores.total.muNuAngle.toFixed(2)}°</span>
  167. <span class="pkmn-tile_label">N =</span>
  168. <span class="pkmn-tile_value">${size}px</span>
  169. </div>
  170. </div>
  171. </div>
  172. ${clusters.map((c, i) => renderPokemonTileCluster(`cls${i+1}`, size, c, scores.clusters[i])).join("\n")}
  173. </div>
  174. `
  175. };