{"id":259082,"date":"2024-09-09T22:13:33","date_gmt":"2024-09-09T22:13:33","guid":{"rendered":"https:\/\/michigandigitalnews.com\/index.php\/2024\/09\/09\/jetpack-compose-apis-for-building-adaptive-layouts-using-material-guidance-now-stable\/"},"modified":"2025-06-25T17:11:26","modified_gmt":"2025-06-25T17:11:26","slug":"jetpack-compose-apis-for-building-adaptive-layouts-using-material-guidance-now-stable","status":"publish","type":"post","link":"https:\/\/michigandigitalnews.com\/index.php\/2024\/09\/09\/jetpack-compose-apis-for-building-adaptive-layouts-using-material-guidance-now-stable\/","title":{"rendered":"Jetpack Compose APIs for building adaptive layouts using Material guidance now stable"},"content":{"rendered":"<p> [ad_1]<br \/>\n<\/p>\n<div>\n<meta content=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEhjQjeNUPPsxNcdHmOSd54uH6MSoMiJysuH_kAdzzhyMmhxWpeepDnS6GP0dhoPP7U9RLHENlmaOOQNpKcTR1MA21TinJdXfc73BJFrGqg3SdhceL_bjIhW99PSgvZFZzPqR_kDCCnjVakUiKn_KMZCvOlD4FWqbCTAy5vbNMh6qjyJ1qKouAzjef3DFfQ\/s1600\/Android-Large-Screen-Form-Factors-Social.png\" name=\"twitter:image\"\/><br \/>\n<img decoding=\"async\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEhjQjeNUPPsxNcdHmOSd54uH6MSoMiJysuH_kAdzzhyMmhxWpeepDnS6GP0dhoPP7U9RLHENlmaOOQNpKcTR1MA21TinJdXfc73BJFrGqg3SdhceL_bjIhW99PSgvZFZzPqR_kDCCnjVakUiKn_KMZCvOlD4FWqbCTAy5vbNMh6qjyJ1qKouAzjef3DFfQ\/s1600\/Android-Large-Screen-Form-Factors-Social.png\" style=\"display: none;\"\/><\/p>\n<p><em>Posted by <author>Alex Vanyo \u2013 Developer Relations Engineer<\/author><\/em><\/p>\n<p>The 1.0 stable version of <a href=\"https:\/\/developer.android.com\/jetpack\/androidx\/releases\/compose-material3-adaptive\" target=\"_blank\" rel=\"noopener\">the Compose adaptive APIs with Material guidance<\/a> is out, ready to be used in production. The library helps you build <a href=\"https:\/\/developer.android.com\/develop\/ui\/compose\/layouts\/adaptive\" target=\"_blank\" rel=\"noopener\">adaptive layouts<\/a> that provide an optimized user experience on any window size.<\/p>\n<p><iframe title=\"Android Dev Story: SAP integrated NavigationSuiteScaffold within 5 minutes, creating an adaptive UI\" width=\"1200\" height=\"675\" src=\"https:\/\/www.youtube.com\/embed\/Nwnj01s-gOo?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/p>\n<p>The team at SAP Mobile Start were early adopters of the Compose adaptive APIs. It took their developers <a href=\"https:\/\/android-developers.googleblog.com\/2024\/09\/sap-integrates-compose-adaptive-api-for-responsive-navigation-ui.html\" target=\"_blank\" rel=\"noopener\">only five minutes to integrate the <span style=\"font-family: Courier;\">NavigationSuiteScaffold<\/span><\/a> from the new Compose Material 3 adaptive library, rapidly adapting the app\u2019s navigation UI to different window sizes.<\/p>\n<p>Each of the new components in the library, <span style=\"color: #0d904f; font-family: Courier;\">NavigationSuiteScaffold<\/span>, <span style=\"color: #0d904f; font-family: Courier;\">ListDetailPaneScaffold<\/span> and <span style=\"color: #0d904f; font-family: Courier;\">SupportingPaneScaffold<\/span> are <i>adaptive<\/i>: based on the window size and posture, different components are displayed to the user based on which one is most appropriate in the current context. This helps build UI that adapts to a wide variety of window sizes instead of just stretching layouts.<\/p>\n<p>For an overview of the components, check out the dedicated <a href=\"https:\/\/www.youtube.com\/watch?v=xPUZENis4gc\" target=\"_blank\" rel=\"noopener\">I\/O session<\/a> and our <a href=\"https:\/\/developer.android.com\/develop\/ui\/compose\/layouts\/adaptive\" target=\"_blank\" rel=\"noopener\">new documentation<\/a> pages to get started.<\/p>\n<p>In this post, we\u2019re going to take a more detailed look at the layering of the new library so you have a better understanding of how customisable it is, to fit a wide variety of use cases you might have.<\/p>\n<p>Similar to <a href=\"https:\/\/developer.android.com\/develop\/ui\/compose\/layering\" target=\"_blank\" rel=\"noopener\">Compose itself<\/a>, the adaptive libraries are layered into multiple dependencies, so that you can choose the appropriate level of abstraction for your application.There are four new artifacts as part of the adaptive libraries:<\/p>\n<ul>\n<ul>\n<li>For the core building blocks for building adaptive UI, including computing the window size class and the current posture, add <span style=\"color: #0d904f; font-family: Courier;\">androidx.compose.material3.adaptive:adaptive:1.0.0<\/span><\/li>\n<\/ul>\n<ul>\n<li>For implementing multi-pane layouts, add <span style=\"color: #0d904f; font-family: Courier;\">androidx.compose.material3.adaptive:adaptive-layout:1.0.0<\/span><\/li>\n<\/ul>\n<ul>\n<li>For standalone navigators for the multi-pane scaffold layouts, add <span style=\"color: #0d904f; font-family: Courier;\">androidx.compose.material3.adaptive:adaptive-navigation:1.0.0<\/span><\/li>\n<\/ul>\n<ul>\n<li>For implementing adaptive navigation UI, add <span style=\"color: #0d904f; font-family: Courier;\">androidx.compose.material3:material3-adaptive-navigation-suite:1.3.0<\/span><\/li>\n<\/ul>\n<\/ul>\n<p>The libraries have the following dependencies:<\/p>\n<p><image><\/p>\n<div style=\"text-align: center;\"><img decoding=\"async\" alt=\"Flow diagram showing dependencies between material3-adaptive 1.0.0 and material 1.3.0 libraries\" border=\"0\" id=\"imgCaption\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEijyMpfuQveO7_inLD_hYQiSP4RHLx9NJX7dF_J3_EYDhzPmCLIPUw_4dhxBgdz8u-OAoH7SBm-_SwNsutG23cxPDsBCR_lJNJjbt_j4UZ4nGYmakHQw3OSZ6Q2qf2UOj2K5gQ0GlR-LYECwhFSBjUK7zaKlZ0nG7nkKU28qC66_vo_BjhPgTZmX_f-L3w\/s1600\/image2.png\" width=\"100%\"\/><\/div>\n<p><imgcaption><center><em>New library dependency graph<\/em><\/center><\/imgcaption><\/image><\/p>\n<p>To explore this layering more, let\u2019s start with the highest level example with the most built-in functionality using a <span style=\"color: #0d904f; font-family: Courier;\">NavigableListDetailPaneScaffold<\/span> from <span style=\"color: #0d904f; font-family: Courier;\">androidx.compose.material3.adaptive:adaptive-navigation<\/span>:<\/p>\n<div style=\"background: rgb(248, 248, 248); border: 0px; overflow: auto; width: auto;\">\n<pre style=\"line-height: 125%; margin: 0px;\"><span style=\"font-family: courier;\">val navigator <span style=\"color: #666666;\">=<\/span> rememberListDetailPaneScaffoldNavigator<span style=\"color: #666666;\">&lt;<\/span>Any<span style=\"color: #666666;\">&gt;()<\/span>\n\nNavigableListDetailPaneScaffold<span style=\"color: #666666;\">(<\/span>\n    navigator <span style=\"color: #666666;\">=<\/span> navigator<span style=\"color: #666666;\">,<\/span>\n    listPane <span style=\"color: #666666;\">=<\/span> <span style=\"color: #666666;\">{<\/span>\n        <span style=\"color: #408080; font-style: italic;\">\/\/ List pane<\/span>\n    <span style=\"color: #666666;\">},<\/span>\n    detailPane <span style=\"color: #666666;\">=<\/span> <span style=\"color: #666666;\">{<\/span>\n        <span style=\"color: #408080; font-style: italic;\">\/\/ Detail pane<\/span>\n    <span style=\"color: #666666;\">},<\/span>\n<span style=\"color: #666666;\">)<\/span><\/span>\n<\/pre>\n<\/div>\n<p>This snippet of code gives you all of our recommended adaptive behavior out of the box for a list-detail layout: determining how many panes to show based on the current window size, hiding and showing the correct pane when the window size changes depending on the previous state of the UI, and having the back button conditionally bring the user back to the list, depending on the window size and the current state.<\/p>\n<p><image><\/p>\n<div style=\"text-align: center;\"><img decoding=\"async\" alt=\"A list layout adapting to and from a list detail layout depending on the window size\" border=\"0\" id=\"imgCaption\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEjfcVgJvk0K6ANCGUEBcCP7XnCjkVRYNynUiNGWz_pmukdMi_tFqXzaZTnGbYnlNSouFaNBC7KP0HpVaXXkoPtCDZ0uWPkBgbKgsucj5H6k44SSmZypBPM3eZvzwNZZdAEf5U8SrMvgL3xmWdBsraS1fu_wgViyUPW1YpPoqBDONSf6WIklmM9vJxaTGsE\/s1600\/image1.gif\" width=\"100%\"\/><\/div>\n<p><\/image><\/p>\n<p>This encapsulates a lot of behavior \u2013 and this might be all you need, and you don\u2019t need to go any deeper!<\/p>\n<p>However, there may be reasons why you may want to tweak this behavior, or more directly manage the state by hoisting parts of it in a different way.<\/p>\n<p>Remember, each layer builds upon the last. This snippet is at the outermost layer, and we can start unwrapping the layers to customize it where we need.<\/p>\n<p>Let\u2019s go one level deeper with <span style=\"color: #0d904f; font-family: Courier;\">NavigableListDetailPaneScaffold<\/span> and drop down one layer. Behavior won\u2019t change at all with these direct inlinings, since we are just inlining the default behavior at each step:<\/p>\n<p>(Fun fact: You can follow along with this directly in Android Studio and for any other component you desire. If you choose <b>Refactor &gt; Inline<\/b> function, you can directly replace a component with its implementation. You can\u2019t delete the original function in the library of course.)<\/p>\n<div style=\"background: rgb(248, 248, 248); border: 0px; overflow: auto; width: auto;\">\n<pre style=\"line-height: 125%; margin: 0px;\"><span style=\"font-family: courier;\">val navigator <span style=\"color: #666666;\">=<\/span> rememberListDetailPaneScaffoldNavigator<span style=\"color: #666666;\">&lt;<\/span>Any<span style=\"color: #666666;\">&gt;()<\/span>\n\nBackHandler<span style=\"color: #666666;\">(<\/span>\n    enabled <span style=\"color: #666666;\">=<\/span> navigator<span style=\"color: #666666;\">.<\/span><span style=\"color: #7d9029;\">canNavigateBack<\/span><span style=\"color: #666666;\">(<\/span>BackNavigationBehavior<span style=\"color: #666666;\">.<\/span><span style=\"color: #7d9029;\">PopUntilContentChange<\/span><span style=\"color: #666666;\">)<\/span>\n<span style=\"color: #666666;\">)<\/span> <span style=\"color: #666666;\">{<\/span>\n    navigator<span style=\"color: #666666;\">.<\/span><span style=\"color: #7d9029;\">navigateBack<\/span><span style=\"color: #666666;\">(<\/span>BackNavigationBehavior<span style=\"color: #666666;\">.<\/span><span style=\"color: #7d9029;\">PopUntilContentChange<\/span><span style=\"color: #666666;\">)<\/span>\n<span style=\"color: #666666;\">}<\/span>\nListDetailPaneScaffold<span style=\"color: #666666;\">(<\/span>\n    directive <span style=\"color: #666666;\">=<\/span> navigator<span style=\"color: #666666;\">.<\/span><span style=\"color: #7d9029;\">scaffoldDirective<\/span><span style=\"color: #666666;\">,<\/span>\n    value <span style=\"color: #666666;\">=<\/span> navigator<span style=\"color: #666666;\">.<\/span><span style=\"color: #7d9029;\">scaffoldValue<\/span><span style=\"color: #666666;\">,<\/span>\n    listPane <span style=\"color: #666666;\">=<\/span> <span style=\"color: #666666;\">{<\/span>\n        <span style=\"color: #408080; font-style: italic;\">\/\/ List pane<\/span>\n    <span style=\"color: #666666;\">},<\/span>\n    detailPane <span style=\"color: #666666;\">=<\/span> <span style=\"color: #666666;\">{<\/span>\n        <span style=\"color: #408080; font-style: italic;\">\/\/ Detail pane<\/span>\n    <span style=\"color: #666666;\">},<\/span>\n<span style=\"color: #666666;\">)<\/span><\/span>\n<\/pre>\n<\/div>\n<p>With the first inlining, we see the <span style=\"color: #0d904f; font-family: Courier;\">BackHandler<\/span> that <span style=\"color: #0d904f; font-family: Courier;\">NavigableListDetailPaneScaffold<\/span> includes by default. If using <span style=\"color: #0d904f; font-family: Courier;\">ListDetailPaneScaffold<\/span> directly, back handling is left up to the developer to include and hoist to the appropriate place.<\/p>\n<p>This also reveals how the navigator provides two pieces of state to control the <span style=\"color: #0d904f; font-family: Courier;\">ListDetailPaneScaffold<\/span>:<\/p>\n<ul>\n<ul>\n<li><span style=\"color: #0d904f; font-family: Courier;\">directive<\/span> \u2014- how the panes should be arranged in the <span style=\"color: #0d904f; font-family: Courier;\">ListDetailPaneScaffold<\/span>, and <\/li>\n<\/ul>\n<ul>\n<li><span style=\"color: #0d904f; font-family: Courier;\">value<\/span> \u2014- the current state of the panes, as calculated from the directive and the current navigation state.<\/li>\n<\/ul>\n<\/ul>\n<p>These are both controlled by the navigator, and the next unpeeling shows us the default arguments to the navigator for <span style=\"color: #0d904f; font-family: Courier;\">directive<\/span> and the adapt strategy, which is used to calculate <span style=\"color: #0d904f; font-family: Courier;\">value<\/span>:<\/p>\n<div style=\"background: rgb(248, 248, 248); border: 0px; overflow: auto; width: auto;\">\n<pre style=\"line-height: 125%; margin: 0px;\"><span style=\"font-family: courier;\">val navigator <span style=\"color: #666666;\">=<\/span> rememberListDetailPaneScaffoldNavigator<span style=\"color: #666666;\">&lt;<\/span>Any<span style=\"color: #666666;\">&gt;(<\/span>\n    scaffoldDirective <span style=\"color: #666666;\">=<\/span> calculatePaneScaffoldDirective<span style=\"color: #666666;\">(<\/span>currentWindowAdaptiveInfo<span style=\"color: #666666;\">()),<\/span>\n    adaptStrategies <span style=\"color: #666666;\">=<\/span> ListDetailPaneScaffoldDefaults<span style=\"color: #666666;\">.<\/span><span style=\"color: #7d9029;\">adaptStrategies<\/span><span style=\"color: #666666;\">(),<\/span>\n<span style=\"color: #666666;\">)<\/span>\n\nBackHandler<span style=\"color: #666666;\">(<\/span>\n    enabled <span style=\"color: #666666;\">=<\/span> navigator<span style=\"color: #666666;\">.<\/span><span style=\"color: #7d9029;\">canNavigateBack<\/span><span style=\"color: #666666;\">(<\/span>BackNavigationBehavior<span style=\"color: #666666;\">.<\/span><span style=\"color: #7d9029;\">PopUntilContentChange<\/span><span style=\"color: #666666;\">)<\/span>\n<span style=\"color: #666666;\">)<\/span> <span style=\"color: #666666;\">{<\/span>\n    navigator<span style=\"color: #666666;\">.<\/span><span style=\"color: #7d9029;\">navigateBack<\/span><span style=\"color: #666666;\">(<\/span>BackNavigationBehavior<span style=\"color: #666666;\">.<\/span><span style=\"color: #7d9029;\">PopUntilContentChange<\/span><span style=\"color: #666666;\">)<\/span>\n<span style=\"color: #666666;\">}<\/span>\nListDetailPaneScaffold<span style=\"color: #666666;\">(<\/span>\n    directive <span style=\"color: #666666;\">=<\/span> navigator<span style=\"color: #666666;\">.<\/span><span style=\"color: #7d9029;\">scaffoldDirective<\/span><span style=\"color: #666666;\">,<\/span>\n    value <span style=\"color: #666666;\">=<\/span> navigator<span style=\"color: #666666;\">.<\/span><span style=\"color: #7d9029;\">scaffoldValue<\/span><span style=\"color: #666666;\">,<\/span>\n    listPane <span style=\"color: #666666;\">=<\/span> <span style=\"color: #666666;\">{<\/span>\n        <span style=\"color: #408080; font-style: italic;\">\/\/ List pane<\/span>\n    <span style=\"color: #666666;\">},<\/span>\n    detailPane <span style=\"color: #666666;\">=<\/span> <span style=\"color: #666666;\">{<\/span>\n        <span style=\"color: #408080; font-style: italic;\">\/\/ Detail pane<\/span>\n    <span style=\"color: #666666;\">},<\/span>\n<span style=\"color: #666666;\">)<\/span><\/span>\n<\/pre>\n<\/div>\n<p>The directive controls the behavior for how many panes to show and the pane spacing, based on <span style=\"color: #0d904f; font-family: Courier;\">currentWindowAdaptiveInfo<\/span>, which contains the size and posture of the window.<\/p>\n<p>This can be customized with a different directive, to show two panes side-by-side at a smaller medium width:<\/p>\n<div style=\"background: rgb(248, 248, 248); border: 0px; overflow: auto; width: auto;\">\n<pre style=\"line-height: 125%; margin: 0px;\"><span style=\"font-family: courier;\">val navigator <span style=\"color: #666666;\">=<\/span> rememberListDetailPaneScaffoldNavigator<span style=\"color: #666666;\">&lt;<\/span>Any<span style=\"color: #666666;\">&gt;(<\/span>\n    scaffoldDirective <span style=\"color: #666666;\">=<\/span> calculatePaneScaffoldDirectiveWithTwoPanesOnMediumWidth<span style=\"color: #666666;\">(<\/span>currentWindowAdaptiveInfo<span style=\"color: #666666;\">()),<\/span>\n    adaptStrategies <span style=\"color: #666666;\">=<\/span> ListDetailPaneScaffoldDefaults<span style=\"color: #666666;\">.<\/span><span style=\"color: #7d9029;\">adaptStrategies<\/span><span style=\"color: #666666;\">(),<\/span>\n<span style=\"color: #666666;\">)<\/span><\/span>\n<\/pre>\n<\/div>\n<p>By default, showing two panes at a medium width can result in UI that is too narrow, especially for complex content. However, this can be a good option to use the window space more optimally by showing two panes for less complex content.<\/p>\n<p>The <span style=\"font-family: Courier;\"><a href=\"https:\/\/developer.android.com\/reference\/kotlin\/androidx\/compose\/material3\/adaptive\/layout\/AdaptStrategy\" target=\"_blank\" rel=\"noopener\">AdaptStrategy<\/a><\/span> controls what happens to panes when there isn\u2019t enough space to show all of them. Right now, this always hides panes for which there isn\u2019t enough space.<\/p>\n<p>This directive is used by the navigator to drive its logic and, combined with the adapt strategy to determine the scaffold value, the resulting target state for each of the panes.<\/p>\n<p>The scaffold directive and the scaffold value are then passed to the <span style=\"color: #0d904f; font-family: Courier;\">ListDetailPaneScaffold<\/span>, driving the behavior of the scaffold.<\/p>\n<p>This layering allows hoisting the scaffold state away from the display of the scaffold itself. This layering also allows custom implementations for controlling how the scaffold works and for hoisting related state. For example, if you are using a custom navigation solution instead of the navigator, you could drive the <span style=\"color: #0d904f; font-family: Courier;\">ListDetailPaneScaffold<\/span> directly with state derived from your custom navigation solution.<\/p>\n<p>The layering is enforced in the library with the different artifacts:<\/p>\n<ul>\n<ul>\n<li><span style=\"color: #0d904f; font-family: Courier;\">androidx.compose.material3.adaptive:adaptive<\/span> contains the underlying methods to calculate the current window adaptive info<\/li>\n<\/ul>\n<ul>\n<li><span style=\"color: #0d904f; font-family: Courier;\">androidx.compose.material3.adaptive:adaptive-layout<\/span> contains the layouts <span style=\"color: #0d904f; font-family: Courier;\">ListDetailPaneScaffold<\/span> and <span style=\"color: #0d904f; font-family: Courier;\">SupportingPaneScaffold<\/span><\/li>\n<\/ul>\n<ul>\n<li><span style=\"color: #0d904f; font-family: Courier;\">androidx.compose.material3.adaptive:adaptive-navigation<\/span> contains the navigator APIs (like <span style=\"color: #0d904f; font-family: Courier;\">rememberListDetailPaneScaffoldNavigator<\/span>)<\/li>\n<\/ul>\n<\/ul>\n<p>Therefore, if you aren\u2019t going to use the navigator and instead use a custom navigation solution, you can skip using <span style=\"color: #0d904f; font-family: Courier;\">androidx.compose.material3.adaptive:adaptive-navigation<\/span> and depend on <span style=\"color: #0d904f; font-family: Courier;\">androidx.compose.material3.adaptive:adaptive-layout<\/span> directly.<\/p>\n<p>When adding the <a href=\"https:\/\/developer.android.com\/jetpack\/androidx\/releases\/compose-material3-adaptive\" target=\"_blank\" rel=\"noopener\">Compose Adaptive library<\/a> to your app, start with the most fully featured layer, and then unwrap if needed to tweak behavior. As we continue to work on the library and add new features, we\u2019ll keep adding them to the appropriate layer. Using the higher-level layers will mean that you will be able to get these new features most easily. If you need to, you can use lower layers to get more fine-grained control, but that also means that more responsibility for behavior is transferred to your app, just like the layering in Compose itself.<\/p>\n<p>Try out the new components today, and send us your <a href=\"https:\/\/issuetracker.google.com\/issues\/new?component=742043\" target=\"_blank\" rel=\"noopener\">feedback<\/a> for bugs and feature requests.<\/p>\n<\/div>\n<p>[ad_2]<br \/>\n<br \/><a href=\"http:\/\/android-developers.googleblog.com\/2024\/09\/jetpack-compose-apis-for-building-adaptive-layouts-material-guidance-now-stable.html\">Source link <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>[ad_1] Posted by Alex Vanyo \u2013 Developer Relations Engineer The 1.0 stable version of the Compose adaptive APIs with Material guidance is out, ready to<\/p>\n","protected":false},"author":1,"featured_media":259083,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[146],"tags":[],"_links":{"self":[{"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/posts\/259082"}],"collection":[{"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/comments?post=259082"}],"version-history":[{"count":0,"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/posts\/259082\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/media\/259083"}],"wp:attachment":[{"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/media?parent=259082"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/categories?post=259082"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/tags?post=259082"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}