@wix/design-system
Version:
@wix/design-system
308 lines (273 loc) • 9.31 kB
Markdown
## Feature Examples
### Size
- description: <p>Adjust the component size using the <code>size</code> prop. It supports 3 sizes:</p><li><code>large</code> - use when the input needs emphasis.</li><li><code>medium</code> (default) - use for all common cases.</li><li><code>small</code> - use in dense and narrow layouts.</li>
- example:
```jsx
() => {
const options = [
{ id: 1, value: 'tag 1' },
{ id: 2, value: 'tag 2' },
{ id: 3, value: 'tag 3' },
];
const renderMultiSelect = ({ size, tagSize }) => {
const [tags, setTags] = React.useState([
{
size: tagSize,
id: '1',
label: 'tag 1',
},
{
size: tagSize,
id: '2',
label: 'tag 2',
},
]);
const handleOnSelect = (tag) =>
setTags([...tags, { id: tag.id, label: tag.value, size: tagSize }]);
const handleOnRemoveTag = (tagId) =>
setTags(tags.filter((currTag) => currTag.id !== tagId));
return (
<MultiSelect
size={size}
options={options}
tags={tags}
onSelect={handleOnSelect}
onRemoveTag={handleOnRemoveTag}
/>
);
};
return (
<StorybookComponents.Stack flexDirection="column">
<FormField label="Large">
{renderMultiSelect({ size: 'large', tagSize: 'medium' })}
</FormField>
<FormField label="Medium">
{renderMultiSelect({ size: 'medium', tagSize: 'small' })}
</FormField>
<FormField label="Small">
{renderMultiSelect({ size: 'small', tagSize: 'tiny' })}
</FormField>
</StorybookComponents.Stack>
);
};
```
### Status
- description: <p>Control the component status using the <code>status</code> prop. It supports 3 states:</p><li><code>error</code> - use to highlight an invalid input.</li><li><code>warning</code> - use to highlight inputs that impact users or can’t be validated.</li><li><code>loading</code> - use to show that the value is being uploaded to the server.</li>
- example:
```jsx
<StorybookComponents.Stack flexDirection="column">
<VariableInput
initialValue="{{status}} is error"
variableParser={(value) => (value === 'status' ? 'Status' : false)}
status="error"
/>
<VariableInput
initialValue="{{status}} is warning"
variableParser={(value) => (value === 'status' ? 'Status' : false)}
status="warning"
/>
<VariableInput
initialValue="{{status}} is loading"
variableParser={(value) => (value === 'status' ? 'Status' : false)}
status="loading"
/>
</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>Showing the status message inline, directly below the input is preferred in all default cases.</p><li>To add an accessible inline message, wrap the component in a <code><FormField/></code> and add the <code>statusMessage</code>.</li><li>To add a status message in a tooltip that requires users to hover on the icon, use the <code>statusMessage</code> prop.</li><p></p><p>View more inline status message examples in <code><FormField/></code>.</p>
- example:
```jsx
<StorybookComponents.Stack flexDirection="column">
<StorybookComponents.Stack flexDirection="column" gap="12px">
<Text secondary>For all default cases:</Text>
<FormField status="error" statusMessage="This is an error message.">
<VariableInput
initialValue="See message {{below}}"
variableParser={(value) => (value === 'below' ? 'below' : false)}
/>
</FormField>
</StorybookComponents.Stack>
<StorybookComponents.Stack flexDirection="column" gap="12px">
<Text secondary>For narrow layouts only:</Text>
<VariableInput
initialValue="{{hover}} on status icon"
variableParser={(value) => (value === 'hover' ? 'Hover' : false)}
status="error"
statusMessage="This is an error message."
/>
</StorybookComponents.Stack>
</StorybookComponents.Stack>;
```
### Read-only and disabled
- description: <p>Control input interaction with:</p><li><code>readOnly</code> - disables writing new values, but allows to copy the current value.</li><li><code>disabled</code> - disables all input interactions. Use to highlight unavailable functions.</li>
- example:
```jsx
<StorybookComponents.Stack flexDirection="column">
<VariableInput
initialValue="{{interactions}} are read only"
variableParser={(value) =>
value === 'interactions' ? 'Interactions' : false
}
readOnly
/>
<VariableInput
initialValue="{{interactions}} are disabled"
variableParser={(value) =>
value === 'interactions' ? 'Interactions' : false
}
disabled
/>
</StorybookComponents.Stack>;
```
### Rows
- description: <p>Set the height of a component to fit a specified number of text lines with <code>rows</code> prop.</p>
- example:
```jsx
<StorybookComponents.Stack flexDirection="column">
<VariableInput
rows={1}
initialValue="Example with 1 {{rows}}"
variableParser={(value) => (value === 'rows' ? 'row' : false)}
/>
<VariableInput
rows={5}
initialValue="Example with 5 {{rows}}"
variableParser={(value) => (value === 'rows' ? 'rows' : false)}
/>
</StorybookComponents.Stack>;
```
### Multiline
- description: <p>Control content scroll direction with the <code>multiline</code> prop.</p><p></p><p>Multiline is allowed by default. Disabling it results in content scrolling horizontally inside of an input.</p>
- example:
```jsx
<StorybookComponents.Stack>
<StorybookComponents.Stack width="50%">
<VariableInput
initialValue="Field that have {{multiline}} enabled scroll content vertically"
multiline={true}
variableParser={(value) => (value === 'multiline' ? 'multiline' : false)}
/>
</StorybookComponents.Stack>
<StorybookComponents.Stack width="50%">
<VariableInput
initialValue="Field that have {{multiline}} disabled scroll content horizontally"
multiline={false}
variableParser={(value) => (value === 'multiline' ? 'multiline' : false)}
/>
</StorybookComponents.Stack>
</StorybookComponents.Stack>;
```
## Common Use Case Examples
### Manual embed
- description: <p>Use a button outside of an input to allow user to embed variables from a predefined list manually.</p>
- example:
```jsx
() => {
const bodyRef = React.useRef();
const variables = [
{
key: 'event.date',
value: 'Event date',
},
{
key: 'last.name',
value: 'Guest last name',
},
{
key: 'first.name',
value: 'Guest first name',
},
{
key: 'event.location',
value: 'Event location',
},
{
key: 'event.name',
value: 'Event name',
},
];
const insertVariable = variable =>
bodyRef.current.insertVariable(variable.key);
return (
<Box gap="10px">
<VariableInput
placeholder="Pick variables and/ or enter strings..."
variableParser={value => {
const variable = variables.find(item => item.key === value);
return variable ? variable.value : false;
}}
ref={bodyRef}
rows={3}
/>
<PopoverMenu triggerElement={<TextButton>Insert Variable</TextButton>}>
{variables.map(variable => (
<PopoverMenu.MenuItem
text={variable.value}
onClick={() => insertVariable(variable)}
/>
))}
</PopoverMenu>
</Box>
);
};
```
### Automations
- description: Use the variable input to send personalized messages and updates.
- example:
```jsx
() => {
const [selectedAction, setSelectedAction] = React.useState(1);
return (
<Card>
<Card.Header
title="Action"
subtitle="Do this: send a message"
></Card.Header>
<Card.Divider></Card.Divider>
<Card.Content>
<Layout>
<Cell>
<Layout gap="12px">
<Cell span={4}>
<Thumbnail
selected={selectedAction === 1}
onClick={() => setSelectedAction(1)}
title="Send a chat message"
size="small"
/>
</Cell>
<Cell span={4}>
<Thumbnail
selected={selectedAction === 2}
onClick={() => setSelectedAction(2)}
title="Get notified by email"
size="small"
/>
</Cell>
<Cell span={4}>
<Thumbnail
selected={selectedAction === 3}
onClick={() => setSelectedAction(3)}
title="Send email to contacts"
size="small"
/>
</Cell>
</Layout>
</Cell>
<Cell>
<FormField label="Message" required>
<VariableInput
rows={5}
initialValue="Hey {{user.name}}! Thanks for reaching out. We'll be right with you."
variableParser={value =>
value === 'user.name' ? 'Name' : false
}
/>
</FormField>
</Cell>
</Layout>
</Card.Content>
</Card>
);
};
```