segmented-control

    0.1.17 • Public • Published

    .

    npm version

    <SegmentedControl> – a good-lookin' segmented control React component

    <SegmentedControlWithoutStyles> - a version that doesn't import the stylesheet (if <SegmentedControl> doesn't work in your build system—eg Next.js)

    <FormsySegmentedControl> – a version for Formsy

    UX background

    In iOS, a segmented control is usually used to display different views (the equivalent of tabs in material design). However, segmented controls are increasingly being used in lieu of plain radio buttons or select inputs (dropdowns, or material menus). See for instance the designer lukew's recommendations:

    Other good choices are radio groups, like this Ionic component, or a button list, as used in the Yo or Thumbtack apps, that looks the same, except on click, instead of seeing a checkmark, you're taken to the next screen.

    A similar component in material design is the toggle button.

    Component

    Demo: lorensr.me/segmented-control

    two three disabled formsy

    Usage

    npm install --save segmented-control

    Plain

    <SegmentedControl> props:

    • className: PropTypes.string: optional custom className for the container in addition to the default segmented-control class.
    • name: PropTypes.string.isRequired: name of the radio <input>s. Also the attribute included in the first argument of Formsy's onSubmit.
    • options: PropTypes.array.isRequired: Maximum length 10, each element an object of the form:
      • label: display text
      • value: value passed to setValue and Formsy's onSubmit
      • default: true: one object must have this
      • disabled: true: optional
    • style: PropTypes.object: common styles are width and color
    • setValue: PropTypes.func: callback on input change, passed the value string. Called once initially with the default value on mount.
    import { SegmentedControl } from 'segmented-control'
    
    <SegmentedControl
      name="oneDisabled"
      options={[
        { label: "One", value: "one", disabled: true },
        { label: "Two", value: "two" },
        { label: "Three", value: "three", default: true },
        { label: "Four", value: "four" }
      ]}
      setValue={newValue => this.doSomething(newValue)}
      style={{ width: 400, color: '#ab47bc' }} // purple400
      />

    Formsy

    <FormsySegmentedControl> has the same props, but includes Formsy.Mixin and calls Formsy's setValue, so that the value is included in onSubmit (see the event triggered by submitting the demo form). In the example below, the first arg of onSubmit would be {exampleInput: 'two'}:

    import Formsy from 'formsy-react'
    import Button from '@material-ui/core/Button'
    import MuiThemeProvider from '@material-ui/core/styles/MuiThemeProvider'
    import { FormsySegmentedControl } from 'segmented-control'
    
    <MuiThemeProvider>
      <Formsy.Form
        onValidSubmit={this.onSubmit}
        >
        <FormsySegmentedControl
          name="exampleInput"
          options={[
            { label: "One", value: "one" },
            { label: "Two", value: "two", default: true },
            { label: "Three", value: "three" }
          ]}
          style={{ width: 300, color: 'rgb(0, 188, 212)' }} // match default material-ui primary teal
          />
        <Button
          variant="contained"
          type="submit"
          label="submit formsy form"
          style={{
            display: 'block',
            width: 200,
            margin: "20px auto"
          }}
          primary
        >
          Submit
        </Button>
      </Formsy.Form>
    </MuiThemeProvider>

    Development

    git clone git@github.com:lorensr/segmented-control.git
    npm install
    npm start

    http://localhost:9009

    Credits

    Install

    npm i segmented-control

    DownloadsWeekly Downloads

    1,096

    Version

    0.1.17

    License

    MIT

    Unpacked Size

    60.8 kB

    Total Files

    9

    Last publish

    Collaborators

    • lorensr