ソースを参照

replace old code, get color picker wired up

Kirk Trombley 2 年 前
コミット
b538a6a8e2
3 ファイル変更204 行追加109 行削除
  1. 40 109
      index.html
  2. 22 0
      script.js
  3. 142 0
      styles.css

+ 40 - 109
index.html

@@ -9,16 +9,14 @@
     <script src="https://unpkg.com/fuse.js@6.5.3/dist/fuse.min.js"></script>
     <script src="database-v3.js"></script>
     <script src="math.js"></script>
-    <script src="form.js" defer></script>
+    <script src="framework.js"></script>
+    <script src="script.js" defer></script>
   </head>
   <body>
     <noscript>Requires javascript</noscript>
 
     <template id="metric-select-template">
-      <fieldset
-        class="metric-select-fieldset"
-        onchange="onMetricChange(event.target.form.elements)"
-      >
+      <fieldset class="metric-select-fieldset">
         <legend>Metric</legend>
         <div>
           <label>
@@ -65,93 +63,34 @@
     </template>
 
     <template id="pkmn-data-template">
-      α&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--alpha"></span>
-      <br />
-      σ&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--sigma"></span>
-      <br />
-      Θ&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--bigTheta"></span>
-      <br />
+      <div>α&nbsp;=&nbsp;<span bind-to="alpha"></span></div>
+      <div>σ&nbsp;=&nbsp;<span bind-to="sigma"></span></div>
+      <div>Θ&nbsp;=&nbsp;<span bind-to="bigTheta"></span></div>
       <hr />
-      θ&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--theta"></span>°
-      <br />
-      ϕ&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--phi"></span>°
-      <br />
-      δ&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--delta"></span>
-      <br />
-      M&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--manhattan"></span>
-      <br />
-      Ч&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--ch"></span>
-      <br />
-      ℓ&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--lightnessDiff"></span>
-      <br />
+      <div>θ&nbsp;=&nbsp;<span bind-to="theta"></span>°</div>
+      <div>ϕ&nbsp;=&nbsp;<span bind-to="phi"></span>°</div>
+      <div>δ&nbsp;=&nbsp;<span bind-to="delta"></span></div>
+      <div>M&nbsp;=&nbsp;<span bind-to="manhattan"></span></div>
+      <div>Ч&nbsp;=&nbsp;<span bind-to="ch"></span></div>
+      <div>ℓ&nbsp;=&nbsp;<span bind-to="lightnessDiff"></span></div>
       <hr />
-      β&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--importance"></span>
-      <br />
-      I&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--inertia"></span>
-      <br />
-      V&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--variance"></span>
-      <br />
-      Φ&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--muNuAngle"></span>°
-      <br />
-      N&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--size"></span>
-      <br />
-      L&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--lightness"></span>
-      <br />
-      C&nbsp;=&nbsp;<span class="pkmn-data-value pkmn-data-value--chroma"></span>
+      <div>β&nbsp;=&nbsp;<span bind-to="importance"></span></div>
+      <div>I&nbsp;=&nbsp;<span bind-to="inertia"></span></div>
+      <div>V&nbsp;=&nbsp;<span bind-to="variance"></span></div>
+      <div>Φ&nbsp;=&nbsp;<span bind-to="muNuAngle"></span>°</div>
+      <div>N&nbsp;=&nbsp;<span bind-to="size"></span></div>
+      <div>L&nbsp;=&nbsp;<span bind-to="lightness"></span></div>
+      <div>C&nbsp;=&nbsp;<span bind-to="chroma"></span></div>
     </template>
 
     <template id="pkmn-template">
-      <div class="pkmn">
-        <img />
-        <div class="pkmn-name"></div>
-        <div
-          role="button"
-          class="pkmn-total"
-          onmouseenter="event.target.querySelector('dialog').show()"
-          onmouseleave="event.target.querySelector('dialog').close()"
-        >
-          <dialog class="pkmn-data"></dialog>
-        </div>
-        <div class="pkmn-score"></div>
-        <div
-          role="button"
-          class="pkmn-cls pkmn-cls1"
-          onmouseenter="event.target.querySelector('dialog').show()"
-          onmouseleave="event.target.querySelector('dialog').close()"
-        >
-          <span></span><span></span>
-          <dialog class="pkmn-data" hidden></dialog>
-        </div>
-        <div
-          role="button"
-          class="pkmn-cls pkmn-cls2"
-          onmouseenter="event.target.querySelector('dialog').show()"
-          onmouseleave="event.target.querySelector('dialog').close()"
-        >
-          <span></span><span></span>
-          <dialog class="pkmn-data" hidden></dialog>
-        </div>
-        <div
-          role="button"
-          class="pkmn-cls pkmn-cls3"
-          onmouseenter="event.target.querySelector('dialog').show()"
-          onmouseleave="event.target.querySelector('dialog').close()"
-        >
-          <span></span><span></span>
-          <dialog class="pkmn-data" hidden></dialog>
-        </div>
-        <div
-          role="button"
-          class="pkmn-cls pkmn-cls4"
-          onmouseenter="event.target.querySelector('dialog').show()"
-          onmouseleave="event.target.querySelector('dialog').close()"
-        >
-          <span></span><span></span>
-          <dialog class="pkmn-data" hidden></dialog>
-        </div>
+      <div>
+        <img bind-to="image" />
+        <div bind-to="name"></div>
+        <!-- TODO the actual data -->
       </div>
     </template>
-
+    <!-- 
     <div class="main-container">
       <form
         action="javascript:void(0);"
@@ -252,33 +191,24 @@
           </div>
           <span class="fn-bracket">]</span>
         </div>
-      </form>
+      </form> -->
 
-      <form action="javascript:void(0);" id="sortMetric">
-        <!-- Template mount point -->
-      </form>
+    <!-- <form id="sortMetric"></form>
+    <form id="clusterMetric"></form> -->
 
-      <form action="javascript:void(0);" id="clusterMetric">
-        <!-- Template mount point -->
-      </form>
-
-      <form action="javascript:void(0);" id="colorSelect" autocomplete="off">
-        <label for="color-input-text">Target Color</label>
-        <button type="button" onclick="onColorChange(randomColor())">Random Color</button>
-        <input
-          id="color-input-text"
-          name="colorText"
-          type="text"
-          maxlength="7"
-          oninput="onColorChange(event.target.value)"
-        />
-        <input
-          name="colorPicker"
-          type="color"
-          onchange="onColorChange(event.target.value)"
-        />
+    <div class="sidebar | flow">
+      <form id="colorSelect" class="flex col small-gap" autocomplete="off">
+        <label class="emphasis" for="color-input-text">Target Color</label>
+        <div class="color-inputs | flex small-gap">
+          <input name="colorText" type="text" pattern="#?[0-9a-fA-F]*" maxlength="7" />
+          <input name="colorPicker" type="color" />
+        </div>
+        <button type="button" bind-to="randomButton">Random Color</button>
       </form>
+    </div>
 
+    <main>test</main>
+    <!-- 
       <form action="javascript:void(0);" id="sortControl" autocomplete="off">
         <div>
           <label>
@@ -335,7 +265,8 @@
           id="name-search"
           oninput="searchByName(event.target.value)"
         />
-      </div>
+      </div> 
     </div>
+-->
   </body>
 </html>

+ 22 - 0
script.js

@@ -0,0 +1,22 @@
+const targetColor = U.obs();
+const randomizeTargetColor = () => {
+  targetColor.value = d3
+    .hsl(Math.random() * 360, Math.random(), Math.random())
+    .formatHex();
+};
+
+U.element("colorSelect", ({ randomButton }, form) => {
+  U.field(form.elements.colorText, { obs: targetColor });
+  U.field(form.elements.colorPicker, { obs: targetColor });
+  U.form(form);
+  randomButton.addEventListener("click", randomizeTargetColor);
+});
+
+randomizeTargetColor();
+
+U.reactive(() => {
+  const contrast = getContrastingTextColor(targetColor.value);
+  const style = document.querySelector(":root").style;
+  style.setProperty("--background", targetColor.value);
+  style.setProperty("--highlight", contrast);
+});

+ 142 - 0
styles.css

@@ -0,0 +1,142 @@
+/* Reset */
+
+*,
+*::before,
+*::after {
+  box-sizing: border-box;
+}
+
+* {
+  margin: 0;
+  padding: 0;
+}
+
+html {
+  color-scheme: dark light;
+}
+
+body {
+  min-height: 100vh;
+}
+
+img,
+picture,
+video,
+canvas,
+svg {
+  display: block;
+  max-width: 100%;
+}
+
+input,
+button,
+textarea,
+select {
+  font: inherit;
+}
+
+/* Colors */
+
+:root {
+  --color-dark: #1f2123;
+  --color-light: #e8e6e3;
+}
+
+:root {
+  /* separated since these are used by the actual script */
+  --highlight: #ddd;
+  --background: #222;
+}
+
+/* Font */
+
+body {
+  font-family: Arial, Helvetica, sans-serif;
+}
+
+/* Composition */
+
+.flex {
+  display: flex;
+  gap: var(--gap, 1rem);
+}
+
+.even {
+  justify-content: space-between;
+  align-items: stretch;
+}
+
+.col {
+  flex-direction: column;
+}
+
+.grid {
+  display: grid;
+  gap: var(--gap, 1rem);
+}
+
+.flow > * + * {
+  margin-block-start: var(--flow-space, 1rem);
+}
+
+.no-gap {
+  --gap: 0px;
+}
+
+.small-gap {
+  --gap: 0.5rem;
+}
+
+/* Utility */
+
+.emphasis {
+  font-size: 1.2rem;
+  font-weight: 600;
+}
+
+/* Block */
+
+body {
+  color: var(--highlight);
+  background-color: var(--background);
+  accent-color: var(--highlight);
+  transition: accent-color 250ms, color 250ms, background-color 250ms;
+}
+
+.sidebar {
+  position: fixed;
+  width: 14rem;
+  height: 100%;
+  border-right: 1px solid var(--highlight);
+  padding-block-start: var(--flow-space, 1rem);
+  padding-inline: calc(var(--flow-space, 1rem) / 2);
+}
+
+main {
+  position: relative;
+  width: calc(100% - 14rem);
+  padding-inline: calc(var(--flow-space, 1rem) / 2);
+  float: right;
+}
+
+#colorSelect label {
+  text-align: center;
+}
+
+#colorSelect button {
+  border-radius: 100vmax;
+  padding-block: 0.25rem;
+  border: 1px solid var(--highlight);
+}
+
+#colorSelect input[type="text"] {
+  border-radius: 100vmax;
+  padding-inline: 1rem;
+  text-align: center;
+  border: 1px solid var(--highlight);
+  min-width: 0px;
+}
+
+#colorSelect input[type="color"] {
+  flex: 0 0 2rem;
+}