# Account Management Source: https://rive.app/docs/account-admin/account-overview/account-management Your account settings live at [rive.app/account](https://rive.app/account?utm_source=docs\&utm_medium=content). You can also get there by clicking your name (top-left corner) → Manage Account. From here you can: * Update your email, password, or profile * Manage your workspaces and billing * View notifications * Manage embed URLs for your files Your workspaces are listed in the left sidebar. Click "Manage Workspace" next to any workspace to change its plan, update payment, or invite members. **Questions?** Contact support. # Billing Changes Source: https://rive.app/docs/account-admin/account-overview/billing-changes How to update your card, change your plan, or manage billing for your Rive workspace. ⚠️ If you have a pending change (like a scheduled cancellation), you can't make other billing changes until it's resolved. Contact support if you're stuck. ## Where to Manage Billing 1. Go to [rive.app/account](https://rive.app/account?utm_source=docs\&utm_medium=content) 2. Find your workspace under "Workspaces" 3. Click "Manage Workspace" From here you can: * **Change Plan** → Switch between Free and Voyager * **Manage Billing** → Opens Stripe to update your payment card ⚠️ "Create a Workspace" creates a NEW workspace. It does not update your current plan. *** ## Update Your Payment Card 1. Click "Manage Billing" to open the Stripe Customer Portal 2. Go to "Payment Methods" 3. Add your new card 4. Click "Set as default" 5. Remove the old card (optional) If your workspace was downgraded due to a failed payment, updating your card alone will not restore access. After updating your payment method, click "Upgrade Plan" and select a paid plan again. Access is typically restored within a few minutes. *** ## Change Your Plan Click "Change Plan" from the Manage Workspace page to switch between Free and Voyager. **Have legacy/grandfathered pricing?** Contact support and we'll process the change for you. This includes switching between monthly and annual billing. *** ## If Your Card Keeps Getting Declined Call your bank first. Common issues: * International transactions blocked (Rive uses Stripe) * Bank flagged the charge as suspicious After your bank clears it, wait 30 minutes and try again. Still not working? Try a different card or contact support. *** ## Multiple Workspaces? Each workspace has its own billing. Make sure you're managing the right one—check the workspace name at the top of the Manage Workspace page. *** ## For Team Members Only the workspace owner can update billing. If you're seeing access errors due to a payment issue, let the owner know. **Questions?** Contact support. # Cancelling My Plan Source: https://rive.app/docs/account-admin/account-overview/cancel-my-account Cancel a workspace's paid plan. Plans are managed per workspace. Cancelling a plan only affects the selected workspace and does not affect any other workspaces you belong to. Go to [rive.app/account](https://rive.app/account?utm_source=docs\&utm_medium=content). Click **Manage Workspace** for the workspace whose plan you want to cancel. Click **Cancel Plan**, which will redirect you to Stripe. If you don't see the Cancel Plan button, the workspace may already be on the Free plan. If not, please contact support. Click **Cancel Plan** to confirm. You'll keep access until the end of your current billing period. After that, the workspace will move to a Free plan. Once cancellation is scheduled, you won't be able to make changes to the workspace's plan until the cancellation takes effect at the end of the current billing period. ## FAQs If you change your mind or need to make changes, contact support to remove the pending cancellation first. See [Deleting a Workspace](/docs/home/account-admin/workspaces/delete-a-workspace). **Questions?** Contact support. # Creating an Account Source: https://rive.app/docs/account-admin/account-overview/creating-an-account To create a Rive account, go to [rive.app/signup](https://rive.app/signup/?redirect=%2Faccount%2Fteams%2F\&utm_source=docs\&utm_medium=content) and follow the signup steps. After signing up, you can use Rive for free or upgrade a workspace later. ## FAQs Yes. You can create a free Rive account and start using the editor without upgrading. If you previously deleted a Rive account with the same email address, you won't be able to create a new account with that email. Contact support to restore the old account instead. To collaborate with others, create or join a workspace. See [Creating a Workspace](/docs/account-admin/workspaces/managing-workspaces#creating-a-new-workspace). Yes. See Rive Student Plan Request for details. # Delete My Account Source: https://rive.app/docs/account-admin/account-overview/delete-my-account Deleting your account is permanent and removes all your data after 90 days. ## Before You Can Delete You need to remove all workspaces from your account first: 1. Go to [rive.app/account](https://rive.app/account?utm_source=docs\&utm_medium=content) 2. For each workspace you own: * Click "Manage Workspace" * If it's a paid plan, click "Cancel Plan" first * Then click "Delete Workspace" 3. Once all workspaces are removed, you can delete your account ## What Happens to Your Data * Your account and data are deleted 90 days after cancellation * Files you contributed to other people's workspaces are **not** deleted * Content others have remixed from your Marketplace uploads is **not** deleted ## If You Own a Workspace With Members Deleting your account suspends access for everyone in your workspace. If you want the workspace to continue, transfer ownership to another admin before deleting your account. See [Transfer Workspace Ownership](/docs/account-admin/workspaces/managing-workspaces#transferring-workspace-ownership). If you delete your account and later want to use the same email address, you won't be able to create a new account. Contact support to restore your account instead. Note: we cannot guarantee your files will still be available. # Downloading My Receipt/Invoice Source: https://rive.app/docs/account-admin/account-overview/downloading-my-receipt-or-invoice Invoice links in email expire after about a week. If your link no longer works, you can always download invoices directly from your account. 1. Go to [rive.app/account](https://rive.app/account?utm_source=docs\&utm_medium=content) 2. Find the workspace in the left sidebar 3. Click "Manage Workspace" 4. Click "Manage Billing" (opens Stripe) 5. If prompted, enter your email—Stripe will send you a login link 6. Scroll to the bottom to view your invoice history 7. Click any invoice date to open it, then download the PDF Check your spam folder if the Stripe email doesn't arrive within a few minutes. **Questions?** Contact support. # Trouble Logging In Source: https://rive.app/docs/account-admin/account-overview/trouble-logging-in ## "Invalid credentials" error Two common causes: **1. You signed up with Google or Facebook** If you created your account using Google or Facebook login, we don't have a password stored—that's managed by them. Use the Google or Facebook sign-in button instead of email/password. **2. Wrong password** Click "Forgot password?" below the login button. We'll email you a reset link. **Questions?** Contact support. # Bring Your Own S3 Bucket Source: https://rive.app/docs/account-admin/bring-your-own-bucket Configure your own AWS S3 bucket to work with Rive This feature is available exclusively to Enterprise plan customers. If you're interested in upgrading to unlock this capability, [contact us](https://rive.app/enterprise?utm_source=docs\&utm_medium=content). ## What is a Custom S3 Bucket? A custom S3 bucket allows Enterprise customers to store their Rive file and asset data in their own AWS environment instead of Rive's default storage. This premium feature gives you greater control over your data, allowing you to: * Apply your organization's security and compliance policies * Keep data within your existing AWS infrastructure * Integrate with your existing backup and disaster recovery processes * Monitor and audit all access to your bucket using CloudTrail If you have existing data in Rive that you would like migrated to your custom S3 bucket after upgrading to Enterprise, our team can help coordinate the migration process. ## Configuration Follow the [AWS documentation](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html) to create a new S3 bucket: * Choose a unique name for your bucket
**Note:** Use that name in place of `BUCKET_NAME` for the rest of this document * Configure basic bucket settings * Block public access * You can choose to leave everything as default or you can decide to enable or customize: * versioning (disabled by default) * encryption - by default buckets and new objects are encrypted by Amazon's S3 managed keys (SSE-S3) which uses AES256 * tags
* In the AWS Console, under IAM / Policies click on *"Create policy"* * Select the *"JSON"* Policy Editor view and paste the following: ```json theme={null} { "Statement": [ { "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject", "s3:ListBucket", "s3:GetBucketLocation", "s3:AbortMultipartUpload", "s3:ListBucketMultipartUploads", "s3:ListMultipartUploadParts" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::BUCKET_NAME", "arn:aws:s3:::BUCKET_NAME/*" ] } ], "Version": "2012-10-17" } ``` * In the AWS Console, under IAM / Roles click on *"Create role"* * Under *"Trusted entity type"* pick *"Custom trust policy"* * In the JSON editor that appears paste the following: ```json theme={null} { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "REQUEST_FROM_RIVE" }, "Action": "sts:AssumeRole" } ] } ``` **Note:** You will need to request the appropriate value to replace `REQUEST_FROM_RIVE` from your Rive representative * Hit *"Next"* to go to the *"Add permissions"* section * Under *"Permission policies"* search for the IAM Policy you just created and select it * Click *"Next"* to go to *"Name, review, and create"* * Choose a name, review the trust policy and the permissions, and click *"Create role"* * Open the Role you just created and make note of the ARN Share the following information with your Rive representative: * **Region**: Region of the S3 Bucket * **Bucket Name**: Name of the Bucket * **Role ARN**: ARN of the role you created
After providing all the above to your Rive representative, our team will configure your account to use your custom S3 bucket. You'll receive a confirmation once everything is set up, at which point all your Rive resources will automatically be stored in your own S3 bucket. ## Troubleshooting If you encounter issues with your S3 bucket configuration: * Verify the IAM Role has the correct trust relationship (using the value provided by Rive) * Ensure the IAM Policy has the necessary S3 permissions * Check that your bucket is in the same region you provided to Rive * Contact your Rive representative for additional assistance # Pricing Source: https://rive.app/docs/account-admin/pricing For full details and feature comparison, see [rive.app/pricing](https://rive.app/pricing?utm_source=docs\&utm_medium=content). ## Plans | Plan | Monthly | Annual (paid upfront) | Best for | | :------------- | :----------- | :-------------------- | :------------------------------------------------------- | | **Free** | \$0 | \$0 | Learning Rive, personal projects | | **Cadet** | \$17/seat/mo | \$108/seat/year | Small teams shipping to production (3 seats max) | | **Voyager** | \$39/seat/mo | \$304/seat/year | Teams needing Libraries and collaboration (25 seats max) | | **Enterprise** | — | \$1,440/seat/year | Large organizations (\$10M+ annual revenue) | Annual billing saves money but requires full payment upfront. ## What's Included **Free** * 3 collaborative files * State Machines, Data Binding, Scripting **Cadet** * Exports for runtime * Unlimited files **Voyager** (everything in Cadet, plus) * Libraries * CDN asset hosting * Embed link hosting * \$20/seat monthly agent credits * Priority Community support **Enterprise** (everything in Voyager, plus) * Dedicated Slack with Rive team * SSO and SOC2 Type II * Custom S3 bucket * Subteam workspaces * Org-wide permissions * Onboarding and training * Custom runtime support * Centralized billing * \$40/seat monthly agent credits *** ## Legacy Pricing If you're on a legacy plan, your pricing is locked in as long as your plan stays active. Adding users may move you to current pricing. If your plan cancels, legacy pricing cannot be reinstated. *** ## Students Rive offers a discounted Student Plan for individual students with a valid student email or documentation. The Student Plan is for personal educational work only—not for commercial use or team collaboration. Complete this form to request access to the Student Plan. Schools, universities, and non-profits should use a standard Cadet or Voyager plan. *** **Questions?** Contact support. # Managing Workspace Members Source: https://rive.app/docs/account-admin/workspaces/managing-workspace-members Add, remove, and change the roles of members in a workspace. ## Member Roles | Role | What they can do | Cost | | :--------- | :----------------------------- | :-------- | | **Viewer** | View files only | Free | | **Editor** | View and edit files | Paid seat | | **Admin** | View, edit, and manage members | Paid seat | ## Inviting Members to a Workspace Inviting a member to a workspace gives them access to all projects in that workspace. If you only want to give a member access to a specific project, open that project and invite them from the right sidebar. Go to [rive.app/account](https://rive.app/account?utm_source=docs\&utm_medium=content). Click **Manage Workspace** next to the workspace you want to add a member to. Under **Members**, click **Invite Members**. Enter the member's email address, select their role, and click **Confirm**. For paid workspaces, you're charged a prorated amount immediately for each Editor or Admin seat. ## Accepting an Invite to a Workspace Go to [rive.app/account](https://rive.app/account?utm_source=docs\&utm_medium=content) and make sure you're logged in to the correct Rive account. Follow the invite link in your email. ## Changing Member Roles Go to [rive.app/account](https://rive.app/account?utm_source=docs\&utm_medium=content). Click **Manage Workspace** next to the workspace you want to update. Under **Members**, click **Manage Roles**. Select the new role and click **Confirm**. For paid workspaces, you're charged a prorated amount immediately for each Editor or Admin seat. ## Removing Members from a Workspace Admins can remove members from a workspace at any time. Go to [rive.app/account](https://rive.app/account?utm_source=docs\&utm_medium=content). Click **Manage Workspace** next to the workspace you want to update. Under **Members**, click the **x** next to the member you want to remove. The workspace owner can't be removed. If you need to change ownership, contact support. ## FAQs Make sure your email address is verified. Go to [rive.app/account](https://rive.app/account?utm_source=docs\&utm_medium=content), open the **Profile** tab, and click **Resend verification email** if needed. Rive charges per seat per workspace. If you're an Editor in multiple workspaces, each workspace pays for your seat separately. To collaborate, one of you should invite the other to their workspace, and that workspace pays for the seat. Check your spam folder and make sure the invite was sent to the correct email address. # Managing Workspaces Source: https://rive.app/docs/account-admin/workspaces/managing-workspaces Create, upgrade, transfer, and delete workspaces. ## Workspace Admin The workspace admin lets you: * View your current AI credit usage and purchase more * View and invite members to the workspace * View projects in your workspace To view the workspace admin, go to the editor **Home** tab, open the dropdown next to the workspace name, and select **Admin**. ## Creating a New Workspace Create a new workspace when you want a separate space for a team or project. Workspaces are separate spaces for files, members, and billing. If you only want to organize files or share a specific set of files, create a new project instead. From the Editor home screen, open the workspace dropdown and select **+ New Workspace**. Choose a workspace name, invite members, and click **Create**. You can add or remove members from Workspace Settings later. You should now see an empty workspace with a **Personal** project. You can create files in this workspace. ## Upgrading a Workspace For more information about plans and features, see [Pricing](https://rive.app/pricing?utm_source=docs\&utm_medium=content). Each workspace is billed separately. Make sure you upgrade the workspace where you want to use the paid features. Go to [rive.app/account](https://rive.app/account?utm_source=docs\&utm_medium=content). Click **Manage Workspace** next to the workspace you want to upgrade. Click **Upgrade Plan**. Select a plan and billing option. Follow the checkout steps to complete your payment. ## Transferring Workspace Ownership Make sure the new owner is already a member of the workspace and has the Admin role. See [Inviting Workspace Members](/docs/account-admin/workspaces/managing-workspace-members#inviting-members-to-a-workspace) and [Changing Member Roles](/docs/account-admin/workspaces/managing-workspace-members#changing-member-roles). Contact support with: * The workspace name * The email address of the current owner * The email address of the new owner We'll handle the transfer for you. ## Deleting a Workspace If you want to cancel your plan without permanently deleting your files, see [Cancel Your Plan](/docs/account-admin/account-overview/cancel-my-account). To permanently delete a workspace for all members, including all files in the workspace, see [Deleting a Workspace](/docs/home/account-admin/workspaces/delete-a-workspace). ## FAQs You probably upgraded a different workspace. Use the workspace switcher to find your paid workspace. Each workspace is billed separately. Upgrading one workspace doesn't affect the others. If you had legacy pricing, it was locked in as long as your plan stayed active. Once canceled, we can't reinstate it. You'll need to upgrade at the current price. # Reactivating a Canceled Plan Source: https://rive.app/docs/account-admin/workspaces/reactivating-a-canceled-workspace If your workspace was canceled but not deleted, you can reactivate it. 1. Go to [rive.app/account](https://rive.app/account?utm_source=docs\&utm_medium=content) 2. Find the canceled workspace in the left sidebar (status shows "Suspended") 3. Click "Manage Workspace" 4. Click "Reactivate Plan" 5. Select monthly or yearly billing 6. Click "Confirm & Pay" Your workspace is now active again. *** ## ⚠️ Don't Create a New Workspace by Mistake "Create new Workspace" is **not** the same as reactivating. If you have multiple workspaces, double-check you're reactivating the right one—each workspace has a display name and a username. **If you accidentally created a new workspace instead of reactivating:** Contact support. We can cancel the incorrect workspace and refund you, but we can't transfer payments or files between workspaces. If you saved files in the wrong workspace, download your backups (.rev files) before we cancel it. **Questions?** Contact support. # Workspaces Source: https://rive.app/docs/account-admin/workspaces/workspaces-overview Workspaces are separate areas in Rive for organizing files and collaborating with others. **Each workspace is isolated from the others. It has its own projects, files, members, roles, permissions, AI credits, and billing plan.** For example, you might have: * A personal workspace for your own files * A company workspace for your team’s files * A client's workspace that you've been invited to Workspaces are separate spaces for files, members, and billing. If you only want to organize files or share a specific set of files, create a new project instead. ## Switching Workspaces To view or work with files in another workspace, go to the editor Home tab, click the dropdown next to the workspace name, and hover over Switch Workspace. ## FAQs Rive files live in the workspace they were created in or shared with. Try looking for it in a [different workspace](/docs/account-admin/workspaces/workspaces-overview#switching-workspaces). # Community Source: https://rive.app/docs/community/community-overview # Marketplace Source: https://rive.app/docs/community/marketplace # Marketplace Overview Source: https://rive.app/docs/community/marketplace-overview The [Rive Marketplace](https://rive.app/marketplace?utm_source=docs\&utm_medium=content) is a place where creators can share their files, get feedback, and learn by opening others’ files directly in the Rive editor. Marketplace files are all shared under a [CC BY](https://creativecommons.org/licenses/by/4.0/) license. ## Remixing A Remix is a copy of another user's file. It uses their file as a starting point for a new file in your account. Remixing encourages sharing, and you'll probably learn some new techniques too! To Remix a file from the Marketplace, find one you like, click on the thumbnail, and use the remix button on the right side. Image The file will open in the editor, and a new copy is added to your file browser. # Rive Experts Source: https://rive.app/docs/community/rive-experts # Support Source: https://rive.app/docs/community/support Choose the best way to get help with Rive—from community support to direct help from our team. ## Quick Links Not sure where to start? Ask in the [community](https://community.rive.app/c/support?utm_source=docs\&utm_medium=support_page\&utm_content=peer_support) — you’ll usually get the fastest response. ### Get Help * [Peer-to-peer Support](https://community.rive.app/c/support?utm_source=docs\&utm_medium=support_page\&utm_content=peer_support) — Best for how-to questions, learning Rive, and general debugging help from the community * [Voyager Support](https://community.rive.app/c/voyager-support?utm_source=docs\&utm_medium=support_page\&utm_content=voyager_support) — Priority support with direct help from the Rive team for production issues and blocking bugs (included with Voyager) * [Enterprise](https://rive.app/pricing?utm_source=docs\&utm_medium=support_page\&utm_content=enterprise_support) - For teams that need closer collaboration, Enterprise plans include a dedicated Slack channel with the Rive team * [Discord](https://discord.com/invite/FGjmaTr) — Chat with the community in real time for quick questions and discussion * Account support — Billing, account issues, or private inquiries For faster, more accurate help, include a `.rev` file, a video, a code snippet, and a minimal example. ### Report & Request * [Report a Bug](https://community.rive.app/c/bug-reports?utm_source=docs\&utm_medium=support_page\&utm_content=bug_report) — Report issues with the editor or runtimes * [Request a Feature](https://community.rive.app/c/feature-requests?utm_source=docs\&utm_medium=support_page) — Suggest improvements or new features * [Early Access](https://community.rive.app/c/early-access?utm_source=docs\&utm_medium=support_page) — Discuss and give feedback on early features *** ## FAQs Yes. See Rive Student Plan Request for details. For most technical questions, the fastest way to get help is through the community. You’ll often get answers from both the Rive team and other experienced users. If you're working on something production-critical or need direct help from the Rive team, consider [Voyager support](https://rive.app/pricing). Use email support for: * Billing or account issues * Security concerns * Private or sensitive information For general how-to questions or debugging help, the community is a better place to start. Voyager support gives you direct access to the Rive team with faster, more in-depth help. This is best for: * Production issues * Blocking bugs * Help debugging complex setups [Upgrade to Voyager](https://rive.app/pricing?utm_source=docs\&utm_medium=support_page). See [Cancelling My Plan](/docs/account-admin/account-overview/cancel-my-account). You can browse runtime-specific FAQ pages here: * [Apple Runtime FAQ](/docs/runtimes/apple/faq) * [Flutter Runtime FAQ](/docs/runtimes/flutter/faq) * [Web Runtime FAQ](/docs/runtimes/web/faq) * [Choose a Renderer FAQ](/docs/runtimes/choose-a-renderer/faq) # Reduced Motion Source: https://rive.app/docs/editor/accessibility/reduced-motion Make Rive animations more comfortable for users who prefer reduced motion. Reduced motion preferences let users request less non-essential motion in apps and operating systems. Rive can’t automatically decide which motion should be reduced because motion may be decorative, functional, or part of the meaning of an interaction. To support reduced motion, pass the user’s motion preference into your Rive file with a data binding property, such as `prefersReducedMotion`. Then use that property to decide how your state machine, timelines, and bound properties should behave. Reduced motion preferences are usually detected by the app or platform, then passed into the Rive file at runtime. For web, this often starts with the `prefers-reduced-motion` media feature. See [MDN’s `prefers-reduced-motion` documentation](https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/At-rules/%40media/prefers-reduced-motion) for accessibility guidance. ## Common Strategies ### Use a Separate Reduced-Motion Path For complex interactions and decorative motion, create separate state machine paths for full motion and reduced motion. Use a `prefersReducedMotion` Boolean property to choose which path runs. ### Reduce or Disable Animation Speed For simpler cases, bind transition durations, timeline speeds, or animation speeds to a property that changes when reduced motion is enabled. For example, full motion might use a normal speed value, while reduced motion uses `0` or a lower value. Use [Converters](/docs/editor/data-binding/converters) to convert your `prefersReducedMotion` boolean to a value of 0. Create a new converter group called `BooleanToSpeed`. Add menu in the Data panel showing the Group option in the Converter submenu This will toggle the boolean so that when `prefersReducedMotion` is `true`, the output will be `false`. Add menu in the Converter Group panel showing the Toggle option in the Boolean submenu This transforms a `boolean` to a number where `true = 1` and `false = 0`. Add menu in the Converter Group panel showing the Convert to Number option in the Numeric submenu With the nested component selected, data bind the **Speed** value to `prefersReducedMotion` and add the `BooleanToSpeed` converter. Data Bind popover with Property set to prefersReducedMotion and Convert set to the BooleanToSpeed converter Now when `prefersReducedMotion` is `true`, the animation speed will be 0. ### Replace Motion With Non-Motion Feedback Reduced motion does not always mean removing feedback. Instead of movement, scale, rotation, or bounce, use changes in opacity, or color. ### Reduce Distance Large spatial movement can be difficult even when it is slow. Consider reducing the distance an object travels, or replacing large movement with a small offset and fade. ## Runtime Setup At runtime, use [data binding](/docs/runtimes/data-binding) to pass the user’s motion preference into the Rive file. In the future, runtimes may expose a built-in reduced motion value that can be read directly by the `.riv` file. For now, pass the user’s motion preference into the file yourself. The Rive file should use that property to control state machine transitions, timeline speeds, or bound animation properties. Rive does not automatically apply reduced motion. File authors need to decide which motion is essential, which motion is decorative, and what the reduced-motion experience should be. # Semantics Source: https://rive.app/docs/editor/accessibility/semantics Make your experiences accessible to screen readers by defining semantic types, properties, states, and actions Semantics is currently only available in [Early Access](https://rive.app/downloads?utm_source=docs\&utm_medium=content). Runtime support is in development or released as experimental. Have feedback? Join the [Early Access community](https://community.rive.app/c/early-access/) to share your thoughts and help shape the feature. Semantics describe what an element is and how it should be understood. Adding semantics makes your experiences accessible, allowing screen readers to correctly describe and navigate your content. **Architecture: Role / Trait / State / Actions** * [Role](#semantic-role) — what the node is (button, checkbox, tab, etc.) * [Properties](#semantic-properties) — additional information like label, value, or hint * [Traits](#traits) — what the node can do (expandable, selectable, checkable, etc.) * [State](#state) — what the node is doing (expanded, selected, checked, etc.) * [Actions](#actions) - interactions triggered by the user (tap, increase, decrease) **Semantics at Runtime** At runtime, semantics are converted into the platform’s accessibility system. On web, this creates accessible DOM elements (for example, divs with roles and attributes). On iOS and Android, a semantic tree is generated and exposed to the system’s accessibility APIs. Rive handles mapping your semantics to each platform automatically. For details on which runtimes currently support semantics, see [Feature Support](/docs/feature-support). ## Adding Semantics Adding semantics Select an element in your scene. In the right sidebar, click the `+` button in the **Semantics** panel to enable semantics for that element. Use the dropdown to assign a [semantic role](#semantic-role), such as button, image, or heading. Update the element’s [semantic properties](#semantic-properties), [Traits](#traits), and [State](#state). ### Semantic Role The semantic role defines what the element *is* (for example, a button or image). Screen readers use this to describe the element and determine how it should behave. Each role has different available [properties](#semantic-properties). If your element doesn’t match a specific role, you can leave it set to **None**. Some elements, like text, automatically infer their semantic role. See [Semantic Inference](#semantic-inference) for more info. ## Semantic Properties Semantic properties provide additional information about an element, such as its label, value, or hint. Available properties vary depending on the selected semantic role. ### Label The label describes what the element is or does. This is what screen readers announce. For example, a slider that controls volume might have the label: `Volume` Text elements automatically use their text content as the label. See [Semantic Inference](#semantic-inference) for more info. ### Heading (Text only) Text elements can be marked as headings to define structure and hierarchy. Options include **None** and **Heading 1** through **Heading 6**. Headings help screen reader users navigate your content more easily. On web, Heading 1 maps to an `

` element, Heading 2 to `

`, and so on. ### Value (Inputs only) Some elements, like sliders and switches, have a **Value** property that reflects their current state. For example, a volume slider might have a value of `70%`. Use data binding to keep the semantic value in sync with the visual state. *** ## Traits Traits define what an element *can do*, while states describe what it is doing right now. Some semantic roles include traits, such as **expandable** or **selectable**. Enabling a trait makes its corresponding [state](#state) available. The lock icon indicates a required trait for that semantic role. For example, a checkbox always includes the **selectable** trait. *** ## State States represent the current value of the node. For example, an element with the **selectable** trait will have a **selected** state. Some state flags are only meaningful when their corresponding trait is set. Without the trait, the platform sees the property as not applicable. Keep semantic states in sync with your Rive file. For example, bind a boolean from your view model to the **toggled** state of a switch. You could also key the **toggled** state in a timeline. ### Hidden Hides the element from the accessibility tree. Elements that are not visible (for example, hidden by layout or soloing) are automatically removed from the accessibility tree and do not require this property. Use **Hidden** when an element is still present in the scene (for example, opacity is set to 0) but should not be exposed to assistive technologies. ### Disabled Marks the element as disabled and not interactive. ### Live Region Indicates that the element’s content may update dynamically and should be announced by screen readers. ## Actions Semantic actions are interaction events triggered by assistive technologies. You can listen for these actions and update your experience in response. ### Adding an Action Select your object and [create a new Listener](/docs/editor/state-machine/listeners). With your listener selected, in the right sidebar choose **Semantic Action** in the **Listen to** dropdown. Select the [action type](#types-of-actions) to listen for. ### Types of Actions Actions include **tap**, **increase**, and **decrease**. Additional actions may be added in future releases. #### Tap Represents activating an element (similar to a click). When a user activates an element using a screen reader, a **tap** action is triggered. You should listen for this action and handle it the same way as a standard click or pointer interaction. It’s common to add both a **Click** and a **Semantic Tap** listener to the same element to support pointer and assistive interactions. #### Increase / Decrease Used for adjustable elements like sliders. Users trigger these actions through assistive technologies—for example, by focusing a slider and swiping up or down with a screen reader, or using arrow keys on a keyboard. You should listen for **increase** and **decrease** and update your value accordingly. ### Semantic Inference Some roles and properties are inferred based on the element they are applied to. For example, when adding semantics to a text element, the [Role](#semantic-role) is set to **Text**, and the [Value](#value) is automatically derived from the element’s text content. *** ## Testing Semantics Adding semantics is only the first step. You should always test your experience at runtime to make sure it behaves as expected. Small issues—like a missing label or incorrect state—can make elements confusing or unusable for screen reader users. ### Runtime Testing The best way to test semantics is by using a screen reader. * **macOS / iOS**: VoiceOver * **Android**: TalkBack * **Windows**: Narrator or NVDA Turn on a screen reader and navigate through your experience: * Move between elements * Listen to how each element is announced * Interact with buttons, sliders, and inputs ### What to Check As you test, pay attention to: * **Labels** — Does each element clearly describe what it is or does? * **Role** — Is the correct role announced (button, heading, etc.)? * **Value** — Do dynamic elements (like sliders) report the correct value? * **State** — Are states like selected, disabled, or expanded accurate? * **Order** — Does navigation follow a logical flow? # AI Agent Source: https://rive.app/docs/editor/ai-agent/ai-agent Rive's AI agent helps you write code, design, and animate. The AI Agent is available with Cadet, Voyager, and Enterprise plans. [Learn more about our plans and pricing](https://rive.app/pricing?utm_source=docs\&utm_medium=content). Rive's AI agent helps you write code, design, and animate. Generate scripts, responsive layouts, data models, and even animation. ## Getting Started Open the **Agent panel** from the left sidebar and type a prompt describing what you want. **Example prompt:** > Create a script that draws a rounded rectangle. > Width, height, color, and corner radius should be inputs. > When the inputs change, the drawing should update. The Agent will respond with: * A summary of what it changed * Any new scripts it created * Explanations for how the script works * Suggestions for how to customize it If a new script is generated, you’ll find it in your Assets panel. ## Toolbar Use the AI Agent toolbar to manage your conversations: AI Agent Toolbar * **New Chat** – Start a new chat thread without losing your past conversations * **Toggle Chats** – Go back to old chats * **Close Chat** – Close the chat without losing your history ## FAQ The AI Coding Agent is billed using AI credits, which are expressed in USD. $1 in AI credits = $1 USD of AI usage **What's included per paid seat (monthly AI credits)?** Each paid seat adds monthly AI credits to your workspace: * Voyager: \$20/seat/month in AI credits * Enterprise: \$40/seat/month in AI credits **AI credit rules** * Monthly AI credits reset each month and don’t roll over. * AI credits are shared at the workspace level. * Monthly credits are always consumed before top-up credits. * AI credit top-ups don't expire When your workspace runs out of available AI credits, the agent stops accepting new prompts until: * Your monthly AI credits reset, or * You add an AI credit top-up No. We have a Zero Data Retention policy active with our LLM provider. Neither we nor the provider use user data to train AI models. Admins on Enterprise workspaces can toggle the AI Coding Agent on or off for the entire workspace at any time. Yes. Like any AI system, the agent may occasionally generate incorrect or suboptimal code, but it will attempt to self-correct. Always review code generated by the AI Coding Agent. Yes. Please send feedback to our [Community](https://community.rive.app/). # Rive MCP Integration Source: https://rive.app/docs/editor/ai/mcp MCP integration is currently available only in the desktop Editor for Windows and macOS. You can connect the Rive Editor to AI tools through MCP (Model Context Protocol). The first set of tools are designed to let AI handle repetitive tasks, like creating complex View Models, State Machines with hundreds of states/layers, Layouts, Shapes, and more. ### Supported Features * **Create and manage Rive files** — add, rename, resize, arrange, and focus artboards. * **Inspect and edit the scene** — query hierarchies, select objects, update properties, rename, duplicate, reorder, reparent, or delete elements. * **Build designs** — create shapes, paths, layouts, component instances, component lists, and asset-based elements. * **Create animation and interaction** — edit linear animations, state machines, states, transitions, conditions, keyframes, and interpolation. * **Work with data binding** — create view models, properties, instances, bindings, and custom property groups. * **Edit scripts and shaders** — manage Luau scripts and WGSL shaders, update source code, run diagnostics, recompile, test, search code, and read console output. This list of features will evolve over time as more tools are added. ## Installation ### Using Cursor Install and open the latest version of the [Rive](https://rive.app/downloads) desktop app for Mac or Windows. Create a [Cursor](https://www.cursor.com/) account and install the app. Open Cursor and navigate to the settings panel in the top right corner. Open cursor settings Open the Tools & MCPs tab and click Add Custom MCP. Open Cursor MCPs tab Save the following JSON snippet to your computer as `mcp.json`. ```json theme={null} { "mcpServers": { "rive": { "url": "http://127.0.0.1:9791/mcp" } } } ``` Turn the MCP connection `On` If everything was installed correctly, you should see Rive as an available MCP server. Cursor verified For the Rive server to be available, you must have the Rive Early Access app opened. Additional information on setting up MCP can be found [here](https://docs.cursor.com/context/model-context-protocol). ### Using Claude in Terminal Install and open the latest version of the [Rive desktop app](https://rive.app/downloads) for macOS or Windows. Run the following command in your terminal: ```shell theme={null} claude mcp add --transport http rive http://127.0.0.1:9791/mcp ``` Run Claude and follow the prompts: ```shell theme={null} claude ``` ## What can it do? Once Cursor is installed and everything is set up correctly, it's time to start prompting the AI. Have a Rive File open and an Artboard created. Type your prompt into the chat UI and hit enter. The AI will take a moment to process the request. Example prompt: ``` Create a State Machine about birds with 20 states and 2 layers ``` Once the request has been processed, type **End Prompt** to allow the AI to make changes to the Rive file. # Animate Mode Overview Source: https://rive.app/docs/editor/animate-mode/animate-mode-overview Use [animate mode](/docs/editor/fundamentals/design-vs-animate-mode) to create timelines, state machines, keys, transitions, and interactive animation logic. In Animate Mode, the editor shows animation tools such as the timeline, animations list, key controls, and interpolation options. Editing objects while a timeline is selected can create keys. See [Design and Animate Modes](/docs/editor/fundamentals/design-vs-animate-mode) to learn how to avoid accidental keying. ### Learn more about Animate mode ## Use case: Building a Bouncing Ball This video walks you through animating a bouncing ball in Rive. We cover keyframes, interpolation and a couple classic principles of animation. # Animating Draw Order Source: https://rive.app/docs/editor/animate-mode/animating-draw-order You can change the draw order of your graphics at design time by moving items up and down the [Hierarchy](/docs/editor/interface-overview/hierarchy)– but what if you want to change the draw order during an animation? Or what if you want to change the draw order without breaking the current hierarchical structure? Rive allows you to accomplish this with Draw Order Rules. ## Draw Order Rules To animate the draw order of a group or shape, start by selecting it. Use the Draw Order section of the Inspector to create Draw Order Rules. Image The Normal rule is the default order (based on [Hierarchy](/docs/editor/interface-overview/hierarchy) order). When the radio button next to this rule is active, the shape appears at its default draw order. Draw Order Rules allow you to select a target (note that this must be a drawable item, not a group) and whether to draw above or below the target. The target must be a drawable item, like a shape. It cannot be a group. In Animate mode, use the radio button next to the Draw Order Rules to set a key. Note that these are [Hold keys](/docs/editor/animate-mode/interpolation-easing#hold) as Draw Order cannot be interpolated. ![Image](https://ucarecdn.com/32925768-cbcf-461c-9fe1-b745bf90a34d/) # Interpolation (Easing) Source: https://rive.app/docs/editor/animate-mode/interpolation-easing When you set two keys on a property, the value in between those keys is automatically calculated. This is called interpolation. Interpolation settings can be customized to create dramatically different results. You can set the easing on your keys by either using the Interpolation panel to the right of the Timeline, or by using the Graph Editor, which you can toggle on via the shortcut near the Timeline options. ## Using the Interpolation Panel The Interpolation Panel appears to the right of the timeline when you select any number of keys on the timeline. Image The interpolation graph is a visual representation of how the value will change over time from the selected key to the next with the x-axis representing time and the y-axis representing the change in the chosen property. You can choose which interpolation type to use by selecting any of the icons above the graph. ### Linear ![Image](https://ucarecdn.com/992113a2-f03d-43be-9f22-d638fa48ba70/) Linear is the default interpolation type, and it creates a constant rate of change from one key value to the next. ### Cubic ![Image](https://ucarecdn.com/c37db072-f932-4bbd-8232-19b6ef59e901/) Cubic interpolation uses a curve to interpolate between key values. It gives you two handles that can be dragged to customize the curve. You can drag the handles as far as you want on the Y-axis. If you drag the handles outside of the graph, the graph view will update to ensure that the handles are always in view. The default cubic curve creates a gentle curve from the first key to the next, which results in the value changing slowly at the start and end, and changing the most in the middle. ### Hold ![Image](https://ucarecdn.com/39d5d86c-d390-4500-acdb-ad57d3e89539/) Hold doesn't interpolate values between keys. It simply holds the current value until the next key is reached, where the next value is set instantly. ### Interpolation field A text field below the preview graph represents the interpolation in a numerical format. A total of four values (typically between 0 and 1) represent the position of the handles – two for the inward curve, and two for the outward curve. You can see how these values change by dragging the handles within the preview window. Use this field if you wish to set specific easing values, perhaps defined in a design language for a specific brand, for instance. The field also makes it easy to copy and paste values across files and tools. When inputting values manually, use a comma or a space to separate each of the four values. ![Image](https://ucarecdn.com/b8f9898c-ea40-404f-8749-daf1fec86325/) ## Default Interpolation You can set a default interpolation to control the interpolation used by new keys. There are two ways to set the default interpolation: ### Set a Selected Key as the Default Select a key, then open the interpolation options in the Inspector and click Set as default. Set current interpolation as default ### Set the Default from the Inspector Deselect everything on the stage. The Inspector shows the default interpolation options for new keys. Choose the interpolation you want new keys to use by default. Set default interpolation from inspector ## The Graph Editor Rive's Graph Editor visually represents how an object's properties change over time. Using this graph, we can edit the rate of change and the values being interpolated. ### Enabling the Graph Editor Use the Graph Editor button on the timeline to enable the Graph Editor. You'll notice that the Graph Editor replaces the timeline. Note that only objects that are selected will appear on the Graph Editor. ### Using the Graph Editor The Graph Editor gives a visual representation of the current interpolation. You have two ways to edit the interpolation on the graph. #### Using Cubic interpolation Cubic interpolation describes the easing function applied between one key and the next, much like a cubic Bezier easing curve in CSS. It shapes how fast the value changes over time, but it always lands exactly on the values you keyed. Adjust a Cubic curve from the Interpolation Panel; the Graph Editor shows the curve, but you set it from the panel. #### Using Cubic Value Cubic Value gives you draggable Bezier handles directly on the Graph Editor, similar to After Effects. Because Rive stores the X and Y position of each handle, it uses a little more data than Cubic, but it gives you much more control over the motion, including the ability to overshoot a value before settling on the final key. That overshoot is the key difference. Cubic interpolation can only move between the values you key, so animating a property from 0 to 0 produces no motion at all. Cubic Value lets you pull the handles so the curve travels past 0 and back, creating real movement even when the start and end values are identical. This makes Cubic Value ideal for bounces, anticipation, and other effects that need to push beyond the final value. # Keys Source: https://rive.app/docs/editor/animate-mode/keys ### Set Keys Objects and their properties appear on the Timeline once they have been keyed. There are a few different ways to key a property. You can manipulate an object directly on the Stage (which will set keys for any resulting transformation, like position, rotation, or scale) or change the property in the Inspector. You can also use the key button that appears next to any property that can be animated. This will set a key for the current value. Image Note that the key button has a grey stroke when a key is not set. If the property has been animated, then the property has a blue stroke. If the property has been animated at the current playhead position, then the key button has a blue fill. ### Manipulate keys Keyed objects and their properties appear on rows in the timeline. Keys for properties are shown in a blue fill. If a property (or multiple properties) is collapsed, then the key appears filled in grey. ![Image](https://ucarecdn.com/4a8fc418-1335-42b6-a640-5f2461b14e94/) You can change a key's position on the timeline by clicking and dragging it to the desired location. Use the grey keys to move all of the keyed properties of an object or use the blue keys to change a single property's location. ## Binding Key Values You can [data bind](/docs/editor/data-binding/overview) the value stored in a key. This lets a keyed value come from data instead of being fixed directly on the timeline. Right-click the key you want to bind. Select **Data Bind**. Choose the property you want to bind to the key value. Once bound, the key uses the bound value when the animation reaches that point in the timeline. ### Copy Keys You can copy the keys from one object to another by copying the property keys from the animated object and pasting them to another object. ## Resize Keys You can resize a selection of keys by holding `alt` and dragging them from the start or end. This serves as a quick way to shrink or lengthen a selection of keys. ![Image](https://ucarecdn.com/9bb04dbc-dade-4bbc-bc25-70015acc9992/) # Timeline Source: https://rive.app/docs/editor/animate-mode/timeline The Rive interface displays a timeline with playback controls and options for the current animation in Animate mode. A list of all animations is displayed to the left of the Timeline. Keep in mind that these are animations for the currently [active artboard](/docs/editor/fundamentals/artboards#active-artboard). Image ## Animation type Image **One-Shot:** The playhead stops at the end of the animation. **Ping-Pong:** The playhead continuously plays from the start point to the end point and back from the end point to the start point. **Loop:** The playhead continuously loops the animation from the start point to the end point. **Work Area:** The work area defines the playback area of an animation. Work areas are an easy way to focus on a small portion of a larger animation. ## Navigate Timeline The Navigate Timeline menu gives you a list of helpful shortcuts to navigate the Timeline. Image ## Show Only Selected The Show Only Selected toggle can be helpful when dealing with animations with many different objects keyed. When this option is toggled on, only objects that you have selected will appear on the timeline. Image ## Timeline Options Located to the right of the playback select, the Timeline Options show you the current time, duration, playback speed, and snap keys options. Image **Current:** The current position of the playhead. **Duration:** The total length of the timeline. **Playback Speed:** The speed at which the animation should play. The default speed is 1x. Negative values cause the animation to play backward. **Snap Keys:** The interval at which keys can be placed on the Timeline. By default, keys can be set at a subdivision of 60 for each second. ## Navigating the Timeline **Scroll and Zoom:** Use the horizontal scrollbar at the top of the Timeline (with two grabbers on each side) to scroll and resize the Timeline's zoom level. **Pan:** You can also use the same pan shortcuts as the stage to pan the Timeline (right-click and drag, or hold the spacebar and drag). # Audio Assets Source: https://rive.app/docs/editor/assets/audio Import, clip, and configure audio assets in Rive. ## Importing Audio See [Importing Assets](/docs/editor/fundamentals/assets-overview#importing-assets) for information about importing files, including MP3, WAV, and FLAC files. ### Browse Sounds Browse Sounds gives you direct access to a free library of over 3,000 sounds from Soundly. In the Assets panel, click **+** and select **Browse Sounds**. In the Sounds panel, search or browse for a sound. Preview the sound, then click **+** to add it to the Assets panel. After adding a sound to the Assets panel, you can use it in an [Audio Event](/docs/editor/events/audio-events) or reference it from a [script](/docs/scripting/getting-started). ## Export Options Audio assets include a **Source** option that controls the audio format used for export. * **Source**: Use the original imported audio format. * **WAV**: Export the audio as WAV. * **FLAC**: Export the audio as FLAC. * **MP3**: Export the audio as MP3. ## Previewing Sounds You can create a shorter clip from any audio asset. Open the **Audio** panel in the **Debug Panel**. Select an audio asset in the **Assets** panel. Click the play icon. Audio asset volume ## Creating Clips You can create a shorter clip from any audio asset. Open the **Audio** panel in the **Debug Panel**. Select an audio asset in the **Assets** panel. Drag along the waveform to select a portion of the audio and click the play button to preview. Click **+** to create a clip. The new clip will now appear as its own audio asset under the parent audio in the sidebar. ## Setting Asset Volume Select an audio asset or clip to set its **Volume** in the Inspector. Volume is set on the asset, not on each individual use of the asset. If the same audio asset is used in multiple places, changing its volume affects all of them. Audio asset volume # Photoshop Files Source: https://rive.app/docs/editor/assets/psd Using layered Photoshop files in Rive. ## Importing PSD Files Drag a PSD file into Rive or import it from the Assets panel. When you import a PSD file, Rive adds its visible image layers to the Assets panel so you can place individual layers or the full composition on an artboard. Hidden layers in the PSD are not imported into Rive. ## Using PSD Layers You can use PSD layers individually or as a full composition. * Drag a layer onto an artboard to place that layer. * Drag the entire PSD onto an artboard to create a group containing all imported layers. ## Asset Settings PSD layers use the same asset settings as raster images. You can configure settings for individual layers or apply settings to all layers in the PSD. ## Export Behavior Only PSD layers used in the Rive file are included in the exported `.riv` file by default. You can adjust export options for individual layers or for all layers in the PSD. See [Assets](/docs/editor/fundamentals/assets-overview#asset-settings) for more about export behavior. ## Reimporting PSD Files You can replace or reimport a PSD to update its layers in Rive. Keep PSD layer names consistent when reimporting. If you rename a layer in Photoshop and reimport the PSD, Rive treats it as a new layer. Any objects using the old layer may lose their asset reference. # SVG & Vector Assets Source: https://rive.app/docs/editor/assets/svg Import SVG files and convert them into editable vector artwork. SVG is one of the easiest ways to bring existing vector artwork into Rive. When you import an SVG, Rive converts the SVG into native Rive vector objects. After import, the artwork is no longer an SVG—it becomes editable shapes, paths, fills, strokes, and groups that behave like any artwork created directly in Rive. ## Importing SVG Files You can import SVG files or copy vector artwork from design tools like Figma and Illustrator. For general importing steps, see [Assets overview](/docs/editor/fundamentals/assets-overview). ### Importing from Figma You can use **Copy as SVG** and paste it directly into the Rive editor. ![Copy as SVG from Figma](https://ucarecdn.com/ec7e980c-ea0a-4147-96df-f29b7dc2be2c/) ### Importing from Illustrator When exporting or copying SVGs from Illustrator, use **Presentation Attributes** for styling. * If you use **Save As**, open **SVG Options** and set **CSS Properties** to **Presentation Attributes**. * If you use **Export As**, open **SVG Options** and set **Styling** to **Presentation Attributes**. * If you copy and paste directly from Illustrator into Rive, Illustrator uses the **Export As SVG** options, so make sure Styling is set to **Presentation Attributes** there. Also disable **Preserve Illustrator Editing Capabilities**. This adds extra Illustrator data that can make the SVG much larger and may include data Rive’s importer does not recognize. ## Export Behavior SVG assets only use **Automatic** export behavior. Rive converts SVGs into native vector objects before runtime export. The original SVG file is not included in the `.riv`, and runtimes do not currently convert SVG assets at runtime. ## Unsupported Features Most SVG artwork imports without issue, but some SVG features do not have direct equivalents in Rive and are imported differently or ignored. | SVG Feature | Import Behavior | | --------------------------------------- | --------------------------------------------------------- | | Embedded images | Ignored. | | Gradient transforms | Ignored. Linear and radial gradients are still supported. | | `stroke-dasharray` | Imported as a solid stroke. | | `mask` | Imported as clipping. | | `filter` | Not supported. | | `skew` transforms | Not supported. | | Inherited fills and strokes (`inherit`) | Inherited colors default to white. | If your artwork relies on unsupported SVG features, consider converting them to editable paths in your design tool before importing into Rive. # Constraints Overview Source: https://rive.app/docs/editor/constraints/constraints-overview Learn how to use constraints in Rive. Constraints are a way to control the properties of an object through another target object. Some constraints can set limits on these properties (and their hierarchical relationships), while others can copy properties from one object to another. ## Learn By Example ## Common Use Cases * Make a character's eyes follow a target. ![Image](https://ucarecdn.com/0e6ea627-fda9-499a-b68c-3bef583ab345/) * Ensure a character's feet stay planted on the floor while their legs automatically bend at the knees. ![Image](https://ucarecdn.com/6b0130b4-3f8a-42c8-9c55-106165c552bf/) * Make all the wheels on a vehicle rotate together. * Make the hands on a clock rotate. * Copy translation, rotation, or scale from another object. * Push an object away as one gets closer, or ensure an object always stays close to another one. Types of constraints in Rive: * [IK Constraint](/docs/editor/constraints/ik-constraint)​ * [Distance Constraint](/docs/editor/constraints/distance-constraint) * [Transform Constraint](/docs/editor/constraints/transform-constraint)​ * [Translation Constraint](/docs/editor/constraints/translation-constraint) * [Scale Constraint](/docs/editor/constraints/scale-constraint) * [Rotation Constraint](/docs/editor/constraints/rotation-constraint) # Distance Constraint Source: https://rive.app/docs/editor/constraints/distance-constraint The Distance Constraint makes an object stay close, far, or exactly at a specific distance to another object. ## How to create a Distance Constraint Use the Constraints section of the Inspector to add a Distance Constraint to an object. ![Image](https://ucarecdn.com/b6ad1d9b-706a-4090-9585-cb2954bfc45a/) Use the new constraint's fly-out menu to select a target for this constraint. ![Image](https://ucarecdn.com/ce97fabc-04ab-463c-bd77-0c75a37f43a1/) Moving the target object now causes the constrained object to stay close (which is the default mode). ![Image](https://ucarecdn.com/0cf99e7d-b1e1-4a0a-988d-9235c28e5868/) ## Strength The Strength property determines how much the constrained object is affected. A Strength of 0% means the constraint won't have any effect. ## Distance The distance that the object will be constrained from the target object. A red constraining circle is drawn on the stage to represent this value. ## Mode ### Closer The owner is constrained closer than the Distance setting. In other words, the owner is constrained inside the constraining sphere. ### Further The owner is constrained further than the Distance setting. In other words, the owner is constrained outside the constraining sphere. ### Exactly The owner is constrained exactly at the distance of the constraining sphere. # Follow Path Constraint Source: https://rive.app/docs/editor/constraints/follow-path-constraint The Follow Path Constraint makes complex motion much easier to create by allowing us to constrain an object to a path. Watch the video, or read more below. For text that follows a path, use the [Follow Path Text Modifier](/docs/editor/text/text-modifiers#follow-path) property instead. ## Setting up a Follow Path Constraint First we’ll need both an object to constrain and a path to constrain it to. Next, add a new constraint and select the Follow Path Constraint. ![Image](https://ucarecdn.com/bd36e6f4-22e8-4b06-8f1d-653fa6216b69/) Now, use the target button and select the path you want to constrain the object to. ## Follow Path Properties Like other Constraints, the Follow Path Constraint has many different properties we can customize. #### Strength The strength property dictates how strictly the constrained object will adhere to the constrained property. #### Target The Target tells the constraint which path to follow. #### Distance The Distance property moves the object up and down the path. As the percent increases, the constrained object moves along the path. Note that this property can exceed 100%. ![Image](https://ucarecdn.com/ad560245-56cd-49c9-8112-ef10c1edeaac/) #### Orient The Orient toggle controls the constrained objects rotation. When the Orient toggle is on, the object will adjust its rotation according to the path. Note that you can’t make manual rotation changes to the object in this state. ![Image](https://ucarecdn.com/74c0ef38-e82e-40ec-a2cf-c1aa963bbc55/) When the Orient toggle is set to off, the rotation of the constrained object does not change. This means you’ll be able to manually change the rotation of the object as you see fit. #### Offset The Offset toggle allows the constrained object to move along the path, but from its current, offset position. # IK Constraint Source: https://rive.app/docs/editor/constraints/ik-constraint Use IK constraints to control bone chains with a target. ## Forward vs Inverse Kinematics Most skeletal animation in Rive uses **Forward Kinematics**. With Forward Kinematics, you pose a bone chain by rotating each bone. Child bones move based on the rotation of their parents. **Inverse Kinematics** works in the opposite direction. Instead of rotating each bone manually, you place a target at the end of the chain and Rive solves the bone rotations needed to reach it. ![Image](https://ucarecdn.com/ffcfbb2c-ad3a-49d4-a4ef-ec83a7e2780c/) IK is useful for rigs where the end of a chain needs to follow something else. For example, you might use IK to make a character point at an object or keep a character's feet planted on the ground. ## Creating an IK constraint To use IK, you need a bone chain and a target. The target can be any object, though in most cases you'll want to use a group with its [Style set to Target](/docs/editor/fundamentals/groups#group-style). Use the **B** shortcut to create a [bone chain](/docs/editor/manipulating-shapes/bones#how-to-create-bones). Then use the **G** shortcut to create a [group](/docs/editor/fundamentals/groups). With the group selected, set **Style** in the Inspector to **Target**. A target group stays selectable, even when other objects are above it. See [Targets](/docs/editor/fundamentals/groups#target). ![Image](https://ucarecdn.com/efde9d84-1364-4cf7-b7a4-16c4834f14f9/) Select the last bone you want the IK constraint to affect. In the Inspector, use the **Constraints** section to add an **IK** constraint. ![Image](https://ucarecdn.com/9b320235-1cfb-4a11-9e02-f64d2149cf11/) Open the constraint flyout menu and use the target button to select the target group you created in step 1. ![Image](https://ucarecdn.com/9646ddc3-b452-41a8-894f-635ccd12df09/) Move the target group. The affected bones should rotate toward the target. ![Image](https://ucarecdn.com/d646176c-f782-4b04-acf2-2c69ae495e36/) ## IK Properties ### Bone Count Use **Bone Count** to set how far up the bone chain the IK constraint should reach. When the target is selected, bones affected by the IK constraint are highlighted. ![Image](https://ucarecdn.com/de7b0c48-49b2-4c6b-8935-1530fef7bffa/) ### Invert Direction Use **Invert Direction** to swap the angle used to solve the IK chain. ![Image](https://ucarecdn.com/c25849b6-b06f-4bd4-a921-fa16fa8de3a9/) ### Strength Use Strength to control how much the affected bones follow the target. A Strength of 0% means the target does not affect the bones. Strength can be animated like most properties in Rive. This is useful for blending between Forward Kinematics and Inverse Kinematics, or for blending between multiple IK constraints with different targets. ![Image](https://ucarecdn.com/b6d8a9bf-c604-4f91-86fe-1c1223aedd89/) ### Constraints order The order of constraints matters. If a bone has two IK constraints and both have a Strength of 100%, the lower constraint overrides the one above it. If the constraints use lower Strength values, Rive blends between them. Drag constraints in the Inspector to change their order. ![Image](https://ucarecdn.com/4751a9cd-f2c8-4b4a-9043-bd71276315f6/) ## Multiple IK constraints and nested targets You can use multiple IK constraints to create more complex rigs. For example, a character leg might use one IK constraint on the foot and another IK constraint on the leg bones. The leg target can be a child of the foot target, so moving the foot target also moves the leg target. ![Image](https://ucarecdn.com/553313ae-136c-456f-9a72-d756904fa823/) # Rotation Constraint Source: https://rive.app/docs/editor/constraints/rotation-constraint The Rotation Constraint allows you to set limits on an object's rotation and/or copy the rotation properties from a target object. These properties can be independently activated. ## How to create a Rotation Constraint Use the Constraints section of the Inspector to add a Rotation Constraint to an object. ![Image](https://ucarecdn.com/22a86fbf-4171-4d1e-b18a-f099b6d89aad/) Use the new constraint's fly-out menu to select a target for this constraint. ![Image](https://ucarecdn.com/c18c068a-c500-4f87-8f32-726a04776daf/) Manipulating the target object now causes the constrained object to copy Rotation properties. ![Image](https://ucarecdn.com/9961824a-a435-48d6-9366-b9f24f8bb730/) ## Strength The Strength property determines how much the constrained object is affected. A Strength of 0% means the constraint won't have any effect. A Strength of 50% means half the value from the target will be applied. ## Transform Space ### Source Space Choose whether this constraint should use World or Local coordinates for the Source Space. ### Destination Space Choose whether this constraint should use World or Local coordinates for the Destination Space. ### Min/Max Space Choose whether this constraint should use World or Local coordinates for the Min/Max Space. ## Offset Allows the constraint owner to be manually offset from the constraint source. ![Image](https://ucarecdn.com/d58cee7e-20cd-4586-b1c3-f1a807e94e84/) ## Copy Define the rate at which the rotation property is copied. ## Min/Max Use the numerical values to define the minimum and maximum limits of the constraint. # Scale Constraint Source: https://rive.app/docs/editor/constraints/scale-constraint The Scale Constraint allows you to set limits on an object's scale and/or copy the scale properties from a target object. These properties can be independently activated. ## How to create a Scale Constraint Use the Constraints section of the Inspector to add a Scale Constraint to an object. ![Image](https://ucarecdn.com/ae4a6d01-89b4-423d-988d-73a7094e4d8a/) ![Image](https://ucarecdn.com/dde72565-7f0f-447b-a98a-3cc33c55c79a/) Use the new constraint's fly-out menu to select a target for this constraint. ![Image](https://ucarecdn.com/52454a24-75d9-464b-8c8e-29de2e620b8a/) Manipulating the target object now causes the constrained object to Scale properties. ## Strength The Strength property determines how much the constrained object is affected. A Strength of 0% means the constraint won't have any effect. A Strength of 50% means half the value from the target will be applied. ## Transform Space ### Source Space Choose whether this constraint should use World or Local coordinates for the Source Space. ### Destination Space Choose whether this constraint should use World or Local coordinates for the Destination Space. ### Min/Max Space Choose whether this constraint should use World or Local coordinates for the Min/Max Space. # Scroll Constraints Source: https://rive.app/docs/editor/constraints/scroll-constraint Scrolling comes to Rive in the form of two new constraints; one to add touch-based scrolling to overflowed content, and another to create a scroll bar. Both constraints work in conjunction with the existing layout components. We plan to provide generalised scrolling components for quicker setup in future. Scroll wheel/trackpad gestures aren't currently supported but are on our v1 Roadmap. *** ## Content Scrolling To create a content scroll region, set up a hierarchy that includes: * Scroll view - the Layout that defines the area that is the scroll region * Scroll content - the Layout that contains the items to be scrolled (this is the Layout you will apply the Scroll Constraint to). The scroll amount will be determined by the size of this Layout. Typically you want to set this Layout to hug (or fixed) * Scroll items - the Layout items to be scrolled Image Select your Scroll content Layout and use the add action within the constraint inspector to add a Scroll Content constraint. Image Once added, use the options fly-out to adjust the Scroll content properties. Image #### Direction **Vertical** - Only scrolls in the vertical direction **Horizontal** - Only scrolls in the horizontal direction **All** - Scrolls in both directions #### Scroll Percent X/Y (Animatable) This property allows you to set the percentage scroll of the content where 0% is scrolled to the top/left and 100% is scrolled to the bottom/right. This property works when the content is set to scroll in one or all directions and can be keyed on the timeline #### Scroll Index (Animatable) This property allows you to set the 0 based index of the Scroll item to scroll to. This only works when scroll is set to either Vertical or Horizontal and can be keyed on the timeline. Scroll Percent and Scroll Index both control the offset within the Scroll content area. As such, you should only set one or the other because there will be contention when both are set at the same time. For example, you should only key one of these values on a given frame in your timeline. In order to use Scroll Percent and Scroll Index together with physical scroll dragging, you should create an empty "reset" timeline/state which you should transition to as soon as the scroll area is interacted with. One way to do this is to add a Mouse down listener to the Scroll View. #### Physics **Elastic** - An iOS style scroll with deceleration and rubber banding at the edges **Clamped** - A basic drag and drop with no physics #### Snap When enabled, the scroll content will always settle with a whole item at the top/left of the scroll area. Once you have applied your desired properties, switch to animate mode and start playback of a State Machine to preview the applied scroll constraint. You should be able to click/drag/release within the Scroll view area to manually control the scroll. *** ## List Scrolling In order to scroll Lists, use the same setup as described above in Content Scrolling, but rather than adding multiple Scroll items to the Scroll content layout, you can add a single List. See [Data Binding Lists](/docs/editor/data-binding/lists) for more information. There are some additional properties that apply when scrolling Lists. These will only be enabled once a List has been added to the Scroll content. #### Virtualize When enabled, the List will only generate Artboard components for the items currently in the Content view area. This improves performance when scrolling lists containing a large number of items. Note that virtualization can only be applied in one direction (either vertical or horizontal, not both). #### Carousel When enabled, the List will scroll endlessly in either direction. In order to use Carousel mode, Virtualize must be enabled. *** ## Creating a Scroll Bar To create a content bar, set up a hierarchy that includes: * Scroll Bar - the Layout that defines the area that is the scroll bar and track * Scroll Thumb - the Layout that defines the draggable scroll thumb Image To create a scroll bar, select a Layout Component acting as the scroll bar thumb. From the constraints inspector, add a Scroll Bar Thumb constraint. Image Use the target button within the options panel to connect a scrolling Layout. As described in the Scrolling Content section above, this should be the Layout that your Scroll Constraint was applied to. Image # Transform Constraint Source: https://rive.app/docs/editor/constraints/transform-constraint The Transform Constraint allows its owner to copy all the transformation properties from a target object, regardless of their hierarchical relationships. These properties include Position, Rotation, and Scale. ## How to create a Transform Constraint Use the Constraints section of the Inspector to add a Transform Constraint to an object. ![Image](https://ucarecdn.com/17a0bf31-0430-46cd-9980-2650a08a27cb/) Use the new constraint's fly-out menu to select a target for this constraint. ![Image](https://ucarecdn.com/c5320720-2332-4c4a-8784-cda0aee1423b/) Manipulating the target object now causes the constrained object to copy Position, Rotation, and Scale properties. ![Image](https://ucarecdn.com/ced5a14f-0add-4300-bdee-2738983c46b3/) ## Strength The Strength property determines how much the constrained object is affected. A Strength of 0% means the constraint won't have any effect. A Strength of 50% means half the value from the target will be applied. ![50% Strength](https://ucarecdn.com/73b4a724-6707-4cd0-80a0-5e6813327a5a/) ## Transform Space ### Source Space Choose whether this constraint should use World or Local coordinates for the Source Space. ### Destination Space Choose whether this constraint should use World or Local coordinates for the Destination Space. ## Example: mechanical arm Consider the package resting on the table and the mechanical arm below. Image Add a Transform Constraint to the package and a target group at the end of the arm. ![Image](https://ucarecdn.com/86ac428d-ed87-4846-b448-4504214ed127/) The target group is a child of the arm hierarchy, so it moves with the arm. With a Strength of 100%, all the transform properties of the package match the target. Notice how the package moves and rotates correctly with the movement of the arm. ![Image](https://ucarecdn.com/411ce58c-031c-4f34-88c4-a7f40a5efbc0/) Set the Strength to 0% to make the arm drop the package. # Translation Constraint Source: https://rive.app/docs/editor/constraints/translation-constraint The Translation Constraint allows you to set limits on an object's position and/or copy the position properties from a target object. These properties can be independently activated. ## How to create a Translation Constraint Use the Constraints section of the Inspector to add a Translation Constraint to an object. ![Image](https://ucarecdn.com/e5e35967-8cc9-4ee1-b2c3-77a676685a12/) Use the new constraint's fly-out menu to select a target for this constraint. ![Image](https://ucarecdn.com/2ace484c-661f-4481-8a3c-c3f4b8cd7e42/) Manipulating the target object now causes the constrained object to copy Position properties. ![Image](https://ucarecdn.com/61b05061-5636-419a-9d83-2c54a34837d8/) ## Strength The Strength property determines how much the constrained object is affected. A Strength of 0% means the constraint won't have any effect. A Strength of 50% means half the value from the target will be applied. ## Transform Space ### Source Space Choose whether this constraint should use World or Local coordinates for the Source Space. ### Destination Space Choose whether this constraint should use World or Local coordinates for the Destination Space. ### Min/Max Space Choose whether this constraint should use World or Local coordinates for the Min/Max Space. ## Offset Allows the constraint owner to be manually offset from the constraint source. ![Image](https://ucarecdn.com/caac6969-e4b6-4bdb-877d-fe548833fd90/) ## Copy X \&Y Allows you to decide if the constraint owner will copy the translation in the X and Y direction. Additionally, use the numerical value to define the rate at which it copies the value. ## Max/Min Use the numerical values to define the minimum and maximum limits of the constraint. # Binding Data Source: https://rive.app/docs/editor/data-binding/binding-data Binding is how you connect data to properties and elements in your Rive file. For example, if you have a `teamName` property bound to a text run in your scene, changing the `teamName` value updates the displayed text automatically. You can change property values in the editor or at runtime, allowing you to create dynamic experiences that adapt to each user. Bindings are not limited to visual properties. You can bind values throughout your file, including transforms, animation speeds, [converter values](/docs/editor/data-binding/converters#converter-types), [script inputs](/docs/scripting/script-inputs#data-binding-inputs), [transition condition values](/docs/editor/state-machine/transitions), and more. This allows the same data to drive behavior, animation, and logic across your scene, helping keep everything in sync. ## Binding a Property Let's control the `X` position of a circle using `circleX`, which is a Number property in our View Model. Bind a property With your circle selected, right-click the `X` field, and select **Data Bind**. In the **Property** dropdown, select `circleX`. The `X` field should now be highlighted in green, indicating that it's bound to a value. The circle's horizontal position is now driven by the `circleX` property. Any time the property's value changes, the circle updates automatically. Bind a property If the field has a yellow border, there is a problem with the binding. In most cases, the property type is incompatible with the target value. For example, the `X` position of an element can only be bound to a Number property. **Previewing Bindings** By default, your data only controls your elements when the state machine is playing. To preview your data-bound values, turn on the **Data Binding Preview Toggle**. Preview data binding ### Updating a Binding Right-click the bound element and select **Update Bind**. Update a binding ### Removing a Binding Right-click the bound element and select **Unbind**. Remove a binding ## Binding Options Each binding has the following properties. ### Property The View Model property the target is connected to. Property field When binding global properties, select the **Globals** icon. Select the Globals icon ### Path When binding properties in nested View Models, there may be multiple properties with the same name available. The path determines which specific property instance the binding should use. Preview data binding See also [Absolute vs Relative Binding](#absolute-vs-relative-binding). ### Bind Direction By default, the View Model property (**source**) controls the bound element or value (**target**), but it can also work the other way around. #### Target to Source When a binding has `Target to Source` toggled on, a change to the element will update the view model property. Target to source Let's say you have a walk cycle animation and you want to track the exact Y position of the head as it bobs up and down. With the head's `Y` position bound to `headY` using **Target to Source**, the `headY` property updates automatically as the head moves. #### Bidirectional A change to the view model property will update the element **AND** a change to the element will update the view model property. Bidirectional data binding Clicking the **Bidirectional** toggle multiple times will cycle between **Bidirectional (prefer target value)** and **Bidirectional (prefer source value)**. In rare cases, both the source and target may change at the same time. This setting determines which value wins when a conflict occurs. Let's say you're building a game of checkers and need to create logic for dragging and dropping each piece. The initial position of each piece is determined by the `piecePositionX` and `piecePositionY` properties (source to target). As the piece is dragged, the piece itself (target) updates those property values (target to source). ### Bind Once When **Bind Once** is enabled, the binding only applies the value a single time when the scene starts or the binding is created. Bind once After the initial value is applied, future changes to the source or target are ignored. Let's say you're creating a particle effect and want each particle to start with a random rotation value. You could bind the particle's rotation to a random number property using **Bind Once**. Each particle would receive its initial rotation value, but future changes to the property would not affect existing particles. ### Absolute vs Relative Binding By default, new data binding connections are created as absolute binds. * **Absolute Binding**: The binding points to a specific property instance within the View Model hierarchy. * **Relative Binding**: The binding searches for a property with a matching name relative to the current context. # Controlling Data Source: https://rive.app/docs/editor/data-binding/controlling-data Update and react to data from within Rive or from your application code. Once you've bound data to properties in your file, changing that data will automatically update the connected elements. You can control data from within your Rive file, or from your application at runtime. ## Controlling data within Rive Rive includes several ways to update data directly inside your file: Update property values when [transitions](/docs/editor/state-machine/transitions#actions) or [state changes](/docs/editor/state-machine/states#actions) occur. Update data in response to interactions and events. Write custom logic that reads and updates data. Update data using an element's property value. Animate values and bind them back to data. ## Controlling data from code Your application can also update data at runtime. For example, you might: * Update a player's score * Change a username or profile image * Display live stock prices * Trigger UI states based on user interaction See the [Runtime Data Binding Overview](/docs/runtimes/data-binding) for implementation details. # Converters Source: https://rive.app/docs/editor/data-binding/converters Transform and adapt data before it’s applied to a binding using built-in and custom converters. Converters transform values before they are applied to a binding. Use them to adapt your data to match the property you're binding to—for example, converting numbers to strings, mapping values between ranges, or smoothing changes over time. ## Adding a Converter Build and apply a converter In the Assets panel, click the `+` button and select a [converter type](#converter-types). With the converter selected, update the settings in the right sidebar. Most options can be data bound. When setting or updating a binding, set the **Converter** field.. ## Converter Types Converters can be used individually or combined into [groups](#converter-groups) to perform more complex transformations. Each converter has its own set of properties, many of which can be bound to other View Model properties. This allows converter behavior to update dynamically. For example, you could bind the maximum value of a range map, a multiplier in a formula, or the padding amount in a string converter. | Category | Converter | Description | | -------- | --------------------------------------- | ----------------------------------------------- | | String | [Pad](#pad) | Add padding to a string | | | Trim | Remove leading or trailing whitespace | | | Convert to String | Convert a value to a string | | | Remove Trailing Zeros | Remove unnecessary decimal zeros | | Number | Round | Round to the nearest value | | | Calculate | Perform simple calculations | | | [Range Map](#range-map) | Map a value from one range to another | | | [Interpolator](#numeric-interpolator) | Smoothly interpolate between values | | | [Formula](#formula) | Evaluate a custom expression | | | Convert to Number | Convert a value to a number | | Boolean | Toggle | Invert a boolean value | | List | [Number to List](#number-to-list) | Generate a list of components based on a number | | | List to Length | Get the number of items in a list | | Color | [Interpolator](#color-interpolator) | Smoothly interpolate between colors | | Script | [Converter Scripts](#converter-scripts) | Create your own custom converters | ### Pad Pads a string to a target length by repeating a value at the start or end. If the string is shorter than the specified length, the pad value is repeated and added until the target length is reached. **Example:** * **Value:** 1 * **Pad:** "0" * **Direction:** Start * **Length:** 3 **Result**: "001" *** ### Range Map Maps a number from one range to another. Use Range Map when you want to take an input value and convert it into a different scale. **Example** Convert a slider value (0–100) into an opacity value (0–1): * **Input**: 50 * **Input range**: 0 → 100 * **Output range**: 0 → 1 **Result**: 0.5 *** ### Numeric Interpolator interpolate a shape Smoothly transitions between number values over time, easing changes instead of jumping instantly. *** ### Formula Generate a formula Formula lets you perform custom calculations using values from your View Model or the input. You can create a formula in two ways: **Writing it directly** ```lua theme={null} random({{NumberConvertersVM/circleX}} / {Input}) + 2 ``` `{Input}` refers to the incoming value, while `{{...}}` references View Model properties. **Using the editor** Click the + button to add values, operations, and functions. This builds the formula for you and generates the equivalent expression. **Formulas don't need inputs** The following formula would output a random number, regardless of input. ```lua theme={null} random(2) ``` #### Random Mode When using `random()` in your formula, the Random Mode determines when a new random value is generated. * **Once** — Generates a random value only when the formula first runs * **Source Change** — Generates a new value each time the input changes * **Always** — Continuously generates new values while the input changes and during interpolation *** ### Number to List The Number to List converter allows you to generate a specified number of Components based on a number. See [Lists](/docs/editor/data-binding/lists#view-model-number-with-converter) for more information. *** ### Color Interpolator interpolate a color Smoothly transitions between color values over time, easing changes instead of jumping instantly. *** ### Converter Scripts Scripting lets you create your own custom converters when you need behavior that isn’t covered by the built-in converters. See [Converter Scripts](/docs/scripting/protocols/converter-scripts) for more information. ## Converter Groups Build and converter group Converter groups let you chain multiple converters together, where the output of one becomes the input of the next. In the Assets panel, click the `+` button and select Converter > Group. With the group selected, add the `+` button in the right sidebar and select an existing or new converter. When binding a value, your converter group can now be used just like an individual converter. ### How execution works Converters run from top to bottom: * The first converter receives the original input * Each converter passes its result to the next * The final output is the result of the last converter ### Reordering converters Drag a converter up or down to change when it runs. Earlier converters affect all converters that follow. # Enums Source: https://rive.app/docs/editor/data-binding/enums Use enums to control states, modes, and variants by selecting from a predefined set of options. An enum lets you choose one value from a predefined set of options. Use enums when a property should only ever be one of a few known values—like modes, states, or variants—instead of allowing any arbitrary value like a string. For example, instead of using a string like "left", "center", or "right", an enum guarantees the value is always one of those valid options. Enums Enums can be: * System enums — built-in sets of options used by the editor (for example, Horizontal Align) * [Custom enums](#custom-enums) — your own defined sets of options for your specific use case **Why not use strings or numbers?** Imagine a calendar app that shows different backgrounds based on the day of the week. You could use a string like "Monday", but it breaks if someone sets it to "Mon". You could use a number, but it’s unclear whether the week starts on Sunday or Monday—or whether the index starts at 0 or 1. With an enum, the value must be one of the defined options, so it’s always valid and unambiguous. ## Adding an enum property Enums Create a new enum view model property inside your view model. Click the dropdown next to the property name and select an enum type. Select your enum view model property and in the right sidebar, select the default value. ## Binding enums Bind an enum Enums can be bound to editor properties that use the same set of options. For example, an enum named “Layout Direction” can be bound to a layout’s Direction property. When binding enums, the System Enum to Uint converter is required and is applied automatically. ## Custom enums Create custom enum Open the Data panel, click the `+` icon and select enum. With your enum selected, click the `+` icon in the right sidebar. Assign your custom enum to your enum view model property. ## Controlling Solos with enums Use an enum to control which Solo is active by mapping each enum value to a Solo. Bind enum to solo Create a [custom enum](#custom-enums) with values that match the **names and order** of your Solos. [Export the names](/docs/editor/exporting/exporting-names) of the objects used by the Solo so they are accessible at runtime. Bind the enum to the Solo’s **Active** property and apply a **Convert to Number** converter. # Lists Source: https://rive.app/docs/editor/data-binding/lists Use Data Binding to generate lists at runtime A List is a way to display a set of items that are dynamically generated based on bound data values that you set up in your View Models. This allows you to build Rive files that can change in real time based on updates to those values. You can use Lists to create: * Menus with a dynamic amount of options * Product listings * Notifications or activity feeds * Chat messages * Dropdown menus * Contacts, friends, or followers lists * High scores, tables, and more *** ## Artboard Lists Artboard Lists enable you to generate a number of list items using an Artboard to represent each item in your List. Artboard Lists must be added as children of an Artboard or Layout. To add an Artboard List to the stage, first select either an Artboard or a Layout. In the inspector on the right side of the editor, you will see a button to add an Artboard List. Click it to add the List to your hierarchy. It will appear as a child of the Artboard or Layout you had previously selected. Inspector button to add an Artboard List as a child of the selected Artboard or Layout Once the Artboard List is added to your hierarchy, you can select it and see its inspector. Inspector for a selected Artboard List showing its view model property selector The next step is to bind data to it using Data Binding. This will determine the content and number of items in your List. There are 2 ways to generate List content: * Using the View Model List property * Using a View Model Number property together with a Number to List converter ## View Model List Property Before continuing, it's important to understand the fundamentals of Data Binding, in particular, what a View Model is, how to create one and how to bind it to an object's properties. Learn more in the [Data Binding Overview](/docs/editor/data-binding/overview). A View Model List is a property that can contain a dynamic number of items which each represent a View Model instance. In order to be used in a List, the View Model must be bound to an Artboard. To Create a View Model List and bind it to an Artboard List: Navigate to the Data tab in the Editor. Click the + button beside View Models to create a View Model (this will represent your List item) Bind that View Model to an Artboard that you want to use to render your List item. This is where you may also want to create additional View Model properties and bind those to object properties on that Artboard. Click the + button beside View Models to create another View Model (this will be the View Model that contains your List and should be bound to the Artboard where you want your List to render) Select the newly created View Model and click the + button next to it. From the popout select **List**. This adds a List property to the View Model Popout menu with List selected after clicking + next to a View Model in the Data panel Select the List property and in the inspector on the right, you can add items by clicking Add List item Number to List option can be found under List, inside the Converter section in the Add menu Once a List item is added, you can click the settings button to the left of its name in order to set the View Model and View Model instance for that item After adding your List items, go back to the Hierarchy tab, select the Artboard List, and from the Artboard List property dropdown, select the ViewModel List property you created above. Run the state machine and you should see your list items. Remember that the layout will be determined by the Artboard List's parent, so modify the parent's settings in order to tweak your List's layout Rive's runtimes provide [APIs to modify the List and List items at runtime](/docs/runtimes/data-binding#lists) (for example, adding or removing items). ## View Model Number with Converter The second way to populate your list is by specifying the number of items you want in your List along with the ViewModel (Artboard) you want to instance. This can be done using a View Model Number property in combination with the new Number to List converter. To Create a View Model Number to List converter and bind it to an Artboard List: Navigate to the Data tab in the Editor. Click the + button beside View Models to create a View Model (this will represent your List item) Bind that View Model to an Artboard that you want to use to render your List item. This is where you may also want to create additional View Model properties and bind those to object properties on that Artboard. Click the + button beside View Models to create another View Model (this will be the View Model that contains your Number property and should be bound to the Artboard where you want your List to render) Select the newly created View Model and click the + button next to it. From the popout select Number. Select the newly created Number and in the inspector, set the number of items you want in your List Click the + button and choose **Converters > List > Number to List**. Converters menu with the Number to List converter hovered Select the created converter and in the inspector, choose the View Model that you created earlier that represents your List item. The converter will convert the Number of items to actual Artboard items Index option under Add Property, in the List Attributes group After adding your Number property and converter, go back to the Hierarchy tab, select the Artboard List, and from the Artboard List property dropdown, select the ViewModel Number property you created above. The Combobox will show a yellow outline. Right click the Combobox and choose Update Bind. In the converter field, select the Number to List converter you created. The yellow outline should change to green. Run the state machine and you should see your list items. Remember that the layout will be determined by the Artboard List's parent, so modify the parent's settings in order to tweak your List's layout ## View Model List Item Index There may be times where it is useful for the Artboard to know at which index it exists within its parent List. This is available using the View Model list item index property. This can be added to your item's View Model by clicking the + button and selecting **List Attributes > Index**. List Attributes menu with Index hovered after clicking + on the item's View Model This property can then be bound to an object's properties and used directly (for example, to change the position of an object based on the index), used together with a converter (to display the index value as a string) or used as a condition in a state machine (to provide different behavior depending on the item's index). When using item index with the [List property](/docs/editor/data-binding/lists#view-model-list-property) and list items, be aware that if more than 1 list item is bound to the same View Model instance, they will share the same index value ## Lists & Scrolling If you add your Artboard List as a child of a Layout, your List items will behave as children of its parent's Layout. This means things like direction, wrapping, padding, gap, alignment, etc. are all dictated by the parent Layout's properties. In addition, if you have applied a [Scroll Constraint](/docs/editor/layouts/scrolling) to the parent Layout, the List items will have the ability to scroll out of the box without any additional setup. There are additional Scroll properties that can be applied when scrolling Lists. See [List Scrolling](/docs/editor/layouts/scrolling#list-scrolling) for more details. # Migration Guide Source: https://rive.app/docs/editor/data-binding/migration-guide Migrate from State Machine Inputs and Listening to Events at runtime to Data Binding Data binding replaces both **state machine inputs** and **runtime event listeners**, and also removes the need to directly modify elements like text runs from code. It provides more data types in a more flexible, consistent system for both sending data into Rive and reacting to changes from Rive. | | Inputs | Events | View Model Properties | | ---------------------- | :----- | :----- | :-------------------- | | Floating point numbers | ✅ | ✅ | ✅ | | Booleans | ✅ | ✅ | ✅ | | Triggers | ✅ | ❌ | ✅ | | Strings | ❌ | ✅ | ✅ | | Enumerations (Enums) | ❌ | ❌ | ✅ | | Colors | ❌ | ❌ | ✅ | | View Model Nesting | ❌ | ❌ | ✅ | | Lists | ❌ | ❌ | ✅ | | Images | ❌ | ❌ | ✅ | | Artboards | ❌ | ❌ | ✅ | You do **not** need to update existing files. Inputs and events will continue to work as expected. Data binding is recommended for new work and future updates. ## Migrating from Deprecated Features ### State Machine Inputs State machine inputs were previously the main way to control animations from code. With data binding, you instead expose **view model properties** that can drive State machine transitions, Blend states, and Any bindable property in the editor Open the **hamburger menu** in the editor Select **Convert Inputs to View Models** Update your runtime code to set values on the view model instead of inputs **Why are State Machine Inputs deprecated?** Inputs are limited to driving state machine transitions and must be used as-is. View model properties: * Can drive more than just transitions * Can be transformed using [Converters](/docs/editor/data-binding/converters) * Can be shared across multiple parts of a file * Provide a more flexible and scalable data model ### Communicating with Code via Events Events were previously used to send information from a Rive file back to runtime code. With data binding, you instead **listen to changes on view model properties**, including trigger and lists. **Why is listening for Events at runtime deprecated?** Events had several limitations: * Difficult to pass dynamic or changing data * Required manual handling to work across nested artboards * Represented a one-time signal rather than a persistent value View model properties always reflect the latest value and can be observed directly. Instead of listening for an event: * Create a **view model property** * Update it from your Rive file (via animation, listener, or script) * Subscribe to that property in your runtime For more info, see [Data Binding](/docs/runtimes/data-binding) *** ### Updating Text Runs at Runtime Previously, updating text required: * Knowing the exact **name** * Knowing the **hierarchy/path** * Accessing the text run directly from code This approach was brittle and easy to break when files changed. With data binding: * Bind a **string property** to a text run * Update the value through the view model This keeps your runtime code stable even if the structure of your file changes. ## Constraints vs Data Binding Constraints are still fully supported and remain the best option for many use cases. ### When to use constraints Use constraints when: * You are linking one object directly to another * The relationship is purely visual or spatial * You want a simple, editor-only solution ### When to use data binding instead Use data binding when: * The value needs to come from **runtime code** * Multiple elements depend on the same value * You want to introduce **logic or transformation** (via [Converters](/docs/editor/data-binding/converters)) * The relationship isn’t strictly object-to-object **Example:** You could: * Use a **constraint** to link the rotation of multiple wheels together Or: * Use a **data-bound `rotation` property** that: * Is controlled at runtime * Drives all wheels * Can be reused elsewhere (speed, effects, UI, etc.) Data binding is more flexible, while constraints are more direct. # Data Binding Overview Source: https://rive.app/docs/editor/data-binding/overview Connect editor elements to data and code using View Models Data binding connects data stored in View Models to properties in your Rive scene. When data changes, your scene updates automatically. Likewise, changes made in your scene can be written back to your data. For example, you might: * Bind an enemy's X and Y position so it can be controlled at runtime. * Bind the color of multiple icons to a single color property. * Bind a `health` value to a health bar in the UI and to the character. * Swap images, artboards, or components based on your application's state. ## Why Use Data Binding? Data binding lets you organize your data independently from your scene hierarchy. For example, you might have a `health` property stored at the top level of your data, while the health bar that displays it is nested several layers deep inside components. Once the property is bound, the hierarchy no longer matters. You can move elements, reorganize components, or rename properties without rewriting runtime code. ## Core Concepts 1. [View Models](/docs/editor/data-binding/view-models) define the structure of your data. 2. View Model Instances store actual values for that data. 3. [Bindings](/docs/editor/data-binding/binding-data) connect View Model data to properties in your scene. 4. [Data can be updated](/docs/editor/data-binding/controlling-data) from the Editor, runtime code, state machines, or scripting. 5. Listeners, runtime code, and scripts can respond when data changes. 6. When data changes, bound elements automatically update to reflect the new values. # Property Groups Source: https://rive.app/docs/editor/data-binding/property-groups Create local values that can be keyed, animated, and bound to View Model properties. 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 Select your Property Group tool and click the stage to add one to your artboard. Create property group Select your Property Group and in the right sidebar, click the `+` icon and select your property type. Add property to group ## 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](/docs/editor/animate-mode/keys) in a timeline to update View Model data at runtime. **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. With the Property Group selected, move the timeline playhead and change the property value to create keyframes. New 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. Bind Property 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. **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. In this example we'll have two Number View Model Properties called `myNumber` and `myOtherNumber`, which will be `myNumber` doubled. Create a new Converter of type Numeric > Formula and add a number value, a multiply operation, and another number. Add property to group Bind the first number to `myNumber`. Bind the first number 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. Control a View Model Property When you run your state machine, you should see that `myOtherNumber` is double `myNumber`. Doubled # View Model Properties Source: https://rive.app/docs/editor/data-binding/property-types A view model property is one piece of data within a view model. Developers might think of this as similar to a field in object-oriented programming. Properties have a data type, which is selected when they are created, and a name which can be referenced in code. Each property can be bound to different editor elements of the same type or used as conditions within a state machine. ## Adding View Model properties In the Data panel, click the **Add View Model Property** button next to the view model name and select your property type. Create a new Enum | Type | Description | | ------------------------- | -------------------------------- | | Number | Numeric value | | String | Text value | | Boolean | True/false value | | Color | RGBA color value | | [Trigger](#trigger) | Fire-and-forget event | | [Enum](#enum) | One value from a predefined list | | [Image](#image) | Image asset reference | | [Font](#font) | Font asset reference | | [Artboard](#artboard) | Artboard reference | | [View Model](#view-model) | Nested View Model instance | | [List](#list) | Collection of view models | ## Property Types ### Trigger Trigger properties represent fire-and-forget events. Use them when you want to signal that something happened, such as a button press or one-time action. ### Enum Select from a fixed set of options to control states and variants. Use enums when the possible values are known ahead of time. [Learn more](/docs/editor/data-binding/enums) about enums. ### Image Bind an image Image properties store a reference to an image, allowing you to change which image is displayed. They are typically bound to image nodes in your design. Use image properties when each instance needs its own image, such as user avatars, thumbnails, or dynamically loaded content. For example, in a game or social UI, each player can have their own avatar by binding a different image to the same property. Image properties affect a **single instance**. If you need to update an image globally across your entire file, use [asset loading instead](/docs/runtimes/loading-assets). Asset loading replaces the underlying asset, updating all instances that use it. ### Font Font properties store a reference to a font, allowing you to change which font is displayed on a specific text style. Font properties affect a **single instance**. If you need to update a font globally across your entire file, use [asset loading instead](/docs/runtimes/loading-assets). Asset loading replaces the underlying asset, updating all instances that use it. ### Artboard Bind an artboard Artboard properties let you reference an artboard and dynamically swap it at runtime. The artboard can come from your current Rive file or be loaded from another .riv file. To use an artboard as a property, it must first be [converted to a Component](/docs/editor/fundamentals/components#creating-a-component). ### View Model View Model properties store a reference to a View Model instance. They are used to create nested data structures by connecting one View Model instance to another. For example, a `Player` View Model could contain a `Team` View Model property, allowing you to access properties such as the team's name, logo, and colors. You can bind to and update properties on nested View Models just like top-level properties. If you want to assign a View Model instance to a nested component, that instance must be referenced from your main View Model. ### List List properties store collections of view model instances, which can be associated with specific artboards. Lists are commonly used for repeating content, such as inventory items, players, messages, or generated UI elements. For more information, see [Lists](/docs/editor/data-binding/lists). # Stateful Components Source: https://rive.app/docs/editor/data-binding/stateful-components Stateful components let you expose specific view model properties directly on a nested component, so each instance can have its own values. This makes it faster to create and iterate on designs that reuse the same component with different content or styling — without wiring up a separate nested view model instance for each one. ### Setting Up a Component for Stateful Use Before a component can be used statefully, its artboard needs a view model with the properties you want to expose. 1. Create or open the artboard you want to use as a component. 2. Add a view model and bind the relevant properties to elements in the artboard (for example, a label string bound to a text run, or a background color bound to a fill). 3. Mark the artboard as a component using the component toggle in the inspector, or press Shift + N. 4. In the inspector, find the Properties section. Click + to add the view model properties you want to expose. 5. For each property, choose whether it's an Input or an Output: * Input — the value can be set on each instance when nested as a stateful component. * Output — the value is read-only when nested; it reports back to the parent. Image ### Using a Stateful Component When you nest a component (press N and select it from the menu), it comes in as a stateless component by default. Switch it to a stateful component in the inspector. Image Once switched to stateful, the nested view model instance selector goes away, and you'll see the exposed properties instead. Set override values directly in the inspector. Each instance of the component can have its own values for those properties. Because the values are owned by the component instance, you don't need a separate view model instance for each one. ### Nesting Stateful Components Stateful components can be nested inside other components. For example, a card component might contain a stateful button component. If you want the card's parent to be able to override the button's properties, add those properties to the card's view model and data bind them to the button's stateful properties. Once added to the card's Properties panel as inputs, they'll be available to override when the card is nested. ### Output Properties Output properties report a value out of a component when it's nested. They appear with a lock icon in the inspector and are marked as read-only — you can interact with the component, but you can't set the value from outside. Image To read an output value in the parent artboard, add a property to the parent's view model and data bind it (target to source) to the component's output property. The value will update in real time as the state machine runs. ### Keying Input Properties on Timelines Input properties can be keyed on a timeline. Open the timeline view with a stateful component selected and you'll see a key indicator next to each exposed input property. Key the values at different points in the timeline to animate them. Image # View Models & Instances Source: https://rive.app/docs/editor/data-binding/view-models A View Model defines the structure of your data. It acts as a reusable blueprint that contains a collection of properties, such as a car's color, speed, and damage. Each property has a type, such as Number, String, Boolean, Color, Enum, or List (For more information, see [View Model Properties](/docs/editor/data-binding/view-model-properties)). View Models do not store values themselves. Instead, values are stored in one or more View Model Instances that are created from the View Model. For example, if you were building a racing game, you might create a Car View Model with the following [properties](/docs/editor/data-binding/view-model-properties): ```jsx theme={null} Car (View Model) color: Color damage: number make: string speed: number ``` A single View Model can be used to create many View Model Instances. Each instance shares the same structure but stores its own values. ```jsx theme={null} Car1 (View Model Instance) color: 0xFFFF0000 damage: 0 make: "Subaru" speed: 0 Car2 (View Model Instance) color: 0xFFFF00FF damage: .9 make: "Honda" speed: 0 ``` The properties in your instances can then be bound to elements in your designs, allowing text, images, colors, animations, state machines, and other properties to react to data changes automatically. ### Creating a View Model A View Model defines the structure of your data. Before creating View Model Instances or setting up data bindings, you'll first need to create a View Model and add properties to it. New Rive files come with a default view model called "ViewModel1" that is already attached to the main artboard. In the Data panel, click the `+` icon and select **View Model** or [**Global View Model**](#global-view-model-instances). In the Data panel, click the **Add View Model Property** button next to the view model name and select your [property type](/docs/editor/data-binding/property-types). Create a View Model ## Creating and Editing Instances Once your View Model has been created, you can create one or more View Model Instances that store actual values for those properties. ### Creating a View Model Instance A View Model can have multiple instances. Each instance contains its own set of property values while sharing the same structure defined by the View Model. When creating a new View Model, Rive automatically creates a View Model Instance named "Instance" so you can immediately begin testing bindings and previewing data. Create a View Model Instance Select a View Model in the Data panel, then click the Controls icon next to the instance name in the Inspector. To see all of your view model instances and values at once, click the Open Table Data button. Open table data Click the `+` icon to add a new instance. Double click the instance's name to rename it. With the instance selected, change any of its properties. Note that this changes **only** the values on the selected view model instance. ### Removing Instances Click the `-` icon next to the instance name to delete it. Remove a View Model Instance Deleting a View Model Instance does not remove the View Model or its properties. It only removes that instance and its stored values. ### Exporting Instances By default, exported View Model Instances are included in the .riv file. Disable Export Instance when the data is only needed during development, not in your application at runtime. Export an Instance Let's say you're building a high score screen in Rive. While designing, you'll use fake score data, but when your game is live, the high scores will be populated using real data from a database or another source. In this case embedding the example data just increases your .riv file size. ## Connecting View Model Instances to Artboards Before binding data, you'll need to decide where the data should live. Rive supports a few common patterns: | Pattern | | | :------------------------------------------------------------------ | :--------------------------------------------------------------------------------------------------------------- | | [Global Instances](#global-view-model-instances) | Global view models and their properties are directly accessible to all artboards | | [Instances attached to artboards](#instances-attached-to-artboards) | The view model instance is attached to the artboard and its values can be used by that artboard and its children | | [Instances as nested properties](#instances-as-nested-properties) | The parent view model instance stores a reference to a nested view model instance | | [Stateful nested components](#stateful-components) | Self-contained, reusable components that store their own unique data | ### Global View Model Instances Global view models are not connected to a specific artboard. Instead, the view model instance and its properties are directly accessible to all artboards. A game's main view model might contain a `brandColor` or `score` property. This property might be used by various nested components, like the header, on buttons, or on a high scores screen. ### Instances Attached to Artboards View Model instances can be attached to a specific artboard or nested component. This is useful when only that artboard and its children need access to that data. ``` EnemyVM ├─ health ``` An Enemy view model might contain a `health` property. This property might be used by the enemy itself, but not by its parent. ### Instances as Nested Properties View Models can have properties that are View Model instances. In this pattern, the parent View Model stores references to child instances, either directly or through a [list](/docs/editor/data-binding/lists). ``` GameVM ├─ health └─ score └─ avatar └─ inventory (stores an instance of InventoryVM) InventoryVM ├─ Sword ├─ Shield └─ Potion ``` Attach instance to component This approach is useful when a parent artboard needs to manage a collection of items while still allowing each component to maintain its own data. An inventory screen might contain a list of Item View Model Instances, with each inventory slot component bound to a different item. ### Stateful Components A stateful component is an instance of a component that maintains its own data. Unlike traditional component View Model Instances, these instances do not need to be created or referenced by the parent View Model. Instead their properties are exposed in the sidebar. Stateful components For more information, see [Stateful Components](/docs/editor/data-binding/stateful-components). # Shape Builder Source: https://rive.app/docs/editor/design/shape-builder Merge and subtract vector shapes. The Shape Builder tool lets you create new shapes by combining or subtracting vector shapes. Instead of editing paths manually, you can drag across regions to merge them or remove unwanted sections. Select two or more vector shapes. Click the **Shape Builder** tool from the **Create Tools** menu in the Toolbar or press **Shift** + **M**. Drag across adjacent regions to merge them into a single shape. Hold Alt (Windows) or Option (macOS) while dragging or clicking to remove regions from the shape. # Embed URLs Overview Source: https://rive.app/docs/editor/embed-urls/overview Embed URLs are a fast, no-code way to share or embed your Rive files on the web. Generating embed URLs is available on Voyager and Enterprise plans. [Learn more about our plans and pricing](https://rive.app/pricing?utm_source=docs\&utm_medium=content). Embed URLs let you quickly generate a public version of your file for embedding or sharing. Unlike [inviting someone to collaborate](/docs/account-admin/workspaces/managing-workspace-members#inviting-members-to-a-workspace), an embed URL is a **snapshot** of your file at the moment it’s generated. If you make changes later, you’ll need to generate a new link to reflect those updates. ## Creating an embed URL In the Rive editor, click the **hamburger menu** in the top-left corner and select **Generate Embed URL**. Generate embed URL In the dialog that appears, click **Generate Embed URL**. Generate embed URL Once the link is generated, select the option that best fits how you plan to use your file. For more information on using embed URLs with tools like Framer, Webflow, and Notion, see [Integrations](/docs/integrations/overview). Generate embed URL ### Embed URL types * **Hosted link** — Opens your file on a dedicated Rive page with a framed viewer. Ideal for sharing with clients or stakeholders. * **Embed link** — Displays your file without the surrounding Rive UI. Useful for platforms that automatically preview links (e.g. Notion, Telegram). * **Embed code** — An iframe snippet for embedding your file into sites where you can edit HTML (e.g. WordPress). * **Framer code (Deprecated)** — See the new official [Rive Framer Plugin](https://www.framer.com/marketplace/plugins/rive/). ### Embed URL options * **Enable** — Turn the link on or off to control access. * **Rive Renderer** — Use the Rive Renderer (recommended) or Canvas renderer. * **Multi-touch** — Enable support for multi-touch interactions. Certain features, such as [Vector Feathering](https://rive.app/blog/introducing-vector-feathering?utm_source=docs\&utm_medium=content), are only available using the Rive Renderer. See our [Feature Support](/docs/feature-support) page for more information. ## Sharing on Social Media 1. Copy the **Hosted Link** 2. Paste it into your favorite platform 3. See your Rive creation unfurl when you post ## Managing embed URLs Visit the [Embed URLs](https://rive.app/account/links?utm_source=docs\&utm_medium=content) section of your settings to manage the links you've generated. You can disable an embed URL by setting its Active toggle to off. # Audio Events Source: https://rive.app/docs/editor/events/audio-events Event-based audio provides the means to trigger sound effects within your animations and/or in response to user interactions. Just like existing events, they can be triggered by a keyframe on a timeline, during a state transition, or via a listener. Audio events represent the first phase of audio features in Rive — they provide an ideal way to trigger sound effects that can be layered on top of each other. Previously, triggering audio with events would require some work with one of the Rive runtimes and your application or game. The introduction of audio events directly inside the Rive editor streamlines the process of adding sound to your animations — further empowering designers, whilst simplifying the implementation for developers. Audio events are ideal for triggering shorter sounds in response to user interactions or to complement character animations. Whilst longer form audio — such as background music and voice overs — can also be triggered with audio events, they lack a level of control to manipulate volume, panning, and more over time. For use cases requiring greater control over volume and playback, consider using [Scripting](/docs/scripting/getting-started). Check out [AudioSound](/docs/scripting/api-reference/interfaces/audio-sound) and [AudioSource](/docs/scripting/api-reference/interfaces/audio-source) for more information. ## Working with Audio Assets Audio events use sounds from the Assets panel. See [Importing Assets](/docs/editor/fundamentals/assets-overview#importing-assets) to import MP3, WAV, and FLAC files, or see [Audio Assets](/docs/editor/assets/audio) to browse Soundly sounds, create clips, and adjust asset volume. ## Creating an audio event The simplest way to create an audio event is to drag your audio asset or clip directly from the [assets panel](/docs/editor/assets/audio) onto the stage. In doing so, an event is created with the preassigned asset. Alternatively, create a regular event by activating the event tool (`SHIFT + E`) and clicking on the stage. Once created, set the type setting in the inspector to Audio. Additional options to assign an asset and browse the Soundly library will be presented for audio events. ## Triggering an audio event Like regular events, audio events can be triggered in a selection of different ways: * **Timeline:** Whilst in animate mode, with a timeline selected, the event inspector will surface a button to key the event. Keying an event causes it to be reported. In the context of an audio event, reporting it will start the playback of the assigned audio asset. * **Transitions:** Select a transition node within a State Machine and add an event via the inspector. You can choose whether the event should be reported at the start or at the end of the transition. * **Listeners:** Select a listener within a State Machine and add a 'report event' action via the inspector. The pointer option will determine when the audio will play. For example, a pointer down listener with an assigned audio event targeting a shape will start playback when the user clicks on the shape. ### Monitoring audio Audio levels can be monitored via the VU meter at the base of the inspector. Use the VU meter to check for clipping. This may occur if multiple audio events are playing at once, causing the overall output to clip. If you notice peak levels turning red, consider lowering the volume of your audio asset to provide more headroom. # Events Overview Source: https://rive.app/docs/editor/events/overview Creating and signaling Rive Events Events live within an artboard and are used to signal that something has happened. They can be fired from timelines, states, transitions, or listeners. Rive supports three types of Events: * [Open URL Event](/docs/editor/events/open-url-events) — Opens a URL at runtime * [Audio Event](/docs/editor/events/audio-events) — Plays a sound * [General Event (deprecated)](/docs/editor/events/general-events) — Previously used to communicate with runtime code ## Creating an Event Use the Events tool located in the Toolbar and click anywhere on the artboard. ![Adding a new event](https://ucarecdn.com/4ed6c563-4c59-42c8-b40c-f502d5a8e1a4/) You'll notice that the Event is displayed on the artboard and in the Hierarchy. Give your event a name so it’s easy to identify and reference. You can rename it using the **Name** field, or by double-clicking the name directly on the artboard. ![Renaming an Event](https://ucarecdn.com/4558fb61-4649-4210-9ec6-c828c48ab2b2/) The Type dropdown allows you to change the Event type between Audio, URL, and General. ![Image](https://ucarecdn.com/9621c007-de2e-428c-95d7-837615a37caa/) Each Event type has its own set of properties. For more information on the specific event types, see [Open URL Events](/docs/editor/events/open-url-events), [Audio Events](/docs/editor/events/audio-events), and [General Events (deprecated)](/docs/editor/events/general-events). If events aren't visible on the stage, open the **View Options** menu and make sure **Events** is enabled. toggle events visibility ## Signaling an Event We can signal an Event in four ways: from a timeline, a listener, a state, or a transition. ### Timeline Signaling an Event from the timeline lets you control the exact moment in an animation when the Event fires. First, select the timeline you want to add the Event to. Then use the **Report Event** button in the Inspector. ![Keying an Event on the timeline](https://ucarecdn.com/bd8d36f9-9cd1-4eec-9c37-85d4a0a19643/) ### Transition & State You can report an event on a Transition or a State. To report an event, select the desired State or Transition and use the `+` button next to the Events section in the Inspector. ![Signaling an Event via State or Transition](https://ucarecdn.com/d1a63666-0cce-408f-9364-826eed66b241/) Now that we've selected the Event, we can decide whether it is signaled at the start or end of the Transition or State. ### Listeners With your [Listener](/docs/editor/state-machine/listeners) selected, click the `+` below the State Machine Graph, and select **Report Event**. Trigger an Event with a listener # Exporting for Backup Source: https://rive.app/docs/editor/exporting/exporting-for-backup Exporting for backup is available on paid plans. [Learn more about our plans and pricing](https://rive.app/pricing?utm_source=docs\&utm_medium=content). Exporting a file for backup is useful when you want a hard copy of your file saved to your device, if you are looking to transfer a file from one user to another, or you're trying to send in a file for a support ticket. Unlike files exported for runtime (.riv), files exported for backup (.rev) contain all of the information that is typically stripped from the file.\ \ To export a file for backup, you can either do this from the file browser, or from the file menu when the file is open. ## Exporting from the file browser To export a backup file from the file browser, first, find the file that you want to download. ![Image](https://ucarecdn.com/4a80265b-e521-476a-8bbd-476e34027443/) \ Next, right click on the file and choose whether you want to download the file backup, or you can choose to download a specific revision of the file. ## Exporting from the file menu To export a backup file, when the file is open, first, click on the file menu. Next, find the export option and select "for backup". ![Image](https://ucarecdn.com/4af741f7-8925-4ab1-88de-472ea00a47e1/) # Exporting for Runtime Source: https://rive.app/docs/editor/exporting/exporting-for-runtime Export a .riv file to use in apps, games, websites, and other supported runtimes. Exporting for runtime is available on paid plans. [Learn more about our plans and pricing](https://rive.app/pricing?utm_source=docs\&utm_medium=content). A `.riv` file is the final Rive file you load at runtime. You can use the same exported file across supported runtimes, including web, mobile, game engines, and other platforms. ## Exporting a .riv File To export a file for runtime, click the blue **Publish** button on the right side of the toolbar, or go to **Export** > **For runtime** from the left toolbar menu. You can load the exported `.riv` file into your app, game, or website with any of Rive's [open source runtimes](/docs/runtimes/). Image ## Using newer files with older runtimes Rive files are built for backwards compatibility. A file exported from the latest version of the editor can still load in older runtimes. If a file uses a feature that was added after your runtime version was released, that specific feature may be skipped, while the rest of the file continues to run. For full [feature support](/docs/feature-support), fixes, and performance improvements, keep your runtime up to date. # Exporting for Video or Static Design Source: https://rive.app/docs/editor/exporting/exporting-for-video-and-static-design Exporting video and images is available on paid plans. [Learn more about our plans and pricing](https://rive.app/pricing?utm_source=docs\&utm_medium=content). Rive is all about interactive animation, but sometimes you need traditional formats such as MP4, GIF, or PNG sequence. Our Cloud Renderer turns any device into a supercomputer, allowing you to continue working while we generate your video or design file. # Supported Formats * H.264 * GIF * PNG Sequence * SVG Sequence * WebM * PNG * SVG # How to render All rendering is done by creating Rendering Presets, then adding those Render Presets to the Render Que. ## Creating a preset With the Artboard selected, you'll find the Render Presets option. Hitting the plus button will create a new Render Preset. This can be done from either [design or animate mode](/docs/editor/fundamentals/design-vs-animate-mode). Image By creating a Render Preset in Design Mode you'll have the option to render either an SVG or PNG. This option can be changed using the dropdown menu with the preset selected. Image By creating a Render Preset in [animate mode](/docs/editor/fundamentals/design-vs-animate-mode) you'll have the option to render a number of video formats including H.264, GIF, PNG/SVG sequence, and WebM. This option can be changed using the dropdown menu with the preset selected. ![Image](https://ucarecdn.com/e826d407-8977-4ed7-9c02-f35a8a30441b/) To the left of the Render Preset name, you'll find additional options which allow you to change a number of options. * Animation * Format * FPS * Duration * Bit rate * Size ## Adding a Preset to the Render Queue When you're finished creating a preset, you'll need to add it to the Render Queue. Do this by either using the Queue All button below the Render Presets, or by finding the Add to Render Queue option within a Render Preset. Image Once you've added an item to the Render, you'll see that a new window appears. This window is the Render Queue. From here, you can change rendering options, as well as begin the rendering process. You can always find the Renderer via the File Menu.\ \ To begin rendering an animation, use the play button next to the preset name, or hit the double play button at the top of the Render Queue. Image Once you're file is finished rendering, you'll be able to download it from the Completed tab within the Cloud Renderer. Image # Align and Distribute Source: https://rive.app/docs/editor/fundamentals/align-and-distribute Align objects to the artboard or to each other. Use align and distribute tools to quickly position objects on the artboard or space multiple objects evenly. When you select one or more objects, the align and distribute tools appear in the Inspector. ## Align Align tools let you align objects to the left, right, top, bottom, or center. When a single object is selected, the object aligns to the artboard. When multiple objects are selected, the selected objects align to each other. ## Distribute Distribution tools appear when multiple objects are selected. Use distribution to space selected objects evenly, either horizontally or vertically. This is useful when creating repeated elements, button groups, icon rows, or other layouts where objects should have consistent spacing. # Artboards Source: https://rive.app/docs/editor/fundamentals/artboards Learn how to create, manage, and configure artboards in Rive. Artboards are the foundation of your composition across both [Design and Animate mode](/docs/editor/fundamentals/design-vs-animate-mode). Each artboard defines a scene with its own dimensions, background, hierarchy, animations, and state machines. Every Rive file contains at least one artboard, but you can create any number of artboards on the [Stage](/docs/editor/interface-overview/stage). Artboards can also be converted to [components](/docs/editor/fundamentals/components), allowing you to create and control multiple instances of an artboard within your composition. ## Creating Artboards ### From a New Rive File When you create a new Rive file, you'll be prompted to create an artboard. Choose a size from one of the presets, or enter a custom width and height. You can resize the artboard at any time. New artboard size options The width and height define the artboard's dimensions in Rive. The size and aspect ratio at runtime may differ depending on the available space and your [layout settings](/docs/editor/layouts/layouts-overview). Artboard dimensions are measured in units rather than pixels. For example, if a 500-unit-wide artboard is displayed at 1000 pixels wide, each unit represents 2 pixels. For simplicity, you can often treat these units like pixels while working in the editor. ### Creating Additional Artboards A Rive file can contain multiple artboards. Select the **Artboard Tool** or press **A**. Click and drag anywhere on the stage to create an artboard. Artboards can't be nested directly inside other artboards. To nest an artboard, first convert it to a [component](/docs/editor/fundamentals/components). ### Copying Artboards Select an artboard and press **Cmd/Ctrl + D** to duplicate the artboard and all of its contents. Copying an artboard ## Managing Artboards Each artboard has its own hierarchy, animations, state machines, and properties. ### Hierarchy Each artboard has its own hierarchy containing the objects that belong to that artboard. Select an artboard to view its hierarchy in the Hierarchy panel. See [Hierarchy](/docs/editor/interface-overview/hierarchy) for more information about organizing and navigating objects. ### Animations & State Machines Animations and state machines belong to individual artboards. Select an artboard to view and edit its animations and state machines. See [Animations](/docs/editor/animate-mode/animate-mode-overview) and [State Machines](/docs/editor/state-machine/state-machine) to learn more. ## Artboard Properties Select an artboard to view and edit its properties in the Inspector. Inspector with an artboard selected * **Transform** - Set the artboard's position, size, scale, rotation, and origin. * **Layout** - Control how the artboard responds when its size changes. See [Layout](/docs/editor/layouts/layouts-overview). * **Fill** - Set the artboard's background color. * **Model** - Choose the [view model](/docs/editor/data-binding/binding-data) associated with the artboard. * [Clip](#clip) - Control whether content outside the artboard's bounds is visible. ### Clip Enabling the **Clip** toggle hides content that extends beyond the bounds of the artboard. Clipping can be expensive to render, so only enable it when needed. In most cases, you don't need to enable **Clip** on a top-level artboard because content outside its bounds isn't rendered at runtime. Toggling Clip on an artboard ## Default Artboard & State Machine The default artboard and state machine are used at runtime when an artboard or state machine isn't explicitly specified. To change the default, use the dropdown to select the artboard and state machine you want to use. Selecting a default artboard # Assets Source: https://rive.app/docs/editor/fundamentals/assets-overview Assets are reusable resources in a Rive file. Some assets are imported from external files, such as images, fonts, audio, and custom blobs. Others are created in Rive, such as scripts and components. This page focuses on imported file assets. For these assets, you can control whether the asset is included in the exported .riv file, loaded separately at runtime, or excluded from the export. For other asset types, see [Scripts](/docs/scripting/getting-started) and [Components](/docs/editor/fundamentals/components). ## Assets Panel Use the Assets panel to find, manage, and create assets in your file. The panel includes imported file assets, such as images, fonts, audio, and blobs, along with assets created in Rive, such as scripts and components. Use the panel to import new assets, create Rive assets, sort and filter by type, and select an asset to view its settings in the Inspector. ## Asset Types Imported file assets include: * **Raster images:** JPEG, PNG, WebP * [Photoshop files](/docs/editor/assets/psd): PSD * [SVG files](/docs/editor/assets/svg): Vector artwork imported as editable Rive content * [Fonts](/docs/editor/text/fonts): TTF, OTF * [Audio](/docs/editor/assets/audio): MP3, WAV, FLAC * [Lottie](/docs/editor/assets/lottie): `.lottie` files, available on Enterprise plans * **Blob assets:** Advanced custom assets Blob assets are useful for advanced workflows where a script needs access to a custom file type, such as a 3D model. ## Importing Assets ### Drag and Drop You can import assets by dragging files into Rive or by using the Assets panel. If the file type is not directly supported, Rive asks if you want to import it as a custom blob asset. ### Browse Files To import from the Assets panel, click **+**, then choose the asset you want to import. Add menu opened under the + button in the Assets panel, with Upload option ### Asset-specific workflows * [SVG Files](/docs/editor/assets/svg) for importing SVGs from Figma, Illustrator, and other vector tools. * [Photoshop Files](/docs/editor/assets/psd) for importing layered PSD files. * [Font Files](/docs/editor/text/fonts) for adding custom and Google Fonts. * [Audio Assets](/docs/editor/assets/audio) for browsing sounds, importing audio, and creating clips. ## Asset Settings Select an asset in the Assets panel to view its settings in the Inspector. The available settings depend on the asset type. Asset settings panels can include: * [Information](#information): Details about the selected asset. * [Compression](#compression): Image compression settings for raster images and PSD files. * [Export Options](#export-options): Settings that control how the asset is handled when exporting a `.riv` file. Inspector showing a selected image asset with the Information, Compression, and Export Options settings sections ### Information The **Information** panel shows details about the selected asset, such as file size, dimensions, usage count, and creation date. Use **Replace** to swap the source asset without changing how the asset is used in the Rive file. For example, replacing an image updates the asset everywhere it is used. The information shown depends on the asset type: * **Fonts** can show family, style, supported scripts, publisher/designer information, license details, and glyphs. * **Audio** can show volume, format, channels, sample rate, duration, and an audio preview. ### Compression Raster images and PSD files include a **Compression** panel. Use compression settings to control how the asset is encoded in the exported `.riv` file. Choose a compression format, then adjust the **Quality** value to balance image quality and file size. WebP is recommended for most raster images because it usually provides smaller file sizes while preserving good visual quality. ### Export Options Export options control how an imported asset is handled when you export a .riv file for runtime. Use these settings to decide whether an asset is included in the .riv file, loaded separately at runtime, or excluded from the export. The available export options depend on the asset type. #### Behavior **Behavior** controls whether the asset is exported. * **Automatic**: Export the asset if it is used in the file. * **Force Export**: Export the asset even if it is not currently used in the file. * **Prevent Export**: Do not export the asset, even if it is used in the file. SVG assets only use Automatic because SVGs are converted to Rive vector objects rather than exported as separate file assets. Use **Prevent Export** when the asset is only a placeholder in the Rive file and will be replaced at runtime. For example, a profile card might use a placeholder avatar in the editor, while your app loads the real user's avatar at runtime. Use **Force Export** when an asset may not be visible or directly used in the editor, but still needs to be available at runtime. For example, a file might show one image in the editor, while your app randomly selects from a set of images at runtime. #### Type Type controls how the asset is included or referenced by the exported .riv file. This option is available for all imported asset types except SVGs. * **Embedded**: Include the asset data directly in the .riv file. * **Referenced**: Store a reference to the asset so it can be loaded separately at runtime. * **Hosted**: Load the asset from Rive’s servers instead of embedding it in the `.riv` file. Hosted assets are available on paid Voyager plans. #### Source See [Audio Assets](/docs/editor/assets/audio#export-settings) for audio-specific export settings, including Source. #### Include See [Font Assets](/docs/editor/text/fonts#export-settings) for font-specific export settings, like Include. # Components (formerly Nested Artboards) Source: https://rive.app/docs/editor/fundamentals/components Components streamline your workflow with reusable artboards and animations. Changes made to the source component are reflected across all of its instances. ## Creating a Component Any artboard can be converted to a component. To do so, select an artboard on the stage and use the component icon in the inspector to toggle its status. Alternatively, you can use the `Shift` + `N` shortcut with an artboard selected. If you're coming from Figma, then the `Cmd/Ctrl` + `Alt/Option` + `K`, shortcut will also work. Select the component toggle in the inspector again to revert your selection back to a regular artboard, or use the `Shift` + `Alt/Option` + `N` shortcut. Currently, only artboards that have been flagged as components will be exported to your `.riv` file. If you think you may want to programmatically access an artboard at runtime, you should mark it as a component. More options on specific export behaviors are coming soon. ## Using Components Use the Component Tool — formerly known as the Nested Artboard Tool — to select and place instances of a component on the stage. Select the tool from the toolbar or use the `N` shortcut to enable it. Click anywhere on the stage to place the component in the desired location. A menu will display available components to instance. If none show up, you may have no artboards marked as components in your file. Placing a component instance by clicking stage with the Component Tool and choosing from the menu of available components Alternatively, select the dropdown menu to the right of the toolbar icon to select the component ahead of time. The menu is informed by the sort mode of the assets tab — the 'Custom' mode will present components as they’re organized in the asset panel, while the 'Source/Type' mode will present components from their source. The latter will become useful with our Libraries feature. ## Configuring a Component Instance Once you’ve added an instance of a component, select a timeline or state machine for playback. ### State Machines After assigning an instance, the default state machine is displayed in the inspector. The default state machine for a placed component instance shown in the Inspector ### Adding an Animation You can playback any animation associated with a component. You’ll need to add the desired animation to the instance using the plus button in the Inspector. Adding an animation to a component instance by clicking the plus button in the Animations section in the Inspector These animations can be used by themselves, mixed with the state machine, or layered with other animations. Note that before adding the animation, you must select whether it's a simple or remapped animation. #### Simple Simple animations are an easy way to playback a component's timeline. Keying the start point of a simple animation on the timeline for a component instance A simple animation lets you key its start point on a timeline. You also have the option to change the animation's playback speed. #### Remap Remap animations allow you to key time values of an animation on the timeline. This lets you stretch, shrink, or even play an animation in reverse. Keying time values of a remap animation on the timeline Note that the time value is in percent, with 0% representing the start of the timeline and 100% representing the end. ### Mix Value As you add additional animations to a Component, animations begin to mix together. This mixing is important, especially when multiple animations share keyed properties. Without adjusting this value, your Component may not playback your animations in the way you want. By default, any animation added to a component starts with a mix value of 100%. You can adjust this value in design mode or in a specific animation by setting keys. **Note that an animation that has a non-zero mix value will always be mixing with other animations, regardless if it has a play key set or not.** To ensure the correct animation is playing, ensure that you key the mix value for the desired animation to 100%, and all other animations have a mix of 0%. ### Mode (Component Sizing) Component instances can use **Node**, **Leaf**, or **Layout** sizing to control how they respond to the space available from their parent. See [Component Sizing](/docs/editor/layouts/component-sizing) to learn how each option scales, fits, or reflows a component. # Edit Vertices Source: https://rive.app/docs/editor/fundamentals/edit-vertices No matter the type of vector you create, you can edit the vertices by changing their position or handles in both design and animate mode. ## Edit Vertices mode To enter Edit Vertices mode, either select the shape and hit enter twice or select a path and hit enter once. Entering Edit Vertices mode to show the vertices and bezier handles of a rectangle on the stage After activating Edit Vertices mode, you can select any vertex, reposition it, and edit the bezier handles. Use [Deep Select](/docs/editor/interface-overview/selection-and-navigation#deep-select) to select a specific path inside nested groups on the stage. ### Path Options Each path in Edit Vertices mode has a set of path options at the top of the Inspector. **Done Editing Button** The Done Editing button can be used to exit Edit Vertices Mode. Done Editing button at the top of the path options in the Inspector **Open Path** The Open Path button will disconnect the last vertex from the first vertex. Open Path button in the path options at the top of the Inspector, right below the Done Editing button **Reverse Direction** The Reverse Direction button can be used to reverse the direction of the path. Depending on the Fill-Rule, this can eliminate holes in our shape by changing the mathematical value of the selected path. **Convert Radial Corners** Straight vertices with a corner radius will deform when the scale transform is applied to the shape or path layer. You can convert radial corners from a procedural property to a defined set of vertices. This process will eliminate deformation of the corner. Convert Radial Corners button in the path options converts a single rounded corner into two vertices on the stage ## Bezier Handles **‌Straight** ‌The default handles are set to straight, which creates straight edges between vertices. Straight handle type selected in the bezier handle options **Corner Radius** The Corner Radius property allows you to round straight corners. This property only appears on vertices that are set to straight. **‌Mirrored** ‌Mirrored is the default handle when you create a vertex by clicking and dragging. These handles always keep the same rotation and length. Mirrored bezier handles on a vertex mirroring each other as they are dragged **‌Detached‌** Detached handles allow each handle to have its own rotation and length. Detached bezier handles on a vertex, each being dragged independently **‌Asymmetric** ‌Asymmetric handles share the same rotation but can have lengths independently of each other. Asymmetric bezier handles on a vertex sharing the same rotation but dragged to independent lengths # Fill and Stroke Source: https://rive.app/docs/editor/fundamentals/fill-and-stroke The Fill and Stroke section of the Inspector allows you to add and modify the Fill and Stroke properties of the currently selected object. You can create as many fills or strokes as you'd like. # Fill ### **Create a new Fill** To create a fill, select a shape, then use the plus button under the Fill and Stroke section of the Inspector. Be sure to select Fill from the new menu. You'll be able to tell that a layer is a fill by looking at the color box on the left side. Creating a fill by clicking the plus button in the Fill and Stroke section of the Inspector and choosing Fill from the menu ### **Changing Fill color** To change the color of a Fill, select the color box on the left side of the Fill layer. This will open the Color Picker. From there, you can use the various sliders to choose which color you'd like for the Fill. Opening the Color Picker from a fill layer and adjusting the sliders to change the color ### **Changing Fill Type** When a new shape is created, by default the shape will have a solid fill. When a new fill is added, by default the fill type is set to linear. We often need to change the fill type between the different types. This can be done by selecting the color box. Changing the fill type with the Fill Selector menu at the top of the Color Picker Once the Fill has been opened, you'll find the Fill Selector dropdown in the top of the option box. The different fills that can be selected are: * **Solid** * **Linear Gradient** * **Radial Gradient** ### **Changing Fill color (Gradient)** To change the color of a Fill, select the color box on the left side of the Fill layer. This will open the Color Picker. A gradient fill selected in the Color Picker showing a gradient bar with two color points When a gradient is selected, you'll notice a new bar appear above the color picker. This represents the color of the gradient at different points. By default, a gradient has two points. ### **Changing the color of a stopper** To change the color of a particular color stopper, start by selecting the stopper you'd like to change. Next, use the various sliders to choose which color that stopper should be. ### **Adding and removing stoppers** To add a new color stopper, click any space along the long that isn't currently occupied by another stopper. This will generate an additional color stopper. Adding a color stopper by clicking an empty spot on the gradient bar, and removing one with the Delete key To delete a color stopper, select the stopper you'd like to delete, then hit the Delete or Backspace key. ### **Change Fill Order** The order of fills determines their render order, with fills on top rendered in front and fills at the bottom rendered in back. Reordering fills by dragging a fill layer, changing which fill renders in front This order can be changed at any time by clicking and dragging on an empty area within the layer. ### **Fill Properties** Each Fill has its own properties which can be edited and keyed on the timeline. Some of these properties can be found by using the fill option button. The Fill Options menu showing the Name, Blend, Fill Rule, and Feather properties for a fill **Fill Name -** You can edit the name of a fill using this property. **Blend -** This option can be used to change the Blend Mode of an individual Fill. By default, this mode will be set to inherit, which inherits the blend mode from the shape layer. **Fill Rule -** This option can be used to change the fill rule for the Fill. This must be set to clock-wise if you want the fill to be feathered. \*\*Feather - \*\*This option can be toggled to feather the chosen Fill. Read more about Feathering below. ### **Deleting and hiding a Fill** Often times we'll need to delete or hide a particular Fill. This can be done by selecting the shape, then using the eye icon to hide the Fill, or the minus icon to delete the fill. Deleting a fill with the minus icon and hiding a fill with the eye icon in the Fill and Stroke section ### Fill Rule The Fill Rule determines how overlapping paths in a shape will be filled: * **Non-Zero** assigns a +1 value to clockwise paths and a -1 value to counter clock wise paths. Areas that equal a value other than 0 will be filled. * **Even-Odd** assigns a +1 value to clockwise paths and a -1 value to counter clock wise paths. Areas that equal an even value will be filled while odd values wont be. * **Clockwise** a Fill Rule exclusive to Rive. This fill rule enables manual subtraction of paths which can be found in edit vertices mode. This fill rule is also required for shapes where you'd like to enable vector feathering. # Stroke ### Create a new Stroke To create a Stroke, select a shape, then use the plus button under the Fill and Stroke section of the Inspector. Be sure to select Stroke from the new menu. You'll be able to tell that a layer is a Stroke by looking at the color box on the left side. Strokes are represented by an outlined box. Creating a stroke by clicking the plus button in the Fill and Stroke section of the Inspector and choosing Stroke from the menu ### **Changing stroke color (solid)** To change the color of a Stroke, select the color box on the left side of the Stroke layer. This will open the Color Picker. From there, you can use the various sliders to choose which color you'd like for the Stroke. Opening the Color Picker from a stroke layer and adjusting the sliders to change the color ### **Changing Stroke type** By default, strokes are set to a solid color, but various stroke types are available from the Color Picker menu. Changing the stroke type with the Stroke Selector menu at the top of the Color Picker The different strokes that can be selected are: * **Solid** * **Linear Gradient** * **Radial Gradient** ### **Changing Stroke color (Gradient)** To change the color of a Stroke, select the color box on the left side of the Stroke layer. This will open the Color Picker. When a gradient is selected, you'll notice a new bar appear above the color picker. This represents the color of the gradient at different points. By default, a gradient has two points. ### **Changing the color of a stopper** To change the color of a particular color stopper, start by selecting the stopper you'd like to change. Selecting a color stopper on a stroke gradient and adjusting the sliders to change its color Next, use the various sliders to choose which color that stopper should be. ### **Adding and removing stoppers** To add a new color stopper, click any space along the long that isn't currently occupied by another stopper. This will generate an additional color stopper. Adding a color stopper by clicking an empty spot on the gradient bar, and removing one with the Delete key To delete a color stopper, select the stopper you'd like to delete, then hit the Delete or Backspace key. ### **Deleting and hiding a Stroke** Often times we'll need to delete or hide a particular Stroke. This can be done by selecting the shape, then using the eye icon to hide the Stroke, or the minus icon to delete the Stroke. # Stroke Properties Each Stroke has its own properties which can be edited and keyed on the timeline. Some of these properties can be found by using the Stroke option button. **Stroke Name -** You can edit the name of a Stroke using this property. **Blend -** This option can be used to change the Blend Mode of an individual Stroke. By default, this mode will be set to inherit, which inherits the blend mode from the shape layer. **Cap -** This option changes the end cap of a Stroke. Read more about the different Caps below. * **Butt** The end of the stroke is a straight line and does not extend beyond the end vertices. On a zero-length path, the stroke will not be rendered at all. * **Round** The ends of a stroke are rounded. On a zero-length path, the stroke is a full circle. * **Square** The ends of a stroke are squared off and extend beyond the end vertices. On a zero-length path, the stroke is a square. **Join -** This option changes how the corners of a Stroke are rendered. Read more about the different Join options below. * **Round** creates a rounded corner. * **Bevel** creates a beveled corner. * **Miter** creates a mitered corner. **Apply Transformations -** The Apply Transformations toggle determines whether the shape layers scale will affect the thickness of the stroke. When this is toggled off, the thickness of the stroke will stay the same regardless of scale. **Feather -** This option can be toggled to feather the chosen stroke. Read more about Feathering below. **Stroke Type** - At the bottom of the Stroke Options Panel, you'll find options to change your stroke between a solid, trim, dashed stroke. * **Solid -** Renders the stroke as a solid stroke. This is the default stroke type for each new stroke created. * **Trim -** Lets you animate the start, end, and offset of a line segment. Read more [here](/docs/editor/manipulating-shapes/trim-path). * **Dashed -** Lets you create dashed strokes with animatable property like the length of the dashed segment and offset. Read more [here.](/docs/editor/manipulating-shapes/trim-path) # Vector Feathering Vector feathering is a new way to feather both Fills and Strokes. Vector Feathering is a technique we invented at Rive that can soften the edge of vector paths without the typical performance impact of traditional blur effects. ### **Enabling Vector Feathering** There are two main ways to enable vector feathering on any Stroke of Fill. Enabling vector feathering with the feather icon on a fill or stroke layer, or the feather toggle in the options panel * **Feather Icon -** The feathering icon can be used on any Fill or Stroke layer to enable vector feathering. * **Feather Toggle -** The feather toggle can be found in the Fill / Stroke options panel. ### Feathering Options Feathers can be customized in a number of ways. The Feathering options can be found in the options panel once Feathering has been enabled on a Fill or Stroke. **Direction** - This option lets you choose which direction the path will feather as you increase the feather amount. Choosing the feather Direction between Outer and Inner in the feather options * Outer - This option creates a feather that will feather outward from the path. * Inner - This option creates a feather that will feather inward from the path. **Amount** - This option lets you increase or decrease the amount of feather applied. Adjusting the feather Amount to increase or decrease how much feather is applied in the feather options **Space -** Determines how the feathered fill or stroke will apply transforms from the parent if any offset is present on the feather. Setting the feather Space option in the feather options * World - Transforms will be applied from the world transform. Feather will now act as a drop shadow. * Local - Transforms will be applied from the local transform. This mode will have the feather work with transforms as you'd expect. **Offset** - The Offset properties let you move the feather away from the path by increasing or decreasing the X and Y numbers. Image # Effect Groups Effect groups let you apply a single path effect — or a stack of effects — to multiple strokes and fills at once, without having to configure each one individually. This is useful any time you have multiple shapes that need to share the same trim, dash, or scripted effect behavior, and you want to control them from one place. # Freeze and Origin Source: https://rive.app/docs/editor/fundamentals/freeze-and-origin When you transform objects, their children inherit the same transformations. The location where these transformations happen (sometimes called the origin, anchor point, or pivot) affects how your objects animate. For example, manipulating the scale of a group creates different results if the scale originates in the center or the bottom. You need to reposition the parent group to change the point of origin for these transformations. However, moving a parent causes all the children to move with it. The Freeze feature makes it possible to achieve this without having to rework the hierarchy structure. # Origin of a Procedural Path Procedural objects (like artboards and procedural paths) have an origin property. The origin of a procedural path determines where its properties originate from. For example, changing the width of a rectangle with its origin in the middle (50% X and 50% Y) causes it to grow from its center. Changing the width of a rectangle with the origin centered at 50% X and 50% Y, so it grows outward from the center Changing the width on a rectangle with its origin on the left side (0% X) causes it to grow from its left. Changing the width of a rectangle with the origin on the left at 0% X, so it grows from the left This is particularly useful when animating paths that have other procedural properties enabled, such as rounded corners. You can use the Freeze feature to change the Origin position on the Stage. Alternatively, set the exact value in the Inspector. # Origin of a Custom Path and Group ### Freeze Mode The Freeze feature allows you to move any parent object (groups, shapes, bones) without affecting the position of its children. Activate Freeze in the [Transform Tools menu](/docs/editor/interface-overview/toolbar) or use the `Y` shortcut. When Freeze Mode is active, you'll notice that your Stage is wrapped in a blue outline. You're now free to move the Origin without affecting the children. Be sure to turn off Freeze by pressing `Y` again. # Changing Origin with Align Tools You can quickly change the location of an origin with the align tools. Start by selecting the shape, then holding Option on Mac, or Alt on Windows. \ \ This now allows the align tool to reposition the Origin various positions. # Groups Source: https://rive.app/docs/editor/fundamentals/groups Use groups to organize your graphics or to add extra transform spaces. Activate the Group tool with the `G` shortcut. Click anywhere in an artboard to add a new group. Now drag and drop objects into the group in the Hierarchy. You can also wrap a selection of shapes into a group with `⌘`+`G` in macOS or `Ctrl`+`G` in Windows. Unwrap a group with `⌘`+`Shift`+`G` in macOS or `Ctrl`+`Shift` +`G` in Windows. ## Group Style The Style property of a group can be set to Group or Target. ### Group Group is the default behavior, which behaves as described in the [Selection and Navigation](/docs/editor/interface-overview/selection-and-navigation). ### Target The Target option draws an icon on the stage that is visible regardless of whether the group has children (usually a group only displays an icon if it is empty). Target visibility can be toggled on or off in the View Options menu. Targets are directly selectable on the stage. You don't need to use [Deep Select](/docs/editor/interface-overview/selection-and-navigation#deep-select) to select them. Setting the Style of a group to Target in the Inspector, which adds a selectable target icon on the stage The Target option is particularly useful when working with Constraints. If targets aren't visible on the stage, open the **View Options** menu and make sure **Targets** is enabled. Enabling Targets in the View Options menu so target icons appear on the stage # Pen Tool Overview Source: https://rive.app/docs/editor/fundamentals/pen-tool-overview The Pen tool allows you to create custom vector paths as well as add additional vertices to your procedural paths. Learn more about the Pen tool by either watching the video or reading more below. ## Creating custom shapes The Pen tool allows you to create custom vector shapes. Activate the Pen tool by finding it under the Create Tools menu or by using the `P` shortcut. Click on the stage to place vertices. Image Click and drag to create a vertex with bezier handles. When you are finished, hit `esc` on your keyboard. Image ## Path & vertex shortcuts * Hold Alt (Opt) to detach the Pen tool while drawing a path. * Ctrl+click (Cmd+click) on the vertex to toggle between mirrored and straight handles. * With Select or Pen tool, Ctrl+click (Cmd+click) on the vertex handle to remove that handle. * With Select or Pen tool, Alt+click (Opt+click) on a vertex handle to detach the handle. * With Pen tool, Alt+click (Opt+click) on a vertex to delete the vertex. * Alt+drag (Option+drag) to duplicate vertices. # Shape Tools Source: https://rive.app/docs/editor/fundamentals/procedural-shapes Create editable shapes with adjustable properties. Shape tools let you create common shapes, such as rectangles, ellipses, polygons, and stars. These shapes keep editable properties, such as width, height, corner radius, and number of points, until you convert them to custom paths. ## Creating a Shape Shape tools are available from the **Create Tools** menu. Open the **Create Tools** menu and select a shape tool. Click and drag inside an artboard to draw the shape. Hold `Shift` while dragging to constrain the shape's proportions. See [Freeze and Origin](/docs/editor/fundamentals/freeze-and-origin) to learn how to change the center point of a shape. ## Shape Properties You can update a shape's properties in the inspector. Available properties depend on the selected shape type. * **Size**: The width and height of the shape. * **Origin**: The [origin](/docs/editor/fundamentals/freeze-and-origin) point of the shape. * [Corner](#corner): The corner radius of rectangles. * [Radius](#radius): The radius of polygons and stars. * [Points](#points): The number of points on polygons and stars. * [Angle](#angle): The angle between the outer and inner points of a star. ### Corner Adjust the corner radius by dragging the circular handles on each corner of the rectangle. Hold `Alt` (Windows) or `Option` (macOS) while dragging to adjust a single corner independently. Adjusting rectangle corner radius handles ### Radius Drag the radius handle to adjust the radius of all points on the shape at once. Adjusting the radius of the corners of a rectangle ### Points Control the number of points by dragging the points handle up or down. Dragging to adjust the number of points on a shape ### Angle Drag the handle on the inner point up or down to adjust the angle on the inner and outer points of a star. Adjusting the angle of the inner points of a star ## Converting a Shape to a Custom Path Press `Enter` to convert the selected shape to a path. After conversion, you can edit each vertex directly. Converting a shape to a path removes its procedural properties, such as width, height, corner radius, and number of points. Any animations applied to those properties are also removed. To edit a path, see [Edit Vertices](/docs/editor/fundamentals/edit-vertices). # Revision History Source: https://rive.app/docs/editor/fundamentals/revision-history Rive saves your files automatically as you work. Even if multiple people are working on the same file at the same time, Rive tracks all changes and stores them in the Revision History. ## View a file's history The Revision History can be accessed from the [Editor Menu](/docs/editor/interface-overview/toolbar). Menu Revision History ## Restore a revision Select a revision to preview it and press the Edit Current Revision button. This copies the selected revision and creates a new entry at the top of the list. This guarantees that even restoring revisions is non-destructive, and you can always go back to the previous version of the file. Restore a revision ## Save a Revision From the Editor Menu, select the Create a Revision button. You'll then be prompted to name the revision. Once the revision is created, you can restore that revision using the steps above. Save a new revision # Shapes and Paths Overview Source: https://rive.app/docs/editor/fundamentals/shapes-and-paths-overview Rive allows you to create, edit, and animate vector graphics using either procedural or custom shapes. These graphics combine shape and path layers to define them, which Rive exposes to give you greater flexibility and control with your designs and animations. To learn more about Shape and Path layers, watch our video on Shapes and Paths, or read more below. ## Shape layer Shape Layer Vectors in Rive are rendered on shape layers. Shape layers define the style of the shape by allowing you to customize the fill and stroke.\` Fill and Stroke ## Path layer Path Layer The actual shape of a vector is defined by a path (or multiple paths). Expanding a shape layer in Rive will reveal the paths it's using. Move Path ‌You can add new paths to any shape by dragging and dropping an existing path onto the desired shape layer. ### Path layer properties Path layers display properties that to the type of path. Learn more about [Procedural Shapes](/docs/editor/fundamentals/procedural-shapes). Path layer Properties ## Enter and Esc shortcuts Use the `Enter` key to quickly navigate down the Hierarchy. If you have a shape selected, this allows you to select the child path layer quickly. Use the `Esc` key to quickly navigate up the Hierarchy. If you have a path selected, this allows you to select the parent shape layer quickly. # Transform Spaces Source: https://rive.app/docs/editor/fundamentals/transform-spaces Container Objects, like Groups, Bones, and Layouts, allow you to create new transform spaces for your graphics, opening up the ability to animate graphics from multiple areas of interest. For example, you might want a planet to rotate on its own axis while also rotating around another planet. Multiple transform spaces (achieved by nesting groups, bones, and other container objects) allow you to achieve this. This technique is a fundamental concept for all motion graphics. To learn more about transform spaces, be sure to watch our video on hierarchical relationships. ## Transform space example ![Image](https://ucarecdn.com/8d60bc32-96ce-4b77-ade8-836f7c92b51d/) Nest multiple groups to transform your shapes from different locations. In the example above, a group is rotating the Earth, another is rotating the Moon around the Earth, and another is rotating the moon on its axis. ![Image](https://ucarecdn.com/ab64bd82-90f1-46eb-b50a-506ec16e36ff/) # Using the Rive Editor Source: https://rive.app/docs/editor/get-rive Choose how you want to use the Rive editor: in your browser or as a desktop app. To get started, [sign up for a Rive account](https://rive.app/signup/?redirect=%2Faccount%2Fteams%2F\&utm_source=docs\&utm_medium=content). You can use the Rive editor as a **desktop app** or directly in your [browser](https://editor.rive.app). Both versions provide the same core features and workflows. Download the Rive editor for macOS or Windows. Voyager users can preview upcoming features in the Early Access Editor. # Debug Panel Source: https://rive.app/docs/editor/interface-overview/debug-panel Inspect logs, problems, AI changes, tests, and audio while working in Rive. The Debug Panel shows output and diagnostic information while you work in Rive. Use it to inspect console logs, find problems, review AI Agent changes, run tests, and preview audio. Viewport ## Tabs The Debug Panel is organized into tabs. * **Console** - view script logs, runtime errors, and State Machine activity. * **Problems** - view code issues, broken bindings, validation warnings, and other problems in the file. * **Changes** - review pending changes from the AI Agent. * **Testing** - run [test scripts](/docs/scripting/debugging/unit-testing). * **Audio** - [preview audio assets](/docs/editor/assets/audio#previewing-sounds) and [create clips](/docs/editor/assets/audio#creating-clips). ### Console The Console shows output from scripts and State Machines. Use the sidebar in the Console tab to switch between the script console and the State Machine console. Use the Console options to clear the console, clear the console when playback starts, or copy console output. #### Script Console The script console shows output from scripts, including `print()` messages and runtime errors. See [Script Console](/docs/scripting/debugging/debug-panel#console) for more information. #### State Machine Console The State Machine console shows State Machine activity during playback, such as entering a state or taking a transition. Viewport ### Problems The Problems tab lists issues found in the file. These can include code problems, broken data bindings, validation warnings, or problematic State Machine setup. Errors are indicated by a red dot, while warnings are yellow. Use the Problems options to filter problems, show or hide warnings, and include non-script validation. Click a problem to open the affected code line, binding, State Machine item, or related editor location. See [Script Problems](/docs/editor/interface-overview/debug-panel#problems) for handling script-related problems. ### Changes The Changes tab shows pending changes from the AI Agent. Use this tab to review changes before applying them to your file. # File Browser Source: https://rive.app/docs/editor/interface-overview/file-browser Create, organize, and manage files, projects, and workspaces. The File Browser is where you create, open, organize, and manage your Rive files. You can also browse recent files, open Marketplace examples, switch between workspaces, and manage projects. ## Home The Home view shows your recent files, links to tutorial videos, and Marketplace examples. File Browser home ## Managing Files Right-click anywhere within the File Browser to create a new file or folder. Right-click a file to open additional options, including: * **Open**, **Copy**, **Cut**, **Duplicate**, and **Delete** - common file actions * **Show File in Browser** - open the file’s location in the File Browser * **Download** - download the file as a `.riv` * **Download Backup** - download a `.rev` backup file * **Download Revision** - download a specific revision ## Toolbar The toolbar includes options for managing your account, changing display options, creating folders, and creating new files. ## Sidebar Use the sidebar to search files, view recent files, access files shared with you, and navigate between workspaces and projects. ### Projects Projects help you organize files within a workspace. Use projects to group related files, such as files for a client, feature, campaign, or product area. For example, you might have separate projects for personal work and freelance work. Projects and folders are available on Cadet, Voyager, and Enterprise plans. [Learn more about our plans and pricing](https://rive.app/pricing?utm_source=docs\&utm_medium=content). #### Create a New Project In the sidebar, click **+ Create Project**. Add a project name and choose who should have access. Create a project #### Managing Project Members You can invite people to a specific project. This is useful when someone needs access to a set of files, but does not need access to the entire workspace. In the sidebar, select a project. Expand the project details panel to invite, remove, or change permissions for individual members or groups. Manage project members ### Workspaces Workspaces are separate spaces for files, members, and billing. You might have a personal workspace, a company workspace, or separate workspaces for different teams. See [Workspaces Overview](/docs/account-admin/workspaces/workspaces-overview) for more information. If you only want to organize files or share a specific set of files, create a project instead of a new workspace. # Hierarchy Source: https://rive.app/docs/editor/interface-overview/hierarchy View, organize, and reorder objects in your file. The Hierarchy is a tree view that shows the objects on the stage. It shows both how objects are nested and the order in which they are rendered. ## Renaming Items You can rename items in the Hierarchy to make your file easier to understand and navigate. To rename an item, double-click its name in the Hierarchy, enter a new name, then press Enter. ## Parent-Child Relationships Each row in the Hierarchy represents an item on the stage. Items with children have a button with an arrow next to them. Use this button to expand or collapse the list of children. Any object can be a parent or child of another object. When an object is nested under another object, it inherits the transformations of its parent. For example, scaling a parent object also scales its children. Parent transformations are applied from the parent’s origin, not the child’s local origin. You can nest objects as deeply as needed, creating children, grandchildren, great-grandchildren, and so on. To change the relationship between objects, drag an item onto another item to make it a child. Drag it out of the parent to remove the relationship. ## Draw Order The Hierarchy also controls draw order. Objects higher in the Hierarchy render above objects lower in the Hierarchy. You can override the default draw order with [custom draw order](/docs/editor/animate-mode/animating-draw-order). To change draw order, drag objects up or down in the Hierarchy. Change hierarchy order ## Lock, Isolate, and Hide Items When you hover over an item in the Hierarchy, controls appear for locking, isolating, or hiding that item. * **Lock** prevents the item from being selected or edited on the stage. * **Isolate** focuses on the item by temporarily hiding other items from view. * **Hide** temporarily hides the item. These controls also apply to any children nested under the item. Lock and isolate are editor workflow tools. They do not change the exported file or runtime behavior. ## Context Menu Right-click an item in the Hierarchy to open additional options. Depending on the selected item, options may include: Hierarchy context menu * Copy, cut, paste, delete, copy styles, and paste styles * Expand or collapse nested items * Show dependencies * Lock, hide, or isolate elements * Add a [tag](/docs/editor/tagging) * Reverse the order of elements * [Export name](/docs/editor/exporting/exporting-names) Many of these options are also covered in more detail on related pages. # Inspector Source: https://rive.app/docs/editor/interface-overview/inspector View and edit properties for the current selection. The Inspector is the right sidebar in the editor. It shows the available properties and options for the current selection. Inspector ## Selection Properties When you select an element, the Inspector updates to show controls for that element. For example, selecting an artboard, object, joystick, script, property group, or State Machine item shows different options based on what that element can do. ## File Properties When nothing is selected, the Inspector shows file-level options. These include: * [Stage background colors](/docs/editor/interface-overview/stage#stage-background-colors) for Design and Animate modes * Scripting optimization and debug settings * [Shader targets](/docs/scripting/wgsl-shaders#shader-targets) * [Tags](/docs/editor/tagging) * [Default interpolation](/docs/editor/animate-mode/interpolation-easing#default-interpolation) # Interface Overview Source: https://rive.app/docs/editor/interface-overview/overview Rive's interface only shows what is needed when you need it. It is divided into a few main panels, which are described below. ## File Browser File Browser home The File Browser is where you create, open, organize, and manage your Rive files. You can also browse recent files, open Marketplace examples, switch between workspaces, and manage projects. Read more on the [File Browser page](/docs/editor/interface-overview/file-browser). ## Toolbar Toolbar The Toolbar displays the tools you have available to create, rig, and manipulate items on the stage. In addition to these tools, the Toolbar houses a variety of options to allow you to customize the look of your file, set your main artboard, and export or share your file. Read more on the [Toolbar page](/docs/editor/interface-overview/toolbar). ## Sidebar Hierarchy The sidebar is the left side of the editor. It contains panels for navigating your file, managing assets, working with data, editing animations, and using the AI Agent. Read more on the [Sidebar page](/docs/editor/interface-overview/sidebar). ## Inspector The Inspector is the right sidebar in the editor. It shows the available properties and options for the current selection. Inspector Read more on the [Inspector page](/docs/editor/interface-overview/inspector). ## Viewport Viewport The Viewport is the central area between the Toolbar, Sidebar, and Inspector. It can display the Stage, scripts, and other panels. The Stage is where you create and edit artboards, which contain the designs and animations in your Rive file. Read more on the [Viewport page](/docs/editor/interface-overview/stage). ## Timeline Timeline The Timeline surfaces from the bottom of the screen upon entering [animate mode](/docs/editor/fundamentals/design-vs-animate-mode). Here you can create new states, access playback controls, settings, and set keyframes for object parameters. Select a timeline from the left-hand list to switch between the respective timelines. Read more on the [Timeline page](/docs/editor/fundamentals/design-vs-animate-mode). ## State Machine graph State machine graph When a state machine is selected, the Timeline is replaced by a graph. This is where you'll be working on the state machine. Read more on the [State Machine page](/docs/editor/state-machine/state-machine). ## Debug Panel Viewport # Selection and Navigation Source: https://rive.app/docs/editor/interface-overview/selection-and-navigation Select objects, move through nested groups, and navigate the stage. Use selection and navigation controls to choose objects, move through nested groups, and move around the stage. For a complete list of shortcuts, see [Keyboard Shortcuts](/docs/editor/keyboard-shortcuts). ## Selecting Objects Click an object to select it. To select multiple objects, drag over them to create a marquee selection. Hold `Shift` while clicking or dragging to add objects to the current selection or remove selected objects. ### Select Objects Inside Groups To select an object inside a group, double-click the object. This moves you one level down in the hierarchy, so you can select objects inside that group. Double Click ### Deep Select To select an object inside nested groups, hold `⌘` on macOS or `Ctrl` on Windows, then click the object. Deep select lets you select an object directly, even when it is inside multiple groups. [Targets](/docs/editor/fundamentals/groups#target) are directly selectable on the stage. You don't need to use **Deep Select** to select them. Deep Select ### Select Behind When you hover over an object on the stage, Rive outlines the object that will be selected if you click. If multiple objects overlap, press `Alt` to cycle through objects under the cursor. When the object you want is outlined, click to select it. Select behind ### Moving Up and Down the Hierarchy Use `Enter` and `Esc` to move through nested objects in the hierarchy. * Press `Enter` to move down into the selected group and select its first child. * Press `Esc` to move up and select the parent of the current selection. Enter And Escape ## Navigating the Stage ### Pan To pan the stage, right-click and drag. You can also hold `Spacebar` to temporarily switch to the Pan tool, then click and drag to move around the stage. If you're using a trackpad, scroll left or right to pan horizontally. Panning the stage ### Zoom To zoom in or out, place your cursor over the stage, then hold `⌘` on macOS or `Ctrl` on Windows and scroll. Zooming the stage You can also use keyboard shortcuts: * Press `+` to zoom in. * Press `-` to zoom out. * Press `⌘` + `0` on macOS or `Ctrl` + `0` on Windows to return to 100%. ### Fit Selection Press `F` to fit the current selection in the viewable stage area. Fitting the selected object in view If an object is selected, Rive fits that object in view. If an artboard is selected, Rive fits the artboard in view. If you lose track of an artboard or object on the stage, select it in the hierarchy and press `F` to fit it in view. # Sidebar Source: https://rive.app/docs/editor/interface-overview/sidebar Use the sidebar to access editor panels and organize your workspace. The sidebar is the left side of the editor. It contains panels for navigating your file, managing assets, working with data, editing animations, and using the AI Agent. Editor sidebar ## Panels The sidebar includes several panels: * [Hierarchy](/docs/editor/interface-overview/hierarchy) - View and organize the objects in your file. * [Data](/docs/editor/data-binding/overview) - Create and manage View Models, properties, and data binding. * [Assets](/docs/editor/fundamentals/assets-overview) - Manage images, fonts, audio, and other assets used in your file. * [Animations](/docs/editor/animate-mode/animate-mode-overview) - Create and manage animations and State Machines. * [Agent](/docs/editor/ai-agent/ai-agent) - Use the AI Agent to help create, edit, and explore your file. ## Panel Options Use the **…** menu on a panel to access options such as filtering, sorting, collapsing the panel, or resetting the sidebar layout. ## Organizing Panels You can customize how panels appear in the sidebar. * Toggle full sidebar height. * Drag panels to change their order. * Drag a panel into its own column. ### Open AI Agent in Viewport The Agent panel also has an option to open in the viewport, where it appears alongside the Stage or Script panel. # Viewport Source: https://rive.app/docs/editor/interface-overview/stage Use the viewport to work with the Stage, scripts, and the AI Agent. The viewport is the center area of the editor. It can show the [Stage](#stage), scripts, and the **AI Agent**. You can [split the viewport](#splitting-the-viewport) to view multiple panels side by side or stacked vertically. This is useful when you want to edit artwork while viewing a script, or keep the AI Agent open alongside the Stage. Viewport ## Stage The Stage is an infinite canvas where you can place artboards containing all your graphics. Stage [Artboards](/docs/editor/fundamentals/artboards) live on the stage. You can pan and zoom around the stage, select objects, and use guides or rulers to help position elements. To learn how to navigate and select items on the stage, see [Keyboard Shortcuts](/docs/editor/keyboard-shortcuts). ### View Options menu View options The View Options menu controls what appears on the stage while you work. Use it to adjust zoom, snapping, guides, and visual overlays for animation and interaction tools. * **Zoom and snapping:** adjust the stage zoom level, enable snapping, or snap objects to pixels * **User Cursors:** show or hide other users' cursors * **Tool overlays:** show or hide gizmos, bones, targets, motion paths, joysticks, events, layouts, and text modifier ranges * **Show Final Playback:** show the final playback state while editing * **Rulers and guides:** show rulers, lock guides, or clear guides from the stage ### Stage Background Colors You can set separate stage background colors for Design mode and Animate mode. Using different colors can make it easier to tell which mode you are in at a glance. This can help prevent accidentally editing keys or animation values when you meant to work in Design mode. To change the stage background colors, deselect everything, then use the background color options in the [Inspector](/docs/editor/interface-overview/inspector). Stage background colors are only visible in the editor. They do not affect the artboard background, exports, or runtime appearance. ### Rulers and Guides ## Splitting the Viewport To split the viewport, drag a panel into the viewport or click **Split Editor Right** from the panel options. To open the **AI Agent** in the viewport, click the **…** button in the **Agent** panel in the sidebar, then select **Open in Viewport**. # Toolbar Source: https://rive.app/docs/editor/interface-overview/toolbar Access file, design, rigging, preview, and export tools from the Rive editor toolbar. Toolbar Use the toolbar to switch tools, create objects, adjust view options, invite collaborators, publish your file, and access file-level actions. ## Editor Menu Editor menu The **Editor menu** contains file-level actions and editor settings. Common actions include: * [Revision History](/docs/editor/fundamentals/revision-history) * [Export for Runtime](/docs/editor/exporting/exporting-for-runtime) * [Export for Backup](/docs/editor/exporting/exporting-for-backup) * [Share and Embed](/docs/editor/embed-urls/overview) * [Render to Video or Image](/docs/editor/exporting/exporting-for-video-and-static-design) ## Tools Toolbar tools The **Tools** area lets you select, transform, draw, create objects, add rigging, and preview interactions. Common tools include: * Select, translate, rotate, and scale tools * [Artboards](/docs/editor/fundamentals/artboards) and [components](/docs/editor/fundamentals/components) * [Shape and drawing tools](/docs/editor/fundamentals/shapes-and-paths-overview) * [Bones tools](/docs/editor/manipulating-shapes/manipulating-shapes) * Play the [State Machine](/docs/editor/state-machine/state-machine) ## Invite Invite members button Use **Invite** to add collaborators to the file. ## Publish Publish button Use **Publish** to export, embed, or publish your file. * [Export a .riv for runtime](/docs/editor/exporting/exporting-for-runtime) * Publish to a [library](/docs/editor/libraries) * [Embed](/docs/editor/embed-urls/overview) * Publish to the [marketplace](/docs/community/marketplace-overview#marketplace-overview) ## Preview Bound Values By default, data-bound values update while the state machine is playing. Turn on the **Data Binding Preview Toggle** to preview bound values while editing. Preview data binding ## Mode Toggle Use the **Mode Toggle** to switch between **Design** and **Animate** mode. Press `Tab` to switch modes quickly. * **Design Mode**: create, edit, import, and rig graphics. * **Animate Mode**: create timelines, state machines, keys, and animation logic. Editing objects while a timeline is selected in Animate Mode can create keys. Learn more about [Design and Animate Modes](/docs/editor/fundamentals/design-vs-animate-mode). Switching between Design and Animate mode\\ # Keyboard Shortcuts Source: https://rive.app/docs/editor/keyboard-shortcuts Find and use keyboard shortcuts for tools, navigation, editing, and playback in the Rive editor. ## Tools | Tools | Shortcut | | ----------------------------------------------------------- | ------------ | | Select Tool | V | | Translate Tool | Q | | Rotate Tool | W | | Scale Tool | E | | Rectangle Tool | R | | Ellipse Tool | O | | [Pen Tool](/docs/editor/fundamentals/pen-tool-overview) | P | | [Artboards](/docs/editor/fundamentals/artboards) | A | | [Bones](/docs/editor/manipulating-shapes/bones) | B | | [Groups](/docs/editor/fundamentals/groups) | G | | [Freeze and Origin](/docs/editor/fundamentals/freeze-and-origin) | Y | ## Editor | Purpose | Shortcut | | ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------- | | Switch Mode | Tab | | Constrain Shape/Angle | Shift | | Deep Select | macOS: + click Windows: Ctrl + click | | Select Behind | Alt | | Nudge Object | Arrow Keys | | Edit Vertices | Enter w/ path selected | | Group Selection | macOS: + G Windows: Ctrl + G | | Ungroup Selection | macOS: + Shift + G Windows: Ctrl + Shift + G | | Convert to Solo | macOS: + L Windows: Ctrl + L | | Duplicate | macOS: + D Windows: Ctrl + D | | Layer Forward | macOS: + ] Windows: Ctrl + ] | | Layer Backward | macOS: + \[ Windows: Ctrl + \[ | | Layer to Top | macOS: + Opt + ] Windows: Ctrl + Alt + ] | | Layer to Bottom | macOS: + Opt + \[ Windows: Ctrl + Alt + \[ | | Move Timeline Playhead | , or . Hold Shift to move 10 frames | | Move | | | Move Selected Keys | Alt + , or . Hold Shift to move 10 frames | | Skip to Keys (Selected Row, Otherwise All) | macOS: + , or . Windows: Ctrl + , or . | | Toggle Snapping | macOS: hold Windows: hold Ctrl | | Color Picker | macOS: Ctrl + C or I Windows: I | | Search | macOS: + K Windows: Ctrl + K | | Reveal Keys for Selection | U | | Play Default State Machine | Shift + Space | ## View | Purpose | Shortcut | | ----------------------- | ------------------------------------------------------------------------ | | Fit selection to screen | F | | Zoom (mouse) | macOS: + Mouse Wheel Windows: Ctrl + Mouse Wheel | | Zoom (keyboard) | + and - | | Zoom (marquee) | Z (hold) | | Pan | Right-click + drag Space + drag | ## Hierarchy | Purpose | Shortcut | | ---------------------------- | ------------------------------------------------------------------------------------- | | Select parent | Esc | | Select 1st child | Enter | | Rename | macOS: + R Windows: Ctrl + R | | Expand/Collapse all children | macOS: Opt + click expand icon Windows: Alt + click expand icon | | Show/hide self only | macOS: + click eye icon Windows: Ctrl + click eye icon | | Show/hide parents only | macOS: Opt + click eye icon Windows: Alt + click eye icon | ## See Shortcuts in the Editor **Show Shortcuts** lets you view and search all keyboard shortcuts in the Rive editor. To open it, go to the **Editor** menu and select **Show Shortcuts**. Shortcuts # Component Sizing Source: https://rive.app/docs/editor/layouts/component-sizing Control how component instances scale, fit, and reflow within their parent. Component sizing determines how a component instance responds to the space available from its parent. Choose a sizing mode based on how you want the component and its contents to respond as that space changes. * **Node** - Scale the component as a single object. * **Leaf** - Fit the component's contents within the available space. * **Layout** - Resize the component's artboard, allowing its contents to reflow. Rive app interface showing Sizing Mode dropdown in the Inspector. ## Node **Node** is the default sizing mode. The component behaves like a regular object or group, with its contents scaling together based on the **Scale** property. Use Node when the component doesn't need to respond to the size of a parent Layout. ## Leaf **Leaf** fits a component's contents within the space provided by its parent Layout or artboard. The component's contents scale rather than reflow. Leaf is useful for responsive components that don't contain Layouts themselves, such as an illustration or icon that needs to fit within the available space. Inspector for a component instance set to Leaf mode, showing the Fit, Alignment, and Alignment Position settings ### Fit **Fit** determines how the component's contents scale within the available space. * **Fill (Default)** - Fill the available space. If the aspect ratios differ, the content stretches to fit. * **Contain** - Fit all content within the available space while preserving its aspect ratio. This may leave unused space. * **Cover** - Fill the available space while preserving the content's aspect ratio. Some content may extend beyond the available space. * **Fit Width** - Scale the content to the width of the available space. This may result in clipping or unused space vertically. * **Fit Height** - Scale the content to the height of the available space. This may result in clipping or unused space horizontally. * **None** - Keep the content at the original size of its artboard. This may result in clipping or unused space. * **Scale Down** - Scale the content down to fit while preserving its aspect ratio, but don't scale it up when the available space is larger. ### Alignment **Alignment** determines where the component's contents are positioned when they don't fill the available space. Choose from nine positions using the alignment grid, including center, corners, and edges. For more precise positioning, use **Alignment Position X/Y**. Values range from `-1` to `1` on each axis: * **X:** `-1` is left, `0` is center, and `1` is right. * **Y:** `-1` is top, `0` is center, and `1` is bottom. You can also use values between these positions. For example, an X value of `0.5` positions the content halfway between center and right. ## Layout **Layout** resizes the component's artboard instead of scaling its contents. As the artboard changes size, Layouts within the component can reflow their contents to respond to the available space. Use Layout for responsive components whose internal content needs to resize or reflow, such as buttons that hug their text or components that fill the width of a parent Layout. Inspector for a component instance set to Layout mode, showing the Size fields with width and height set to Hug ### Size In Layout mode, the component's width and height can each use one of three sizing behaviors: * **Fixed** - Use a defined width or height. Fixed dimensions can use either units or percentage values. * **Hug** - Resize to fit the component's contents. This is useful when content such as text needs to determine the component's size. * **Fill** - Expand to fill the available space within the parent Layout or artboard. When using **Fixed**, enter a value for the component's width or height and use the unit control to switch between units and percentages. Unlike the **Scale** property, changing the size of a component in Layout mode changes the dimensions of its artboard and allows its contents to reflow. In most cases, avoid using **Scale** with components in Layout mode. # Layout Animation Source: https://rive.app/docs/editor/layouts/layout-animation Animate how children reposition when content reflows within a Layout. When a Layout resizes or its content changes, its children may move to new positions. Layout animation controls how children transition to their new positions, including the duration and easing. Animated layout resizing ## Adding Layout Animation Select a **Layout** and click the **+** button in the **Enable Layout Animation** section of the Inspector. * **None:** Disable Layout animation. * **Inherit:** Use the Layout animation settings from the parent Layout. * **Custom:** Define Layout animation settings for the selected Layout. If you select **Custom**, set the duration and easing for the animation. # Parameters Source: https://rive.app/docs/editor/layouts/layout-parameters Layout parameters can broadly be grouped into one of two categories — those that affect the parent layout, and those that affect the child layouts. In Rive, it's important to remember that layout parameters generally only affect other layout containers. This can often result in the nesting of layouts for desired results, but unlocks opportunities to blend with Rive's more freeform canvas in creative ways. *** ## Absolute vs Relative To control the flow of child Layouts in a Row or Column requires the Layout children to be Relative, i.e. not have their Absolute position option enabled. Use the icon in the top right of the Layout inspector to toggle between an Absolute and Relative Layout. Image * **Absolute:** An Absolute Layout positions itself within an artboard or parent Layout container. It can have 2 or more of it’s edges pinned to the container. * **Relative:** A Relative Layout has it’s position defined by the parent artboard or Layout. Changing the flex properties on the parent will determine the child layout behaviour. ## Scale Types A layout’s width and height can make use of 3 different scale behaviours: * **Fixed:** A fixed width or height for the Layout. The defined value can be either a point or percentage value. Use the unit toggle within the fields to toggle between value types. * **Hug:** The width and/or height of the Layout shrinks to fit its children. For example, you may want a Layout to hug a text object; resizing itself based on the length of the text inside. * **Fill:** The width and/or height of the Layout expands to fill the available space within the parent Layout or artboard. The fill option switches the width/height fields to be represented in `fr` (fill ratio) units and reveals a base size field. The fill ratio values make it possible to control the fill behaviour between a number of children with the fill scale behaviour. For example, you may want the children to fill the available space equally, or perhaps have one child scale at a greater factor than the rest. Options to set the scale type are below the width and height fields in the inspector. Image Hug and Fill options will only surface when applicable. For example, a Layout without any children won’t surface the option to hug, while only a Layout with another Layout as its parent can be set to Fill. ## Size constraints Use the icon above the absolute toggle to add minimum and/or maximum width and height values. As with the width and height values themselves, these can be defined as either points or percentages. Image ## Clip The clip toggle hides any child elements within the layout that extend beyond the bounds of the Layout. Image ## Position (Absolute Layouts only) Absolute Layouts provide additional options to set their position within the artboard or parent Layout. The position is defined by at least 2 pinned edges — one horizontal and one vertical, however additional edges can also be enabled. Set the desired edges to pin by selecting the markers within the inspector graphic, or via the fields below. You can hold `shift` while selecting a marker to add a second edge along the same axis. The distance values from a chosen edge can be provided as points or percentages by selecting the chosen unit type within the field. Image ## Padding and Margin Padding ONLY affects Layout children. For example if you want to have a button with a label, the text should be wrapped in a Layout and that Layout should be the child of another Layout that applies the padding. Margin affects the Layout to which the margin is applied relative to its parent Layout. Padding and margin can be applied symmetrically along an axis, or to individual edges. Use the edge toggle to reveal fields for each edge plus options to use point or percent values. * **Padding:** Inner space between the Layout bounds and any relative Layout children. * **Margin:** Outer space between the Layout bounds and a relative parent Layout. ## Layout Children A layout’s flex parameters are only applied to other layouts contained within it. In order to generate rows, columns, and grids of content that reflow, content items must themselves be wrapped in an additional layout container. ## Row/Column * **Row:** Lay out children along the horizontal axis. * **Column:** Layout children along the vertical axis. * **Row Reverse:** Lay out children horizontally, in reverse order. * **Column Reverse:** Lay out children vertically, in reverse order. Image ## Wrap * **No Wrap:** When the content reaches the bounds of the layout, continue to extend beyond it. * **Wrap:** When the content reached the bounds of the layout, place the next item on below or alongside the currently row/column. * **Wrap Reverse:** Same as wrap, but display the content in reverse order. Image ## Alignment Select the desired point on the inspector widget to align content within a layout container. Image ## Justify Click on the current alignment position to expand the content to fill the available space. Selecting the one of the active tiles again collapses the content back down. ![Image](https://ucarecdn.com/d79e6712-f751-4526-951a-0408f9fca6c0/) ## Gap Spacing between content (gaps) can be set both horizontally and vertically, and as either points or percentages of the container width/height. Image ## Left-to-Right/Right-to-Left Determines the horizontal direction for this Layout and will also be cascaded down to its child Layouts (when its child Layouts are set to Inherit). This will change the direction of Row based Layouts as well as Text alignment within any Layouts. This is useful when there is a requirement to support Right-to-Left languages. ## Styles Layouts can have fills, strokes, feathers, blend modes, and corner radii, just like other objects in Rive. Styles can be rendered in the **background**, behind the Layout's children, or in the **foreground**, in front of them. For example, you might place a fill and feathered shadow behind the children while rendering a stroke in front. Corner radius applies to the Layout's styles as well as its clipping bounds. # Tools Source: https://rive.app/docs/editor/layouts/layout-tools There are several Layout tools available in Rive to build your responsive UI or content ## Getting Started with Layouts There are a number of ways to start adding layouts to your designs. * Layout Tools in the Arrangement Tools menu * Wrap in Layout * Add Child Layout * Dragging and Dropping Layouts *** ### Layout Tools in the Arrangement Tools Menu Arrangement Tools menu open in the toolbar, listing the Layout (L), Row (R), and Column (C) tools * **Layout:** A single Layout container. Select the tool and drag on an artboard to create the Layout. Drag directly onto the Artboard to create an Absolute Layout or on top of an existing Layout to create a Relative child. In addition, any objects positioned within the bounds of the newly created Layout will automatically themselves be wrapped in Layouts and absolutely positioned inside the new Layout. * **Row/Column:** The Row and Column tools create a Layout in the same way as the Layout tool above, but also include an initial set of children which will be positioned in either a Row or Column. You can use either the number keys or the up/down keys to define the number of children while dragging your row or column onto the stage. The created children will have their widths and heights set to **Fill**. Absolute Layouts can be dragged around or resized like other Rive objects. By default, if you drag a Layout (or any other object) inside the bounds of another Layout, it will display an indicator showing you that the dragged object will become a child of that Layout if dropped. Hold `command` / `control` while dragging the object to prevent existing items from being moved into the Layout. *** ### Wrap in Layout Instead of starting with an empty Layout container, you can wrap existing objects into a Layout. There are a number of ways to wrap an active selection in a Layout: * Right click on the stage or the hierarchy to surface the context menu. Select `Wrap in` > `Layout`. You can do this for a single or multiple objects at once. * Use the `shift` + `L` shortcut. * Alternatively, you can use the `Layout selection` button in the inspector. This is available when only non-Layout objects are selected. *** ### Add Child Layout When a Layout is the current selection, an `Add Child Layout` button will appear in the Layout inspector. Clicking this will add a new Layout as a child of the selected Layout, with its width and height set to Fill. Add Child Layout button at the top of the Layout inspector, above the alignment grid and Column layout settings *** ### Dragging and Dropping Layouts Layouts (both Absolute and Relative) can be dragged and dropped into other Layouts at any time. This can be done in two ways: * Drag and drop Layouts in the hierarchy panel. * Drag and drop Layouts directly on the stage. When doing so, an indicator will show where in the new parent Layout the dragging Layout will be inserted. A Layout on the stage containing four children arranged in a row, with spacing indicators marking where a dragged Layout would be inserted Layouts can also be deleted by selecting the Layout on stage or in the hierarchy and hitting the delete key. # Overview Source: https://rive.app/docs/editor/layouts/layouts-overview Layouts allow you to build responsive UI components in Rive. Make your designs fit, fill, or reflow content based on the space available. Leverage Rive's layout system to accommodate a variety of use cases: * Pin items to chosen edges of a parent artboard or container. * Create buttons and labels that adapt to the size of the text. * Build lists and grids of content that reflow, animate, and scroll. * Combine and nest layouts to develop entire interfaces You can use these techniques to create all kinds of production-ready buttons, lists, and menus that can fluidly resize to fit any device size or orientation. Rive graphics aren’t mockups or prototypes, they’re functional graphics that can change state and be connected to real data — and because Rive runs anywhere, you can re-use the same responsive graphics on mobile apps, game engines, websites, custom devices, and more. Check out the [Layouts playlist](https://www.youtube.com/playlist?list=PLujDTZWVDSsGvor80PkjHaZ3hNNo6s_ef) on Rive's YouTube channel for additional Layout related tutorials *** ## Introduction Prior to the addition of Layouts in Rive, all objects on an Artboard were positioned in a freeform way, with few rules limiting this (one exception being [Constraints](/docs/editor/constraints/constraints-overview)). Layouts provide a rules based way to position and size your content using Rows and Columns. A Layout is a container whose position and size is bound by rules (relative to its parent Layout or children). When Rive objects (text, shapes, paths, groups, images, components, and even joysticks or bones) are placed in a Layout, they inherit the positioning rules of the Layout (**participate in the Layout**), but they can also act independently within the Layout container if desired. This allows for added freedom if you need to animate an object within a Layout. Layouts only affect the position of other Layouts. For example, if you want to have a Row Layout, you would have a parent Layout set to a direction of Row, and all of its Layout children will be laid out in a row (and have things like their parent's padding, gap, alignment, etc. applied to their positions). *** ## Layout Parents and Children In order to create more complex UI that responds to the screen or browser size, it is important to understand that Layouts can be placed inside other Layouts. We refer to the outer Layout as the parent and the inner Layout as the child. The Layout children are typically positioned relative to their Layout parent (similar to how [Groups](/docs/editor/fundamentals/groups) work). In addition, the parent can either be sized to the children ([Hug](editor/layouts/layout-parameters#scale-types)) or the children can size to their parent ([Fill](editor/layouts/layout-parameters#scale-types)). Here is an example to help visualize how these relationships work. In the image below we will focus on the regions contained by the dashed lines. The outer green dashed line is the outermost Layout, which is set to Layout its children in a single Column. In the second row of that Column, the red dashed line is a child Layout containing the Battery indicators for various devices. This Layout is defined as a Row. This Layout has 4 child Layouts (blue dashed) set to evenly Fill the width of their parent (so that when the parent resizes, the child Layouts also resize, each to Fill 25% of the available space). Each of those 4 Layouts are set to Column and have 2 child Layouts (pink dashed) containing a trim path with a visualization of battery remaining and percentage label. By creating these simple parent-child Layouts, we can create infinitely responsive content with Rive! Image *** ## Absolute vs Relative Layouts Layouts can exist within Rive's freeform transform space, which means that you can draw a Layout to the Artboard and position it as you would any other Rive object. This type of Layout is referred to as **Absolute** (positioned absolutely). On the other hand, when you want a Layout to participate in the flow of its parent layout, this is referred to as **Relative** (positioned relative to its parent). The position of Relative Layouts are determined by their parent via many parameters such as Row/Column, alignment, padding, gap, etc. Use the icon in the top right of the layout inspector to toggle between an absolute and relative layout. Image *** ## Layouts and other Rive objects A Layout container will affect its children in one of two ways: * Set the child’s position * Set both the child’s position and size This behaviour is determined by the object type of the child. Objects that have both their position and size defined by a Layout container include: * Text * Images * Parametric shapes (rectangles, ellipses, triangles, polygons, and stars) * Component instances (Leaf & Layout mode) * Other Layouts All other objects will only have their positioned set by the layout. The [N-Slicing](/docs/editor/layouts/n-slicing) feature provides more advanced options to control the layout/scale behaviour of more advanced shapes and groups. Unlike in some other tools, Rive will provide an additional hierarchy item to represent the Layout container of an object. This helps differentiate the freeform nature of Rive with the structured Layout system. For example, an object within a Layout container can still apply additional transforms such as position, scale, and rotation to allow it to break out of the Layout. This becomes particularly powerful when coupled with constraints. Furthermore, a Layout container can house multiple objects that can be placed in front of each other. *** ## Use cases #### Building a Responsive Button This tutorial shows how you can build a responsive button from scratch. #### Reflow With Dynamic Components This tutorial explains how to build Rive files that can reposition their elements dynamically when resized. If layouts aren't visible on the stage, open the **View Options** menu and make sure **Layouts** is enabled. toggle layouts visibility # N-Slicing Source: https://rive.app/docs/editor/layouts/n-slicing ## What is N-Slicing? Rive's N-Slice feature is inspired by the 9-slicing technique commonly used in game design. A 9-slice is typically applied to an image to prevent the four corner segments from scaling when resized. Meanwhile, the remaining five inner segments stretch or tile to allow raster artwork to scale up and change ratio without distorting. N-Slicing takes things a step further; allowing you to create any number of segments, to both raster and vector artwork within Rive. ## Creating an N-Slice There are two types of N-Slice — those applied to images and those applied to vector objects in the form of a group. Whilst much of the functionality between them is shared, there are some subtle differences, starting with the way you apply them. **Image/Raster N-Slice** Select the image you want to apply an N-Slice to. Select the add action within the Deform section of the inspector and choose the N-Slice option. Alternatively, right-click the image on the stage or in the hierarchy and navigate to the N-Slice option within the Deform submenu." Upon creation, the N-Slice will enter edit mode. Here you can set up the axes and tile modes that define the scale behaviour of the image. Start by positioning and/or creating the axes as desired. Once completed, select the 'Done' action in the inspector or stage prompt. Learn more about how to best setup your N-Slice in the 'Setting up an N-Slice' section below. To return to the edit mode, select the 'Edit N-Slice' action in the inspector or right-click menu. **Group/Vector N-Slice** If your selection is already contained within a group, select the group on the stage or in the hierarchy and use the 'Convert to N-Slice' action in the inspector. Alternatively, select the stage objects you'd like to wrap in an N-Slice group and choose the 'N-Slice selection' action in the inspector. You can also reach this option by right-clicking on the items within the stage or the hierarchy and navigating to the 'Wrap in' submenu. With the N-Slice group selected, use the 'Edit N-Slice' option in the inspector (or press `enter`) to enable the edit mode. From here, you can setup your axes and tile modes. Once completed, select the 'Done' action in the inspector or stage prompt. Learn more about how to best setup your N-Slice in the 'Setting up an N-Slice' section below. ## Setting up an N-Slice With your image or N-Slice item selected, use the inspector action, right-click menu, or `enter` key to enter the edit mode. The edit mode allows you to change the configuration of your axes and tile modes to define how your image or group scales. We recommend setting up your N-Slice *before* scaling the image or changing the size of the group. While it's possible to adjust the axes on an already-scaled image, accurately positioning new ones can be more difficult. The scale behaviour of segments within an N-Slice alternate, starting with a fixed segment. With a regular 9-slice, this results in a fixed segment, followed by a scaling one, and ending with another fixed. This behaviour is applied along both axes. You can identify a fixed segment from a scaling one by the solid blue borders displayed in edit mode. Meanwhile, scaling segments are identifiable via dashed borders. **Creating and positioning axes** By default, a new N-Slice is created with 4 axes — 2 vertical and 2 horizontal. Together they divide the content into 9 segments. Click and drag the existing axes to reposition them, or adjust their values in the inspector. Values can be defined as points or percentages. To create new axes, click and drag from the outer bounds of the image or group. You can identify the bounds via the white handles positioned on each edge. By default, a new axis will be created with a mirrored counterpart. This helps maintain the alternating fixed/scale behaviour. However if you'd prefer to create a single axis, hold `command` / `control` before dragging the new axis. Hold `command` / `control` while dragging a new axis to prevent a mirrored counterpart being created at the same time. **Setting tile modes** Tile modes can only be changed on image/raster based n-slices. Tile modes determine the behaviour of a **scaling segment**. There're 3 tile mode options to choose from: * **Stretch:** Stretches the segment as the image is resized. * **Repeat:** Tiles the segment repeatedly as the image is resized. * **Hidden:** Hides the segment, not rendering it at all. Tile modes other than 'hidden' won't have any effect on a fixed segment. To change the tile mode of a segment: With the image or its N-Slice selected, use the 'Edit N-Slice' option in the inspector (or press `enter`) to enable the edit mode. Identify the segment you want to change by selecting it on the stage. The corresponding tile will be highlighted in the inspector. Set the tile mode via the dropdown menu in the inspector. # Libraries Source: https://rive.app/docs/editor/libraries Publish your components with dynamic data once, and reuse them everywhere in your project. Libraries are available on Voyager and Enterprise plans. [Learn more about our plans and pricing](https://rive.app/pricing?utm_source=docs\&utm_medium=content). ## Introduction Libraries facilitate the sharing of [components](editor/fundamentals/components) and their view models across Rive files. In the past, you may have relied on nested artboards and copy-paste workflows to share elements. This works for individuals, but breaks down at scale: exports bloat, versions drift, and teams lose track of changes. With Libraries: * Components can be published and reused across project files. * Updates flow downstream with version history and change notifications. * Teams can collaborate without worrying about mismatched assets. Libraries are available on Voyager and Enterprise plans. [Learn more about our plans and pricing](https://rive.app/pricing?utm_source=docs\&utm_medium=content). ## Creating a Library Any file can be made into a library. First, you'll need to create a [component](editor/fundamentals/components) and/or a view model before you can publish the file as a library. Select an artboard on the stage and use the component icon in the inspector or `Shift` + `N` to toggle its status as a component. Image With a component or view model present in the file, select the **Publish Library** option via the export action on the toolbar, or via the file menu. The publishing panel provides an opportunity to select which of the components, view models, and enums you'd like to be published as part of the library. Image You can identify a library file by the icon in the tab bar and in the file browser. ## Importing from a Library To start using components and view models from a published library, select the library icon present in both the asset and data panels. The library panel displays alongside the hierarchy/asset/data column, and displays a list of the available libraries for the active file. Image Currently, a Rive file can only access libraries contained within the same project. Cross-project — or workspace — libraries are coming soon. Public libraries are planned soon after that. Selecting a library listed in the panel will present its available components, view models, and enums. Choose the elements you'd like to add to your file, and use the **Add to File** action in the inspector to import them. Image You can use the version dropdown to browse and import previous iterations of libraries and their components. Image With the chosen elements added to your file, you can access and reuse components and view models via the asset and data panels. Elements sourced from a library can be identified by the library icon appended to the bottom-right corner of the regular icon. Image ## Updating a Library After publishing, you can continue to make changes, add, or remove components, view models, and enums. Republish the library via the same option in the export or file menus. Upon publishing an updated version of the library, any files that have imported elements from it will display a small badge indicating an available update. Image To update a component, right-click it in asset panel and select **Library Options** -> **Update Component** from the context menu. Choose the library elements you'd like to update and select **Update Selected**. Image ## Detaching After importing a component from a library and creating an instance of it on the stage, you may choose to detach it. Detaching a component will decouple it from the source and copy over its contents into your active file. Any references to it will be redirected to the new local copy. You may want to detach a component to make changes to it, without changing the source. It's not possible to re-attach a component after it has been detached. Image ## Export Options By using libraries, you create a series of dependencies between files. For example, an instance of an imported component depends on the library file it came from, which in turn may depend on an image asset used within the component, or perhaps another component from a different library entirely. The export options control what and how components and any assets they depend on get exported to a riv file. These options are available across assets and components, with an additional layer of separation for libraries specifically. To access the export options for a given component, asset, or library, select it in the asset panel and set the desired options in the inspector. Image * **Automatic:** Include this asset/component in the export if it's being used somewhere on the stage. For assets contained within a library, this option is inherited from the source file. * **Force Export:** Export this asset/component, regardless of whether or not it's referenced within the file. * **Prevent Export:** Don't include this asset/component in the export, regardless of whether or not it's referenced within the file. You may want to adjust these options to suit your needs at runtime as opposed to design-time. For example, images used within a design are to be supplied from an external source at runtime, and therefore aren't required in the riv file. Or, you intend to use a library component across multiple Rive files at once via data binding. Exporting the library component separately and excluding from the host files prevents it from being duplicated. Currently, the export behavior for assets within a library component can only be set at the library level, not per component. To do so, set the panel display mode to Source/Type, and select the library item in the asset panel. Image ## Unpublishing a Library Use the **Unpublish Library** action in the file menu to prevent additional files from accessing the library and its components. Unpublishing does not remove library components from host files that had already imported them. Host files that have imported library components will retain access to previously published versions of the library. You may republish a library at any time. Image # Bones Source: https://rive.app/docs/editor/manipulating-shapes/bones Bones create a skeleton you can use to pose and animate elements. Connect bones in a chain, then move or rotate them to control anything from a character’s arm to a bending branch or waving flag. Bones can control elements in three ways: * **Transform an element:** Make a shape, image, group, or other element a child of a bone. The entire element follows the bone’s position, rotation, and scale. * **Deform a vector:** Bind the vertices and Bézier handles of a vector path to one or more bones. Adjust their weights to control how the path bends. * **Deform an image:** Add a mesh to a raster image, then bind its vertices to one or more bones. Weighted vertices allow the image to bend and stretch smoothly. You can combine these methods in the same rig. For example, a character’s hand might be parented to an arm bone while the sleeve’s vertices are weighted across several bones to create a natural bend. ## Creating Bone Chains Select the Bone tool from the **Bones** menu, or press **B**. Click once to place the start of the first bone, then click again to set its length and rotation. Continue clicking to add bones to the chain. Each new bone becomes a child of the previous bone. Press Esc or switch to the **Select** tool (**V**) when you’re finished. ![Image](https://ucarecdn.com/7e6cb0cf-ec53-4da8-bfbf-627b841b3208/) To extend an existing chain from a different point, select the [joint](#joints) where you want the new branch to begin. Then select the Bone tool and continue clicking to add bones. ![Image](https://ucarecdn.com/264073a6-f9bc-4344-9474-f7d7011c5568/) If you can’t see your bones on the Stage, open **View Options** and make sure **Bones** is enabled. ### Joints Joints are the points where bones connect. Use them to position and orient bones while building your chain. Joints do not appear as separate objects in the Hierarchy. Moving a joint changes properties such as the length and rotation of the bones connected to it. ### Root bone The first bone in a chain is the **root bone**. It controls the position of the entire chain and is the only bone in the chain with X and Y position properties. Every other bone is positioned by its length and rotation relative to its parent. ## Controlling Elements With Bones ### Transforming Elements Make an element a child of a bone to control its transform. When the bone moves, rotates, or scales, its children follow without being deformed. To connect an element, drag its layer onto the bone in the Hierarchy. You can parent shapes, images, groups, and other bone groups to a bone. This method works well for rigid parts that should keep their shape, such as a hand, shoe, or mechanical component. ### Deforming Elements You can bind bones to the control points of both vector paths and raster images: * Vector paths use vertices and Bézier handles. * Raster images use the vertices of a [mesh](/docs/editor/manipulating-shapes/meshes). Binding allows different bones to influence different parts of an element, creating smooth bends and other deformations. Before binding a procedural shape, such as a rectangle or ellipse, convert it to a custom path. Select its path layer, then press `Enter`. Select the element you want to deform, such as a vector shape or a raster image with a [mesh](/docs/editor/manipulating-shapes/meshes). In the **Bind Bones** section of the Inspector, click the **+** button. Hold **Cmd + Shift** on macOS or **Ctrl + Shift** on Windows, then select the bones you want to bind. Click **Done**. After binding, Rive assigns each bone a color. The same colors appear on the bone and in the Bind Bones section, helping you identify which bones influence each control point. Rive automatically assigns an initial influence, or weight, to each vertex. Vector paths also allow you to weight their Bézier handles. Adjust these weights to fine-tune how the element deforms. #### Adjusting Vertex Weights A weight determines how much influence a bone has over a vertex. A vertex can be influenced by one or more bound bones, but its combined weights always equal 100%. After binding, each vertex displays a pie chart using the colors assigned to its bones. The size of each colored segment represents how much that bone influences the vertex. Rive assigns initial weights automatically. To adjust them, select a vertex or group of vertices, then change the weight for each bone in the Bind Bones section of the Inspector. Vertices near a joint often benefit from being influenced by both neighboring bones. Blending their weights creates a smoother bend as the bones move. On vector paths, you can weight a vertex and its Bézier handles independently for more precise control over the deformation. Bones controlling bezier handles [Try it in the Rive Editor](https://rive.app/community/files/28349-53555-control-bezier-handles-with-bones?utm_source=docs\&utm_medium=docs_link_card\&utm_campaign=docs_to_marketplace_links). You can lock a vertex’s weight for a specific bone. Locked weights stay fixed when you adjust other bone weights on the same vertex. #### Weight Editing Tools Rive includes tools to help you adjust vertex weights after bones are bound. **Edit Weights** lets you adjust the influence of a specific bone on selected vertices. Select a vertex, then select a bone on the Stage or in the **Bind Bones** section. Drag up or down on the vertex to increase or decrease that bone’s weight. **Smooth** evens out bone weights across neighboring vertices. If vertices are selected, smoothing applies to the selected vertices. If no vertices are selected, it applies to the entire shape. **Auto-Weights** automatically assigns weights based on each vertex’s nearest bone, blending where neighboring bone regions meet. If vertices are selected, auto-weights apply to the selected vertices. If no vertices are selected, they apply to the entire shape. Auto-Weights includes two settings: * **Blend** - controls how widely weights blend at the boundary between two bones. Higher values spread the blend across more of the mesh, creating softer deformation. Lower values create a more rigid result, where each vertex sticks more closely to its nearest bone. * **Influence** - controls the maximum number of bones that can influence each vertex. #### Mesh View Options **Show Weights** shows or hides weight pie charts on unselected vertices. Selected vertices always show their weights while you edit them. For other mesh view options, such as isolating the mesh or showing and hiding triangles, see [Meshes](/docs/editor/manipulating-shapes/meshes#mesh-view-options). # Clipping Source: https://rive.app/docs/editor/manipulating-shapes/clipping Clipping allows you to cut one shape out from another. ## How to use Clipping Select the shape or group you want to clip and hit the plus button next to the Clipping options in the Inspector. After hitting the plus button, you'll notice a blue border appear around the stage, indicating that you can pick a shape as the clipping source. Now, select the path you want to use as a clipping path. Remember, the clipping target must be a shape, not a group or any other object. Clipping You can add as many clipping paths to a shape as you'd like. ## Clipping and path direction If you have shapes that aren't clipping, or only partially clipping, be sure to check the winding of that shape. In most cases, reversing the direction of the path fixes this problem. Reverse Direction ## Inverse Clipping Clipping is typically used to hide a part of your graphics. In the example below, we're using an ellipse to show only part of our jewel graphic. Image You occasionally may want to invert the clipping, so that only the graphics outside of the clipping paths are drawn. Image This is achieved using a clipping path that looks like the gray shape in the image below. Image To create this shape, draw a rectangle the size of the artboard. Add both the rectangle path and ellipse path to the same shape layer in your Hierarchy. Image Note that your shape might not show a hole as ours does. That's because you need to set the Fill Rule of your shape to Even-Odd. This setting doesn't affect your Clipping Path, but it helps explain how the Even-Odd operation works, which will be useful later! Image Select the group containing the jewel and use the "plus" icon in the Clipping section of the Inspector. Next, select the Clipping Shape as the target. Image Open the Clip Options and set the Operation to Even-Odd. Image Be sure to hide the visibility of your clipping shape so it doesn't cover your graphic. # Joysticks Source: https://rive.app/docs/editor/manipulating-shapes/joysticks Joysticks make it easy to set up sophisticated rigs with simple controls. You can quickly animate body poses, eyes, mouths, hands, and more. You can even control joysticks with other joysticks. Joysticks work by allowing you to pan through different timelines that are assigned to either the X or Y axis of the joystick. Once you’ve assigned the timelines, you can use the joystick to set keys to create animations. Either watch the video, or read more below. ## Creating a new Joystick To create a new joystick, either find the Joystick Tool in the Stage Controls Tool menu, or by hitting the J key. Once the tool is activated, click anywhere on the stage to add a new Joystick. New Joy If joysticks aren't visible on the stage, open the **View Options** menu and make sure **Joysticks** is enabled. toggle joysticks visibility ## Joystick Properties With the Joystick selected, you’ll see a number of properties that you can use in the Inspector. ### Handle The Handle X and Y property describes the position that the handle is currently in. You’ll notice that these properties update as you move the handle around the Joystick. ### Position The position property describes the position of the Joystick on the stage. For the most part, we won't need to update this property at all while animating. Handle ### Size The size property describes the size of the joystick. We can modify this property to fit our needs by making the joystick longer/shorter or wider/skinnier. Height Width ### Draw in World Space This toggle tells the joystick whether the joystick will scale with the zoom level or not. This option is useful when we need the joystick to always stay the same size, relative to the artboard. ### X & Y dropdown The X & Y dropdowns allow us to assign timelines to the different axis of the Joystick. For example, this timeline animates the 3D rotation of this ship. You'll notice many keys, which would make reusing this animation within other animations tricky to achieve. Joy Timeline When the timeline is assigned to the X axis of the Joystick, notice that the joystick becomes a slider that only allows you to move the handle in the X direction. Use Joy As we move the joystick up and down, you’ll notice that the ball also moves up and down. Keep in mind that we are scrubbing through the assigned timeline. We can now use this joystick to set keys on a new timeline to create animations. **Invert Toggle** After you add a timeline to an axis, you’ll notice a toggle that appears next to it. This allows you to invert the direction that the joystick scrubs through the timeline. Invert Toggle ### Handle Source The handle source allows you to constrain the position of the handle to another object's position properties. Use the button, then select an object you'd like to use as the handle's position source. This option is helpful when you want the mouse cursor to drive the joystick while the state machine is running. Handle Source ## Joystick considerations Joysticks are a powerful tool that allows you to create complex deformations, but like with many things in the Rive editor, there are a few things to keep in mind as you set up these controls. ### Conflicting properties The most important consideration is that when you have multiple animations assigned to the joystick, those timelines will blend. If, for example, both timelines Y property of an object, these joysticks will conflict and prevent that object from moving in the Y direction. Be sure to separate animated properties to prevent any conflicts. We now actively prevent you from creating keys for properties that are already being used in a timeline assigned to a joystick. ### Creating Complex Deformations You can add as many keys to a joystick timeline as you’d like. By doing this, we can create incredibly complex deformations, but remember, these deformations will often bloat the size of your file, so use them sparingly. # Manipulating Shapes Overview Source: https://rive.app/docs/editor/manipulating-shapes/manipulating-shapes The Rive editor gives you multiple ways to manipulate your graphics to create the animation that you want. In addition to adding the basic transform properties, you can use bones, meshes, joysticks, and constraints to give your graphics and animations some added flair. # Meshes Source: https://rive.app/docs/editor/manipulating-shapes/meshes Add natural, organic deformations to raster graphics. Meshes let you deform raster images by moving vertices instead of transforming the image as a flat rectangle. They are useful for natural motion, such as skin flexing, fabric rippling, hair flowing, or creating faux 3D effects. A mesh is built from a [contour](#contours), which defines the mesh’s shape and vertices. Rive uses that contour to create a triangulated surface over the image. ## Adding a Mesh to an Image Select an image on the Stage or Hierarchy and press **Enter** or go to the **Deform** section in the Inspector. Click the **+** button and select **Mesh**. In the Inspector, in the Deform panel click the plus icon and select Mesh ## Deforming a Mesh Enter Mesh Editing Mode by pressing `V` or by deselecting **Edit Contour**. In mesh editing mode, moving a vertex changes the shape of any triangles connected to that vertex and deforms the pixels inside those triangles. Pixels in triangles that are not connected to the moved vertex are not affected. Here’s a simple mesh with four vertices divided into two triangles: Here’s a slightly more complex mesh with a center vertex, dividing the image into four triangles: The position of these vertices can be keyed on a timeline or [controlled by bones](/docs/editor/manipulating-shapes/bones). ## Contours The contour defines the visible shape and vertex structure of the mesh. Editing the contour changes the mesh structure without deforming the image. ### Creating Contours When you add a mesh to an image, Rive automatically creates a simple contour with four vertices that make two triangles. You can use this contour as a starting point or make your own. #### Manually Create a New Contour Click the **New Contour** button to draw a new contour from scratch. This is useful when the default contour does not match the shape of the image, or when you want full control over the mesh structure. #### Auto-Trace a New Contour Use **Auto-Trace** to quickly create a contour that follows the visible shape of an image. Adjust the settings to control the generated contour: * **Detail** - how closely the contour follows small details in the image. * **Concavity** - how deeply the contour follows inward curves. * **Uniform** - how evenly vertices are spaced along the contour. * **Alpha** - the transparency threshold used to detect the image edge. * **Padding** - extra space added around the traced outline. #### Contour Bounds Only the area inside the contour is rendered. Anything outside the contour is hidden. This can be useful when you want to create multiple meshes from different parts of the same image. ### Editing Contours Use **Edit Contour** or press **P** to adjust the existing contour. The Mesh Pen lets you add new vertices or move existing vertices without warping the image. Click continuously to create forced edges between vertices. Press **Esc** between clicks to create separate vertices and let Rive automatically generate the edges between them. #### Forced Edges Forced edges are edges you manually add between mesh vertices. Use forced edges when you need more control over the mesh structure, such as defining an important seam, crease, corner, or area where the mesh triangles should follow a specific path. When using the Mesh Pen, click continuously to create connected vertices with forced edges. In this example, the default edges made the snake stretch in an unexpected way, creating a bump in its skin. By adding a forced edge, the edges run perpendicular to the body, helping the snake deform more naturally. Forced edges are shown as thicker lines in the mesh. Forced edge in a mesh To remove a forced edge, select **Edit Contour**, then **Cmd-click** the edge on macOS or **Ctrl-click** the edge on Windows. ### Generate Use **Generate** to add more vertices to the current mesh. Click **Generate** multiple times to increase the mesh complexity. A more complex mesh can create smoother deformations, but it can also be harder to edit. ### Resetting a Contour Use **Reset** to return the mesh to its default contour. ## Managing Meshes ### Copying a Mesh You can copy a mesh and apply it to another image. Select the image with the mesh you want to copy and press **Cmd + C** on macOS or **Ctrl + C** on Windows. Select the image you want to apply the mesh to and press **Cmd + P** on macOS or **Ctrl + P** on Windows to paste the mesh. ### Swapping Images A mesh can continue to work when the image is changed. This is useful when multiple images share the same basic structure. The same mesh can deform each face without creating a separate mesh for every image. ### Removing a Mesh After an image has a mesh, the **Deform** section shows options for editing or removing it. Select an image on the Stage or Hierarchy and press **Enter** or go to the **Deform** section in the Inspector. Click the **Edit Mesh** or **Remove Mesh** button. Removing a mesh deletes the mesh and its vertex edits from the image. ## Mesh View Options Mesh view options control how the mesh and image appear while editing. These options can make it easier to focus on vertices, edges, weights, or the deformed result. Mesh view options * **Bounding Box Edit** - show a bounding box around selected vertices so you can transform them together. * **Isolate** - show only the graphic or graphics being edited. * **Show Weights** - show mesh weights while editing. * **Deform** - toggle between the deformed and undeformed version of the image. * **Show Triangles** - show or hide the triangle edges. When disabled, only vertices are shown. * **Dim** - dim the image so the mesh is easier to see. # Solos Source: https://rive.app/docs/editor/manipulating-shapes/solos A Solo is similar to a group, but only one of the elements inside the solo is rendered at a time. This is much faster than having to animate the opacity of each object individually. ## Creating a Solo There are two ways to create a solo. The first is to select multiple items on your artboard, right click them in the Hierarchy, and click "Wrap in Solo". Wrap in Solo The second option is to select the **Solo** tool from the **Hierarchy Tools** dropdown (or click **S** on your keyboard) and click anywhere on your artboard. Now that you have a Solo in your Hierarchy, you can drag elements into it. Solo Tool ## Animating Solos You can animate solos by opening a timeline and clicking the solo's radio buttons in the Hierarchy. Image ## Creating New Skins One of the most common use cases for Solos is creating new skins for a character. ![Image](https://ucarecdn.com/1dc10aa9-1dd9-438d-8a3d-8b8192ff9647/) ## Change the underlying rig Sometimes when we animate an object or character, we need to create animations at different angles. Solos allow us to create multiple rigs and switch between them during our animation. ![Image](https://ucarecdn.com/c168815b-d92e-4c8e-b5f6-4ecbc013e08d/) ## Frame-by-frame animation The ability to toggle between many images gives you a quick way to create frame by frame effects. ![Image](https://ucarecdn.com/76841fdd-3190-46d5-b553-e33bd7cf9c6d/) # Trim Path Source: https://rive.app/docs/editor/manipulating-shapes/trim-path The Trim Path feature allows you to draw only a portion of the stroke on a vector shape. This can be used to create a variety of animations where a line needs to follow a path. Every stroke you create for a shape can have its own independent Trim Path. ![Image](https://ucarecdn.com/996191bd-6394-4aa3-be85-1a5a46150220/) ## Enable trim path To activate Trim Path, select a shape that has a stroke and click the stroke options in the inspector. Now, use the Trim Path drop-down menu and select either Sequential or Synced mode. Both modes enable Trim Path, but behave differently when used on a shape with multiple paths. ### Sequential When Trim Path is set to Sequential, paths are animated sequentially. The order in which they animate is dictated by their order under the shape. ![Image](https://ucarecdn.com/b1e23052-84c2-4b55-8653-9af6253953a4/) ### Synced Synced mode animates the trim path along all paths concurrently. ![Image](https://ucarecdn.com/fba474d1-ab60-444f-a89c-fa5fedda0f77/) ## Start and end The trim of a stroke happens from a Start point to an End point. By default, all shapes have a Stroke that starts at 0% and ends at 100%. Change these values to modify the position of the Start and End points of the trim (which are represented by a percentage of the full length of the path). ![Image](https://ucarecdn.com/e5c990dd-278f-4f41-b2d7-5d95fa46127d/) ## Offset Use Offset to easily move the trimmed portion of the path. ![Image](https://ucarecdn.com/50b672cd-610a-4829-a46d-5f106dcad0e9/) # Dashed Stroke Much like Trim Path, the Dashed Stroke option allows you to dynamically change and animate parts of a path. Dash strokes allow you to customize the size of the dash and offset the dashes around the path. Note that you can add more than one dash size and gap to a path. ![Image](https://ucarecdn.com/56fa4778-555d-460e-8133-809e73c7746a/) ## Dash The dash property controls the size of the dashed segments. This option can be in pixels, or a percentage length of the path. ![Image](https://ucarecdn.com/34d7c4d3-3f92-4140-9a12-bc83b67f8e0d/) ## Offset The offset property moves the dashes along the path. This option can be in pixels, or a percentage. ![Image](https://ucarecdn.com/1b2bf36f-940e-4e56-a1ef-4d98c6cbd8b7/) # Layers Source: https://rive.app/docs/editor/state-machine/layers Layers let you build more complex logic and animation with the state machine. A state machine layer can play one state at a time. Add multiple layers when you want a state machine to play multiple animations or interactions at once. For example, one layer might control a character's idle and walk animations, while another layer controls a separate hover or selected state. ## Creating a new layer To create a layer, click the **+** button in the **Layers** tab. Adding a new layer ## Layer Order Layer order determines which layer takes priority when multiple layers animate the same property. Layers farther down the list take priority over layers above them. In most cases, this does not matter. However, if multiple layers control the same object property, the animation in the lower layer takes priority as the layers mix. ### Changing layer order To change layer order, drag layers up or down in the **Layers** tab. Reorder state machine layers ## Layer Menu Click the **...** button next to a layer name to open the layer menu. Layer menu | Option | Description | | ------------- | --------------------------------------------------------------------- | | **Delete** | Deletes the layer. | | **Duplicate** | Creates a copy of the layer. | | **Disable** | Disables the layer without deleting it. | | **Snapping** | Enables or disables snapping for states and transitions in the layer. | # Listeners Source: https://rive.app/docs/editor/state-machine/listeners Respond to interactions, property changes, and events in your Rive file. Listeners let you respond to interactions, property changes, and other events in your Rive file. When a listener is triggered, it can perform actions such as updating property values, firing Rive events, or running other logic. A listener has three main parts: * [Target](#target): what the listener watches * [Listen to](#listen-to): what needs to happen to trigger the listener * [Action](#listener-actions): what happens in response Use listeners to create dynamic experiences that react to user input and changes in state. ## Creating a Listener Select the element you want the listener to respond to. To listen for a view model property change or Rive event, select the artboard or nested component instead. In the **Animations** panel, click the icon next to the **State Machine** to show listeners. Click the **+** icon to create a new listener and select the action the listener should perform. With the listener selected, set its **Target**, **Listen To**, and other options in the right sidebar. With a listener selected, you’ll see its options in the right sidebar. ## Target The **Target** determines what the listener watches. The target can be an element in your scene, an artboard, or a nested component. Use an element as the target when you want to listen for interactions on that element, such as clicks or drags. Use an artboard or nested component as the target when you want to listen for view model property changes, Rive events, or other events that belong to that artboard or component. ### Opaque Target **Opaque Target** controls whether pointer events stop at this listener's hit area or continue through to elements behind it. When **Opaque Target** is enabled, pointer events stop at the target. When it's disabled, pointer events can pass through the target and trigger other listeners underneath. ## Listen To **Listen to** is the condition the listener watches for. When the condition is met, the listener is triggered. | Listen To | Description | | -------------------------------- | -------------------------------------------------------------- | | **View Model Property Change**\* | Fires whenever the selected view model property changes.\*\* | | **Rive Event**\* | Fires when a Rive event is fired. | | **Pointer Enter** | Fires when the pointer enters the target area. | | **Pointer Exit** | Fires when the pointer leaves the target area. | | **Pointer Move** | Fires repeatedly while the pointer moves over the target area. | | **Pointer Down** | Fires when the pointer is pressed down on the target. | | **Pointer Up** | Fires when the pointer is released over the target. | | **Click** | Fires when the target is clicked or tapped. | *\* Available when the listener target is an artboard or nested component.*
*\*\* View Model Property Change listeners fire whenever the selected property changes. You can’t specify an expected value or direction of change. For example, a Boolean listener fires when the value changes from true to false or from false to true.*
**Pointer Exit** only fires while Rive can read the pointer position. If the target touches the edge of the canvas or container, moving the pointer out of the container may not trigger **Pointer Exit** because the pointer has left the area Rive is tracking. We strongly recommend using [Data Binding](/docs/editor/data-binding/overview) to communicate between artboards instead of relying on nested Rive events. ## Listener Actions A listener action runs when a listener is triggered. Actions include: * Changing a view model property * [Aligning an element to a target](#align-target) * Reporting an event * Triggering a scripted action * Firing a Rive event * Updating an input value (deprecated) To add a listener action, click the **+** icon in the panel below the **State Machine Graph**. You can add multiple actions to a single listener. You can data bind values in listener actions. ### Align Target The **Align Target** action positions an object so it follows the pointer when the listener is triggered within the listener area. Use the **Target Picker** to select the object you want to align. Enable **Preserve Offset** to maintain the original distance between the object and the pointer when the action is triggered. When **Preserve Offset** is disabled, the object aligns directly to the pointer. # State Machine Overview Source: https://rive.app/docs/editor/state-machine/state-machine Add intelligence to your animations. ## Overview State Machines are a visual way to connect animations together and define the logic that drives the transitions. They allow you to build interactive motion graphics that are ready to be implemented in your product, app, game, or website. State machines create a new level of collaboration between designers and developers, allowing both teams to iterate deep in the development process without the need for a complicated handoff. Using the State Machine requires designers and animators to think more like a developer but in a straightforward, visual way. Every artboard has at least one State Machine by default, but you can create as many as you’d like. To create a new state machine, hit the plus button in the Animations List and select the State Machine option. ### Anatomy of a State Machine A basic state machine will consist of a Graph, [States](/docs/editor/state-machine/states), [Transitions](/docs/editor/state-machine/transitions), and [Layers](/docs/editor/state-machine/layers). We’ll explore each of these pieces and more throughout this section. The Graph is the space in which you’ll be adding States and connecting Transitions. It appears in place of the Timeline when a state machine is selected in the animations list. State Machine Graph States are simply timeline animations that can play in your state machine. Typically, these will represent some state that your animated content is in. For example, a button will typically have an Idle state (the button is stationary), a Hovered state (what the button looks like when it is hovered), and a Clicked state (what the button looks like when it’s been clicked). ![Preview of States](https://ucarecdn.com/ca93f148-a38c-4eac-a166-8399065315c2/) Once we have defined the States of our content, we can tie them together with transitions to create a logical path that our State Machine can take through these different timelines. We’re creating a map that our State Machine can use to get from one animation to the next. ![Creating Transitions](https://ucarecdn.com/cf0f53e3-abc9-43a9-b43a-e18483fe2613/) # States Source: https://rive.app/docs/editor/state-machine/states States are simply timeline animations that can play at any point in your state machine. A state could be as simple as changing the color and position of an object, or as complex as blending multiple timelines together. There are a few types of states that you’ll end up using as you work with the State Machine, including Default States, Single animations, and Blend States. We’ll explore each of these below. ## Default States The Default States are the states that, by default, are added to every State Machine. Default States ### Entry State The Entry State is the state that your State Machine will start from. You’ll notice that by default, your state machine will already have an animation attached to the Entry State, but you can change this animation at any time. Note that you can connect multiple animations to the Entry State if you need I.E. you want to build a switch that can start in either the on or off state. ![Using the Entry state](https://ucarecdn.com/9d359af8-f3c3-4d57-8f88-7ba8dcad4847/) ### Exit State The Exit State tells the State Machine layer to stop playing. This niche state has uses when multiple layers are being used. ### Any State Unlike normal states, states connected to the Any State can be played at any time, regardless of which state your state machine is in. Any States are great to use when you want to create an array of states that can be activated at any time, such as changing the skin of a character. ![Rating system using the Any state](https://ucarecdn.com/6c4401fc-1b7c-4748-901d-a6e237f57e51/) ## Animation States Animation states include all states other than the default states added to a State Machine. These states will control the look and motion of your interactive content. There are three types of animation states; Single Animation, 1D blend, and Direct blend states. To add a State to the Graph, you can drag and drop an animation from the Animations List directly onto the Graph. Notice that this will create a Single Animation state. You can change the state type using the inspector. ![Drop and drop State onto the Graph](https://ucarecdn.com/f99e2294-1915-4449-8632-71227dc4f87f/) Additionally, you can right-click on the graph and create a blank state of any type with no associated timelines. ![Image](https://ucarecdn.com/34662198-6e61-43bd-83dd-d4d8e1ee8012/) Right-click to add State To assign a timeline to a state, use the timeline dropdown in the inspector. ### Single animation state Any timeline that we create can be used as a single animation state. Depending on the type of animation we are using, the single animation state could be a one-shot, looping, or ping-pong state. In most cases, you’ll be using single animation states to create most of your state machines. ### Blend states A Blend State is any state that blends together two or more timeline animations. We use these states for content like loading bars, health systems, scrolling interactions, and dynamic face rigs. There are two types of blend states; 1D and Direct Blend states. #### 1D Blend state: A 1D Blend State allows us to mix multiple timelines together with a single numerical view model property. This state works by ramping up one animation and ramping down the other while you increase or decrease a number value. Note that this mixing is not linear, but is additive and could give you unexpected results. ![Health bar using Blend state](https://ucarecdn.com/875b9ed6-41c7-4023-aaad-f38d2042dca7/) **Configuring a 1D Blend State:** You'll want to start by creating a few timelines for your Blend state. Keep in mind that it's often best to use timelines with only a few properties keyed. In this health bar example, only the X scale is keyed. ![Image](https://ucarecdn.com/a2e08c89-388b-4b21-b31b-3d5fb6e94cd7/) Timelines for health bar After adding a 1D Blend State to the graph, use the Inspector to configure the state. ![Add Blend state](https://ucarecdn.com/266c2c6d-6719-4b65-b06a-b1ca35d2eb86/) First, add the number property you want to drive the blend using the dropdown. If you haven’t created one yet, you’ll notice that nothing appears here. ![Create and add number property to Blend state](https://ucarecdn.com/baf39e65-5bf1-44ed-bd2e-b0f0afa24ded/) The plus button that appears below the number property allows you to add timelines to your blend state. Use the dropdown to assign a specific timeline. Note that you can add as many timelines as you’d like. ![Add timelines to the Blend state](https://ucarecdn.com/fe5d4505-8290-4be9-b0d6-58f13d1df553/) Next, you need to define a numerical range that your blend state will work between. This particular blend works between 0 and 100. ![Image](https://ucarecdn.com/6a92f242-2979-44c7-bb95-fc51ebeeda5d/) Notice that once you define the range, a graphic appears above the property dropdown, visually representing how your animations will mix. When the state machine is active, as you increase or decrease your property within the defined range, you’ll see a visual representation move across that graph, showing you the mix of your timelines. ![Blend State in action](https://ucarecdn.com/44a40cb9-90d9-4aca-920f-6042cc52340f/) #### Additive Blend state: An Additive Blend state allows you to blend together multiple timelines using multiple number properties. This allows us to create unique poses and facial positions by mixing multiple animations together. While working with an Additive Blend, you’ll either be mixing an animation by value or property. Read more below. ![Using Additive Blend for facial animations](https://ucarecdn.com/71cf4345-b728-47a4-946c-e08de2eb86dd/) **Value vs Property blend** When adding animations to an Additive blend state, you’ll be prompted to either add a Blend by Value animation or a Blend by Property animation. ![Adding timeline to Additive Blend](https://ucarecdn.com/8e2c7380-85cf-4e41-8dd8-82e98f34d1bd/) A Blend by Value timeline can be thought of as the baseline animation, or default pose. This value is not tied to a property, so it can’t be used to control the state machine. Instead, this value describes its mix weighting. A view model property blend is an animation that is mixed with the default pose or motion via a number property. Each of your different property blends should have their own number property. ## State Options When you select a state in the State Machine Graph, you can change its options in the Inspector, including: * **Name** - The name of the state. * [Caption](#caption) - Notes for collaborators or your future self. * **Type** - The type of state, such as a single animation, 1D blend, or additive blend. * [Timeline](#timeline) - The animation assigned to the state. * [Speed](#speed) - The speed at which the timeline plays. * [Transitions](#transitions) - A list of transitions to and from the state. ### Caption You can add a caption to a state to leave notes for collaborators or your future self. When a state has a caption, an info icon appears on the state in the State Machine Graph. Hover over the icon to view the caption. Captions are useful for explaining why a state exists and documenting complex logic. Captions are only visible in the editor. They are not exported for runtime. ### Timeline Use the dropdown to change which animation is assigned to the current state. ![Changing animation on a state](https://ucarecdn.com/e8a8e540-b5ed-4947-b2cc-45ba793f0ea0/) ### Speed Use **Speed** to change how fast the state’s animation plays. Positive values play the animation forward, and negative values play it backward. ![Change animation speed](https://ucarecdn.com/5ada4e3d-bbba-412d-8bc3-6b4417717e16/) ### Transitions The **Transitions** section lists the [transitions](/docs/editor/state-machine/transitions) connected to the selected state. Use the eye icon to disable a transition, or the **-** button to remove it. ## Actions You can perform actions when the state starts or ends. Actions can be used to: * Set property values * Report events * Align targets * Control focus * Fire a scripted action Actions can also be fired at the start or end of a transition. See [Transition Actions](/docs/editor/state-machine/transitions#actions). ### Action Timing Each action can run at either: * **Start** — Runs when the state begins * **End** — Runs after the state completes ### Creating an Action Creating an transition action With a state selected, click the `+` button to the right of the state name, and select an action type. Configure the action based on the action type. ## Common Issues ## Use case: Build a simple button In this exercise, we will use our state machine knowledge to create a simple button with two layers of interactivity. Hover and click. # Transitions Source: https://rive.app/docs/editor/state-machine/transitions Transitions define how and when a State Machine moves from one state to another. A transition is made up of four parts: The direction the transition travels. **Example**: A character might have one path from **Idle** to **Walk**, and another from **Walk** back to **Idle**. When the transition occurs. **Example**: A character might transition to **Walk** when a button is pressed, then back to **Idle** when the button is released. How the transition behaves. **Example**: You might set the transition duration to `0.2` seconds so the change between states feels smoother. Extra behavior to perform when the transition occurs. **Example**: A transition might fire an event, set a property value, or align a target. ## Transition Path A transition path determines how the State Machine moves from one state to another. To create a transition path, move your cursor near the state you want to leave until the circle appears. Click and drag from the circle to the state you want to transition to. Creating a transition Once you connect two states, the transition path shows a circle with an arrow icon indicating the transition direction. In this example, the State Machine can move from Timeline 1 to Timeline 2, but not from Timeline 2 back to Timeline 1. To allow the State Machine to move back to Timeline 1, create another transition path starting from Timeline 2. Creating a reverse transition You can create multiple transitions between the same two states. Each transition can have different [conditions](#transition-conditions), allowing you to create “or” logic. Creating an "or" transition ## Transition Conditions Conditions determine when a transition can occur. Without conditions, transitions fire as soon as they are reached. This can cause a State Machine to rapidly move between states or skip directly to a single animation. ### Adding a Condition To add a condition to a transition, select the transition, then click the plus button next to **Conditions**. A condition has three parts: * **Source value** - the value or event the condition watches * **Operator** - how the source value is compared * **Comparison value** - the value the source value is compared against For example, a character might transition from **Idle** to **Walk** when `isWalking` is `true`. In this condition, `isWalking` is the **source value**, **equals** is the **operator**, and `true` is the **comparison value**. Add a transition condition #### The Source Value Conditions can be driven by many different sources, including: * View Model properties * Events * Built-in properties such as artboard width, height, and ratio Source value #### The Operator Conditions can use comparisons such as equals, does not equal, greater than, greater than or equal to, less than, and less than or equal to. The available comparisons depend on the type of value being compared. Operators #### Comparison Value The comparison value is the value the source value is compared against. Comparison value You can enter a fixed comparison value, such as `true`, `100`, or `"mobile"`. You can also data bind the comparison value to another property, allowing the transition to compare against dynamic data. For example, a transition might occur when `speed` is greater than a data-bound `walkThreshold` value. ### Adding Multiple Conditions You can add multiple conditions to a single transition. All conditions must be met before the transition occurs. Adding multiple conditions ## Transition Properties Once you’ve added a transition, selecting the direction indicator will allow you to configure the transition. There are three different sections to the transition panel, the transition properties, conditions, and interpolation. Selecting multiple transitions allows you to update multiple properties at once. Transition properties ### Duration The duration property describes how long it takes for a transition to occur. The duration is set to zero by default, meaning the transition happens immediately. So, when we transition between these two animations, it appears as though the object snaps from one side of the artboard to the other. ### Exit Time Exit Time tells the state machine how much of the state must play before transitioning. By default, Exit Time is unchecked. To enable Exit Time, use the checkbox. Once the setting is enabled, you can use either a time value or percent. For example, if you want the state machine to play the entire animation before transitioning, you can either enter the duration of the animation, or use 100%. Exit time 100% ### Pause Source When Exiting **Pause Source When Exiting** pauses the animation in the state you are leaving while the transition plays. In this example, the up-and-down motion pauses as soon as the transition begins. Pause when exiting ### Allow Exit During Transition **Allow exit during transition** controls whether the State Machine can leave a transition before that transition finishes. For example, if a button is transitioning from **Idle** to **Hover** and the user moves their cursor away, **Allow exit during transition** lets it transition back to Idle immediately. Allow exit during transition ### Interpolation You can add interpolation to your transition at the bottom of the Transitions Panel. By default, the interpolation is set to linear, but you can use the cubic and other interpolations. If you are unfamiliar with the basics of Interpolation, see [Interpolation (Easing)](/docs/editor/animate-mode/interpolation-easing). ## Actions Transitions can also perform actions when the transition occurs. Unlike conditions, which determine whether a transition can happen, actions perform an operation when the transition is triggered. Actions can be used to: * Set property values * Report events * Align targets * Control focus * Fire a scripted action Actions can also be fired at the start or end of a state. See [State Actions](/docs/editor/state-machine/states#actions). ### Creating an Action Creating a transition action With a transition selected, go to the Actions tab, click the `+` button, and select an action type. Configure the action based on the action type. #### Action Timing Each action can run at either: * **Start** — Runs when the transition begins * **End** — Runs after the transition completes ## Randomize Exit **Randomize Exit** lets a state choose from its outgoing transition paths at random. To use it, select the origin state and enable **Randomize Exit**. The state lists each path leaving it and lets you assign a weight to each path. The higher the weight, the more likely that path is to be chosen. For example, if **Timeline 1** has a weight of `3` and **Timeline 2** has a weight of `1`, the State Machine has a 75% chance of transitioning to **Timeline 1** and a 25% chance of transitioning to **Timeline 2**. ## Disabling a Transition You can temporarily disable a transition without deleting it. Disabling is useful when you want to isolate part of a state machine for testing, or temporarily remove a path without losing its configuration. There are two ways to toggle a transition's enabled state: * **From the transition panel:** select the transition and click the enable/disable icon in the panel. * **From the canvas:** right-click the transition and choose **Disable transition** (or **Enable transition** if it's already disabled). Disable transition from the right-click menu # Tagging Source: https://rive.app/docs/editor/tagging Tagging is a way to organize your hierarchy further. Create tags, then apply them to objects in the Hierarchy like Bones or Groups, then filter the view to see exactly what you need, when you need it. ## Creating Tags There are two ways to create a Tag: either through the Hierarchy or by using the Inspector. Remember that any Tag created can be used on any artboard in the file. ### In the Inspector To create a new tag, ensure that you have nothing selected on the artboard, then use the plus button next to the Tags option. ![Create Tag through Inspector](https://ucarecdn.com/9b8a9f8d-7755-4341-a2e2-e765277c078b/) Once the Tag has been added, you can change the name and color to your liking. ### In the Hierarchy There are two ways to create tags through the Hierarchy. The first is by using the tag menu at the top of the Hierarchy. From here you can create new Tags, edit Tags, collapse Tags, filter, lock, or select assigned Tags. ![Create Tag through Tag menu](https://ucarecdn.com/efcce09c-e7dc-46d4-9d29-7f8e57d63248/) The second way is to select one or more objects to create a tag directly in the hierarchy, then right-click and use the add tag option. From there, you can either create a new tag or assign a tag that you’ve already created. ![Create Tag on object](https://ucarecdn.com/7e3b90b7-97de-4337-9c5b-77e8038f11b3/) To edit the Tag's properties, use the steps above. ## The Tags Menu The Tags Menu is where you will find most of the Tag Options. Some of these options are self-explanatory, such as creating or editing a tag. Let’s explore some of the other available options. Tag menu ### Collapse Tag When you add a tag to an object, you’ll notice that the Tag's name and the color pip are displayed to the right. ![Image](https://ucarecdn.com/eb9e515c-04e3-4f56-bee5-196e72e65ad9/) We can use the Collapse Tag option to hide the name. Conversely, we can use the Reveal Tag option to display the names again. ### Filter Tags When you mouse over a tag in the menu, you’re given the option to Filter. This option will filter your Hierarchy and only show you the objects with the filtered tag. The current filtered tabs are shown next to the Tag Menu. ![Image](https://ucarecdn.com/e808968b-1ee4-4e25-a3f6-09f615ba2229/) Note that you can add as many tags to the filter as you want. This is a great way to show only the controls you need to create an animation. ### Locked The Locked option will allow you to lock the objects with the selected Tag. When locked, you can no longer select that object on the stage. ![Image](https://ucarecdn.com/f2b63a89-cbea-42ed-bd3b-c35969ef62ee/) This is a great tool to use when you want to hand off a file to another animator so that they don’t inadvertently use a control that shouldn’t be. This option is also available via the Inspector via the lock icon. ### Select The Select option will select every object with the assigned tag. Note that this option is also available in the Inspector via the target icon. # Font Assets Source: https://rive.app/docs/editor/text/fonts Import and customize fonts. ## Importing Fonts See [Importing Assets](/docs/editor/fundamentals/assets-overview#importing-assets) for information about importing files, including TTF and OTF files. ### Google Fonts You can add Google Fonts directly from the text style font options. Select a text run, choose a Google Font, and Rive adds the font to the Assets panel automatically. ## Export Options Font assets include an Include option that controls which glyphs are included when the font is exported. * **All glyphs**: Include the full font. * **Glyphs used**: Include only the glyphs used in the file. * **Custom**: Include a custom set of glyphs. Export options Fonts can significantly increase the size of your exported `.riv` file, especially when exporting **All glyphs**. Use **Glyphs used** or **Custom** when you only need a smaller set of characters. To control which glyphs are included, create an artboard that you do not export to the `.riv` file. Add a text run with the exact characters you want to include, then set the font asset’s **Include** option to **Glyphs used**. For example, if your file only needs numbers, add a text run with `0123456789`. Those glyphs will be included in the exported font. Glyphs used hack ### Custom - Export Scripts When **Include** is set to **Custom**, you can use **Export Scripts** to choose which glyph groups to include, such as Latin, Thai, or other writing systems. Export scripts # Text Modifiers Source: https://rive.app/docs/editor/text/text-modifiers Text Modifiers let you animate or transform individual characters, words, lines, or glyphs within a text object. By combining ranges, falloff, and animated offsets, you can create effects such as text reveals, wave animations, bouncing characters, and per-letter motion. ## Modifier Group A Text Modifier Group combines a **Range** and a set of **Properties**. * **Properties** determine what changes, such as position, rotation, scale, opacity, or follow path. * The **Range** determines which characters, words, or lines are affected. A single modifier group can affect multiple properties that share the same range. Multiple modifier groups can be combined to create layered effects. For example, one modifier group might animate character scale while another animates position. ### Adding a Modifier Group Select a text object, then click the `+` button in the **Text Modifier** panel. Create Text Modifier Groups via the Inspector ### Properties Properties determine how the text is modified. Each modifier group can modify one or more of the following properties: * **Position** - Move text along the X and Y axes. * **Rotation** - Rotate text around its origin. * **Scale** - Change the size of the text. * **Origin** - Adjust the pivot point used for rotation and scale. * **[Opacity](#opacity)** - Change the transparency of the text. * **[Follow Path](#follow-path)** - Align text to a path and control how glyphs follow its direction. * **Variables** - Adjust variable font axes such as weight or width. Requires a variable font that supports the selected axis. Multiple properties can be combined within a single modifier group to create more complex effects. #### Adding a Property Select a text object, then click the `+` button in the **Modifier Group**. Each property has its own settings, which can be adjusted and animated. Adding Properties If text modifier range or values aren't visible on the stage, open the **View Options** menu and make sure **Text Modifier Range** **Text Modifier Values** are enabled. toggle text modifier range and value visibility #### Opacity The Opacity value controls the opacity of text within the modifier group's range. The Invert option controls the opacity of text outside the range: * Disabled: Text outside the range is fully transparent (0% opacity). * Enabled: Text outside the range is fully visible (100% opacity). Invert Opacity #### Follow Path To make non-text objects follow a path, use the [Follow Path Constraint](/docs/editor/constraints/follow-path-constraint) instead. The Follow Path modifier allows text to follow the shape of a vector path. This can be used to create curved text, circular text layouts, or animated text that moves along a path. Follow Path Modifier * **Follow** - The path to follow. * **Trim Start and End** - Defines where text begins and stops following the path. Text outside the trimmed section continues from the nearest trim point in the direction the path is facing. * **Offset** - Where along the path to start. * **Strength** - Controls how strongly the text follows the path. At 0%, text stays in its original position. At 100%, text follows the path completely. Animate Strength to transition text onto or off of a path. * **Auto Orient Glyphs** - Make the rotation of the glyph follow the path. * **Auto Orient Lines** - Rotates each line to follow the direction of the path. ### Range The range can be defined as a percentage of the text length or as an index value. Ranges can be applied by character, word, or line. Open the Range Options fly-out to configure the range behavior. A range with a start value of 0% and an end value of 50% affects only the first half of the text. If the modifier group applies a scale of 25%, only glyphs within the first half of the text will be scaled. You can see a visual representation of the range via a shaded area on the stage. You can configure the stage visual options in the visibility menu on the toolbar. Apply transforms to the target text range Multiple ranges can be added to a single modifier group to create complex effects. #### Run Determines whether the modifier is applied to the entire text object or only to a specific text run. When a text object contains multiple text runs, modifiers can be limited to a single run instead of affecting all text. #### Falloff Use the falloff values to add interpolation to the applied modifier properties. For example, a modifier group that scales glyphs to 200% with a range from 0% to 100% and a falloff of 25% to 75% will gradually scale glyphs up from 100% to 200% over the first quarter of the text, and back down again over the last quarter of the text. The falloff can be visualized via the darker shading on the stage guide. Use falloff to interpolate applied modifier properties #### Offset Use Offset to move the range along the text. Try animating the offset value to create wipe effects along a text value. For example, a scale modifier can animate the offset to make individual glyphs scale up and back down again. Text Runs Modifiers Offset #### Range Options Additional range options can be found in the fly-out alongside the range name for more fine-grained control over the range selection behavior. **Increment** Define whether modifier properties get applied by: * Characters (with or without spaces) * Words * Lines The increment value will affect an index-based Range Type. **Mode** Defines how modifier values are combined when multiple ranges overlap. For example, if two overlapping ranges each apply a scale of 200%, an **Add** mode would combine them to produce a scale of 400%. Turn on Modifier Range Values in the visibility menu to get a numerical indication of how much a Text Modifier is affecting glyphs. **Strength** Adjust the overall influence of the modifier within the range. A value of 0% disables the modifier, while 100% applies its full effect. **Range Type** Set the range type to configure range start, end, and offset values as a percentage of the text length, or by indices. You may also want to consider which increment value to use alongside the Range Type. For example, an index value of 1 incremented by characters will target the second character, whereas an index value of 1 incremented by words will target the start of the second word. **Falloff Interpolation** Modify the falloff interpolation to define a custom cubic curve. The falloff defaults to linear interpolation. ## View Options Toggle visual guides on the stage via the visibility menu in the toolbar: * Text Modifier Range: Toggle the display of a shaded area on the stage to highlight the range position on a selected text object. * Text Modifier Range Values: Toggle the display of per-glyph values on modifier ranges to indicate the applied strength of a given modifier. Text Runs Modifiers View Options ## Use case: Animating a text pendulum This simple example will get you used to animating with Text Modifiers. # Text Overview Source: https://rive.app/docs/editor/text/text-overview ## Text Guides # Text Runs Source: https://rive.app/docs/editor/text/text-runs Runs allow you break your text up into sections — typically, they're used to apply a variety of styles to a single block of text. Whilst most tools manage text runs behind the scenes, Rive exposes them for greater control when dynamically changing text at runtime. You may want to split your text into multiple runs to apply a different style (such as font, font size, color etc.) to a certain part of your text, where you can then [update your text runs at runtime](/docs/runtimes/data-binding). A Text Run may only have one Text Style applied at a time. For example, an animation welcoming a user to an app or website may greet them by their name. In the Rive Editor, you may design and animate the text to read "Welcome back, username". Defining "username" as its own run means you can target it with the Rive Runtimes and replace it with the user's name. Update text for a specific run *** ## Creating a Text Run To create a Run, select the desired portion of text and select the 'Run from Selection' button in the Inspector. You can see Text Runs listed beneath the text object in the hierarchy. Double click or press `Enter` with the text box selected to start editing text. Toggle the 'Highlight Text Runs' option in the inspector for a visual guide of your current Text Runs. Hovering a run in the hierarchy also highlights its location within the text. Split text into multiple runs *** ## Managing Text Runs Select a Text Run in the hierarchy for inspector options: * **Text Value:** Update the text value for the run. Key this value in [animate mode](/docs/editor/fundamentals/design-vs-animate-mode). * **Edit Text Run:** Initiate the text editor with the run pre-selected. * **Merge with Next:** Combine the selected run with the next run. * **Merge with Previous:** Combine the selected run with the previous run. * **Delete text Run:** Delete the run and its contents. * **Style:** Assign one of the Text Styles defined on the text object. Key this value in [animate mode](/docs/editor/fundamentals/design-vs-animate-mode). Assign a Text Style to a Text Run # Text Styles Source: https://rive.app/docs/editor/text/text-styles A Text Style contains many of the familiar options that define how you'd like your text to be styled, and is applied to one or more runs. Currently, only Text Styles defined on a Text object can be applied to it. We'll introduce ways to share Text Styles across multiple Text objects or entire Rive files in future. Each new Text object is created with a Text Style. Use the `+` action in the Inspector to create additional styles to be applied to specific Text Runs or to key between in an animation. Each Text Style contains: * Font * Font Size * Font Weight * Line Height * Fills * Strokes Add multiple styles to a single text object ### Applying a style to a Text Run There are two ways to apply a Text Style to a Text Run: * Select the Text Run in the hierarchy, then use the Style dropdown in the Inspector. * Select the `A+` icon alongside the style options in the Inspector, then use the popup menu to select the desired Text Run. Hovering each option will preview the result on the Stage. Apply a style to a chosen run *** ## Variables Fonts that support variable axes or OpenType features will surface an options fly-out button on the Text Style within the Inspector. Use the fly-out to access and configure the available variables and features for the selected font. Font variables can be animated in Rive. Open the variable fly-out in [animate mode](/docs/editor/fundamentals/design-vs-animate-mode) to key the available axes. Animate font variables # Dependencies Graph Source: https://rive.app/docs/editor/workflows/dependency-graph Use the Dependency Graph to visualize relationships between elements in your file ## Show Dependencies To show dependencies, select an item and press **D**. Rive displays arrows connecting the selected item to its parent and child dependencies. Filter dependency types Dependency arrows are color coded based on the type of relationship. For example, if the rotation of `NEW_sticker` is controlled by the rotation of `Icon` through a constraint, Rive shows that dependency with a yellow arrow. Filter dependency types ## Filtering Use the dependency options to filter which relationships are shown. This is helpful when an element has many connections and you only want to focus on specific dependency types. Filter dependency types # Feature Support Source: https://rive.app/docs/feature-support As the Rive Editor evolves, some new features require updates to the Rive runtimes. In certain cases, this may introduce new or modified APIs. We recommend staying on the latest runtime version to ensure compatibility, bug fixes, and performance improvements. Use the table below to verify whether a feature used in your `.riv` file is supported by your target runtime. Certain features require the use of the Rive Renderer at runtime. See our documentation on [choosing a renderer](/docs/runtimes/choose-a-renderer/). Currently, the only feature that requires the Rive Renderer is **[Vector Feathering](https://rive.app/blog/introducing-vector-feathering?utm_source=docs\&utm_medium=content)**. When a feature requires API changes, migration notes will be included below. ## Feature Support by Runtime ### Runtimes Choose between @rive-app/webgl2 and @rive-app/canvas, with guidance on performance, package size, and when to use canvas-lite. For better performance and the latest features, like vector feathering, we recommend using the WebGL2 runtime, which uses the Rive Renderer. ### Lite Runtimes This lightweight version uses the same API as `@rive-app/canvas`, but excludes certain features to reduce bundle size. This lightweight version uses the same API as `@rive-app/react-canvas`, but excludes certain features to reduce bundle size. ### Legacy Runtimes The `@rive-app/webgl` runtime is deprecated. For better performance and the latest features, use `@rive-app/webgl2`. The `@rive-app/react-webgl` runtime is deprecated. For better performance and the latest features, use `@rive-app/react-webgl2`. The `rive-react-native` runtime is deprecated. For better performance and the latest features, use `rive-nitro-react-native`. [Migration guide](/docs/feature-support#react-native-legacy) ## Runtime Support by Feature A green checkmark (✅) indicates that a feature is supported in all current runtimes. A yellow circle (🟡) indicates that support varies by runtime or renderer. Differences may reflect: * Platform or SDK limitations where a feature cannot be supported * Staggered releases as features roll out across runtimes, or * Lightweight (“lite”) builds that intentionally omit some features to reduce package size. A feature may still be considered fully supported even if it is unavailable in legacy runtimes. ### Features Accessibility voice over support with [Semantics](/docs/editor/accessibility/semantics). Support for Rive files with [Scripting](/docs/scripting). Data binding lists, images, and artboards were added after initial data binding support. See [Data Binding Overview](/docs/editor/data-binding/overview) and [Data Binding for Runtimes](/docs/runtimes/data-binding). See [Data Binding Overview](/docs/editor/data-binding/overview) and [Data Binding for Runtimes](/docs/runtimes/data-binding). See [N-Slicing](/docs/editor/layouts/n-slicing). Allows Rive to automatically update the artboard size as the underlying view/canvas/widget/texture size changes. See [Layouts](/docs/editor/layouts/layouts-overview). Allows Rive to use a fallback font if a glyph is not available. A default font is automatically chosen, or you can optionally configure the desired fallback font based on various options. See [Fallback Fonts](/docs/runtimes/text#fallback-fonts). Enables randomizing transitions between animations and customizing the probability. See [Rive Events](/docs/runtimes/rive-events) and [Audio Events](/docs/editor/events/audio-events). See [Loading Assets](/docs/runtimes/loading-assets). See [Text](/docs/runtimes/text). ### Legacy Features Listening to [Rive Events](/docs/runtimes/rive-events) at runtime is deprecated and will be removed in future versions. Use [Data Binding](/docs/runtimes/data-binding) to listen for triggers or changes to properties instead. Setting text, including [nested text](/docs/runtimes/text#read-update-nested-text-runs-at-runtime), at runtime is deprecated and will be removed in a future version. Instead, use [Data Binding](/docs/runtimes/data-binding) to update a string, which is bound to a text run. # Defold Source: https://rive.app/docs/game-runtimes/defold [Defold](https://defold.com/) is a free, cross-platform, game engine that has built-in support for Rive graphics, allowing you to easily incorporate Rive into your Defold games. Rive integration is managed by the Defold team. For more information on using Rive with Defold, please refer to the [official Defold documentation](https://defold.com/extension-rive/). There, you will find comprehensive guides on setting up Rive graphics and best practices for using them within the Defold engine. ### Rendering Defold has integrated the [Rive Renderer](https://rive.app/renderer) natively, which means that Rive graphics in Defold are rendered by the same renderer used in the Rive Editor. This native integration offers several benefits: * **Performance**: The Rive Renderer is custom-built for Rive content, for animation, and for runtime. Allowing you to draw an unprecedented amount of vector graphics with mega fast rendering. [Read more](https://rive.app/blog/rive-renderer-now-open-source-and-available-on-all-platforms). * **Quality**: Graphics remain crisp and clear regardless of scale, resolution, or device. * **Consistency:** Your graphic will look exactly the same in the Editor and at Runtime. * **Feature support:** You'll also benefit from upcoming Rive features, such as blurs and shadows, that will only be possible through the Rive Renderer. ### Support If you have any questions about Rive in Defold, feel free to explore their [community forums](https://forum.defold.com/) or reach out to their support. If you believe the issue to be with Rive, reach out to us on [our Community](https://community.rive.app/c/support/). # Audio Source: https://rive.app/docs/game-runtimes/unity/audio Rive audio playback in Unity. In the Unity runtime, audio playback from Rive files is automatically routed through Unity's audio system via the `AudioProvider` component, which wraps an `AudioSource` to mix Rive's audio output into the Unity audio pipeline. Audio playback via `AudioProvider` is **not supported in WebGL builds**. On WebGL, Rive automatically falls back to system audio instead of routing through Unity's `AudioSource`. ## How it works Each `RiveWidget` that plays a Rive file with audio needs access to an `AudioProvider`. By default, all widgets share a single **global** `AudioProvider` that is created automatically at runtime. No additional setup is required. If you need more control (for example, to manage volume or audio mixer groups independently per widget), you can assign a **custom** `AudioProvider` to individual widgets. ## Global Audio Provider The global `AudioProvider` is created automatically the first time a widget with audio needs it. It is shared across all `RiveWidget` instances that don't have a custom provider assigned. This is the recommended setup for most projects, and no additional configuration is required. ## Custom Audio Provider To use a custom `AudioProvider` for a specific widget: Add an `AudioProvider` component to a GameObject in your scene. The `AudioProvider` component requires an `AudioSource` on the same GameObject. Unity will add one automatically. Assign the `AudioProvider` to the **Custom Audio Provider** field on your `RiveWidget` in the Inspector. You can also assign a custom provider at runtime via script: ```csharp theme={null} [SerializeField] private RiveWidget m_riveWidget; [SerializeField] private AudioProvider m_audioProvider; private void Start() { m_riveWidget.CustomAudioProvider = m_audioProvider; } ``` Setting `CustomAudioProvider` to `null` reverts the widget to using the shared global provider. ## Platform Notes | Platform | Behavior | | ------------------- | -------------------------------------------------------------------------------------- | | Editor / Standalone | Audio routed through Unity's `AudioSource` via `AudioProvider` | | iOS / Android | Audio routed through `AudioSource`; `Play()` is called automatically on start | | WebGL | System audio is used; `AudioProvider` is not supported and will log a warning if added | Adding an `AudioProvider` component to a WebGL build will produce a warning at runtime. The component has no effect on that platform, and audio will still play via the browser's system audio. ## AudioProvider component reference | Property | Description | | ------------- | -------------------------------------------------------------------------------------------------------- | | `AudioSource` | The `AudioSource` component used for audio playback. Required; automatically added with `AudioProvider`. | # Best Practices Source: https://rive.app/docs/game-runtimes/unity/best-practices Performance and usage considerations for Rive in Unity. Rive is designed to be efficient in Unity, but performance can still be affected by core factors like how much work happens every frame, how much memory is in use, and how much rendering overhead is required. Design-time and runtime guidance that applies across platforms. Learn how Rive Panel, Rive Widget, and render target strategies work. ## Rive Panels and Render Textures In Unity, **one Rive Panel renders into one Render Texture** by default. Every **Rive Widget** under a panel draws into that same Render Texture. That's why, for UI: * **Prefer fewer panels**: One (or a small number) of panels is usually best, especially on mobile. * **Group widgets under a shared panel**: Multiple widgets under a single panel is typically more efficient than multiple panels. ### Compose UI in Rive When you're getting started with Rive, it can be tempting to use it as a simple replacement for individual UI components (for example, building a single “Rive Button”, instancing it many times, and then assembling it in uGUI/UIToolkit). In Unity, this often creates unnecessary widget/panel/render texture overhead. For most projects, the recommended approach is to build your full menu (or at least larger chunks of a screen) in Rive, render it single widget/panel, and drive it with data binding. ### Prefer data binding with lists for dynamic content If your UI needs to create and remove items dynamically (for example: inventories, chat feeds, spawning characters), prefer using **data binding list properties** instead of creating lots of separate Rive Widgets. Using lists keeps repeated graphics **inside a single Rive file / widget**, while still letting you add/remove/swap items at runtime through your Unity code. See: * Concepts + examples: [Data binding lists](/docs/game-runtimes/unity/data-binding#lists) * Editor setup: [Lists in the editor](/docs/editor/data-binding/lists) ### Screen space UI vs world space UI * **Screen space UI**: You can usually structure your UI so a single panel covers the whole screen. * **World space UI / VR**: If your UI exists in the world and needs different sizes, transforms, or visibility rules, you may end up needing more panels and more careful control of render textures. If you have a real use case for many panels (for example, lots of world-space UI surfaces), look at **Render Target Strategies**: * **Atlas Render Target Strategy**: Packs multiple panels into a shared atlas texture to reduce texture count. * **Pooled Render Target Strategy**: Reuses textures to reduce allocation churn when panels appear/disappear frequently. See: [Render Target Strategies](/docs/game-runtimes/unity/components#render-target-strategies). ## One Rive file vs multiple files For multi-screen UI, this usually means choosing between: * **One larger `.riv` file** that contains multiple screens (often as components), with transitions and logic handled inside Rive. * **Multiple `.riv` files** (for example, one per menu) that you enable or instantiate and swap via C#. The best structure depends on both performance goals and how you want to author and maintain your files. #### One larger file * **Pros**: Keep a full UI flow in one place, drive transitions inside Rive, and test the entire experience in the Rive Editor. The file could be loaded once (e.g. at the start of the game) and can be reused across multiple screens or menus. * **Tradeoff**: The entire file (including its embedded assets) stays in memory even if you're only using part of it or displaying a single artboard. #### Multiple files For example, one per screen or menu: * **Pros**: Load/unload screen-specific UI to save memory. This works well when different screens have different asset needs. * **Tradeoffs**: * Transitions between screens typically happen in C# (outside Rive). * Be sure to **disable/destroy** widgets you aren't using so they aren't advancing or rendering. #### Hybrid approach: data binding with artboard slots If you want modular loading *and* want to stay in a single widget/panel, a hybrid approach can work well: * Keep a “main” UI file that owns the overall layout and interaction flow. * Use data binding to load other artboards (stored in other `.riv` files) into slots at runtime. This lets you keep UI modular while still rendering through a shared panel and widget. The main tradeoff here is that you may need to create more files and manage them more carefully, and you may need to create more data binding properties and logic to manage the different artboards. See: * Unity: [Data Binding](/docs/game-runtimes/unity/data-binding) * Concepts: [Data binding artboards](/docs/game-runtimes/unity/data-binding#artboards) ## Embedded vs referenced assets Most projects can start with embedded assets and only optimize when needed. Referenced assets become useful when you need better reuse and control. * **Embedded assets**: Simple workflow; everything is inside the `.riv` file. * **Referenced assets**: Useful when you reuse the same fonts/images/audio across multiple `.riv` files, or when you want to swap assets at runtime without duplicating them across files. Referenced assets can also help you: * **Avoid duplicating assets** when the same images/fonts are used across multiple Rive files. * **Swap to lower-resolution assets** on memory-constrained devices (keeping the same aspect ratio). If your Rive layout is set up to adapt, the graphic can adjust cleanly. See: [Loading Assets (Unity)](/docs/game-runtimes/unity/loading-assets). # Components Source: https://rive.app/docs/game-runtimes/unity/components The Rive Unity package includes components to help you integrate Rive into your project quickly and easily. These components are a high-level abstraction over the [low-level API](/docs/game-runtimes/unity/fundamentals), handling rendering and pointer input, and providing a unified way of working with Rive across render pipelines. We recommend working with these components unless you have specific rendering needs or need more control over where Rive fits into your graphics pipeline, in which case you can use the low-level API. ## Rive Panel The Rive Panel is the foundation for displaying Rive graphics in Unity. It acts as a viewport that manages and renders a collection of Rive widgets to a render texture, with the panel's dimensions determining the render target's size. The panel renders multiple widgets to a single render texture, which means you draw different Rive files and artboards to one texture by placing multiple Rive Widgets under the same panel. This is more performant than using multiple panels as each panel renders to a separate texture by default. #### Setup Create an instance: Right-click in the scene hierarchy `→ Rive → Rive Panel` A Rive Panel simply handles drawing the graphics to a texture. You'll need to use the Rive Panel **with** a [Panel Renderer](/docs/game-runtimes/unity/components#panel-renderers) to display the texture. **Configuration** | Property | Description | | ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Custom Render Target Strategy | The strategy to use for rendering the panel. By default, each panel renders to a single RenderTexture that matches the panel's dimensions. You can provide a different strategy to render to a pool of textures or share a texture between panels. | | Update Mode | Controls how the panel updates widgets: `Auto` for automatic updates each frame, or `Manual` for explicit control through `Tick()`. | | Disable Editor Preview | Use this to prevent the panel from rendering in Edit mode in the Unity Editor | | Multitouch Support | When `Disabled`, the panel collapses all input to a single pointer for legacy behavior. When `Enabled`, multiple pointers are tracked independently. | **Properties** | Property | Description | | ------------------------ | ------------------------------------------------------------------------------------------------------------- | | Widget Container | The RectTransform that holds the panel's widgets. | | Widgets | A read-only list of widgets managed by the panel. | | Render Texture | The current render texture where widgets are drawn. | | Scale In RenderTexture | The scale of the panel within its render texture. Returns `Vector2.one` if no render strategy is set. | | Offset In Render Texture | The offset of the panel within its render texture. Returns `Vector2.one` if no render target strategy is set. | | Is Rendering | Whether the panel is currently registered with a render target strategy and actively rendering. | **Public Methods** | Name | Description | | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | | Tick(float deltaTime) | Updates all widgets in the panel. Called automatically in Auto mode.
You only need to call this if the `Update Mode` is set to `Manual` | | StartRendering() | Begins rendering the panel if it isn't already rendering to a render texture. | | StopRendering() | Stops rendering the panel if it's currently rendering to a render texture | | SetDimensions(Vector2 dimensions) | Sets the width and height of the panel. | | RegisterInputProvider(IPanelInputProvider provider) | Registers a custom input provider for handling pointer events. | | UnregisterInputProvider(IPanelInputProvider provider) | Removes a previously registered input provider. | ## Rive Widget The Rive Widget is the primary component for displaying Rive artboards in Unity. It handles loading Rive files either from assets during edit time or from runtime-loaded files (useful when loading Rive content from a server or Addressables). The component manages artboard and state machine setup, automatically configuring everything needed to display your graphic. #### Setup Create an instance: Right-click in the scene hierarchy `→ Rive → Widgets → RiveWidget` Rive Widgets must be placed under a RivePanel to be displayed. **Configuration** | Field | Description | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Asset | The Rive asset (.riv) to load. | | Artboard Name | The name of the artboard to load from the Rive file. | | State Machine Name | The name of the state machine to load from the selected artboard. | | Hit Test Behaviour | How pointer events are handled (Opaque, Translucent, Transparent, None). | | Fit | How the artboard should fit within the widget's bounds. See the [Fit docs](/docs/game-runtimes/unity/layouts#the-fit-mode) for more details about the available options. | | Alignment | How to align the artboard within the widget's bounds | | Layout Scale Factor | Scale multiplier used when in Layout fit mode. | | Layout Scaling Mode | How the widget scales in Layout mode ( `ReferenceArtboardSize` , `ConstantPhysicalSize` and `ConstantPixelSize`). | | Fallback DPI | DPI value to use when screen DPI is unavailable | | Reference DPI | Target DPI for scaling calculations | | Speed | Controls the widget's playback speed. A value of 1 is normal speed, 2 is double speed, 0.5 is half speed | **Properties** | Name | Description | | --------------------- | -------------------------------------------------------------------------------------------------------------------------- | | File | The currently loaded Rive file instance. | | Artboard | The currently loaded artboard instance. | | State Machine | The currently loaded state machine instance. | | Status | Current status of the widget (Uninitialized, Loading, Loaded, Error) | | BindingMode | Determines how the widget should handle binding to a ViewModel instance: Auto Bind Default, Auto Bind Selected, or Manual. | | ViewModelInstanceName | The name of the ViewModel instance to bind to when BindingMode is set to Auto Bind Selected. | **Events** | Name | Description | | --------------------- | ------------------------------------------------------------------------------------ | | OnRiveEventReported | Triggered when a Rive event is reported from the Rive graphic. | | OnWidgetStatusChanged | Triggered when the widget's status changes (e.g., from Loading to Loaded, or Error). | **Public Methods** | Name | Description | | --------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Load(File file) | Loads a Rive file using the default artboard and state machine. | | Load(File file, string artboardName, string stateMachineName) | Loads a Rive file with specified artboard and state machine. | | Load(Asset asset) | Loads from a Rive asset using the default artboard and state machine. The Rive Widget manages the lifecycle of the loaded file and cleans up the file when the widget is destroyed or when a new asset is passed in. | | Load(Asset asset, string artboardName, string stateMachineName) | Loads from a Rive asset with specified artboard and state machine. The Rive Widget manages the lifecycle of the loaded file and cleans up the file when the widget is destroyed or when a new asset is passed in. | If you use any Load methods that accept a `File` instance, you're responsible for disposing of the File instance when you no longer need it. This is not the case when loading from an `Asset` as the Rive Widget manages the lifecycle of the underlying file (loading and disposing). ## Procedural Rive Widget The Procedural Rive Widget enables runtime generation of graphics using the Rive's Renderer. This component lets you create graphics programmatically using Rive's drawing primitives (paths and paints, etc.). See [this example](https://github.com/rive-app/rive-unity/blob/0765c81e1b68e77fcbf0e62afee7290eff400d17/tests/package/PlayModeTests/Components/Goldens/TestPanels/TestProceduralDrawing.cs) for a practical implementation of a procedural drawing. #### Setup Create an instance: Right-click in the scene hierarchy `→ Rive → Widgets → Procedural Rive Widget` Procedural Rive Widgets must be placed under a RivePanel to be displayed. **Configuration** | Property | Description | | ------------------ | ------------------------------------------------------------------------ | | Procedural Drawing | ProceduralDrawing instance that defines what to draw. | | Hit Test Behavior | How pointer events are handled (Opaque, Translucent, Transparent, None). | **Properties** | Name | Description | | ------ | --------------------------------------------------------------------- | | Status | Current status of the widget (Uninitialized, Loading, Loaded, Error). | **Events** | Name | Description | | --------------------- | ------------------------------------------------------------------------------------ | | OnWidgetStatusChanged | Triggered when the widget's status changes (e.g., from Loading to Loaded, or Error). | **Public Methods** | Name | Description | | ----------------------------------------- | ----------------------------------------------- | | Load(ProceduralDrawing proceduralDrawing) | Loads a new procedural drawing into the widget. | ## Panel Renderers Panel renderers connect RivePanel's render texture to Unity's display systems. By separating rendering logic from display concerns, we can support different rendering contexts (UI, world space, etc.) while keeping the core Rive functionality consistent. Each renderer type specializes in a specific Unity rendering pathway, handling details like input systems and render order automatically. ### Rive Canvas Renderer The Rive Canvas Renderer displays Rive content within Unity's UI system (uGUI). It automatically configures the necessary Canvas components and handles UI-specific concerns like proper render order and raycasting. The Rive Canvas Renderer controls the size of the Rive Panel based on the uGUI Canvas it is being displayed under. You can also create a Rive Panel that has been automatically configured to use this component by right-clicking in the scene hierarchy and navigating to the `Rive > Rive Panel (Canvas)` #### Requirements * Requires an EventSystem in the scene for pointer input * Requires a GraphicRaycaster on the Canvas for pointer input * The Rive Panel must be under a uGUI canvas * This component must be placed on the same game object as the Rive Panel #### Configuration | Property | Description | | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Pointer Input Mode | Controls whether the renderer accepts pointer input (Enable/Disable). | | Custom Material | A custom UI material to use when rendering the Rive graphic. | | Match Canvas Resolution | Whether to match the canvas resolution to the RivePanel's resolution. This is useful for keeping the Rive graphic crisp when using a `Canvas Scaler`. By default, the RivePanel resolution is defined by its rect transform's width and height. Setting this to `true` will result in the RivePanel being rendered at a higher resolution than the panel's rect transform's size if needed. This feature is currently only supported when the RivePanel uses the `SimpleRenderTargetStrategy`, which is the default strategy used if none is provided. | #### Properties | Name | Description | | ---------- | ------------------------- | | Rive Panel | The panel being rendered. | ### Rive Texture Renderer Rive Texture Renderer projects Rive content onto materials in your 3D scene. It bridges the gap between Rive's 2D rendering system and Unity's 3D material system, making it easy to apply Rive content to any mesh in your scene. #### Requirements * Must be placed on a GameObject with a MeshRenderer on it. e.g. a Cube, Plane, Quad, or Capsule. * Requires an EventSystem in the scene for pointer input * Requires a PhysicsRaycaster on the camera for pointer input in 3D space * Target GameObject needs a MeshCollider for pointer input #### Configuration | Field | Description | | -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Renderer | The Unity Renderer component (e.g., MeshRenderer,) that will display the Rive content. | | Material Texture Assignment Mode | Controls which texture properties are set to the Rive Panel's render texture: MainTexture sets the `_MainTex` property on the material. The `TextureProperties` option lets you select multiple specific texture properties. | | Visibility Optimization | Determines if the RivePanel should stop rendering when the mesh is not visible to the camera. | | Pointer Input Mode | Controls whether the renderer accepts pointer input (Enable/Disable). | #### Properties | Name | Description | | ---------- | -------------------------------------- | | Rive Panel | The panel being rendered to materials. | **Public Methods** | Name | Description | | -------------------------- | --------------------------------------------------- | | SetPanel(IRivePanel panel) | Assigns a new panel to render. | | RefreshMaterials() | Updates material references after material changes. | ## Render Target Strategies Render Target Strategies control how **Rive Panels** render to textures. They determine whether panels get individual textures or share a texture atlas, and handle details like texture creation, panel arrangement, and memory management. ### Simple Render Target Strategy The `Simple Render Target Strategy` is the default rendering approach for **Rive Panels**, creating a dedicated render texture for each panel. It is automatically added to a Rive Panel if no custom strategy is provided. This one-to-one mapping between panels and textures provides straightforward memory management. The component must be attached to the same GameObject as its RivePanel **Configuration** | Field | Description | | ----------- | ----------------------------------------------------------------------------------- | | Panel | The RivePanel this strategy manages (automatically set when on same GameObject). | | Draw Timing | When rendering occurs: `Batched` (once per frame) or `Immediate` (instant updates). | **Properties** | Name | Description | | ---------- | ------------------------- | | DrawTiming | Current draw timing mode. | ### Atlas Render Target Strategy The Atlas Render Target Strategy enables multiple panels to share a single texture atlas, optimizing memory usage and draw calls. By default, it uses a simple shelf-packing algorithm to efficiently arrange panels within the atlas, automatically growing the texture as needed while respecting maximum size constraints. #### Setup 1. Create an instance: Right-click in the scene hierarchy `→ Rive → Render Target Strategies → Atlas Render Target Strategy` * Assign to panels: Drag the strategy into the `Custom Render Target Strategy` field on desired panels * (Optional) Configure atlas parameters like starting size and resolution limits #### Notes * Panels sharing the same strategy instance share the same atlas texture * Create multiple strategy instances to group panels into different atlases