Skip to main content

ColorSlider

The ColorSlider widget edits color ramp stops. Wire its events so each interaction updates the layer’s renderer.

Simple example

The following example listens for slider events, clones the layer renderer, and writes the slider’s stops onto the color visual variable (same idea as the ArcGIS color visualization sample).

Live Editor
function Example() {
  const [layerRef, setLayerRef] = useState<__esri.FeatureLayer>(null);
  const [rendererResponse, setRendererResponse] =
    useState<__esri.RendererResult>(null);
  const [layerRenderer, setLayerRenderer] = useState<__esri.Renderer | null>(
    null,
  );

  useEffect(() => {
    if (layerRef) {
      const createRenderer = async () => {
        const response = await createContinuousRenderer({
          layer: layerRef,
          field: "pop20",
          theme: "high-to-low",
        });
        setRendererResponse(response);
        setLayerRenderer(response.renderer.clone());
      };
      createRenderer();
    }
  }, [layerRef]);

  const applySliderToRenderer = (slider: __esri.ColorSlider) => {
    setLayerRenderer((current) => {
      const renderer = (current ?? rendererResponse?.renderer)?.clone();
      if (!renderer?.visualVariables?.[0]) return current;

      const color = renderer.visualVariables[0].clone();
      color.stops = slider.stops;
      renderer.visualVariables = [color];

      return renderer;
    });
  };

  return (
    <MapView
      ViewProperties={{ extent: OAHU_EXTENT_2 }}
      MapProperties={{ basemap: "topo-vector" }}
      style={{ height: "400px", width: "100%" }}
    >
      <FeatureLayer
        url={HI_CENSUS_2020_FL_URL}
        events={{ "layerview-create": (e) => setLayerRef(e.layerView.layer) }}
        renderer={layerRenderer}
      />

      <Legend position="top-right" />

      <h4 className="mt-2! mb-0!">Population 2020</h4>
      <div
        id="color-slider-container"
        style={{ height: "300px", width: "100%" }}
      >
        {rendererResponse && (
          <ColorSlider
            container="color-slider-container"
            stops={docusaurusCompatibleStops(rendererResponse)}
            min={rendererResponse.statistics.min as number}
            max={rendererResponse.statistics.max as number}
            events={(slider) => ({
              "thumb-change": () => applySliderToRenderer(slider),
              "thumb-drag": () => applySliderToRenderer(slider),
              "segment-drag": () => applySliderToRenderer(slider),
              "min-change": () => applySliderToRenderer(slider),
              "max-change": () => applySliderToRenderer(slider),
            })}
          />
        )}
      </div>
    </MapView>
  );
}
Result
Loading...