{"id":32064,"date":"2023-07-07T11:01:04","date_gmt":"2023-07-07T15:01:04","guid":{"rendered":"https:\/\/sep.com\/?p=32064"},"modified":"2023-07-07T11:01:04","modified_gmt":"2023-07-07T15:01:04","slug":"shared-element-transitions","status":"publish","type":"post","link":"https:\/\/hexboxdev.wpenginepowered.com\/blog\/shared-element-transitions\/","title":{"rendered":"How Designers and Developers can use Shared Element Transitions to Improve UX"},"content":{"rendered":"<h2>What are Shared Element Transitions?<\/h2>\n<p>Shared Element Transitions are animations that move elements from one screen to another within an app. They help users understand how the interface changes when navigating between screens. They are particularly effective when users are browsing diverse content and frequently switching back and forth between screens. These transitions can be simple to design, prototype, and build in code.<\/p>\n<h2>How to Design Shared Element Transitions<\/h2>\n<p>As with all nuanced or uncommon interactions, we want to start in design so we can visualize what we want to happen before pulling our hair out in code. Figma\u2019s Smart Animate feature is perfect for prototyping shared element transitions.<\/p>\n<ol>\n<li>Design two screens you want to transition between. Make sure the elements you want to &#8220;share&#8221; between the views have the same layer name and layer structure in both screens.<\/li>\n<li>Add a &#8220;Navigate to&#8221; interaction between the elements<\/li>\n<li>Set the animation to &#8220;Smart Animate&#8221;<\/li>\n<\/ol>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-32067 size-full\" src=\"https:\/\/hexboxdev.wpenginepowered.com\/wp-content\/uploads\/2023\/06\/transition-design-before.gif\" alt=\"A slow bouncy Shared Element Transition with elements moving in different directions\" width=\"520\" height=\"369\" \/><\/p>\n<p>That was easy! However, there are a few changes we can make to improve this transition<\/p>\n<ul>\n<li><strong>Simplify the \u201cgesture\u201d. <\/strong>The title and image move in conflicting directions, which makes the overall transition confusing to follow. When all elements move in a cohesive manner, the overall gesture becomes easier to understand.<\/li>\n<li><strong>Speed it up<\/strong>. People can make decisions on what to do next in as little as 100ms. If your transition takes much longer than that, you are slowing users down. 400ms is a good starting point for full-page transitions. It gives users just enough time to understand where elements have moved.<\/li>\n<li><strong>Make the spring effect subtler<\/strong>. We can draw less attention to the animation with a subtler easing effect. We want people to focus on the content, not the animation.<\/li>\n<\/ul>\n<p>Here\u2019s a version that is clearer and less distracting, keeping users focused on the content.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-32068 size-full\" src=\"https:\/\/hexboxdev.wpenginepowered.com\/wp-content\/uploads\/2023\/06\/transition-design-after-1.gif\" alt=\"A smooth and and quick Shared Element Transition with elements with the blog title and image moving in the same direction.\" width=\"520\" height=\"369\" \/><\/p>\n<h3>Tips<\/h3>\n<ul>\n<li>Consider creating a separate prototype specifically for demoing this transition. It can be difficult to make Smart Animate work with components, AutoLayout, and other Figma features since the layer structure and naming has to match exactly.<\/li>\n<\/ul>\n<h2>How to Build Shared Element Transitions<\/h2>\n<p>You might be thinking, how can I export my awesome transition from Figma? Unfortunately there isn\u2019t a reliable way to go from Figma to code on anything but the simplest projects. However, Implementing shared element transitions can be straightforward. Most platforms provide an API for this purpose. We&#8217;ll take a brief look at how to implement this transition style on each.<\/p>\n<h3>The Process, Generally<\/h3>\n<p>The APIs on these platforms generally follow the same steps:<\/p>\n<ol>\n<li>Identify elements to be transitioned in both views with a unique id<\/li>\n<li>Change UI state using a special method that triggers a transition<\/li>\n<li>Let the platform handle the transition animations automatically<\/li>\n<\/ol>\n<h3>Gotchas<\/h3>\n<p>For the most part, implementation should be pretty simple, but there are are a few topics that could require special thought or more work in code.<\/p>\n<ul>\n<li><strong>Preserving scroll position.<\/strong>\u00a0you need to ensure that when users close the &#8220;expanded&#8221; view, the list page returns to the same scroll position as before. This way, users won&#8217;t lose their place when switching back and forth between the views.<\/li>\n<li><strong>Platform features don\u2019t always work well together.<\/strong>\u00a0Depending on the platform and how your app is set up, you may get frustrated when platform features don\u2019t work well together. Be prepared to compromise, simplify, or abandon this transition style.<\/li>\n<li><strong>Some users prefer reduced motion. <\/strong>This can be for accessibility or motion-sickness reasons. Many platforms offer features to check if a user has indicated their preference for reduced motion. Look into your platform&#8217;s capabilities and consider disabling the animation for those users or offering an alternative like a simple dissolve.<\/li>\n<\/ul>\n<h3>Examples<\/h3>\n<p>The code in this article is simplified for brevity. For detailed code examples, I have put together this <a href=\"https:\/\/github.com\/sep\/shared-element-transition-examples\" target=\"_blank\" rel=\"noopener\">example repository<\/a> on GitHub with samples for iOS, Android, and the web.<\/p>\n<h3>On the Web<\/h3>\n<p>In the past, implementing shared element transitions on the web required careful planning and tricky calculations using the <a href=\"https:\/\/css-tricks.com\/animating-layouts-with-the-flip-technique\/\" target=\"_blank\" rel=\"noopener\">&#8220;F.L.I.P. Technique&#8221;<\/a>. However, thanks to the new <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/View_Transitions_API\" target=\"_blank\" rel=\"noopener\">View Transitions API<\/a>, creating these transitions is much simpler. With this standardized API, we can smoothly transition between views with just a few lines of JavaScript and CSS.<\/p>\n<h4>Give Unique Ids to Shared Elements<\/h4>\n<p>First, we give unique IDs to the elements we want to transition using the CSS rule <code>view-transition-name<\/code>. These IDs help the browser recognize and move the elements to their desired positions during the transition, just like how matching layer names work with Figma\u2019s Smart Animate. Here is simplified HTML for an article preview in a list:<\/p>\n<pre><code>&lt;article&gt;\n  &lt;!-- note that we need unique view transition names per article --&gt;\n  &lt;img style=\"view-transition-name: article-1-image;\" src=\"...\" alt=\"...\" \/&gt;\n  &lt;h2 style=\"view-transition-name: article-1-title;\"&gt;Example Article&lt;\/h2&gt;\n&lt;\/article&gt;<\/code><\/pre>\n<p>And the full article on another screen:<\/p>\n<pre><code>&lt;main&gt;\n  &lt;img style=\"view-transition-name: article-1-image;\" src=\"...\" alt=\"...\" \/&gt;\n  &lt;h1 style=\"view-transition-name: article-1-title;\"&gt;Example Article&lt;\/h1&gt;\n  &lt;!\u2014 ... \u2014&gt;\n&lt;\/main&gt;<\/code><\/pre>\n<h4>Trigger the Transition<\/h4>\n<p>When the article is tapped, we will present the full content of the article. To tell the browser these changes are a part of a transition, we have to use a special JavaScript function.<\/p>\n<pre><code>document.startViewTransition(() =&gt; changeTheDocumentSomehow());<\/code><\/pre>\n<h4>Result<\/h4>\n<p>Now, when we click on the article:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-32070 size-full\" src=\"https:\/\/hexboxdev.wpenginepowered.com\/wp-content\/uploads\/2023\/06\/transition-web.gif\" alt=\"Website showing a blog article expanding using the Web Transitions API to achieve a Shared Element Transition\" width=\"520\" height=\"529\" \/><\/p>\n<p>That&#8217;s it! As long as the shared elements share the same unique <code>view-transition-name<\/code> on both screens, they will transition smoothly. It&#8217;s not even necessary for the screens to have a similar structure. If desired, you can <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/View_Transitions_API#customizing_your_animations\" target=\"_blank\" rel=\"noopener\">customize the transition<\/a>, but the default animation is suitable for many use cases.<\/p>\n<h4>Support<\/h4>\n<p>You can use the View Transitions API today, although browser support is limited. As of now, you can expect it to work for about <a href=\"https:\/\/caniuse.com\/?search=View%20Transition%20API\" target=\"_blank\" rel=\"noopener\">65% of your users<\/a>. Don&#8217;t let this stop you from using the API. Browsers are designed to ignore unsupported CSS rules, so including <code>view-transition-name<\/code> won&#8217;t cause any issues. As for the JavaScript, we just have to check if the <code>startViewTransition<\/code> function exists before we use it.<\/p>\n<pre><code>if (document.startViewTransition) {\n    document.startViewTransition(() =&gt; changeTheDocumentSomehow());\nelse {\n    changeTheDocumentSomehow()\n}<\/code><\/pre>\n<p>View Transitions are simple, performant, and concise. They are low-risk <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Glossary\/Progressive_Enhancement\" target=\"_blank\" rel=\"noopener\">progressive enhancements<\/a> that can make certain kinds of page transitions easier for your users to understand.<\/p>\n<h4>Tips<\/h4>\n<ul>\n<li>Give transitioned images a similar aspect ratio in both views. The default animation for view transitions is more of a cross-fade than a blend. Matching aspect ratios will look smoother during the transition.<\/li>\n<li>For smoother text transitions, consider utilizing the CSS properties <code>width: max-content;<\/code> and <code>max-width: 100%;<\/code> Depending on the length and style of text, this approach can result in a more seamless blend. Additionally, animating text that has the same or similar number of lines in both views will further contribute to a smoother and more cohesive transition.<\/li>\n<\/ul>\n<h3>iOS and Other Apple Platforms<\/h3>\n<p>A SwiftUI View Modifier called <a href=\"https:\/\/www.hackingwithswift.com\/quick-start\/swiftui\/how-to-synchronize-animations-from-one-view-to-another-with-matchedgeometryeffect\" target=\"_blank\" rel=\"noopener\">matchedGeometryEffect<\/a> provides a process for animating between views very similar to the web\u2019s View Transitions API. It&#8217;s a declarative API that is flexible in terms of layout structure.<\/p>\n<h4>Data Model<\/h4>\n<p>There are a dozen ways of managing state in Apple apps. Here&#8217;s what our Article model looks like.<\/p>\n<pre><code>class Article: Identifiable {\n    var title = \"How Now Brown Cow? Nursery Rhymes in the Age of Artificial Intelligence\"\n    var content = \"Lorem ipsum dolor ist amet\"\n    var image = \"hexter\"\n\n    \/\/ MARK: for animations\n    var titleId: String { \"article \\(id) title\" }\n    var imageId: String { \"article \\(id) image\" }\n}<\/code><\/pre>\n<p>Note <code>titleId<\/code> and <code>imageId<\/code>. These will give us ids for shared elements that are unique per article. This is needed to distinguish between articles.<\/p>\n<h4>Create The List and Detail Views<\/h4>\n<p>Next, lets create a View that changes based on some state.<\/p>\n<pre><code>enum BlogViewState {\n    case normal\n    case article(article: Article)\n}\n\nstruct BlogView: View {\n    \/\/...\n\n    @State private var state: BlogViewState\n\n    var body: some View {\n        switch state {\n        case .normal:\n            \/\/ show a list of articles...\n\n        case .article(let article):\n            \/\/ show the full article...\n        }\n    }\n}<\/code><\/pre>\n<h4>Set up the Transition<\/h4>\n<p>Next, we add a namespace for this animation. SwiftUI uses namespaces to prevent animations from conflicting.<\/p>\n<pre><code>struct BlogView: View {\n    \/\/...\n    @Namespace private var articleAnimationNamespace\n}<\/code><\/pre>\n<p>Next, we add the <code>.matchedGeometryEffect<\/code> modifier to the elements we want to transition. We need to give the shared elements matching ids on both views.<\/p>\n<pre><code>case .normal:\n    \/\/ somewhere in a list of article previews ...\n    Text(article.title)\n        .matchedGeometryEffect(id: article.titleId, in: articleAnimationNamespace)\n    Image(article.image)\n        .matchedGeometryEffect(id: article.imageId, in: articleAnimationNamespace)\n\ncase .article(let article):\n    \/\/...\n    Text(article.title)\n        .matchedGeometryEffect(id: article.titleId, in: articleAnimationNamespace)\n    Image(article.image)\n        .matchedGeometryEffect(id: article.imageId, in: articleAnimationNamespace)<\/code><\/pre>\n<h4>Trigger the Transition<\/h4>\n<p>Now, we\u2019ll add some code to switch between the views. Note that we need to change the state using a special method <code>withAnimation<\/code> to tell SwiftUI that the change should trigger a transition.<\/p>\n<pre><code>case .normal:\n    \/\/ ...\n    VStack {\n        \/\/ article preview layout...\n    }\n    .onTapGesture { \n       withAnimation {\n           state = .article(article: article)\n       }\n    }<\/code><\/pre>\n<h4>Result<\/h4>\n<p>Now, when we tap on the article:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-32071 size-full\" src=\"https:\/\/hexboxdev.wpenginepowered.com\/wp-content\/uploads\/2023\/06\/transition-mobile.gif\" alt=\"iPhone showing a blog article expanding in a Shared Element Transition\" width=\"259\" height=\"520\" \/><\/p>\n<p>In theory, the process is concise and straightforward. However, in practice, these transitions can require lots of trial-and-error to get right, particularly when combining them with other SwiftUI modifiers like <code>.edgesIgnoringSafeArea<\/code>. If you intend to use this API, I suggest starting your experimentation in code before choosing a design. It could save you a lot of frustration.<\/p>\n<h4>Support<\/h4>\n<p><code>.matchedGeometryEffect<\/code> is supported on iOS 14 and later, which is widely adopted. If you need to support older iOS versions, you may need to add a check for the iOS version to prevent errors.<\/p>\n<h4>Tips<\/h4>\n<ul>\n<li>Experiment with the <code>properties:<\/code> and <code>anchor:<\/code> arguments of <code>matchedGeometryEffect<\/code>. Text boxes, for example, should not animate their size because the characters will wrap, and they should have a stable top leading corner when moving.<\/li>\n<li>Experiment with the structure of the elements. Things like <code>.clipPath<\/code> and <code>ScrollView<\/code> can have various undesirable effects on the transition.<\/li>\n<\/ul>\n<h3>Android<\/h3>\n<p>Shared Element Transitions in Android can be implemented in quite a few ways. It\u2019s difficult to tell exactly which method is best. It will depend highly on how your app navigation is set up. I will show one way that works with Android\u2019s newest <a href=\"https:\/\/developer.android.com\/guide\/navigation\/get-started\" target=\"_blank\" rel=\"noopener\">graph-based navigation<\/a>. I won\u2019t explain as much of the Android code because it&#8217;s a bit more verbose than other platforms.<\/p>\n<h4>Set up Navigation<\/h4>\n<p>First, set up your navigation graph. A navigation graph describes how users can navigate between screens in your app. I have two screens that users can navigate between, a list view and a detail view. The navigation graph looks like this in Android Studio:<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-32069 size-full\" src=\"https:\/\/hexboxdev.wpenginepowered.com\/wp-content\/uploads\/2023\/06\/android-nav-graph.jpg\" alt=\"nav_graph.xml in Android studio\" width=\"1064\" height=\"892\" srcset=\"https:\/\/hexboxdev.wpenginepowered.com\/wp-content\/uploads\/2023\/06\/android-nav-graph.jpg 1064w, https:\/\/hexboxdev.wpenginepowered.com\/wp-content\/uploads\/2023\/06\/android-nav-graph-300x252.jpg 300w, https:\/\/hexboxdev.wpenginepowered.com\/wp-content\/uploads\/2023\/06\/android-nav-graph-1024x858.jpg 1024w, https:\/\/hexboxdev.wpenginepowered.com\/wp-content\/uploads\/2023\/06\/android-nav-graph-768x644.jpg 768w\" sizes=\"auto, (max-width: 1064px) 100vw, 1064px\" \/><\/p>\n<h4>The Article Class<\/h4>\n<p>There are a thousand ways to manage state in Android. Our article data looks something like this:<\/p>\n<pre><code>data class Article(\n    val title: String,\n) {\n    val id = UUID.randomUUID().toString()\n    val imageId: String get() = \"article $id image\"\n    val titleId: String get() = \"article $id title\"\n}<\/code><\/pre>\n<p>Note <code>imageId<\/code> and <code>titleId<\/code>. This gives us unique ids that we can use to identify shared elements on the source and target screens. If they weren&#8217;t unique, Android won&#8217;t be able to distinguish article images and titles from each other on the article list page (and the program will crash!).<\/p>\n<h4>Setting up the Source View (the List View)<\/h4>\n<p>First, in the code for the list view, we apply the ids to each shared element&#8217;s <code>transitionName<\/code>.<\/p>\n<pre><code>val article = articles[index]\n\/\/ ...\nlistItem.textView.transitionName = article.titleId\nlistItem.imageView.transitionName = article.imageId<\/code><\/pre>\n<p>Next, when we tap the article, we navigate to the target view (the detail view). When we do this, we have to add some extra info to tell Android to transition the shared elements.<\/p>\n<pre><code>val extras = FragmentNavigatorExtras(\n    textView to article.titleId,\n    imageView to article.imageId\n)\nview.findNavController().navigate(R.id.articleListToDetails, null, null, extras)<\/code><\/pre>\n<h4>Setting up the Target View (the Detail View)<\/h4>\n<p>On the target view (the article detail view), we need to add an enter transition. First we create an xml file at <code>res\/transitions\/shared_element.xml<\/code>. This file tells Android what it should animate on the shared views.<\/p>\n<pre><code>&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\n&lt;transitionSet&gt;\n    &lt;changeImageTransform\/&gt;\n    &lt;changeBounds\/&gt;\n    &lt;changeTransform\/&gt;\n&lt;\/transitionSet&gt;<\/code><\/pre>\n<p>Next, apply the enter transition to the target view.<\/p>\n<pre><code>override fun onCreate(savedInstanceState: Bundle?) {\n    \/\/ ...\n    sharedElementEnterTransition = TransitionInflater.from(requireContext())\n        .inflateTransition(R.transition.shared_element)\n}<\/code><\/pre>\n<p>Finally, since we need the <code>transitionName<\/code>s to be unique per article, we have to set these ids dynamically in the detail view. More, we need to set the ids before the transition starts. Android provides <code>postponeEnterTransition()<\/code> and <code>startPostponedEnterTransition()<\/code> for this purpose.<\/p>\n<pre><code>override fun onCreate(\/* ... *\/) {\n    \/\/ ...\n    postponeEnterTransition()\n}<\/code><\/pre>\n<p>Now, we add <code>transitionName<\/code>s to the shared elements.<\/p>\n<pre><code>override fun onCreateView(\/* ... *\/) {\n    \/\/ ...\n    val title = view.findViewById&lt;TextView&gt;(R.id.article_title)\n    title.transitionName = article.titleId\n    \n    val image = view.findViewById&lt;ImageView&gt;(R.id.article_image)\n    image.transitionName = article.imageId\n}<\/code><\/pre>\n<p>Finally, we resume the transition once the view has finished initializing.<\/p>\n<pre><code>override fun onViewCreated(\/* ... *\/) {\n    \/\/ ...\n    startPostponedEnterTransition()\n}<\/code><\/pre>\n<h4>Result<\/h4>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-32072 size-full\" src=\"https:\/\/hexboxdev.wpenginepowered.com\/wp-content\/uploads\/2023\/06\/transition-android.gif\" alt=\"Android phone demonstrating a blog article opening to show the full details with a Shared Element Transition\" width=\"251\" height=\"520\" \/><\/p>\n<p>Once you find the correct transition process to use for your navigation setup, it should be fairly straightforward to implement. Though, since Android requires more setup and more files than other platforms, it will take some time and debugging to make things work as expected.<\/p>\n<h3>Cross-Platform<\/h3>\n<p>Similar solutions are available on popular cross-platform solutions as well. I haven\u2019t explored these thoroughly.<\/p>\n<h4>React Native<\/h4>\n<p>There&#8217;s no built-in process for shared element transitions. But <code>react-native-shared-element<\/code> is <a href=\"https:\/\/github.com\/IjzerenHein\/react-native-shared-element\" target=\"_blank\" rel=\"noopener\">a popular community library<\/a> for achieving this effect. For those looking for something closer to a standard API, Expo (one of the de-facto standard frameworks for react native) is working on an <a href=\"https:\/\/docs.expo.dev\/versions\/latest\/sdk\/shared-element\/\" target=\"_blank\" rel=\"noopener\">API for this<\/a>. It&#8217;s in alpha, so it&#8217;s not yet ready for use.<\/p>\n<h4>Flutter<\/h4>\n<p>Flutter calls these transitions <a href=\"https:\/\/docs.flutter.dev\/ui\/animations\/hero-animations\" target=\"_blank\" rel=\"noopener\">&#8220;Hero animations,&#8221;<\/a> presumably because elements &#8220;fly&#8221; from one screen to the other. I haven&#8217;t tried it yet, but the API seems about as simple as the web&#8217;s View Transitions API.<\/p>\n<h2>Shared Element Transitions Can Be Easy<\/h2>\n<p>You can build these view transitions today on some platforms without too much of a hassle. But expect some degree of debugging and compromise. If you&#8217;re interested in digging deeper to see what it takes, take a look at working example code at <a href=\"https:\/\/github.com\/sep\/shared-element-transition-examples\" target=\"_blank\" rel=\"noopener\">this GitHub repo<\/a>.<\/p>\n<div style=\"background-color: #eceeff; padding: 30px; width: 80%;\">\n<h2>Let&#8217;s build awesome things together.<\/h2>\n<p>Our approach to Product Design &amp; UX is holistic, integrating business, tech, user needs, and market demands.<\/p>\n<p><a href=\"https:\/\/hexboxdev.wpenginepowered.com\/custom-software-services\/software-product-design\/\">Explore Software Product Design Services \u00bb<\/a><\/p>\n<\/div>\n<p><strong>You Might Also Like<\/strong><\/p>\n<ul>\n<li><a href=\"https:\/\/hexboxdev.wpenginepowered.com\/blog\/10-figma-shortcuts-to-improve-your-ui-design-proficiencies\/\">10 Figma Shortcuts to Improve Your UI Design Proficiencies<\/a><\/li>\n<li><a href=\"https:\/\/hexboxdev.wpenginepowered.com\/blog\/6-tips-for-designing-a-dark-mode-version-of-your-app\/\">Welcome to the Dark Side: 6 Tips for Designing a Dark Mode Version of Your App<\/a><\/li>\n<li><a href=\"https:\/\/hexboxdev.wpenginepowered.com\/our-work\/case-study\/using-collaboration-to-build-a-better-product\/\">Indianapolis Web Development Example: Using Collaboration to Build a Better Product (Case Study)<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>What are Shared Element Transitions? Shared Element Transitions are animations that move elements from one screen to another within an app. They help users understand how the interface changes when navigating between screens. They are particularly effective when users are browsing diverse content and frequently switching back and forth between screens. These transitions can be [&hellip;]<\/p>\n","protected":false},"author":32,"featured_media":32068,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"content-type":"","associated_team_member":0,"associated_user_id":0,"footnotes":""},"categories":[273,256,268,366],"tags":[398,254,295,274,292,367],"service":[],"class_list":["post-32064","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mobile","category-product-design-ux","category-programming","category-web","tag-android","tag-design","tag-ios","tag-mobile","tag-ux","tag-web"],"_links":{"self":[{"href":"https:\/\/hexboxdev.wpenginepowered.com\/wp-json\/wp\/v2\/posts\/32064","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hexboxdev.wpenginepowered.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hexboxdev.wpenginepowered.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hexboxdev.wpenginepowered.com\/wp-json\/wp\/v2\/users\/32"}],"replies":[{"embeddable":true,"href":"https:\/\/hexboxdev.wpenginepowered.com\/wp-json\/wp\/v2\/comments?post=32064"}],"version-history":[{"count":0,"href":"https:\/\/hexboxdev.wpenginepowered.com\/wp-json\/wp\/v2\/posts\/32064\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hexboxdev.wpenginepowered.com\/wp-json\/wp\/v2\/media\/32068"}],"wp:attachment":[{"href":"https:\/\/hexboxdev.wpenginepowered.com\/wp-json\/wp\/v2\/media?parent=32064"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hexboxdev.wpenginepowered.com\/wp-json\/wp\/v2\/categories?post=32064"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hexboxdev.wpenginepowered.com\/wp-json\/wp\/v2\/tags?post=32064"},{"taxonomy":"service","embeddable":true,"href":"https:\/\/hexboxdev.wpenginepowered.com\/wp-json\/wp\/v2\/service?post=32064"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}