@wix/design-system
Version:
@wix/design-system
286 lines (253 loc) • 8.7 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 variableParser = (key) => {
const variables = {
firstName: 'First name',
city: 'City',
};
return variables[key] || false;
};
const sizes = ['large', 'medium', 'small'];
return (
<>
{sizes.map((size) => (
<FormField
key={size}
label={size.charAt(0).toUpperCase() + size.slice(1)}
>
<VariableInput
size={size}
initialValue="{{firstName}} from {{city}}"
placeholder="Type text and variables like {{firstName}}"
variableParser={variableParser}
/>
</FormField>
))}
</>
);
};
```
### 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>
);
};
```