
## 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>
  );
};

```


