| --- |
| title: Switch |
| sidebar_label: Switch |
| --- |
| |
| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one |
| or more contributor license agreements. See the NOTICE file |
| distributed with this work for additional information |
| regarding copyright ownership. The ASF licenses this file |
| to you under the Apache License, Version 2.0 (the |
| "License"); you may not use this file except in compliance |
| with the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, |
| software distributed under the License is distributed on an |
| "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| KIND, either express or implied. See the License for the |
| specific language governing permissions and limitations |
| under the License. |
| --> |
| |
| import { StoryWithControls } from '../../../src/components/StorybookWrapper'; |
| |
| # Switch |
| |
| A toggle switch for boolean on/off states. Supports loading indicators, sizing, and an HTML title attribute for accessibility tooltips. |
| |
| ## Live Example |
| |
| <StoryWithControls |
| component="Switch" |
| props={{ |
| disabled: false, |
| loading: false, |
| title: "Toggle feature" |
| }} |
| controls={[ |
| { |
| name: "disabled", |
| label: "Disabled", |
| type: "boolean", |
| description: "Whether the switch is disabled." |
| }, |
| { |
| name: "loading", |
| label: "Loading", |
| type: "boolean", |
| description: "Whether to show a loading spinner inside the switch." |
| }, |
| { |
| name: "title", |
| label: "Title", |
| type: "text", |
| description: "HTML title attribute shown as a browser tooltip on hover. Useful for accessibility." |
| }, |
| { |
| name: "checked", |
| label: "Checked", |
| type: "boolean", |
| description: "Whether the switch is on." |
| }, |
| { |
| name: "size", |
| label: "Size", |
| type: "radio", |
| options: [ |
| "small", |
| "default" |
| ], |
| description: "Size of the switch." |
| } |
| ]} |
| /> |
| |
| ## Try It |
| |
| Edit the code below to experiment with the component: |
| |
| ```tsx live |
| function Demo() { |
| const [checked, setChecked] = React.useState(true); |
| return ( |
| <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}> |
| <Switch |
| checked={checked} |
| onChange={setChecked} |
| title="Toggle feature" |
| /> |
| <span>{checked ? 'On' : 'Off'}</span> |
| <span style={{ color: '#999', fontSize: 12 }}>(hover the switch to see the title tooltip)</span> |
| </div> |
| ); |
| } |
| ``` |
| |
| ## Switch States |
| |
| ```tsx live |
| function SwitchStates() { |
| return ( |
| <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}> |
| <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}> |
| <Switch defaultChecked title="Enabled switch" /> |
| <span>Checked</span> |
| </div> |
| <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}> |
| <Switch title="Unchecked switch" /> |
| <span>Unchecked</span> |
| </div> |
| <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}> |
| <Switch disabled defaultChecked title="Disabled on" /> |
| <span>Disabled (on)</span> |
| </div> |
| <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}> |
| <Switch disabled title="Disabled off" /> |
| <span>Disabled (off)</span> |
| </div> |
| <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}> |
| <Switch loading defaultChecked title="Loading switch" /> |
| <span>Loading</span> |
| </div> |
| </div> |
| ); |
| } |
| ``` |
| |
| ## Sizes |
| |
| ```tsx live |
| function SizesDemo() { |
| return ( |
| <div style={{ display: 'flex', alignItems: 'center', gap: 24 }}> |
| <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}> |
| <Switch size="small" defaultChecked title="Small switch" /> |
| <span>Small</span> |
| </div> |
| <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}> |
| <Switch size="default" defaultChecked title="Default switch" /> |
| <span>Default</span> |
| </div> |
| </div> |
| ); |
| } |
| ``` |
| |
| ## Settings Panel |
| |
| ```tsx live |
| function SettingsPanel() { |
| const [notifications, setNotifications] = React.useState(true); |
| const [darkMode, setDarkMode] = React.useState(false); |
| const [autoRefresh, setAutoRefresh] = React.useState(true); |
| return ( |
| <div style={{ maxWidth: 320, border: '1px solid #e8e8e8', borderRadius: 8, padding: 16 }}> |
| <h4 style={{ marginTop: 0 }}>Dashboard Settings</h4> |
| {[ |
| { label: 'Email notifications', checked: notifications, onChange: setNotifications, title: 'Toggle email notifications' }, |
| { label: 'Dark mode', checked: darkMode, onChange: setDarkMode, title: 'Toggle dark mode' }, |
| { label: 'Auto-refresh data', checked: autoRefresh, onChange: setAutoRefresh, title: 'Toggle auto-refresh' }, |
| ].map(({ label, checked, onChange, title }) => ( |
| <div key={label} style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', padding: '8px 0', borderBottom: '1px solid #f0f0f0' }}> |
| <span>{label}</span> |
| <Switch checked={checked} onChange={onChange} title={title} /> |
| </div> |
| ))} |
| </div> |
| ); |
| } |
| ``` |
| |
| ## Props |
| |
| | Prop | Type | Default | Description | |
| |------|------|---------|-------------| |
| | `disabled` | `boolean` | `false` | Whether the switch is disabled. | |
| | `loading` | `boolean` | `false` | Whether to show a loading spinner inside the switch. | |
| | `title` | `string` | `"Toggle feature"` | HTML title attribute shown as a browser tooltip on hover. Useful for accessibility. | |
| |
| ## Import |
| |
| ```tsx |
| import { Switch } from '@superset/components'; |
| ``` |
| |
| --- |
| |
| :::tip[Improve this page] |
| This documentation is auto-generated from the component's Storybook story. |
| Help improve it by [editing the story file](https://github.com/apache/superset/edit/master/superset-frontend/packages/superset-ui-core/src/components/Switch/Switch.stories.tsx). |
| ::: |