index.html 12 KB

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