Note: This site is currently "Under construction". I'm migrating to a new version of my site building software. Lots of things are in a state of disrepair as a result (for example, footnote links aren't working). It's all part of the process of building in public. Most things should still be readable though.

HTML Input Range Number Slider With Tic Marks

Code

```cargo
[dependencies]
minijinja = { version = "1.0", features = ["loader"] }
```

use minijinja::{Environment, context};

fn main() {
  let label = "Hue";
  let id = "hue";
  let class_prefix = "lchSlider";
  let min = 0;  
  let max = 359.999;
  let step = 0.01;
  let value = 260;
  let mut tics: Vec<String> = vec![];
  let show_tics = false;

  //for tic in min..=max {
    //tics.push(format!("{}", tic))
  //};

    let mut env = Environment::new();
    env.add_template_owned("template", r#"
<div class="{{ class_prefix }}Wrapper">{% if show_tics == true %}
  <datalist id="{{ id }}Tics">
  {% for tic in tics %}  <option value="{{ tic }}"></option>
  {% endfor %}</datalist>{% endif %}
  <label class="{{ class_prefix }}_labelWrapper">
    <span class="{{ class_prefix }}_label">{{ label }}</span>
    <span>
      <input type="range" id="{{ id }}" name="{{ id }}" 
      min="{{ min }}" max="{{ max }}" step="{{ step }}" 
      class="{{ class_prefix }}Slider" {% if show_tics == true %}list="{{ id }}Tics"{% endif %} />
      <span id="{{ id }}Value" class="{{ class_prefix }}Value"></span>
    </span>
  </label>
  <script>document.addEventListener('DOMContentLoaded', () => {
    const el = document.querySelector(`#{{ id }}`)
    el.value = {{ value }}
    document.querySelector('#{{ id }}Value').innerHTML= el.value
    el.addEventListener('input', () =>{
      document.querySelector('#{{ id }}Value').innerHTML = el.value
    })
  })</script>
</div>"#.to_string()
    ).unwrap();
    let skeleton = env.get_template("template").unwrap();
    let output = skeleton.render(context!(
      class_prefix => class_prefix,
      id => id,
      label => label,
      min => min,
      max => max,
      step => step,
      tics => tics,
      show_tics => show_tics,
      value => value,
    )).unwrap();
    println!("{}", output.trim());
}

Results

<div class="lchSliderWrapper">
  <label class="lchSlider_labelWrapper">
    <span class="lchSlider_label">Hue</span>
    <span>
      <input type="range" id="hue" name="hue" 
      min="0" max="359.999" step="0.01" 
      class="lchSliderSlider"  />
      <span id="hueValue" class="lchSliderValue"></span>
    </span>
  </label>
  <script>document.addEventListener('DOMContentLoaded', () => {
    const el = document.querySelector(`#hue`)
    el.value = 260
    document.querySelector('#hueValue').innerHTML= el.value
    el.addEventListener('input', () =>{
      document.querySelector('#hueValue').innerHTML = el.value
    })
  })</script>
</div>

warning: variable does not need to be mutable
  --> /Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:16:7
   |
16 |   let mut tics: Vec<String> = vec![];
   |       ----^^^^
   |       |
   |       help: remove this `mut`
   |
   = note: `#[warn(unused_mut)]` on by default