---
class: css
---
# horizontal-kv-list

Provides a horizontally stacked list of key/value pairs, commonly used with a
definition/description list.

The keys can be configured to be either, visible, invisible, or with an icon.

- **Icon Configuration:** Add a `class` that describes the key/value pair and configure the icon for that class in the CSS
- **Visible Title Configuration:** Add an empty `class` attribute. A trailing `:`
  will be added to the title (ensure you collapse the whitespace in the `dt`).
- **Invisible Title Configuration:** Don't add a `class` attribute at all, i.e. by default
  the title is not shown.

If you are providing an icon, you should also use the `{{tooltip}}` modifier
to provide a textual tooltip for the icon. Using the `{{tooltip}}` modifier
with no arguments will make it use the text/DOM content of the DOM element it
is attached to, see below for a full usage example.

`<ConsulCopyButton />` components are commonly added to the value, and can be added
to the left or right of the value.

```hbs preview-template
<figure>
  <figcaption>
    All KVs can be specified in a single list
  </figcaption>

  <dl>
    <dt class="kind-terminating-gateway">Kind</dt>
    <dd>
      Terminating Gateway
    </dd>
{{#if true}}
    <dt
      {{tooltip}}
      class="lock-delay"
    >
      Lock Delay
    </dt>
    <dd>10ms</dd>
{{/if}}
    <dt
      {{tooltip}}
      class="ttl"
    >
      TTL
    </dt>
    <dd>
      <ConsulCopyButton
        @value={{"1m30s10ms"}}
        @name="TTL"
      />
      1m30s10ms
    </dd>
    <dt>
      Invisible title
    </dt>
    <dd>
      local
    </dd>
    <dt class>Visible title</dt>
    <dd>
      global
    </dd>
  </dl>

</figure>
<hr />
<figure>
  <figcaption>...or they can all be specified as individual lists (for if you have a component that is already wrapped in a dl, such as our TagList)</figcaption>

  <dl>
    <dt
      class="service-identity"
    >
      Service Identity
    </dt>
    <dd>service-0</dd>
  </dl><dl>
    <dt
      {{tooltip}}
      class="lock-delay"
    >
      Lock Delay
    </dt>
    <dd>10ms</dd>
  </dl><dl>
    <dt
      {{tooltip}}
      class="ttl"
    >
      TTL
    </dt>
    <dd>
      1m30s10ms
      <ConsulCopyButton
        @value={{"1m30s10ms"}}
        @name="TTL"
      />
    </dd>
  </dl><dl>
    <dt>
      No visible title
    </dt>
    <dd>local</dd>
  </dl><dl>
    <dt class>Visible title</dt>
    <dd>global</dd>
  </dl><!--
      Collapse the whitespace but keep our indentation
--><TagList @tags={{array 'one' 'two'}} />

</figure>
<hr />
<figure class="reversed">
  <figcaption>When reversing, you'll probably want to use indiviudual dl's so as to not reverse the order of the KV pairs</figcaption>
  <dl>
      <dt class="kind-terminating-gateway">Kind</dt>
      <dd>
        Terminating Gateway
      </dd>
  </dl>
  <dl>
    <dt
      class="service-identity"
    >
      Service Identity
    </dt>
    <dd>service-0</dd>
  </dl>
  <dl>
    <dt
      {{tooltip}}
      class="lock-delay"
    >
      Lock Delay
    </dt>
    <dd>10ms</dd>
  </dl><dl>
    <dt
      {{tooltip}}
      class="ttl"
    >
      TTL
    </dt>
    <dd>
      <ConsulCopyButton
        @value={{"1m30s10ms"}}
        @name="TTL"
      />
      1m30s10ms
    </dd>
  </dl><dl>
    <dt>
      No visible title
    </dt>
    <dd>local</dd>
  </dl><dl>
    <dt class>Visible title</dt>
    <dd>global</dd>
  </dl>

</figure>
```
When conditionally listing key/values within a single `dl`, be aware that if no key/values should be shown, then you will be left with an empty `dl`. If you collapse the whitespace using handlebars whitespace collapsing `~`, then this empty `dl` will be removed from the flow via CSS. Alternatively consider using multiple `dl`s which can be wrapped with conditionals individually and therefore leave no empty DOM.

When using as individual `dl` lists be aware of whitespace between `dl`s. There are various ways you can counter this:

1. remove the whitespace `</dl><dl>`.
2. Wrap the whitespace in comments `</dl><!-- carriage return --><dl>`
3. Use handlebars whitespace removal `~` as above.
4. Put a `display: inline-flex` on the parent element (this can affect other layout).

Depending on your exact usecase one of the above options may be more suited than others.

```hbs preview-template
<figure>
  <figcaption>
    Conditionally showing multiple key/values sometimes means that you insert an empty `dl` into the DOM
  </figcaption>

  <dl>
    {{~#if false}}
      <dt>Something that might not be set</dt>
      <dd>No value!</dd>
    {{/if~}}
    {{~#if false}}
      <dt>Something that might not be set</dt>
      <dd>No value!</dd>
    {{/if~}}
  </dl>
</figure>
```


```css
dl {
  @extend %horizontal-kv-list;
}
.lock-delay::before {
  @extend %with-delay-mask, %as-pseudo;
  color: var(--token-color-foreground-faint);
}
.ttl::before {
  @extend %with-history-mask, %as-pseudo;
  color: var(--token-color-foreground-action);
}
.service-identity {
  @extend %badge;
}
.kind-terminating-gateway {
  @extend %badge, %badge-with-icon;
}
.kind-terminating-gateway::before {
  @extend %with-gateway-mask, %as-pseudo;
}
.reversed > dl {
  @extend %horizontal-kv-list-reversed;
}
.reversed .service-identity {
  @extend %badge-reversed;
}
.reversed .kind-terminating-gateway {
  @extend %badge-with-icon-reversed;
}
```

## Properties

| Property | Type | Default | Description |
| --- | --- | --- | --- |
| `--horizontal-kv-list-separator-width` | `length-percentage` | `18px` | The width of the whitespace between two sets of key/value pairs |
| `--horizontal-kv-list-key-separator` | `string` | `:` | Separator used for between `Key: Value` for textual key/values |
| `--horizontal-kv-list-key-wrapper-start` | `string` | `(` | Starting wrapper used for wrapping `Value (Key)` for reversed textual key/values |
| `--horizontal-kv-list-key-wrapper-end` | `string` | `)` | Ending wrapper used for wrapping `Value (Key)` for reversed textual key/values |
