npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

react-native-a11y-slider

v1.3.2

Published

An accessible range slider that supports assistive devices like screen readers

Downloads

3,740

Readme

React Native Accessible Slider

A slider that supports assistive devices, like screen readers, out of the box.

The slider can be setup to either have a single value or define a two value range (min/max).

Single value example

Range example

Getting Started

yarn add react-native-a11y-slider

or

npm install -S react-native-a11y-slider

Creates a basic slider that with a min/max slider and a total range from 1 to 100.

import Slider from "react-native-a11y-slider";

function Example() {
  return <Slider min={1} max={100} values={[10, 87]} />;
}

Props

| Prop name | Default | Type | Description | | :----------------: | :------------------------------: | :-------------------------------------------------: | :-----------------------------------------------------------------------------------------------------: | | values | [0] | number[] | The initial values of the sliders. If the array has two values, there will be two slider markers | | min | | number | The minimum value of the slider scale | | max | | number | The max value of the slider scale | | increment | 1 | number | If min and max are defined, this is the increment between slider steps | | sliderValues | | number[] | Hardcode the slider step values. If this is used, min and max are ignored | | markerColor | #333333 | 'string' | The hex color to use for the slider marker thumb | | style | | ViewStyle | The style to apply to the slider container | | trackStyle | | ViewStyle | The style to apply to the slider track | | labelStyle | | ViewStyle | The style to apply to the floating label | | labelTextStyle | | ViewStyle | The style to apply to the floating label text | | selectedTrackStyle | | ViewStyle | The style to apply to the selected section of the slider track | | showLabel | true | boolean | Show the floating marker label over the slider marker | | onChange | | (values) => void | Fired when the slider value changes | | onSlidingStart | | (type) => void | Fired when one of the markers starts to be dragged | | onSlidingComplete | | (type) => void | Fired when one of the markers finishes being dragged | | labelComponent | src/Label | Component | The component used for the floating marker label | | markerComponent | srv/Marker | Component | The component used for the marker thumb. Note, this needs to have a static size property. (see below) | | setA11yMarkerProps | | Function | Customize the accessibility values (see below) | | hitSlop | | Insets | Defines how far a touch event can start away from the marker |

Custom Marker

You can customize the marker dot (also known as a "thumb") by passing a custom Marker Component in the props.

NOTE: In order for the slider to know how to calculate steps without unnecessary rendering flashes, your component MUST define a static size property.

You can use Marker.tsx as an example

import React from "react";
import { View } from "react-native";
import { MarkerProps } from "react-native-a11y-slider";

function MyMarker({ color }: MarkerProps) {
  return (
    <View
      style={{
        backgroundColor: "red",
        height: MyMarker.size,
        width: MyMarker.size,
      }}
    />
  );
}
Marker.size = 30;
export default MyMarker;
import Slider from "react-native-a11y-slider";
import MyMarker from "./MyMarker";

function SliderExample() {
  return (
    <Slider min={1} max={100} values={[10, 87]} markerComponent={MyMarker} />
  );
}

Accessibility values

For a screen reader, each slider marker thumb will have the following accessibility attributes defined:

  • accessibilityLabel
  • accessibilityRole: 'adjustable'
  • accessibilityValue
    • min
    • max
    • now
    • text
  • accessibilityActions: [{ name: "increment" }, { name: "decrement" }]
  • onAccessibilityAction: <internal function>

(learn more about React Native accessibility attributes)

If you want to customize any of the values (except for accessibilityActions and onAccessibilityAction), you can define a setA11yMarkerProps callback function. This function will be called each time the marker is rendered or moved.

import React from "react";
import Slider, {
  MarkerType,
  setA11yMarkerPropsFunctionArgs,
} from "react-native-a11y-slider";
import MyMarker from "./MyMarker";

function DistanceSlider() {
  const setA11yProps = useCallback(
    ({ markerType, value, minValue, maxValue }: setA11yMarkerPropsFunctionArgs) => {

      let accessibilityLabel = "Min distance";
      if (markerType === MarkerType.UPPER) {
        accessibilityLabel = "Max distance";
      }

      const accessibilityValue = {
        min: minValue,
        max: maxValue,
        now: value,
        text: `${value} miles`,
      },

      return {
        accessibilityLabel,
        accessibilityValue
      };
    },
    []
  );

  return (
    <Slider
      min={1}
      max={100}
      values={[10, 87]}
      setA11yMarkerProps={setA11yProps}
    />
  );
}