index.html 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Pokemon By Color</title>
  6. <link rel="stylesheet" href="styles.css" />
  7. <script src="https://unpkg.com/d3-color@3.0.1/dist/d3-color.min.js"></script>
  8. <script src="https://unpkg.com/d3-cam02@0.1.5/build/d3-cam02.min.js"></script>
  9. <script src="https://unpkg.com/fuse.js@6.5.3/dist/fuse.min.js"></script>
  10. <script src="database-v3.js"></script>
  11. <script src="math.js"></script>
  12. <script src="form.js"></script>
  13. </head>
  14. <body>
  15. <noscript>Requires javascript</noscript>
  16. <template id="metric-form-template">
  17. <div>
  18. <label>
  19. <input type="checkbox" name="sortOrder" role="button" hidden />
  20. <output name="sortOrderLabel"></output>
  21. (click to toggle)
  22. </label>
  23. </div>
  24. <div>
  25. <label>
  26. <input type="radio" name="metricKind" value="whole" />
  27. Set Comparison
  28. </label>
  29. </div>
  30. <div>
  31. <label>
  32. <input type="radio" name="metricKind" value="mean" />
  33. Mean Comparison
  34. </label>
  35. </div>
  36. <div>
  37. <label>
  38. <input type="radio" name="metricKind" value="statistic" />
  39. Set Statistics
  40. </label>
  41. </div>
  42. <select name="whole" disabled>
  43. <option value="sigma">RMS Deviation (σ)</option>
  44. <option value="bigTheta">Cosine Difference (Θ)</option>
  45. <option value="alpha">Geometric Difference (α)</option>
  46. </select>
  47. <select name="mean" disabled>
  48. <option value="theta">Angular Difference (θ)</option>
  49. <option value="phi">Hue Azimuth (ϕ)</option>
  50. <option value="delta">Euclidean (δ)</option>
  51. <option value="manhattan">Manhattan (M)</option>
  52. <option value="ch">Chebyshev (Ч)</option>
  53. <option value="lightnessDiff">Lightness (ℓ)</option>
  54. </select>
  55. <select name="statistic" disabled>
  56. <option value="inertia">Inertia (I)</option>
  57. <option value="variance">Variance (V)</option>
  58. <option value="muNuAngle">Mu-Nu Angle (Φ)</option>
  59. <option value="size">Size (N)</option>
  60. <option value="lightness">Mean Lightness (L)</option>
  61. <option value="chroma">Mean Chroma (C)</option>
  62. <option value="importance">Visual Importance (β)</option>
  63. </select>
  64. <output name="sortMetric" hidden aria-hidden="true"></output>
  65. </template>
  66. <template id="scale-form-template">
  67. <div>
  68. <label>
  69. <input type="radio" name="rescaleFactor" value="none" />
  70. None
  71. </label>
  72. </div>
  73. <div>
  74. <label>
  75. <input type="radio" name="rescaleFactor" value="direct" />
  76. Cluster Size
  77. </label>
  78. </div>
  79. <div>
  80. <label>
  81. <input type="radio" name="rescaleFactor" value="inverse" />
  82. Inverse Cluster Size
  83. </label>
  84. </div>
  85. <div>
  86. <label>
  87. <input type="radio" name="rescaleFactor" value="size" />
  88. Image Size
  89. </label>
  90. </div>
  91. <div>
  92. <label>
  93. <input type="radio" name="rescaleFactor" value="inverseSize" />
  94. Inverse Image Size
  95. </label>
  96. </div>
  97. </template>
  98. <template id="pkmn-template">
  99. <div class="pkmn">
  100. <img />
  101. <div class="pkmn-name"></div>
  102. <div class="pkmn-total"></div>
  103. <div class="pkmn-score"></div>
  104. <div class="pkmn-cls pkmn-cls1"><span></span><span></span></div>
  105. <div class="pkmn-cls pkmn-cls2"><span></span><span></span></div>
  106. <div class="pkmn-cls pkmn-cls3"><span></span><span></span></div>
  107. <div class="pkmn-cls pkmn-cls4"><span></span><span></span></div>
  108. </div>
  109. </template>
  110. <form action="javascript:void(0);" id="sortControl" autocomplete="off">
  111. <div>
  112. <label>
  113. <div>Target Color</div>
  114. <input
  115. name="colorText"
  116. type="text"
  117. maxlength="7"
  118. oninput="onColorChange(event.target.value)"
  119. />
  120. </label>
  121. <input
  122. name="colorPicker"
  123. type="color"
  124. onchange="onColorChange(event.target.value)"
  125. />
  126. <button type="button" onclick="onColorChange(randomColor())">Random Color</button>
  127. </div>
  128. <div>
  129. <label>
  130. <div>Results:&nbsp;<output name="resultsToDisplayOutput">10</output></div>
  131. <input
  132. name="resultsToDisplay"
  133. type="range"
  134. min="1"
  135. max="100"
  136. value="10"
  137. oninput="
  138. event.target.form.elements.resultsToDisplayOutput.value = event.target.value
  139. "
  140. onchange="showResults()"
  141. />
  142. </label>
  143. </div>
  144. <fieldset onchange="updateSort()">
  145. <legend>Color Space</legend>
  146. <div>
  147. <label>
  148. <input type="radio" name="colorSpace" value="jab" checked />
  149. CIECAM
  150. </label>
  151. </div>
  152. <div>
  153. <label>
  154. <input type="radio" name="colorSpace" value="rgb" />
  155. sRGB
  156. </label>
  157. </div>
  158. </fieldset>
  159. <fieldset name="metric" onchange="onMetricChange(event.target.form.elements)">
  160. <legend>Distance Metric</legend>
  161. <!-- template mount point -->
  162. </fieldset>
  163. <fieldset name="rescaleSection" onchange="updateSort()">
  164. <legend>Scaled By</legend>
  165. <!-- template mount point -->
  166. </fieldset>
  167. <fieldset
  168. onchange="
  169. const elements = event.target.form.elements;
  170. document.forms.sortControl.elements.rescaleSection.hidden = elements.useClusters.value === 'off';
  171. document.forms.clusterControl.hidden = elements.useClusters.value === 'off';
  172. onMetricChange(elements);
  173. "
  174. >
  175. <legend>Compare With</legend>
  176. <div>
  177. <label>
  178. <input type="radio" name="useClusters" value="off" />
  179. Whole Image
  180. </label>
  181. </div>
  182. <div>
  183. <label>
  184. <input type="radio" name="useClusters" value="on" />
  185. Best Cluster
  186. </label>
  187. </div>
  188. <div>
  189. <label>
  190. <input type="radio" name="useClusters" value="mult" checked />
  191. Best Cluster Times Whole
  192. </label>
  193. </div>
  194. </fieldset>
  195. </form>
  196. <form action="javascript:void(0);" id="clusterControl" autocomplete="off">
  197. <div>Cluster Ranking</div>
  198. <fieldset name="metric" onchange="onMetricChange(event.target.form.elements)">
  199. <legend>Distance Metric</legend>
  200. <!-- template mount point -->
  201. </fieldset>
  202. <fieldset name="rescaleSection" onchange="updateSort()">
  203. <legend>Scaled By</legend>
  204. <!-- template mount point -->
  205. </fieldset>
  206. </form>
  207. <div id="color-results"></div>
  208. <input
  209. type="text"
  210. autocomplete="off"
  211. id="name-search"
  212. oninput="searchByName(event.target.value)"
  213. />
  214. <button type="button" onclick="randomPokemon()">Random Pokemon</button>
  215. <div id="name-results"></div>
  216. <div>
  217. <div>Previous Colors</div>
  218. <div id="prev-colors"></div>
  219. </div>
  220. </body>
  221. </html>