---

title: BaseVariableColumnGrid

---

# BaseVariableColumnGrid

The `BaseVariableColumnGrid` component is a wrapper of the `BaseGrid` component that listens to the
`UserClickedColumnPicker` and the `ColumnsNumberProvided` events and passes the selected number of
columns to the grid. It also allows to customize the grid items using the available `scopedSlots`.

## Props

| Name                   | Description                                                                                                                             | Type                       | Default           |
| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | -------------------------- | ----------------- |
| <code>animation</code> | Animation component that will be used to animate the grid.                                                                              | <code>AnimationProp</code> | <code>'ul'</code> |
| <code>items</code>     | The list of items to be rendered.                                                                                                       | <code>ListItem[]</code>    | <code></code>     |
| <code>columns</code>   | The columns to render by default in the grid. This property is used when the user has not<br />selected any value in the column picker. | <code>number</code>        | <code>0</code>    |

## Slots

| Name              | Description                                                                        | Bindings<br />(name - type - description)              |
| ----------------- | ---------------------------------------------------------------------------------- | ------------------------------------------------------ |
| <code>name</code> | Customized item rendering. The slot name can either be default or the item's model | **item** <code>GridItem</code> - Item to render.<br /> |

## Example

The `BaseVariableColumnGrid` component is a wrapper of the `BaseGrid` component that listens to the
`ColumnsNumberProvided` events and passes the selected amount of columns to the grid. It also allows
you to customize the grid items using the available `scopedSlots`.

```vue
<template>
  <section class="results">
    <button @click="setColumns(4)" class="column-picker-selector">
      <span class="column-picker-selector__text">4 columns</span>
    </button>
    <BaseVariableColumnGrid :animation="animation" :items="items">
      <template #default="{ item }">
        <span data-test="default-slot">{{ item.id }}</span>
      </template>
      <template #result="{ item }">
        <span data-test="result-slot">{{ 'Result ' + item.id }}</span>
      </template>
    </BaseVariableColumnGrid>
  </section>
</template>

<script>
  import { BaseVariableColumnGrid, StaggeredFadeAndSlide } from '@empathyco/x-components';

  export default {
    name: 'ResultsSection',
    components: {
      BaseVariableColumnGrid
    },
    data() {
      return {
        animation: StaggeredFadeAndSlide,
        items: [
          {
            id: 'res-1',
            modelName: 'Result',
            name: 'Product 1'
          },
          {
            id: 'res-2',
            modelName: 'Result',
            name: 'Product 2'
          }
        ]
      };
    },
    methods: {
      setColumns(columns) {
        this.$x.emit('UserClickedColumnPicker', columns);
      }
    }
  };
</script>
```

### Playing with props

Configuring the default columns to be rendered. These columns will be the default value until the
`ColumnsNumberProvided` is emitted and changes the value.

```vue
<template>
  <section class="results">
    <button @click="setColumns(5)" class="column-picker-selector">
      <span class="column-picker-selector__text">5 columns</span>
    </button>
    <BaseVariableColumnGrid :animation="animation" :items="items" :columns="3">
      <template #default="{ item }">
        <span data-test="default-slot">{{ item.id }}</span>
      </template>
      <template #result="{ item }">
        <span data-test="result-slot">{{ 'Result ' + item.id }}</span>
      </template>
    </BaseVariableColumnGrid>
  </section>
</template>

<script>
  import { BaseVariableColumnGrid, StaggeredFadeAndSlide } from '@empathyco/x-components';

  export default {
    name: 'ResultsSection',
    components: {
      BaseVariableColumnGrid
    },
    data() {
      return {
        animation: StaggeredFadeAndSlide,
        items: [
          {
            id: 'res-1',
            modelName: 'Result',
            name: 'Product 1'
          },
          {
            id: 'res-2',
            modelName: 'Result',
            name: 'Product 2'
          }
        ]
      };
    },
    methods: {
      setColumns(columns) {
        this.$x.emit('UserClickedColumnPicker', columns);
      }
    }
  };
</script>
```

### Customizing the items width

The `--x-size-min-width-grid-item` variable can be used to customize the min width of the grid
items.

```vue
<template>
  <BaseVariableColumnGrid
    :animation="animation"
    :items="items"
    style="--x-size-min-width-grid-item: 150px"
  >
    <template #default="{ item }">
      {{ `Default slot content: ${item.id}` }}
    </template>
  </BaseVariableColumnGrid>
</template>

<script>
  import { BaseVariableColumnGrid, StaggeredFadeAndSlide } from '@empathyco/x-components';

  export default {
    name: 'ResultsSection',
    components: {
      BaseVariableColumnGrid
    },
    data() {
      return {
        animation: StaggeredFadeAndSlide,
        items: [
          {
            id: 'res-1',
            modelName: 'Result',
            name: 'Product 1'
          },
          {
            id: 'res-2',
            modelName: 'Result',
            name: 'Product 2'
          }
        ]
      };
    }
  };
</script>
```
