index.html 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  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-select-template">
  17. <fieldset
  18. class="metric-select-fieldset"
  19. onchange="onMetricChange(event.target.form.elements)"
  20. >
  21. <legend>Metric</legend>
  22. <div>
  23. <label>
  24. <input type="radio" name="metricKind" value="whole" />
  25. Set Comparison
  26. </label>
  27. </div>
  28. <div>
  29. <label>
  30. <input type="radio" name="metricKind" value="mean" />
  31. Mean Comparison
  32. </label>
  33. </div>
  34. <div>
  35. <label>
  36. <input type="radio" name="metricKind" value="statistic" />
  37. Set Statistics
  38. </label>
  39. </div>
  40. <select name="whole" disabled>
  41. <option value="alpha">Geometric Difference (α)</option>
  42. <option value="sigma">RMS Deviation (σ)</option>
  43. <option value="bigTheta">Cosine Difference (Θ)</option>
  44. </select>
  45. <select name="mean" disabled>
  46. <option value="theta">Angular Difference (θ)</option>
  47. <option value="phi">Hue Azimuth (ϕ)</option>
  48. <option value="delta">Euclidean (δ)</option>
  49. <option value="manhattan">Manhattan (M)</option>
  50. <option value="ch">Chebyshev (Ч)</option>
  51. <option value="lightnessDiff">Lightness (ℓ)</option>
  52. </select>
  53. <select name="statistic" disabled>
  54. <option value="importance">Visual Importance (β)</option>
  55. <option value="inertia">Inertia (I)</option>
  56. <option value="variance">Variance (V)</option>
  57. <option value="muNuAngle">Mu-Nu Angle (Φ)</option>
  58. <option value="size">Size (N)</option>
  59. <option value="lightness">Mean Lightness (L)</option>
  60. <option value="chroma">Mean Chroma (C)</option>
  61. </select>
  62. <output name="sortMetric" hidden aria-hidden="true"></output>
  63. </fieldset>
  64. </template>
  65. <template id="pkmn-data-template">
  66. α&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--alpha"></span>
  67. σ&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--sigma"></span>
  68. Θ&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--bigTheta"></span>
  69. <hr />
  70. θ&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--theta"></span>°
  71. ϕ&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--phi"></span>°
  72. δ&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--delta"></span>
  73. M&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--manhattan"></span>
  74. Ч&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--ch"></span>
  75. ℓ&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--lightnessDiff"></span>
  76. <hr />
  77. β&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--importance"></span>
  78. I&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--inertia"></span>
  79. V&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--variance"></span>
  80. Φ&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--muNuAngle"></span>°
  81. N&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--size"></span>
  82. L&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--lightness"></span>
  83. C&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--chroma"></span>
  84. </template>
  85. <template id="pkmn-template">
  86. <div class="pkmn">
  87. <img />
  88. <div class="pkmn-name"></div>
  89. <div
  90. class="pkmn-total"
  91. onmouseenter="event.target.querySelector('dialog').show()"
  92. onmouseleave="event.target.querySelector('dialog').close()"
  93. >
  94. <dialog class="pkmn-data"></dialog>
  95. </div>
  96. <div class="pkmn-score"></div>
  97. <div
  98. class="pkmn-cls pkmn-cls1"
  99. onmouseenter="event.target.querySelector('dialog').show()"
  100. onmouseleave="event.target.querySelector('dialog').close()"
  101. >
  102. <span></span><span></span>
  103. <dialog class="pkmn-data" hidden></dialog>
  104. </div>
  105. <div
  106. class="pkmn-cls pkmn-cls2"
  107. onmouseenter="event.target.querySelector('dialog').show()"
  108. onmouseleave="event.target.querySelector('dialog').close()"
  109. >
  110. <span></span><span></span>
  111. <dialog class="pkmn-data" hidden></dialog>
  112. </div>
  113. <div
  114. class="pkmn-cls pkmn-cls3"
  115. onmouseenter="event.target.querySelector('dialog').show()"
  116. onmouseleave="event.target.querySelector('dialog').close()"
  117. >
  118. <span></span><span></span>
  119. <dialog class="pkmn-data" hidden></dialog>
  120. </div>
  121. <div
  122. class="pkmn-cls pkmn-cls4"
  123. onmouseenter="event.target.querySelector('dialog').show()"
  124. onmouseleave="event.target.querySelector('dialog').close()"
  125. >
  126. <span></span><span></span>
  127. <dialog class="pkmn-data" hidden></dialog>
  128. </div>
  129. </div>
  130. </template>
  131. <div class="main-container">
  132. <form
  133. action="javascript:void(0);"
  134. id="sortFunction"
  135. autocomplete="off"
  136. onchange="updateSort()"
  137. >
  138. <div class="fn-group fn-group-outer">
  139. <label class="fn-minmax">
  140. <input type="checkbox" name="sortOrder" role="button" hidden />
  141. <div class="fn-minmax-toggle">
  142. <span>min</span>
  143. <span>max</span>
  144. </div>
  145. </label>
  146. <span class="fn-bracket">[</span>
  147. <div
  148. class="fn-group"
  149. onchange="event.target.parentNode.classList.toggle('fn-part--disabled')"
  150. >
  151. <label class="fn-part">
  152. <input type="checkbox" name="useWholeImage" checked />
  153. <output name="metricSymbolP">α</output>(P)
  154. </label>
  155. <label class="fn-part">
  156. <input type="checkbox" name="totalSize" checked />
  157. |P|
  158. </label>
  159. <label class="fn-part fn-part--disabled">
  160. <input type="checkbox" name="invTotalSize" />
  161. |P|<sup>-1</sup>
  162. </label>
  163. <label class="fn-part">
  164. <input type="checkbox" name="useBestCluster" checked />
  165. <output name="metricSymbolB">α</output>(B)
  166. </label>
  167. <label class="fn-part fn-part--disabled">
  168. <input type="checkbox" name="clusterSize" />
  169. |B|
  170. </label>
  171. <label class="fn-part">
  172. <input type="checkbox" name="invClusterSize" checked />
  173. |B|<sup>-1</sup>
  174. </label>
  175. </div>
  176. <span class="fn-bracket">]</span>
  177. </div>
  178. </form>
  179. <form
  180. action="javascript:void(0);"
  181. id="clusterFunction"
  182. autocomplete="off"
  183. onchange="updateSort()"
  184. >
  185. <div class="fn-group">
  186. <span class="center">where B =&nbsp;</span>
  187. <label class="fn-minmax fn-minmax--wide">
  188. <input type="checkbox" name="sortOrder" role="button" checked hidden />
  189. <div class="fn-minmax-toggle">
  190. <span>argmin</span>
  191. <span>argmax</span>
  192. </div>
  193. </label>
  194. <span class="fn-bracket">[</span>
  195. <div
  196. class="fn-group"
  197. onchange="event.target.parentNode.classList.toggle('fn-part--disabled')"
  198. >
  199. <span class="fn-part fn-part--fixed">
  200. <output name="metricSymbol">β</output>(K)
  201. </span>
  202. <label class="fn-part fn-part--disabled">
  203. <input type="checkbox" name="clusterSize" />
  204. |K|
  205. </label>
  206. <label class="fn-part fn-part--disabled">
  207. <input type="checkbox" name="invClusterSize" />
  208. |K|<sup>-1</sup>
  209. </label>
  210. <label class="fn-part fn-part--disabled">
  211. <input type="checkbox" name="totalSize" />
  212. |P|
  213. </label>
  214. <label class="fn-part fn-part--disabled">
  215. <input type="checkbox" name="invTotalSize" />
  216. |P|<sup>-1</sup>
  217. </label>
  218. </div>
  219. <span class="fn-bracket">]</span>
  220. </div>
  221. </form>
  222. <form action="javascript:void(0);" id="sortMetric">
  223. <!-- Template mount point -->
  224. </form>
  225. <form action="javascript:void(0);" id="clusterMetric">
  226. <!-- Template mount point -->
  227. </form>
  228. <form action="javascript:void(0);" id="colorSelect" autocomplete="off">
  229. <label for="color-input-text">Target Color</label>
  230. <button type="button" onclick="onColorChange(randomColor())">Random Color</button>
  231. <input
  232. id="color-input-text"
  233. name="colorText"
  234. type="text"
  235. maxlength="7"
  236. oninput="onColorChange(event.target.value)"
  237. />
  238. <input
  239. name="colorPicker"
  240. type="color"
  241. onchange="onColorChange(event.target.value)"
  242. />
  243. </form>
  244. <form action="javascript:void(0);" id="sortControl" autocomplete="off">
  245. <div>
  246. <label>
  247. <div>Results:&nbsp;<output name="resultsToDisplayOutput">6</output></div>
  248. <input
  249. name="resultsToDisplay"
  250. type="range"
  251. min="1"
  252. max="100"
  253. value="6"
  254. oninput="
  255. event.target.form.elements.resultsToDisplayOutput.value = event.target.value
  256. "
  257. onchange="showResults()"
  258. />
  259. </label>
  260. </div>
  261. <div>
  262. <label>
  263. <input
  264. type="radio"
  265. onchange="updateSort()"
  266. name="colorSpace"
  267. value="jab"
  268. checked
  269. />
  270. CIECAM
  271. </label>
  272. </div>
  273. <div>
  274. <label>
  275. <input type="radio" onchange="updateSort()" name="colorSpace" value="rgb" />
  276. sRGB
  277. </label>
  278. </div>
  279. </form>
  280. <div id="color-results-label">By Color</div>
  281. <div id="name-results-label">By Name</div>
  282. <div id="color-results"></div>
  283. <div id="name-results"></div>
  284. <div id="prev-colors-container">
  285. <div>Previous Colors</div>
  286. <div id="prev-colors"></div>
  287. </div>
  288. <div id="name-search-container">
  289. <div>Name Search</div>
  290. <button type="button" onclick="randomPokemon()">Random Pokemon</button>
  291. <input
  292. type="text"
  293. autocomplete="off"
  294. id="name-search"
  295. oninput="searchByName(event.target.value)"
  296. />
  297. </div>
  298. </div>
  299. </body>
  300. </html>