Fixes a few docs pages

Signed-off-by: Charles de Dreuille <charles.dedreuille@gmail.com>
This commit is contained in:
Charles de Dreuille
2026-01-15 17:49:42 +01:00
parent c29416593e
commit 8e4fc42348
8 changed files with 538 additions and 294 deletions
@@ -10,7 +10,7 @@ import { Text } from '../../../../../packages/ui/src/components/Text/Text';
export const Default = () => {
return (
<Card>
<Card style={{ width: '300px', height: '200px' }}>
<CardHeader>Header</CardHeader>
<CardBody>Body</CardBody>
<CardFooter>Footer</CardFooter>
+30 -16
View File
@@ -12,17 +12,35 @@ import {
} from '../../../../../packages/ui/src/components/Menu/Menu';
import { Button } from '../../../../../packages/ui/src/components/Button/Button';
import { MemoryRouter } from 'react-router-dom';
import { RiFileLine, RiFolderLine, RiImageLine } from '@remixicon/react';
import {
RiChat1Line,
RiFileLine,
RiFolderLine,
RiImageLine,
RiSettingsLine,
RiShareBoxLine,
} from '@remixicon/react';
export const Preview = () => (
<MemoryRouter>
<MenuTrigger>
<Button variant="secondary">Menu</Button>
<Button aria-label="Menu">Menu</Button>
<Menu>
<MenuItem>New File</MenuItem>
<MenuItem>Open File</MenuItem>
<MenuItem>Save</MenuItem>
<MenuItem>Save As...</MenuItem>
<MenuItem>Edit</MenuItem>
<MenuItem>Duplicate</MenuItem>
<MenuItem>Rename</MenuItem>
<MenuSeparator />
<MenuItem iconStart={<RiShareBoxLine />}>Share</MenuItem>
<MenuItem iconStart={<RiChat1Line />}>Feedback</MenuItem>
<MenuSeparator />
<SubmenuTrigger>
<MenuItem iconStart={<RiSettingsLine />}>Settings</MenuItem>
<Menu placement="right top">
<MenuItem>Edit</MenuItem>
<MenuItem>Duplicate</MenuItem>
<MenuItem>Rename</MenuItem>
</Menu>
</SubmenuTrigger>
</Menu>
</MenuTrigger>
</MemoryRouter>
@@ -53,9 +71,9 @@ export const PreviewIcons = () => (
<MenuTrigger>
<Button variant="secondary">Menu</Button>
<Menu>
<MenuItem icon={<RiFileLine />}>New File</MenuItem>
<MenuItem icon={<RiFolderLine />}>New Folder</MenuItem>
<MenuItem icon={<RiImageLine />}>New Image</MenuItem>
<MenuItem iconStart={<RiFileLine />}>New File</MenuItem>
<MenuItem iconStart={<RiFolderLine />}>New Folder</MenuItem>
<MenuItem iconStart={<RiImageLine />}>New Image</MenuItem>
</Menu>
</MenuTrigger>
</MemoryRouter>
@@ -110,7 +128,7 @@ export const PreviewSeparators = () => (
export const PreviewAutocompleteMenu = () => (
<MemoryRouter>
<MenuAutocomplete label="Search" placeholder="Type to search...">
<MenuAutocomplete placeholder="Type to search...">
<MenuItem>Option 1</MenuItem>
<MenuItem>Option 2</MenuItem>
<MenuItem>Option 3</MenuItem>
@@ -120,7 +138,7 @@ export const PreviewAutocompleteMenu = () => (
export const PreviewAutocompleteListbox = () => (
<MemoryRouter>
<MenuAutocomplete label="Select an option" placeholder="Type to filter...">
<MenuAutocomplete placeholder="Type to filter...">
<MenuListBoxItem>Option 1</MenuListBoxItem>
<MenuListBoxItem>Option 2</MenuListBoxItem>
<MenuListBoxItem>Option 3</MenuListBoxItem>
@@ -130,11 +148,7 @@ export const PreviewAutocompleteListbox = () => (
export const PreviewAutocompleteListboxMultiple = () => (
<MemoryRouter>
<MenuAutocomplete
label="Select multiple options"
placeholder="Type to filter..."
selectionMode="multiple"
>
<MenuAutocomplete placeholder="Type to filter..." selectionMode="multiple">
<MenuListBoxItem>Option 1</MenuListBoxItem>
<MenuListBoxItem>Option 2</MenuListBoxItem>
<MenuListBoxItem>Option 3</MenuListBoxItem>
@@ -2,10 +2,16 @@
import { SearchField } from '../../../../../packages/ui/src/components/SearchField/SearchField';
import { Flex } from '../../../../../packages/ui/src/components/Flex/Flex';
import { RiEBike2Line } from '@remixicon/react';
export const WithLabel = () => {
return <SearchField name="url" label="Label" aria-label="Search" />;
return (
<SearchField
name="url"
label="Label"
aria-label="Search"
style={{ width: '100%', maxWidth: '300px' }}
/>
);
};
export const Sizes = () => {
@@ -24,6 +30,7 @@ export const WithDescription = () => {
label="Label"
description="Description"
aria-label="Search"
style={{ width: '100%', maxWidth: '300px' }}
/>
);
};
@@ -45,7 +52,6 @@ export const StartCollapsed = () => {
startCollapsed
/>
</Flex>
<SearchField name="url" aria-label="Search" size="small" startCollapsed />
</Flex>
);
};
+167 -142
View File
@@ -1,163 +1,188 @@
'use client';
import dynamic from 'next/dynamic';
// Import Table components dynamically with ssr: false to avoid SSR issues
const TableComponents = dynamic(
() =>
import('../../../../../packages/ui/src/components/Table').then(mod => ({
default: () => null, // Placeholder
Table: mod.Table,
TableHeader: mod.TableHeader,
Column: mod.Column,
TableBody: mod.TableBody,
Row: mod.Row,
Cell: mod.Cell,
})),
{ ssr: false },
);
import {
Table,
TableHeader,
Column,
TableBody,
Row,
Cell,
CellProfile,
CellText,
type ColumnConfig,
useTable,
} from '../../../../../packages/ui/src/components/Table';
import { Flex } from '../../../../../packages/ui/src/components/Flex/Flex';
import { Text } from '../../../../../packages/ui/src/components/Text/Text';
import { RadioGroup } from '../../../../../packages/ui/src/components/RadioGroup/RadioGroup';
import { Radio } from '../../../../../packages/ui/src/components/RadioGroup';
import { data as data4 } from '../../../../../packages/ui/src/components/Table/stories/mocked-data4';
import { useState } from 'react';
import type { Selection } from 'react-aria-components';
import {
selectionData,
selectionColumns,
} from '../../../../../packages/ui/src/components/Table/stories/utils';
import { MemoryRouter } from 'react-router-dom';
const rockBands = [
{ id: 1, name: 'The Beatles', genre: 'Rock', year: 1960 },
{ id: 2, name: 'Led Zeppelin', genre: 'Hard Rock', year: 1968 },
{ id: 3, name: 'Pink Floyd', genre: 'Progressive Rock', year: 1965 },
{ id: 4, name: 'The Rolling Stones', genre: 'Rock', year: 1962 },
{ id: 5, name: 'Queen', genre: 'Rock', year: 1970 },
type Data4Item = (typeof data4)[0];
const columns: ColumnConfig<Data4Item>[] = [
{
id: 'name',
label: 'Band name',
isRowHeader: true,
cell: item => (
<CellProfile name={item.name} src={item.image} href={item.website} />
),
},
{
id: 'genre',
label: 'Genre',
cell: item => <CellText title={item.genre} />,
},
{
id: 'yearFormed',
label: 'Year formed',
cell: item => <CellText title={item.yearFormed.toString()} />,
},
{
id: 'albums',
label: 'Albums',
cell: item => <CellText title={item.albums.toString()} />,
},
];
// Simple wrapper to ensure client-side only rendering
const ClientOnly = ({ children }: { children: React.ReactNode }) => {
const [mounted, setMounted] = useState(false);
useState(() => {
if (typeof window !== 'undefined') {
setMounted(true);
}
export const TableRockBand = () => {
const { tableProps } = useTable({
mode: 'complete',
getData: () => data4,
paginationOptions: { pageSize: 5 },
});
if (!mounted) return <div>Loading...</div>;
return <>{children}</>;
};
export const TableRockBand = () => (
<ClientOnly>
<Table aria-label="Rock Bands">
<TableHeader>
<Column>Name</Column>
<Column>Genre</Column>
<Column>Year</Column>
</TableHeader>
<TableBody>
{rockBands.map(band => (
<Row key={band.id}>
<Cell>{band.name}</Cell>
<Cell>{band.genre}</Cell>
<Cell>{band.year}</Cell>
</Row>
))}
</TableBody>
</Table>
</ClientOnly>
);
export const SelectionModePlayground = () => {
const [selectedKeys, setSelectedKeys] = useState<Selection>(new Set());
return (
<ClientOnly>
<Table
aria-label="Rock Bands"
selectionMode="multiple"
selectedKeys={selectedKeys}
onSelectionChange={setSelectedKeys}
>
<TableHeader>
<Column>Name</Column>
<Column>Genre</Column>
<Column>Year</Column>
</TableHeader>
<TableBody>
{rockBands.map(band => (
<Row key={band.id}>
<Cell>{band.name}</Cell>
<Cell>{band.genre}</Cell>
<Cell>{band.year}</Cell>
</Row>
))}
</TableBody>
</Table>
</ClientOnly>
);
};
export const SelectionBehaviorPlayground = () => {
const [selectedKeys, setSelectedKeys] = useState<Selection>(new Set());
return (
<ClientOnly>
<Table
aria-label="Rock Bands"
selectionMode="multiple"
selectionBehavior="replace"
selectedKeys={selectedKeys}
onSelectionChange={setSelectedKeys}
>
<TableHeader>
<Column>Name</Column>
<Column>Genre</Column>
<Column>Year</Column>
</TableHeader>
<TableBody>
{rockBands.map(band => (
<Row key={band.id}>
<Cell>{band.name}</Cell>
<Cell>{band.genre}</Cell>
<Cell>{band.year}</Cell>
</Row>
))}
</TableBody>
</Table>
</ClientOnly>
<MemoryRouter>
<Table columnConfig={columns} {...tableProps} />
</MemoryRouter>
);
};
export const SelectionToggleWithActions = () => {
const [selectedKeys, setSelectedKeys] = useState<Selection>(new Set());
const [selected, setSelected] = useState<Set<string | number> | 'all'>(
new Set(),
);
const { tableProps } = useTable({
mode: 'complete',
getData: () => selectionData,
paginationOptions: { pageSize: 10 },
});
return (
<ClientOnly>
<MemoryRouter>
<Table
aria-label="Rock Bands"
selectionMode="multiple"
selectedKeys={selectedKeys}
onSelectionChange={setSelectedKeys}
>
<TableHeader>
<Column>Name</Column>
<Column>Genre</Column>
<Column>Year</Column>
</TableHeader>
<TableBody>
{rockBands.map(band => (
<Row key={band.id}>
<Cell>{band.name}</Cell>
<Cell>{band.genre}</Cell>
<Cell>{band.year}</Cell>
</Row>
))}
</TableBody>
</Table>
</ClientOnly>
{...tableProps}
columnConfig={selectionColumns}
selection={{
mode: 'multiple',
behavior: 'toggle',
selected,
onSelectionChange: setSelected,
}}
rowConfig={{ onClick: item => alert(`Clicked: ${item.name}`) }}
/>
</MemoryRouter>
);
};
export const SelectionModePlayground = () => {
const [selectionMode, setSelectionMode] = useState<'single' | 'multiple'>(
'multiple',
);
const [selected, setSelected] = useState<Set<string | number> | 'all'>(
new Set(),
);
const { tableProps } = useTable({
mode: 'complete',
getData: () => selectionData,
paginationOptions: { pageSize: 10 },
});
return (
<MemoryRouter>
<Flex direction="column" gap="8">
<Table
{...tableProps}
columnConfig={selectionColumns}
selection={{
mode: selectionMode,
behavior: 'toggle',
selected,
onSelectionChange: setSelected,
}}
/>
<div>
<Text as="h4" style={{ marginBottom: 'var(--bui-space-2)' }}>
Selection mode:
</Text>
<RadioGroup
aria-label="Selection mode"
orientation="horizontal"
value={selectionMode}
onChange={value => {
setSelectionMode(value as 'single' | 'multiple');
setSelected(new Set());
}}
>
<Radio value="single">single</Radio>
<Radio value="multiple">multiple</Radio>
</RadioGroup>
</div>
</Flex>
</MemoryRouter>
);
};
export const SelectionBehaviorPlayground = () => {
const [selectionBehavior, setSelectionBehavior] = useState<
'toggle' | 'replace'
>('toggle');
const [selected, setSelected] = useState<Set<string | number> | 'all'>(
new Set(),
);
const { tableProps } = useTable({
mode: 'complete',
getData: () => selectionData,
paginationOptions: { pageSize: 10 },
});
return (
<MemoryRouter>
<Flex direction="column" gap="8">
<Table
{...tableProps}
columnConfig={selectionColumns}
selection={{
mode: 'multiple',
behavior: selectionBehavior,
selected,
onSelectionChange: setSelected,
}}
/>
<div>
<Text as="h4" style={{ marginBottom: 'var(--bui-space-2)' }}>
Selection behavior:
</Text>
<RadioGroup
aria-label="Selection behavior"
orientation="horizontal"
value={selectionBehavior}
onChange={value => {
setSelectionBehavior(value as 'toggle' | 'replace');
setSelected(new Set());
}}
>
<Radio value="toggle">toggle</Radio>
<Radio value="replace">replace</Radio>
</RadioGroup>
</div>
</Flex>
</MemoryRouter>
);
};
@@ -2,78 +2,153 @@
import { ToggleButtonGroup } from '../../../../../packages/ui/src/components/ToggleButtonGroup/ToggleButtonGroup';
import { ToggleButton } from '../../../../../packages/ui/src/components/ToggleButton/ToggleButton';
import { RiBold, RiItalic, RiUnderline } from '@remixicon/react';
import { useState } from 'react';
import { Flex } from '../../../../../packages/ui/src/components/Flex/Flex';
import { Text } from '../../../../../packages/ui/src/components/Text/Text';
import {
RiCloudLine,
RiStarFill,
RiStarLine,
RiArrowRightSLine,
} from '@remixicon/react';
export const Default = () => {
const [selected, setSelected] = useState<string[]>([]);
return (
<ToggleButtonGroup
selectionMode="multiple"
selectedKeys={selected}
onSelectionChange={keys => setSelected(Array.from(keys as Set<string>))}
>
<ToggleButton id="bold" icon={<RiBold />} />
<ToggleButton id="italic" icon={<RiItalic />} />
<ToggleButton id="underline" icon={<RiUnderline />} />
</ToggleButtonGroup>
);
};
export const ToggleButtonGroupSurfaces = () => (
<Flex direction="column" gap="4">
<Flex direction="column" gap="4">
<Text>Default</Text>
<Flex align="center" p="4" gap="4">
<ToggleButtonGroup
selectionMode="single"
defaultSelectedKeys={['option1']}
>
<ToggleButton id="option1">Option 1</ToggleButton>
<ToggleButton id="option2">Option 2</ToggleButton>
<ToggleButton id="option3">Option 3</ToggleButton>
</ToggleButtonGroup>
</Flex>
</Flex>
<Flex direction="column" gap="4">
<Text>On Surface 0</Text>
<Flex align="center" surface="0" p="4" gap="4">
<ToggleButtonGroup
selectionMode="single"
defaultSelectedKeys={['option1']}
>
<ToggleButton id="option1">Option 1</ToggleButton>
<ToggleButton id="option2">Option 2</ToggleButton>
<ToggleButton id="option3">Option 3</ToggleButton>
</ToggleButtonGroup>
</Flex>
</Flex>
<Flex direction="column" gap="4">
<Text>On Surface 1</Text>
<Flex align="center" surface="1" p="4" gap="4">
<ToggleButtonGroup
selectionMode="single"
defaultSelectedKeys={['option1']}
>
<ToggleButton id="option1">Option 1</ToggleButton>
<ToggleButton id="option2">Option 2</ToggleButton>
<ToggleButton id="option3">Option 3</ToggleButton>
</ToggleButtonGroup>
</Flex>
</Flex>
<Flex direction="column" gap="4">
<Text>On Surface 2</Text>
<Flex align="center" surface="2" p="4" gap="4">
<ToggleButtonGroup
selectionMode="single"
defaultSelectedKeys={['option1']}
>
<ToggleButton id="option1">Option 1</ToggleButton>
<ToggleButton id="option2">Option 2</ToggleButton>
<ToggleButton id="option3">Option 3</ToggleButton>
</ToggleButtonGroup>
</Flex>
</Flex>
<Flex direction="column" gap="4">
<Text>On Surface 3</Text>
<Flex align="center" surface="3" p="4" gap="4">
<ToggleButtonGroup
selectionMode="single"
defaultSelectedKeys={['option1']}
>
<ToggleButton id="option1">Option 1</ToggleButton>
<ToggleButton id="option2">Option 2</ToggleButton>
<ToggleButton id="option3">Option 3</ToggleButton>
</ToggleButtonGroup>
</Flex>
</Flex>
</Flex>
);
export const SingleSelection = () => {
const [selected, setSelected] = useState<string>('left');
return (
<ToggleButtonGroup
selectionMode="single"
selectedKeys={[selected]}
onSelectionChange={keys => {
const key = Array.from(keys as Set<string>)[0];
if (key) setSelected(key);
}}
>
<ToggleButton id="left">Left</ToggleButton>
<ToggleButton id="center">Center</ToggleButton>
<ToggleButton id="right">Right</ToggleButton>
</ToggleButtonGroup>
);
};
export const ToggleButtonGroupSingle = () => (
<ToggleButtonGroup selectionMode="single" defaultSelectedKeys={['dogs']}>
<ToggleButton id="dogs">Dogs</ToggleButton>
<ToggleButton id="cat">Cats</ToggleButton>
<ToggleButton id="bird">Birds</ToggleButton>
</ToggleButtonGroup>
);
export const Sizes = () => {
const [small, setSmall] = useState<string[]>([]);
const [medium, setMedium] = useState<string[]>([]);
export const ToggleButtonGroupMultiple = () => (
<ToggleButtonGroup
selectionMode="multiple"
defaultSelectedKeys={['frontend']}
>
<ToggleButton id="frontend">Frontend</ToggleButton>
<ToggleButton id="backend">Backend</ToggleButton>
<ToggleButton id="platform">Platform</ToggleButton>
</ToggleButtonGroup>
);
return (
<div style={{ display: 'flex', flexDirection: 'column', gap: '16px' }}>
<ToggleButtonGroup
size="small"
selectionMode="multiple"
selectedKeys={small}
onSelectionChange={keys => setSmall(Array.from(keys as Set<string>))}
>
<ToggleButton id="bold" icon={<RiBold />} />
<ToggleButton id="italic" icon={<RiItalic />} />
<ToggleButton id="underline" icon={<RiUnderline />} />
</ToggleButtonGroup>
<ToggleButtonGroup
size="medium"
selectionMode="multiple"
selectedKeys={medium}
onSelectionChange={keys => setMedium(Array.from(keys as Set<string>))}
>
<ToggleButton id="bold" icon={<RiBold />} />
<ToggleButton id="italic" icon={<RiItalic />} />
<ToggleButton id="underline" icon={<RiUnderline />} />
</ToggleButtonGroup>
</div>
);
};
export const ToggleButtonGroupVertical = () => (
<ToggleButtonGroup selectionMode="single" orientation="vertical">
<ToggleButton id="morning">Morning</ToggleButton>
<ToggleButton id="afternoon">Afternoon</ToggleButton>
<ToggleButton id="evening">Evening</ToggleButton>
</ToggleButtonGroup>
);
export const Disabled = () => {
return (
<ToggleButtonGroup isDisabled selectionMode="multiple">
<ToggleButton id="bold" icon={<RiBold />} />
<ToggleButton id="italic" icon={<RiItalic />} />
<ToggleButton id="underline" icon={<RiUnderline />} />
</ToggleButtonGroup>
);
};
export const ToggleButtonGroupDisabled = () => (
<ToggleButtonGroup selectionMode="single" isDisabled>
<ToggleButton id="cat">Cat</ToggleButton>
<ToggleButton id="dog">Dog</ToggleButton>
<ToggleButton id="bird">Bird</ToggleButton>
</ToggleButtonGroup>
);
export const ToggleButtonGroupDisallowEmpty = () => (
<ToggleButtonGroup
selectionMode="single"
disallowEmptySelection
defaultSelectedKeys={['one']}
>
<ToggleButton id="one">One</ToggleButton>
<ToggleButton id="two">Two</ToggleButton>
<ToggleButton id="three">Three</ToggleButton>
</ToggleButtonGroup>
);
export const ToggleButtonGroupIcons = () => (
<ToggleButtonGroup selectionMode="multiple" defaultSelectedKeys={['cloud']}>
<ToggleButton id="cloud" aria-label="Cloud" iconStart={<RiCloudLine />} />
<ToggleButton
id="starred"
aria-label="Starred"
iconStart={<RiStarFill />}
/>
<ToggleButton id="star" iconStart={<RiStarLine />}>
Star
</ToggleButton>
<ToggleButton id="next" iconEnd={<RiArrowRightSLine />}>
Next
</ToggleButton>
</ToggleButtonGroup>
);
export const ToggleButtonGroupIconsOnly = () => (
<ToggleButtonGroup selectionMode="multiple" defaultSelectedKeys={['cloud']}>
<ToggleButton id="cloud" aria-label="Cloud" iconStart={<RiCloudLine />} />
<ToggleButton id="star" aria-label="Star" iconStart={<RiStarLine />} />
<ToggleButton id="next" aria-label="Next" iconEnd={<RiArrowRightSLine />} />
</ToggleButtonGroup>
);
@@ -4,12 +4,25 @@ import { CodeBlock } from '@/components/CodeBlock';
import { toggleButtonGroupPropDefs } from './props-definition';
import {
toggleButtonGroupUsageSnippet,
defaultSnippet,
singleSelectionSnippet,
sizesSnippet,
disabledSnippet,
toggleButtonGroupSurfacesSnippet,
toggleButtonGroupSingleSnippet,
toggleButtonGroupMultipleSnippet,
toggleButtonGroupIconsSnippet,
toggleButtonGroupIconsOnlySnippet,
toggleButtonGroupDisallowEmptySnippet,
toggleButtonGroupVerticalSnippet,
toggleButtonGroupDisabledSnippet,
} from './snippets';
import { Default, SingleSelection, Sizes, Disabled } from './components';
import {
ToggleButtonGroupSingle,
ToggleButtonGroupMultiple,
ToggleButtonGroupVertical,
ToggleButtonGroupDisabled,
ToggleButtonGroupDisallowEmpty,
ToggleButtonGroupIcons,
ToggleButtonGroupIconsOnly,
ToggleButtonGroupSurfaces,
} from './components';
import { PageTitle } from '@/components/PageTitle';
import { Theming } from '@/components/Theming';
import { ChangelogComponent } from '@/components/ChangelogComponent';
@@ -20,7 +33,12 @@ import { ToggleButtonGroupDefinition } from '../../../utils/definitions';
description="A grouping container for related [ToggleButtons](./toggle-button) supporting single or multiple selection."
/>
<Snippet align="center" py={4} preview={<Default />} code={defaultSnippet} />
<Snippet
align="center"
py={4}
preview={<ToggleButtonGroupSingle />}
code={toggleButtonGroupUsageSnippet}
/>
## Usage
@@ -32,24 +50,74 @@ import { ToggleButtonGroupDefinition } from '../../../utils/definitions';
## Examples
### Surfaces
<Snippet
align="center"
py={4}
open
preview={<ToggleButtonGroupSurfaces />}
code={toggleButtonGroupSurfacesSnippet}
/>
### Single Selection
<Snippet
align="center"
py={4}
open
preview={<SingleSelection />}
code={singleSelectionSnippet}
preview={<ToggleButtonGroupSingle />}
code={toggleButtonGroupSingleSnippet}
/>
### Sizes
### Multiple Selection
<Snippet
align="center"
py={4}
open
preview={<Sizes />}
code={sizesSnippet}
preview={<ToggleButtonGroupMultiple />}
code={toggleButtonGroupMultipleSnippet}
/>
### Icons and Text
<Snippet
align="center"
py={4}
open
preview={<ToggleButtonGroupIcons />}
code={toggleButtonGroupIconsSnippet}
/>
### Icons Only
<Snippet
align="center"
py={4}
open
preview={<ToggleButtonGroupIconsOnly />}
code={toggleButtonGroupIconsOnlySnippet}
/>
### Disallow Empty Selection
<Snippet
align="center"
py={4}
open
preview={<ToggleButtonGroupDisallowEmpty />}
code={toggleButtonGroupDisallowEmptySnippet}
/>
### Vertical Orientation
<Snippet
align="center"
py={4}
open
preview={<ToggleButtonGroupVertical />}
code={toggleButtonGroupVerticalSnippet}
/>
### Disabled
@@ -58,8 +126,8 @@ import { ToggleButtonGroupDefinition } from '../../../utils/definitions';
align="center"
py={4}
open
preview={<Disabled />}
code={disabledSnippet}
preview={<ToggleButtonGroupDisabled />}
code={toggleButtonGroupDisabledSnippet}
/>
<Theming definition={ToggleButtonGroupDefinition} />
@@ -1,59 +1,115 @@
export const toggleButtonGroupUsageSnippet = `import { ToggleButtonGroup, ToggleButton } from '@backstage/ui';
import { useState } from 'react';
const [selected, setSelected] = useState<string[]>([]);
<ToggleButtonGroup
selectionMode="multiple"
selectedKeys={selected}
onSelectionChange={(keys) => setSelected(Array.from(keys))}
>
<ToggleButton id="bold" icon={<RiBold />} />
<ToggleButton id="italic" icon={<RiItalic />} />
<ToggleButton id="underline" icon={<RiUnderline />} />
<ToggleButtonGroup selectionMode="single">
<ToggleButton id="dogs">Dogs</ToggleButton>
<ToggleButton id="cats">Cats</ToggleButton>
<ToggleButton id="birds">Birds</ToggleButton>
</ToggleButtonGroup>`;
export const defaultSnippet = `const [selected, setSelected] = useState<string[]>([]);
<ToggleButtonGroup
selectionMode="multiple"
selectedKeys={selected}
onSelectionChange={(keys) => setSelected(Array.from(keys))}
>
<ToggleButton id="bold" icon={<RiBold />} />
<ToggleButton id="italic" icon={<RiItalic />} />
<ToggleButton id="underline" icon={<RiUnderline />} />
export const toggleButtonGroupSingleSnippet = `<ToggleButtonGroup selectionMode="single" defaultSelectedKeys={['dogs']}>
<ToggleButton id="dogs">Dogs</ToggleButton>
<ToggleButton id="cat">Cats</ToggleButton>
<ToggleButton id="bird">Birds</ToggleButton>
</ToggleButtonGroup>`;
export const singleSelectionSnippet = `const [selected, setSelected] = useState<string>('left');
<ToggleButtonGroup
selectionMode="single"
selectedKeys={[selected]}
onSelectionChange={(keys) => {
const key = Array.from(keys)[0];
if (key) setSelected(key);
}}
>
<ToggleButton id="left">Left</ToggleButton>
<ToggleButton id="center">Center</ToggleButton>
<ToggleButton id="right">Right</ToggleButton>
export const toggleButtonGroupMultipleSnippet = `<ToggleButtonGroup selectionMode="multiple" defaultSelectedKeys={['frontend']}>
<ToggleButton id="frontend">Frontend</ToggleButton>
<ToggleButton id="backend">Backend</ToggleButton>
<ToggleButton id="platform">Platform</ToggleButton>
</ToggleButtonGroup>`;
export const sizesSnippet = `<ToggleButtonGroup size="small" selectionMode="multiple">
<ToggleButton id="bold" icon={<RiBold />} />
<ToggleButton id="italic" icon={<RiItalic />} />
<ToggleButton id="underline" icon={<RiUnderline />} />
</ToggleButtonGroup>
<ToggleButtonGroup size="medium" selectionMode="multiple">
<ToggleButton id="bold" icon={<RiBold />} />
<ToggleButton id="italic" icon={<RiItalic />} />
<ToggleButton id="underline" icon={<RiUnderline />} />
export const toggleButtonGroupVerticalSnippet = `<ToggleButtonGroup selectionMode="single" orientation="vertical">
<ToggleButton id="morning">Morning</ToggleButton>
<ToggleButton id="afternoon">Afternoon</ToggleButton>
<ToggleButton id="evening">Evening</ToggleButton>
</ToggleButtonGroup>`;
export const disabledSnippet = `<ToggleButtonGroup isDisabled selectionMode="multiple">
<ToggleButton id="bold" icon={<RiBold />} />
<ToggleButton id="italic" icon={<RiItalic />} />
<ToggleButton id="underline" icon={<RiUnderline />} />
export const toggleButtonGroupDisabledSnippet = `<ToggleButtonGroup selectionMode="single" isDisabled>
<ToggleButton id="cat">Cat</ToggleButton>
<ToggleButton id="dog">Dog</ToggleButton>
<ToggleButton id="bird">Bird</ToggleButton>
</ToggleButtonGroup>`;
export const toggleButtonGroupDisallowEmptySnippet = `<ToggleButtonGroup selectionMode="single" disallowEmptySelection defaultSelectedKeys={['one']}>
<ToggleButton id="one">One</ToggleButton>
<ToggleButton id="two">Two</ToggleButton>
<ToggleButton id="three">Three</ToggleButton>
</ToggleButtonGroup>`;
export const toggleButtonGroupIconsSnippet = `import { RiCloudLine, RiStarFill, RiStarLine, RiArrowRightSLine } from '@remixicon/react';
<ToggleButtonGroup selectionMode="multiple" defaultSelectedKeys={['cloud']}>
<ToggleButton id="cloud" aria-label="Cloud" iconStart={<RiCloudLine />} />
<ToggleButton
id="starred"
aria-label="Starred"
iconStart={<RiStarFill />}
/>
<ToggleButton id="star" iconStart={<RiStarLine />}>
Star
</ToggleButton>
<ToggleButton id="next" iconEnd={<RiArrowRightSLine />}>
Next
</ToggleButton>
</ToggleButtonGroup>`;
export const toggleButtonGroupIconsOnlySnippet = `import { RiCloudLine, RiStarLine, RiArrowRightSLine } from '@remixicon/react';
<ToggleButtonGroup selectionMode="multiple" defaultSelectedKeys={['cloud']}>
<ToggleButton id="cloud" iconStart={<RiCloudLine />} />
<ToggleButton id="star" iconStart={<RiStarLine />} />
<ToggleButton id="next" iconEnd={<RiArrowRightSLine />} />
</ToggleButtonGroup>`;
export const toggleButtonGroupSurfacesSnippet = `<Flex direction="column" gap="4">
<Flex direction="column" gap="4">
<Text>Default</Text>
<Flex align="center" p="4" gap="4">
<ToggleButtonGroup selectionMode="single" defaultSelectedKeys={['option1']}>
<ToggleButton id="option1">Option 1</ToggleButton>
<ToggleButton id="option2">Option 2</ToggleButton>
<ToggleButton id="option3">Option 3</ToggleButton>
</ToggleButtonGroup>
</Flex>
</Flex>
<Flex direction="column" gap="4">
<Text>On Surface 0</Text>
<Flex align="center" surface="0" p="4" gap="4">
<ToggleButtonGroup selectionMode="single" defaultSelectedKeys={['option1']}>
<ToggleButton id="option1">Option 1</ToggleButton>
<ToggleButton id="option2">Option 2</ToggleButton>
<ToggleButton id="option3">Option 3</ToggleButton>
</ToggleButtonGroup>
</Flex>
</Flex>
<Flex direction="column" gap="4">
<Text>On Surface 1</Text>
<Flex align="center" surface="1" p="4" gap="4">
<ToggleButtonGroup selectionMode="single" defaultSelectedKeys={['option1']}>
<ToggleButton id="option1">Option 1</ToggleButton>
<ToggleButton id="option2">Option 2</ToggleButton>
<ToggleButton id="option3">Option 3</ToggleButton>
</ToggleButtonGroup>
</Flex>
</Flex>
<Flex direction="column" gap="4">
<Text>On Surface 2</Text>
<Flex align="center" surface="2" p="4" gap="4">
<ToggleButtonGroup selectionMode="single" defaultSelectedKeys={['option1']}>
<ToggleButton id="option1">Option 1</ToggleButton>
<ToggleButton id="option2">Option 2</ToggleButton>
<ToggleButton id="option3">Option 3</ToggleButton>
</ToggleButtonGroup>
</Flex>
</Flex>
<Flex direction="column" gap="4">
<Text>On Surface 3</Text>
<Flex align="center" surface="3" p="4" gap="4">
<ToggleButtonGroup selectionMode="single" defaultSelectedKeys={['option1']}>
<ToggleButton id="option1">Option 1</ToggleButton>
<ToggleButton id="option2">Option 2</ToggleButton>
<ToggleButton id="option3">Option 3</ToggleButton>
</ToggleButtonGroup>
</Flex>
</Flex>
</Flex>`;
@@ -20,7 +20,7 @@ export const WithIcon = () => {
<ToggleButton
isSelected={isSelected}
onChange={setIsSelected}
icon={<RiCheckLine />}
iconStart={<RiCheckLine />}
>
With Icon
</ToggleButton>