> ## Documentation Index
> Fetch the complete documentation index at: https://rive-transitions-2.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Property Groups

> Create local values that can be keyed, animated, and bound to View Model properties.

export const Marketplace = ({href, children}) => {
  const hrefWithTracking = `${href}?utm_source=docs&utm_medium=docs_link_card&utm_campaign=docs_to_marketplace_links`;
  return <Card title="Learn by remixing" icon="external-link" href={hrefWithTracking} arrow="true" horizontal>
      {children ? children : "Open this file on Marketplace, then click Remix to experiment in the Rive Editor."}

    </Card>;
};

export const YouTube = ({id, timestamp}) => {
  const videoSrc = timestamp ? `https://www.youtube.com/embed/${id}?start=${timestamp}` : `https://www.youtube.com/embed/${id}`;
  return <iframe width="100%" height="400" src={videoSrc} title="YouTube video player" frameBorder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerPolicy="strict-origin-when-cross-origin" allowFullScreen />;
};

Property Groups are local, artboard-level values that can be keyed, animated, and bound to View Model properties.

View Model properties are global and shared, while timelines and state machines are local. Property Groups bridge that gap, allowing local animation and logic to read from or drive global data.

## Creating a Property Group

<Steps>
  <Step title="Create a Property Group">
    Select your Property Group tool and click the stage to add one to your artboard.

    <img src="https://mintcdn.com/rive-transitions-2/pUWAhxU9qubdBvIR/images/editor/data-binding/property-groups/create-a-group.png?fit=max&auto=format&n=pUWAhxU9qubdBvIR&q=85&s=53aad8359589070a852719ac22de8a1a" alt="Create property group" width="633" height="247" data-path="images/editor/data-binding/property-groups/create-a-group.png" />
  </Step>

  <Step title="Add a property">
    Select your Property Group and in the right sidebar, click the `+` icon and select your property type.

    <img src="https://mintcdn.com/rive-transitions-2/pUWAhxU9qubdBvIR/images/editor/data-binding/property-groups/new-property.png?fit=max&auto=format&n=pUWAhxU9qubdBvIR&q=85&s=307e45015e70d813502e981d61b28fb1" alt="Add property to group" width="814" height="309" data-path="images/editor/data-binding/property-groups/new-property.png" />
  </Step>
</Steps>

## Common Use Cases

### Controlling a View Model Property with a Timeline

You can’t key a View Model property directly in the timeline. Instead, you key a Property Group value, then bind that value to a View Model property.

This lets you use [Keyframes](/editor/animate-mode/keys) in a timeline to update View Model data at runtime.

<Info>
  **Why can't I key View Model Properties directly?**

  View Model properties represent global data shared across your app, while keyframes are local to a timeline—so they can’t be keyed directly.
</Info>

<YouTube id="V7GYhd8ZHYg" />

<Marketplace href="https://rive.app/community/files/27294-property-groups-demo" />

<Steps>
  <Step title="Key a property">
    With the Property Group selected, move the timeline playhead and change the property value to create keyframes.

    <img src="https://mintcdn.com/rive-transitions-2/pUWAhxU9qubdBvIR/images/editor/data-binding/property-groups/key-property.png?fit=max&auto=format&n=pUWAhxU9qubdBvIR&q=85&s=d491be8cf0820a58cdedb9e8ffce4844" alt="New Property" width="1561" height="497" data-path="images/editor/data-binding/property-groups/key-property.png" />
  </Step>

  <Step title="Bind the property">
    Right-click the property and select the View Model property you want to control. Set the direction to Target → Source so the keyed value drives the View Model property.

    <img src="https://mintcdn.com/rive-transitions-2/pUWAhxU9qubdBvIR/images/editor/data-binding/property-groups/bind-property.png?fit=max&auto=format&n=pUWAhxU9qubdBvIR&q=85&s=db0c4d134f8b88955677964a76c8da95" alt="Bind Property" width="596" height="199" data-path="images/editor/data-binding/property-groups/bind-property.png" />
  </Step>
</Steps>

When you run your state machine, the View Model property updates based on the keyed Property Group values.

### Controlling one View Model Property with another

You can't directly control one View Model Property with another View Model Property. Instead, you can use a Property Group value that reads one View Model Property and sets another.

<Info>
  **Why can't I control one View Model property with another?**

  Allowing View Model properties to control each other would create hidden dependencies and update loops, so relationships between values are handled explicitly through bindings.
</Info>

In this example we'll have two Number View Model Properties called `myNumber` and `myOtherNumber`, which will be `myNumber` doubled.

<Marketplace href="https://rive.app/community/files/27294-property-groups-demo" />

<Steps>
  <Step title="Create a Formula Converter">
    Create a new Converter of type Numeric > Formula and add a number value, a multiply operation, and another number.

    <img src="https://mintcdn.com/rive-transitions-2/pUWAhxU9qubdBvIR/images/editor/data-binding/property-groups/number-converter.png?fit=max&auto=format&n=pUWAhxU9qubdBvIR&q=85&s=3e2edeab195ae439ed1e662433255497" alt="Add property to group" width="269" height="317" data-path="images/editor/data-binding/property-groups/number-converter.png" />
  </Step>

  <Step title="Bind the number value">
    Bind the first number to `myNumber`.

    <img src="https://mintcdn.com/rive-transitions-2/pUWAhxU9qubdBvIR/images/editor/data-binding/property-groups/bind-my-number.png?fit=max&auto=format&n=pUWAhxU9qubdBvIR&q=85&s=a3bbc83dd4ad3684acc29e8096683747" alt="Bind the first number" width="482" height="230" data-path="images/editor/data-binding/property-groups/bind-my-number.png" />
  </Step>

  <Step title="Control the View Model Property">
    Select the Property Group, right-click the property, and bind it to the `myOtherNumber` value using the converter. Set the direction to Target → Source so the converted value drives the View Model property.

    <img src="https://mintcdn.com/rive-transitions-2/pUWAhxU9qubdBvIR/images/editor/data-binding/property-groups/bind-my-number.png?fit=max&auto=format&n=pUWAhxU9qubdBvIR&q=85&s=a3bbc83dd4ad3684acc29e8096683747" alt="Control a View Model Property" width="482" height="230" data-path="images/editor/data-binding/property-groups/bind-my-number.png" />
  </Step>
</Steps>

When you run your state machine, you should see that `myOtherNumber` is double `myNumber`.

<img src="https://mintcdn.com/rive-transitions-2/pUWAhxU9qubdBvIR/images/editor/data-binding/property-groups/doubled.png?fit=max&auto=format&n=pUWAhxU9qubdBvIR&q=85&s=f883f22d049dde789cc34aa32c26164b" alt="Doubled" width="635" height="224" data-path="images/editor/data-binding/property-groups/doubled.png" />
