index.html 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  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. <br />
  68. σ&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--sigma"></span>
  69. <br />
  70. Θ&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--bigTheta"></span>
  71. <br />
  72. <hr />
  73. θ&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--theta"></span>°
  74. <br />
  75. ϕ&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--phi"></span>°
  76. <br />
  77. δ&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--delta"></span>
  78. <br />
  79. M&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--manhattan"></span>
  80. <br />
  81. Ч&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--ch"></span>
  82. <br />
  83. ℓ&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--lightnessDiff"></span>
  84. <br />
  85. <hr />
  86. β&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--importance"></span>
  87. <br />
  88. I&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--inertia"></span>
  89. <br />
  90. V&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--variance"></span>
  91. <br />
  92. Φ&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--muNuAngle"></span>°
  93. <br />
  94. N&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--size"></span>
  95. <br />
  96. L&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--lightness"></span>
  97. <br />
  98. C&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--chroma"></span>
  99. </template>
  100. <template id="pkmn-template">
  101. <div class="pkmn">
  102. <img />
  103. <div class="pkmn-name"></div>
  104. <div
  105. class="pkmn-total"
  106. onmouseenter="event.target.querySelector('dialog').show()"
  107. onmouseleave="event.target.querySelector('dialog').close()"
  108. >
  109. <dialog class="pkmn-data"></dialog>
  110. </div>
  111. <div class="pkmn-score"></div>
  112. <div
  113. class="pkmn-cls pkmn-cls1"
  114. onmouseenter="event.target.querySelector('dialog').show()"
  115. onmouseleave="event.target.querySelector('dialog').close()"
  116. >
  117. <span></span><span></span>
  118. <dialog class="pkmn-data" hidden></dialog>
  119. </div>
  120. <div
  121. class="pkmn-cls pkmn-cls2"
  122. onmouseenter="event.target.querySelector('dialog').show()"
  123. onmouseleave="event.target.querySelector('dialog').close()"
  124. >
  125. <span></span><span></span>
  126. <dialog class="pkmn-data" hidden></dialog>
  127. </div>
  128. <div
  129. class="pkmn-cls pkmn-cls3"
  130. onmouseenter="event.target.querySelector('dialog').show()"
  131. onmouseleave="event.target.querySelector('dialog').close()"
  132. >
  133. <span></span><span></span>
  134. <dialog class="pkmn-data" hidden></dialog>
  135. </div>
  136. <div
  137. class="pkmn-cls pkmn-cls4"
  138. onmouseenter="event.target.querySelector('dialog').show()"
  139. onmouseleave="event.target.querySelector('dialog').close()"
  140. >
  141. <span></span><span></span>
  142. <dialog class="pkmn-data" hidden></dialog>
  143. </div>
  144. </div>
  145. </template>
  146. <div class="main-container">
  147. <form
  148. action="javascript:void(0);"
  149. id="sortFunction"
  150. autocomplete="off"
  151. onchange="updateSort()"
  152. >
  153. <div class="fn-group fn-group-outer">
  154. <label class="fn-minmax">
  155. <input type="checkbox" name="sortOrder" role="button" hidden />
  156. <div class="fn-minmax-toggle">
  157. <span>min</span>
  158. <span>max</span>
  159. </div>
  160. </label>
  161. <span class="fn-bracket">[</span>
  162. <div
  163. class="fn-group"
  164. onchange="event.target.parentNode.classList.toggle('fn-part--disabled')"
  165. >
  166. <label class="fn-part">
  167. <input type="checkbox" name="useWholeImage" checked />
  168. <output name="metricSymbolP">α</output>(P)
  169. </label>
  170. <label class="fn-part">
  171. <input type="checkbox" name="totalSize" checked />
  172. |P|
  173. </label>
  174. <label class="fn-part fn-part--disabled">
  175. <input type="checkbox" name="invTotalSize" />
  176. |P|<sup>-1</sup>
  177. </label>
  178. <label class="fn-part">
  179. <input type="checkbox" name="useBestCluster" checked />
  180. <output name="metricSymbolB">α</output>(B)
  181. </label>
  182. <label class="fn-part fn-part--disabled">
  183. <input type="checkbox" name="clusterSize" />
  184. |B|
  185. </label>
  186. <label class="fn-part">
  187. <input type="checkbox" name="invClusterSize" checked />
  188. |B|<sup>-1</sup>
  189. </label>
  190. </div>
  191. <span class="fn-bracket">]</span>
  192. </div>
  193. </form>
  194. <form
  195. action="javascript:void(0);"
  196. id="clusterFunction"
  197. autocomplete="off"
  198. onchange="updateSort()"
  199. >
  200. <div class="fn-group">
  201. <span class="center">where B =&nbsp;</span>
  202. <label class="fn-minmax fn-minmax--wide">
  203. <input type="checkbox" name="sortOrder" role="button" checked hidden />
  204. <div class="fn-minmax-toggle">
  205. <span>argmin</span>
  206. <span>argmax</span>
  207. </div>
  208. </label>
  209. <span class="fn-bracket">[</span>
  210. <div
  211. class="fn-group"
  212. onchange="event.target.parentNode.classList.toggle('fn-part--disabled')"
  213. >
  214. <span class="fn-part fn-part--fixed">
  215. <output name="metricSymbol">β</output>(K)
  216. </span>
  217. <label class="fn-part fn-part--disabled">
  218. <input type="checkbox" name="clusterSize" />
  219. |K|
  220. </label>
  221. <label class="fn-part fn-part--disabled">
  222. <input type="checkbox" name="invClusterSize" />
  223. |K|<sup>-1</sup>
  224. </label>
  225. <label class="fn-part fn-part--disabled">
  226. <input type="checkbox" name="totalSize" />
  227. |P|
  228. </label>
  229. <label class="fn-part fn-part--disabled">
  230. <input type="checkbox" name="invTotalSize" />
  231. |P|<sup>-1</sup>
  232. </label>
  233. </div>
  234. <span class="fn-bracket">]</span>
  235. </div>
  236. </form>
  237. <form action="javascript:void(0);" id="sortMetric">
  238. <!-- Template mount point -->
  239. </form>
  240. <form action="javascript:void(0);" id="clusterMetric">
  241. <!-- Template mount point -->
  242. </form>
  243. <form action="javascript:void(0);" id="colorSelect" autocomplete="off">
  244. <label for="color-input-text">Target Color</label>
  245. <button type="button" onclick="onColorChange(randomColor())">Random Color</button>
  246. <input
  247. id="color-input-text"
  248. name="colorText"
  249. type="text"
  250. maxlength="7"
  251. oninput="onColorChange(event.target.value)"
  252. />
  253. <input
  254. name="colorPicker"
  255. type="color"
  256. onchange="onColorChange(event.target.value)"
  257. />
  258. </form>
  259. <form action="javascript:void(0);" id="sortControl" autocomplete="off">
  260. <div>
  261. <label>
  262. <div>Results:&nbsp;<output name="resultsToDisplayOutput">6</output></div>
  263. <input
  264. name="resultsToDisplay"
  265. type="range"
  266. min="1"
  267. max="100"
  268. value="6"
  269. oninput="
  270. event.target.form.elements.resultsToDisplayOutput.value = event.target.value
  271. "
  272. onchange="showResults()"
  273. />
  274. </label>
  275. </div>
  276. <div>
  277. <label>
  278. <input
  279. type="radio"
  280. onchange="updateSort()"
  281. name="colorSpace"
  282. value="jab"
  283. checked
  284. />
  285. CIECAM
  286. </label>
  287. </div>
  288. <div>
  289. <label>
  290. <input type="radio" onchange="updateSort()" name="colorSpace" value="rgb" />
  291. sRGB
  292. </label>
  293. </div>
  294. </form>
  295. <div id="color-results-label">By Color</div>
  296. <div id="name-results-label">By Name</div>
  297. <div id="color-results"></div>
  298. <div id="name-results"></div>
  299. <div id="prev-colors-container">
  300. <div>Previous Colors</div>
  301. <div id="prev-colors"></div>
  302. </div>
  303. <div id="name-search-container">
  304. <div>Name Search</div>
  305. <button type="button" onclick="randomPokemon()">Random Pokemon</button>
  306. <input
  307. type="text"
  308. autocomplete="off"
  309. id="name-search"
  310. oninput="searchByName(event.target.value)"
  311. />
  312. </div>
  313. </div>
  314. </body>
  315. </html>