ToggleButton component is used to create a button that can be toggled on or off.
import { ToggleButton } from 'primereact/togglebutton';
<ToggleButton>
<ToggleButton.Indicator>Toggle</ToggleButton.Indicator>
</ToggleButton>
import { ToggleButton } from 'primereact/togglebutton';
export default function BasicDemo() {
return (
<div className="card flex items-center justify-center">
<ToggleButton>
<ToggleButton.Indicator>Bold</ToggleButton.Indicator>
</ToggleButton>
</div>
);
}
This is called the render prop pattern. It lets you use a function to customize what the component displays based on its internal state.
import { ToggleButtonIndicatorInstance } from '@primereact/types/shared/togglebutton';
import { ToggleButton } from 'primereact/togglebutton';
export default function StateDemo() {
return (
<div className="card flex flex-wrap items-center justify-center gap-4">
<ToggleButton>
<ToggleButton.Indicator>{({ togglebutton }: ToggleButtonIndicatorInstance) => (togglebutton?.state.pressed ? 'On' : 'Off')}</ToggleButton.Indicator>
</ToggleButton>
<ToggleButton>
<ToggleButton.Indicator>
{({ togglebutton }: ToggleButtonIndicatorInstance) =>
togglebutton?.state.pressed ? (
<>
<i className="pi pi-lock"></i>Locked
</>
) : (
<>
<i className="pi pi-lock-open"></i>Unlocked
</>
)
}
</ToggleButton.Indicator>
</ToggleButton>
<ToggleButton>
<ToggleButton.Indicator>
{({ togglebutton }: ToggleButtonIndicatorInstance) =>
togglebutton?.state.pressed ? (
<>
<i className="pi pi-volume-up"></i>Mute
</>
) : (
<>
<i className="pi pi-volume-off"></i>Unmute
</>
)
}
</ToggleButton.Indicator>
</ToggleButton>
<ToggleButton>
<ToggleButton.Indicator className="w-8 h-8">{({ togglebutton }: ToggleButtonIndicatorInstance) => (togglebutton?.state.pressed ? <i className="pi pi-heart-fill"></i> : <i className="pi pi-heart"></i>)}</ToggleButton.Indicator>
</ToggleButton>
</div>
);
}
Use pressed
and onPressedChange
properties to control the state of the ToggleButton.
import type { ToggleButtonChangeEvent } from '@primereact/types/shared/togglebutton';
import { ToggleButton } from 'primereact/togglebutton';
import * as React from 'react';
export default function ControlledDemo() {
const [pressedState, setPressedState] = React.useState(false);
return (
<div className="card flex items-center justify-center">
<ToggleButton pressed={pressedState} onPressedChange={(e: ToggleButtonChangeEvent) => setPressedState(e.pressed)}>
<ToggleButton.Indicator>{pressedState ? 'Pressed' : 'Not Pressed'}</ToggleButton.Indicator>
</ToggleButton>
</div>
);
}
ToggleButton
provides small and large sizes as alternatives to the base by using the size
property.
import { ToggleButton } from 'primereact/togglebutton';
export default function SizesDemo() {
return (
<div className="card flex flex-col gap-2 items-center justify-center">
<ToggleButton size="small" className="min-w-16">
<ToggleButton.Indicator>Small</ToggleButton.Indicator>
</ToggleButton>
<ToggleButton size="normal" className="min-w-20">
<ToggleButton.Indicator>Normal</ToggleButton.Indicator>
</ToggleButton>
<ToggleButton size="large" className="min-w-28">
<ToggleButton.Indicator>Large</ToggleButton.Indicator>
</ToggleButton>
</div>
);
}
Invalid state is displayed using the invalid
prop to indicate a failed validation. You can use this style when integrating with form validation libraries.
import type { ToggleButtonChangeEvent } from '@primereact/types/shared/togglebutton';
import { ToggleButton } from 'primereact/togglebutton';
import * as React from 'react';
export default function InvalidDemo() {
const [pressedState, setPressedState] = React.useState(false);
return (
<div className="card flex items-center justify-center">
<ToggleButton pressed={pressedState} onPressedChange={(e: ToggleButtonChangeEvent) => setPressedState(e.pressed)} invalid={!pressedState}>
<ToggleButton.Indicator>Invalid</ToggleButton.Indicator>
</ToggleButton>
</div>
);
}
When disabled
is present, the element cannot be edited and focused.
import { ToggleButton } from 'primereact/togglebutton';
export default function DisabledDemo() {
return (
<div className="card flex items-center justify-center">
<ToggleButton disabled>
<ToggleButton.Indicator>Disabled</ToggleButton.Indicator>
</ToggleButton>
</div>
);
}
The allowEmpty
property is true by default. If set to false, the component ensures that at least one item remains selected at all times.
import { ToggleButton } from 'primereact/togglebutton';
export default function GroupDemo() {
return (
<div className="card flex items-center justify-center">
<ToggleButton.Group allowEmpty={false}>
<ToggleButton value="left">
<ToggleButton.Indicator>
<i className="pi pi-align-left"></i>
</ToggleButton.Indicator>
</ToggleButton>
<ToggleButton value="center">
<ToggleButton.Indicator>
<i className="pi pi-align-center"></i>
</ToggleButton.Indicator>
</ToggleButton>
<ToggleButton value="right">
<ToggleButton.Indicator>
<i className="pi pi-align-right"></i>
</ToggleButton.Indicator>
</ToggleButton>
<ToggleButton value="justify">
<ToggleButton.Indicator>
<i className="pi pi-align-justify"></i>
</ToggleButton.Indicator>
</ToggleButton>
</ToggleButton.Group>
</div>
);
}
Use value
and onValueChange
properties to control the state of the ToggleButton.Group
.
import type { ToggleButtonGroupValueChangeEvent } from '@primereact/types/shared/togglebutton';
import { ToggleButton } from 'primereact/togglebutton';
import * as React from 'react';
export default function ControlledGroupDemo() {
const [value, setValue] = React.useState<string[]>([]);
return (
<div className="card flex items-center justify-center">
<ToggleButton.Group allowEmpty={false} value={value} onValueChange={(e: ToggleButtonGroupValueChangeEvent) => setValue(e.value as string[])}>
<ToggleButton value="left">
<ToggleButton.Indicator>
<i className="pi pi-align-left"></i>
</ToggleButton.Indicator>
</ToggleButton>
<ToggleButton value="center">
<ToggleButton.Indicator>
<i className="pi pi-align-center"></i>
</ToggleButton.Indicator>
</ToggleButton>
<ToggleButton value="right">
<ToggleButton.Indicator>
<i className="pi pi-align-right"></i>
</ToggleButton.Indicator>
</ToggleButton>
<ToggleButton value="justify">
<ToggleButton.Indicator>
<i className="pi pi-align-justify"></i>
</ToggleButton.Indicator>
</ToggleButton>
</ToggleButton.Group>
</div>
);
}
ToggleButton.Group
allows selecting only one item by default and setting multiple
option enables choosing more than one item. In multiple case, model property should be an array.
import { ToggleButton } from 'primereact/togglebutton';
export default function MultipleDemo() {
return (
<div className="card flex items-center justify-center">
<ToggleButton.Group multiple>
<ToggleButton value="bold">
<ToggleButton.Indicator>Bold</ToggleButton.Indicator>
</ToggleButton>
<ToggleButton value="italic">
<ToggleButton.Indicator>Italic</ToggleButton.Indicator>
</ToggleButton>
<ToggleButton value="underline">
<ToggleButton.Indicator>Underline</ToggleButton.Indicator>
</ToggleButton>
</ToggleButton.Group>
</div>
);
}
ToggleButton.Group
provides small and large sizes as alternatives to the base by using the size
property.
import { ToggleButton } from 'primereact/togglebutton';
export default function SizesGroupDemo() {
return (
<div className="card flex flex-col gap-4 items-center justify-center">
<ToggleButton.Group size="small" multiple>
<ToggleButton value="bold">
<ToggleButton.Indicator>Bold</ToggleButton.Indicator>
</ToggleButton>
<ToggleButton value="italic">
<ToggleButton.Indicator>Italic</ToggleButton.Indicator>
</ToggleButton>
<ToggleButton value="underline">
<ToggleButton.Indicator>Underline</ToggleButton.Indicator>
</ToggleButton>
</ToggleButton.Group>
<ToggleButton.Group size="normal" multiple>
<ToggleButton value="bold">
<ToggleButton.Indicator>Bold</ToggleButton.Indicator>
</ToggleButton>
<ToggleButton value="italic">
<ToggleButton.Indicator>Italic</ToggleButton.Indicator>
</ToggleButton>
<ToggleButton value="underline">
<ToggleButton.Indicator>Underline</ToggleButton.Indicator>
</ToggleButton>
</ToggleButton.Group>
<ToggleButton.Group size="large" multiple>
<ToggleButton value="bold">
<ToggleButton.Indicator>Bold</ToggleButton.Indicator>
</ToggleButton>
<ToggleButton value="italic">
<ToggleButton.Indicator>Italic</ToggleButton.Indicator>
</ToggleButton>
<ToggleButton value="underline">
<ToggleButton.Indicator>Underline</ToggleButton.Indicator>
</ToggleButton>
</ToggleButton.Group>
</div>
);
}
Invalid state is displayed using the invalid
prop to indicate a failed validation. You can use this style when integrating with form validation libraries.
import type { ToggleButtonGroupValueChangeEvent } from '@primereact/types/shared/togglebutton';
import { ToggleButton } from 'primereact/togglebutton';
import * as React from 'react';
export default function InvalidGroupDemo() {
const [value, setValue] = React.useState<string[] | null>(null);
return (
<div className="card flex items-center justify-center">
<ToggleButton.Group value={value} onValueChange={(e: ToggleButtonGroupValueChangeEvent) => setValue(e.value as string[])} invalid={value === null}>
<ToggleButton value="monthly">
<ToggleButton.Indicator>Monthly</ToggleButton.Indicator>
</ToggleButton>
<ToggleButton value="yearly">
<ToggleButton.Indicator>Yearly</ToggleButton.Indicator>
</ToggleButton>
</ToggleButton.Group>
</div>
);
}
When disabled
is present, the element cannot be edited and focused entirely. Certain options can also be disabled using their disabled
properties.
import { ToggleButton } from 'primereact/togglebutton';
export default function DisabledGroupDemo() {
return (
<div className="card flex items-center gap-4 justify-center">
<ToggleButton.Group disabled>
<ToggleButton value="off">
<ToggleButton.Indicator>Off</ToggleButton.Indicator>
</ToggleButton>
<ToggleButton value="on">
<ToggleButton.Indicator>On</ToggleButton.Indicator>
</ToggleButton>
</ToggleButton.Group>
<ToggleButton.Group>
<ToggleButton value="option1">
<ToggleButton.Indicator>Option 1</ToggleButton.Indicator>
</ToggleButton>
<ToggleButton value="option2" disabled>
<ToggleButton.Indicator>Option 2</ToggleButton.Indicator>
</ToggleButton>
</ToggleButton.Group>
</div>
);
}