UNPKG

@wix/design-system

Version:

@wix/design-system

352 lines (322 loc) 12.5 kB
## Feature Examples ### Structure - description: <p>The component consists of a list of options with radio buttons wrapped inside <code><RadioGroup></code>.</p><p></p><p>Option labels are plain text by default, but they can be replaced with any other component or set of components.</p> - example: ```jsx <RadioGroup value={1}> <RadioGroup.Radio value={1}>Option 1</RadioGroup.Radio> <RadioGroup.Radio value={2}>Option 2</RadioGroup.Radio> <RadioGroup.Radio value={3}>Option 3</RadioGroup.Radio> <RadioGroup.Radio value={4}>Option 4</RadioGroup.Radio> </RadioGroup>; ``` ### Layout - description: <p>Control the layout of the options with the <code>display</code> prop. Choose from 2 layouts:</p><li>For most common cases, use the default <code>vertical</code>.</li><li>Use <code>horizontal</code> for options with short labels (e.g., Yes/No selections in a form), or when there is limited space.</li> - example: ```jsx <StorybookComponents.Stack flexDirection="column"> <RadioGroup value={1} display="vertical"> <RadioGroup.Radio value={1}>Vertical 1</RadioGroup.Radio> <RadioGroup.Radio value={2}>Vertical 2</RadioGroup.Radio> <RadioGroup.Radio value={3}>Vertical 3</RadioGroup.Radio> </RadioGroup> <RadioGroup value={1} display="horizontal"> <RadioGroup.Radio value={1}>Horizontal 1</RadioGroup.Radio> <RadioGroup.Radio value={2}>Horizontal 2</RadioGroup.Radio> <RadioGroup.Radio value={3}>Horizontal 3</RadioGroup.Radio> </RadioGroup> </StorybookComponents.Stack>; ``` ### Spacing - description: <p>Control the pixel spacing between options with the <code>spacing</code> prop.</p> - example: ```jsx <StorybookComponents.Stack gap="72px"> <RadioGroup spacing="12px"> <RadioGroup.Radio value={1}>Option 1</RadioGroup.Radio> <RadioGroup.Radio value={2}>Option 2</RadioGroup.Radio> <RadioGroup.Radio value={3}>Option 3</RadioGroup.Radio> </RadioGroup> <RadioGroup spacing="18px"> <RadioGroup.Radio value={1}>Option 1</RadioGroup.Radio> <RadioGroup.Radio value={2}>Option 2</RadioGroup.Radio> <RadioGroup.Radio value={3}>Option 3</RadioGroup.Radio> </RadioGroup> <RadioGroup spacing="24px"> <RadioGroup.Radio value={1}>Option 1</RadioGroup.Radio> <RadioGroup.Radio value={2}>Option 2</RadioGroup.Radio> <RadioGroup.Radio value={3}>Option 3</RadioGroup.Radio> </RadioGroup> </StorybookComponents.Stack>; ``` ### Button alignment - description: <p>Control how the radio buttons align to the text with the <code>vAlign</code> prop. Choose from 2 alignments:</p><li><code>center</code> (the default) aligns the radio button to the middle of the text. It is recommended for most common cases.</li><li><code>top</code> aligns the radio buttons to the top of the text. This is good for options that go over 3 or more lines of text.</li> - example: ```jsx <StorybookComponents.Stack flexDirection="column"> <RadioGroup vAlign="center"> <RadioGroup.Radio> <Heading size="small">Center aligned radio</Heading> <Text secondary size="small"> Subtitle </Text> </RadioGroup.Radio> </RadioGroup> <RadioGroup vAlign="top"> <RadioGroup.Radio> <Heading size="small">Top aligned radio</Heading> <Text secondary size="small"> Subtitle </Text> </RadioGroup.Radio> </RadioGroup> </StorybookComponents.Stack>; ``` ### Disabled buttons - description: <p>Radio options can be disabled in 2 ways:</p><li>Disable all options at once with <code>disabled</code>.</li><li>Choose which options to disable with <code>disabledRadios</code>.</li> - example: ```jsx <StorybookComponents.Stack gap="60px"> <RadioGroup disabled value={1}> <RadioGroup.Radio value={1}>All disabled</RadioGroup.Radio> <RadioGroup.Radio value={2}>All disabled</RadioGroup.Radio> <RadioGroup.Radio value={3}>All disabled</RadioGroup.Radio> </RadioGroup> <RadioGroup disabledRadios={[3]} value={1}> <RadioGroup.Radio value={1}>Selected</RadioGroup.Radio> <RadioGroup.Radio value={2}>Unselected</RadioGroup.Radio> <RadioGroup.Radio value={3}>Disabled</RadioGroup.Radio> </RadioGroup> </StorybookComponents.Stack>; ``` ### Status message - description: <p>Add text that explains the status or what action the user should take with the <code>statusMessage</code> prop.</p><p></p><p>Show the status message inline, directly below the radio group by wrapping it in a <code><FormField/></code> and adding <code>statusMessage</code>.</p><p></p><p>View more inline status message examples in <code><FormField/></code>.</p> - example: ```jsx <FormField status="error" statusMessage="This is an error message."> <RadioGroup> <RadioGroup.Radio value={1}>Option 1</RadioGroup.Radio> <RadioGroup.Radio value={2}>Option 2</RadioGroup.Radio> <RadioGroup.Radio value={3}>Option 3</RadioGroup.Radio> </RadioGroup> </FormField>; ``` ### Button area - description: <p>Highlight the clickable area of an option by controlling the design. It's recommended to always use this on mobile.</p><li>Specify when the button area should be highlighted (on hover, always, or not at all) with <code>selectionArea</code>.</li><li>To choose a filled or outlined design, use <code>selectionAreaSkin</code>.</li><li>Define the white pixel spacing around each radio button with <code>selectionAreaPadding</code>.</li> - example: ```jsx <StorybookComponents.Stack flexDirection="column"> <RadioGroup value={1} selectionArea="always" selectionAreaSkin="outlined" selectionAreaPadding="12px 18px" > <RadioGroup.Radio value={1}>Option 1</RadioGroup.Radio> <RadioGroup.Radio value={2}>Option 2</RadioGroup.Radio> <RadioGroup.Radio value={3}>Option 3</RadioGroup.Radio> </RadioGroup> <RadioGroup value={1} selectionArea="hover" selectionAreaSkin="filled" selectionAreaPadding="12px 18px" > <RadioGroup.Radio value={1}>Option 1</RadioGroup.Radio> <RadioGroup.Radio value={2}>Option 2</RadioGroup.Radio> <RadioGroup.Radio value={3}>Option 3</RadioGroup.Radio> </RadioGroup> </StorybookComponents.Stack>; ``` ### Additional content - description: <p>Use the <code>content</code> prop to show additional details for an option. It accepts any kind of content and places it outside of a radio option.</p> - example: ```jsx <RadioGroup value={1} selectionArea="always"> <RadioGroup.Radio value={1} content={ <StorybookComponents.Placeholder margin={2}> Details about Option 1 </StorybookComponents.Placeholder> } > Option 1 </RadioGroup.Radio> <RadioGroup.Radio value={2} content={ <StorybookComponents.Placeholder margin={2}> Details about Option 2 </StorybookComponents.Placeholder> } > Option 2 </RadioGroup.Radio> </RadioGroup>; ``` ## Common Use Case Examples ### Settings panel - description: <p>Only use small size radio buttons in settings panels to ensure consistency across all panels.</p> - example: ```jsx () => { const [defaultStateselected, setDefaultStateSelected] = React.useState(1); const [homepageTypeSelected, setHomepageTypeSelected] = React.useState(1); return ( <SidePanel maxHeight="576px" width="288px" skin="floating"> <SidePanel.Header title="Breadcrumbs Settings" /> <SidePanel.Content noPadding> <SidePanel.Field> <FormField label="Default state"> <RadioGroup value={defaultStateselected} onChange={setDefaultStateSelected} size="small" > <RadioGroup.Radio value={1}>Full trail</RadioGroup.Radio> <RadioGroup.Radio value={2}>Hide homepage</RadioGroup.Radio> <RadioGroup.Radio value={3}>Hide current page</RadioGroup.Radio> </RadioGroup> </FormField> </SidePanel.Field> <SidePanel.Field> <FormField label="Display homepage as"> <RadioGroup value={homepageTypeSelected} onChange={setHomepageTypeSelected} size="small" > <RadioGroup.Radio value={1}>Text</RadioGroup.Radio> <RadioGroup.Radio value={2}>Icon</RadioGroup.Radio> </RadioGroup> </FormField> </SidePanel.Field> </SidePanel.Content> </SidePanel> ); }; ``` ### Default selection - description: <p>Have a default option selected whenever possible, ideally a neutral choice such as "None" or "All". </p> - example: ```jsx () => { const [selected, setSelected] = React.useState(1); return ( <RadioGroup value={selected} onChange={setSelected}> <RadioGroup.Radio value={1}>All</RadioGroup.Radio> <RadioGroup.Radio value={2}>In stock</RadioGroup.Radio> <RadioGroup.Radio value={3}>Out of stock</RadioGroup.Radio> </RadioGroup> ); }; ``` ### Additional info - description: <p>Use <code><InfoIcon/></code> to add a tooltip next to an option to provide additional information.</p> - example: ```jsx () => { const [selected, setSelected] = React.useState(2); return ( <FormField label="How would you like to add tax?"> <RadioGroup value={selected} onChange={setSelected}> <RadioGroup.Radio value={1}>Include in the price</RadioGroup.Radio> <RadioGroup.Radio value={2}> Add at checkout <Box inline> <InfoIcon content="Tax will not be included in the price of your plans. Customers will see the tax added on at checkout." /> </Box> </RadioGroup.Radio> </RadioGroup> </FormField> ); }; ``` ### Horizontal layout - description: <p>Use a horizontal layout when displaying radio lists with 2-3 options and short descriptions. This layout is great for situations where vertical space is limited.</p> - example: ```jsx () => { const [selected, setSelected] = React.useState(2); return ( <CustomModalLayout title="Add an area for local delivery" subtitle="Set a delivery area within a radius or certain postal codes." primaryButtonText="Add Area" secondaryButtonText="Cancel" onCloseButtonClick={() => {}} > <Layout cols={1}> <FormField label="Area name"> <Input placeholder="e.g., Lower East Side" /> </FormField> <FormField label="Set area by"> <RadioGroup display="horizontal" value={selected} onChange={setSelected} > <RadioGroup.Radio value={1}>Radius</RadioGroup.Radio> <RadioGroup.Radio value={2}>Postal codes</RadioGroup.Radio> </RadioGroup> </FormField> <FormField label="Add postal codes that all have the same delivery rate"> <InputArea placeholder="Separate postal codes with commas, e.g., 10002, 10003, 10009" /> </FormField> </Layout> </CustomModalLayout> ); }; ``` ### Custom button - description: <p>Other components can also be used in radio option labels (e.g., avatar, illustration, additional text).</p> - example: ```jsx () => { const [selected, setSelected] = React.useState(1); return ( <Card> <Card.Header title="Business type" subtitle="Define your business type for legal purposes." /> <Card.Divider /> <Card.Content> <RadioGroup selectionArea="always" selectionAreaSkin="outlined" selectionAreaPadding="18px" spacing="12px" value={selected} onChange={setSelected} > <RadioGroup.Radio value={1}> <Box gap={2} verticalAlign="middle"> <Avatar /> <Box direction="vertical"> <Text weight="normal">Individual</Text> <Text size="small"> You own and run the business with a personal bank account. </Text> </Box> </Box> </RadioGroup.Radio> <RadioGroup.Radio value={2}> <Box gap={2} verticalAlign="middle"> <Avatar shape="square" /> <Box direction="vertical"> <Text weight="normal">Partnership, LLC or Corporation</Text> <Text size="small"> You have a business registration number and a business bank account. </Text> </Box> </Box> </RadioGroup.Radio> </RadioGroup> </Card.Content> </Card> ); }; ```