Toggle & Switch (#21979)

![CleanShot 2024-12-13 at 11 27
39@2x](https://github.com/user-attachments/assets/7c7828c0-c5c7-4dc6-931e-722366d4f15a)

- Adds the Switch component
- Updates `Selected`, `Selectable` -> `ToggleState`, `Toggleable`
- Adds `checkbox` and `switch` functions to align better with other
elements in our layout system.

We decided not to merge Switch and Checkbox. However, in a followup I'll
introduce a Toggle or AnyToggle enum so we can update
`CheckboxWithLabel` -> `ToggleWithLabel` as this component will work
exactly the same with either a Checkbox or a Switch.

Release Notes:

- N/A
This commit is contained in:
Nate Butler
2024-12-13 14:23:02 -05:00
committed by GitHub
parent 2f2e7f0317
commit 19d6e067af
77 changed files with 626 additions and 453 deletions
@@ -1,14 +1,15 @@
/// A trait for elements that can be selected.
/// A trait for elements that can be toggled.
///
/// Generally used to enable "toggle" or "active" behavior and styles on an element through the [`Selection`] status.
pub trait Selectable {
/// Implement this for elements that are visually distinct
/// when in two opposing states, like checkboxes or switches.
pub trait Toggleable {
/// Sets whether the element is selected.
fn selected(self, selected: bool) -> Self;
fn toggle_state(self, selected: bool) -> Self;
}
/// Represents the selection status of an element.
#[derive(Debug, Default, PartialEq, Eq, Hash, Clone, Copy)]
pub enum Selection {
pub enum ToggleState {
/// The element is not selected.
#[default]
Unselected,
@@ -18,7 +19,7 @@ pub enum Selection {
Selected,
}
impl Selection {
impl ToggleState {
/// Returns the inverse of the current selection status.
///
/// Indeterminate states become selected if inverted.
@@ -30,7 +31,7 @@ impl Selection {
}
}
impl From<bool> for Selection {
impl From<bool> for ToggleState {
fn from(selected: bool) -> Self {
if selected {
Self::Selected
@@ -40,7 +41,7 @@ impl From<bool> for Selection {
}
}
impl From<Option<bool>> for Selection {
impl From<Option<bool>> for ToggleState {
fn from(selected: Option<bool>) -> Self {
match selected {
Some(true) => Self::Selected,