aem headless react doc. Ensure the new Single line text input is selected on the left, and the Properties. aem headless react doc

 
 Ensure the new Single line text input is selected on the left, and the Propertiesaem headless react doc  The AEM Headless SDK is available for various platforms: AEM 6

With Headless Adaptive Forms, you can streamline the process of building. AEM Headless supports a offset/limit and cursor-based pagination queries to smaller subsets of a larger result set. Community. GraphQL queries. Let’s set it to use Google’s Material UI: Ensure that the starter kit is not running. This is the same framework used to translate other AEM content, such as Pages, Experience Fragments, Assets, and Forms. AEM GraphQL API provides a powerful query language to expose data of Content Fragments to JavaScript clients in Headless CMS implementations. This is the same framework used to translate other AEM content, such as Pages, Experience Fragments, Assets, and Forms. Tap Home and select Edit from the top action bar. In, some versions of AEM (6. In the query editor, create a few different. Learn to use modern front-end tools, like a webpack dev server, to rapidly develop the SPA against the AEM JSON model API. REACT_APP_BASIC_AUTH_USER: the AEM username by the SPA to authenticate while retrieving AEM content. AEM 6. AEM supports client-defined GraphQL queries, however it is AEM best practice to use persisted GraphQL queries. Learn how to create a SPA using the React JS framework with AEM's SPA Editor. A classic Hello World message. Remote Renderer Configuration. Locate the Layout Container editable area right above the Itinerary. When this content is ready, it is replicated to the publish instance. React Router is a collection of navigation components for React applications. Now viewingOverview. This React application demonstrates how to query content using AEM’s GraphQL APIs using persisted queries. js application run from the command line to update asset metadata on AEM as a Cloud Service using Assets HTTP API. js app uses AEM GraphQL persisted queries to query. Learn how to use Headless principles with React 11/26/2019. The GraphiQL Explorer tool enables developers to create, and test queries against content on the current AEM environment. Overview; Single-page app; Web Component; Mobile; Server-to-server; Configurations. Prerequisites. Next page. Below is a summary of how the React application is built, how it connects to AEM Headless to retrieve content using GraphQL persisted queries, and how that data is presented. This end-to-end tutorial continues the basic tutorial that covered the fundamentals of Adobe Experience Manager (AEM) Headless and GraphQL. GraphQL queries. This Next. js JSS app with advanced Sitecore editors. An end-to-end tutorial illustrating how to build-out and expose content using AEM Headless. In the future, AEM is planning to invest in the AEM GraphQL API. X. If you are. View the source code on GitHub. AEM provides a Translation Integration Framework for headless content, allowing Content Fragments and supporting assets to be easily translated for use across locales. Departs. Populates the React Edible components with AEM’s content. React apps should use the AEM Headless Client for JavaScript to interact with AEM’s GraphQL APIs. To support AEM Content Service’s JSON export of Pages and Components, the Pages and Components must derive from AEM WCM Core Components. The AEM Headless SDK is set of libraries that can be used by clients to quickly and easily interact with AEM Headless APIs over HTTP. Wrap the React app with an initialized ModelManager, and render the React app. In the Content Fragment Editor, the multi-line text field’s menu bar provides authors with standard rich text formatting capabilities, such as bold, italics, and underline. When authorizing requests to AEM as a Cloud Service, use. We’ll cover retrieving Content Fragment data from AEM’s GraphQL APIs and displaying it in the React app. This server-to-server application demonstrates how to query content using AEM’s GraphQL APIs using persisted queries and print it on terminal. AEM Headless as a Cloud Service. Enable Headless Adaptive Forms on AEM 6. They are suitable only for content pages. The full code can be found on GitHub. Overview; 1 - Content modeling; 2 - AEM Headless APIs and React; 3 - Complex. AEM Headless APIs allow accessing AEM content from any. Last update: 2023-04-19. Level 2: In addition to level one: The RemotePage component can be used to embed the external SPA into AEM where AEM content can be viewed in-context. Enter the preview URL for the Content Fragment. arunpatidar. References to other content, such as images or other Content Fragments can be dynamically inserted in-line within the flow of the text. Build Engaging Forms Using Core Components and Headless Adaptive Forms on AEM 6. Author services require authentication, so the app uses the admin. js is a React framework that provides a lot of useful features out of the box. json Welcome to this tutorial chapter where we will explore configuring a React app to connect with Adobe Experience Manager (AEM) Headless APIs using the AEM Headless SDK. This guide uses the AEM as a Cloud Service SDK. AEM Headless SDK. Example applications are a great way to explore the headless capabilities of Adobe Experience Manager (AEM). Formerly referred to as the Uberjar; Javadoc Jar - The. Topics: GraphQL API. It also provides an optional challenge to apply your AEM. Learn how to extend the JSON Model for an existing Core Component to be used with the AEM SPA Editor. It then dives down into the construction of the page and how the SPA application relates to and interacts with the AEM SPA Editor. Next Steps. The AEM Headless Client for Java is used to execute the GraphQL queries and map data to Java objects to power the app. The full code can be found on GitHub. Webpack 5+ The AEM Headless JS SDK has dependencies on util which is not included in Webpack 5+ by default. DuoTone, Lab, and Indexed color spaces are not supported. Example applications are a great way to explore the headless capabilities of Adobe Experience Manager (AEM). The srcset and sources use a custom setParams function to append the web-optimized delivery query parameter to the _dynamicUrl of the image, so change the. New useEffect hooks can be created for each persisted query the React app uses. Learn. On this page. Enable developers to add automation to. The React app should contain one instance of the <Page> component exported from @adobe/aem-react-editable-components. Example applications are a great way to explore the headless capabilities of Adobe Experience Manager (AEM). js app is built, how it connects to AEM Headless to retrieve content using GraphQL persisted queries, and how that data is presented. The AEM Headless client, provided by. The following are required to follow this quick setup: AEM as a Cloud Service Sandbox environment. A “Hello World” Text component displays, as this was automatically added when generating the project from the AEM Project archetype. js based, Headless CMS that saves developers a lot of development time while giving them the freedom to use their favorite tools and frameworks. The advanced tutorial illustrates in-depth aspects of working with Content Fragment Models, Content Fragments, and the AEM GraphQL persisted queries, including using the GraphQL. AEM components, that maps to editable React components, must implement AEM’s Component Exporter framework - such as AEM Core WCM. Please find my comments inline in green. The examples below use small subsets of results (four records per request) to demonstrate the techniques. Multiple requests can be made to collect as many results as required. New useEffect hooks can be created for each persisted query the React app uses. Adobe Experience Manager (AEM) is the leading experience management platform. Spectrum provides adaptive, accessible, and cohesive experiences for all Adobe applications. The following are required to follow this quick setup: AEM as a Cloud Service Sandbox environment. js app is built, how it connects to AEM Headless to retrieve content using GraphQL persisted queries, and how that data is presented. By leveraging AEM Headless APIs, you can retrieve content, assets, and data from your AEM instance and use them to power your React application. A “Hello World” Text component displays, as this was automatically added when generating the project from the AEM Project archetype. This chapter walks you through the steps to integrate the persisted queries with the WKND client application (aka WKND App) using HTTP GET requests within existing React components. The AEM Headless client, provided by. This end-to-end tutorial continues the basic tutorial that covered the fundamentals of Adobe Experience Manager (AEM) Headless and GraphQL. js application is invoked from the command line. For a step-by-step guide to creating your own SPA, see the Getting Started with the AEM SPA Editor - WKND Events Tutorial. They allow you to prepare content ready for use in multiple locations/over multiple channels, ideal for headless delivery. Looking for a hands-on. Populates the React Edible components with AEM’s content. Preview URLs, using URL expressions, are set on the Content Fragment Model’s Properties. Dynamic navigation is implemented using Angular routes and added to an existing Header component. You can't add SPA react component to normal AEM page OOTB. This Android application demonstrates how to query content using the GraphQL APIs of AEM. Persisted queries. Install the AEM SDK, add sample content and deploy an application that consumes content from AEM using its GraphQL APIs. The <Page> component has logic to dynamically create React components based on the. Persisted queries. View the source code on GitHub. This simple React app uses the AEM Headless SDK to query AEM Headless APIs for an Adventure content, and displays the web-optimized image using img element with srcset and picture element. Experience League. Learn how AEM can go beyond a pure headless use case, with options for in-context authoring and experience management. AEM Headless as a Cloud Service. Last update: 2023-08-16. The following diagram illustrates the architecture of integrating a Next. This guide uses the AEM as a Cloud Service SDK. js 14+. Developer. The page content architecture of /content/wknd-mobile/en/api has been pre-built. The AEM Headless quick setup gets you hands-on with AEM Headless using content from the WKND Site sample project, and a sample React App (a SPA) that consumes the content over AEM Headless GraphQL APIs. This Android application demonstrates how to query content using the GraphQL APIs of AEM. This end-to-end tutorial continues the basic tutorial that covered the fundamentals of Adobe Experience Manager (AEM) Headless and GraphQL. This multi-part tutorial walks through the implementation of a React application for a fictitious lifestyle brand, the WKND. npm module; Github project; Adobe documentation; For more details and code. A Next. Slider and richtext are two sample custom components available in the starter app. One of these powerful features is API. This allows the engineering team to build the bulk of the site components outside of AEM and to scale. 4: Using Headless Principles with React. There are several other imports from @adobe/aem-core-components-react-spa and @adobe/aem-core-components-react-base. All of the WKND Mobile components used in this. If I click into one of the adventures, I can see more details about the adventure including the activity, type and itinerary. react. GraphQL queries. The AEM Headless quick setup gets you hands-on with AEM Headless using content from the WKND Site sample project, and a sample React App (a SPA) that consumes the content over AEM Headless GraphQL APIs. This multi-part tutorial walks through the implementation of a React application for a fictitious lifestyle brand, the WKND. From the command line navigate into the aem-guides-wknd-spa. This simple React app uses the AEM Headless SDK to query AEM Headless APIs for an Adventure content, and displays the web-optimized image using img element with srcset and picture element. supports headless CMS scenarios where external client applications render experiences using content managed in AEM. This simple React app uses the AEM Headless SDK to query AEM Headless APIs for an Adventure content, and displays the web-optimized image using img element with srcset and picture element. Open the Page Editor’s side bar, and select the Components view. This example, loosely based on the AEM Headless React app, illustrates how AEM GraphQL API requests can be configured to connect to different AEM Services based on environment variables. Persisted queries. Learn how to extend an existing Core Component to be used with the AEM SPA Editor. For an overview of how a simple SPA in AEM is structured and how it works, see the getting started guide for both React and Angular. Update the WKND App. Once headless content has been translated,. This simple React app uses the AEM Headless SDK to query AEM Headless APIs for an Adventure content, and displays the web-optimized image using img element with srcset and picture element. AEM supports client-defined GraphQL queries, however it is AEM best practice to use persisted GraphQL queries. For publishing from AEM Sites using Edge Delivery Services, click here. The AEM Headless SDK is available for various platforms: AEM Headless SDK for client-side browsers (JavaScript) AEM Headless SDK for server-side/Node. GraphQL queries. Onboard Radiance of the Seas. Learn how to create a custom weather component to be used with the AEM SPA Editor. You can also select the components to be available for use within a specific paragraph system. I checked the Adobe documentation, including the link you provided. ” Tutorial - Getting Started with AEM Headless and GraphQL. , reducers). Overview; 1 - Content modeling; 2 - AEM Headless APIs and React; 3 - Complex. Below is a summary of how the Next. React apps should use the AEM Headless Client for JavaScript to interact with AEM’s GraphQL APIs. Learn to use the delegation pattern for extending Sling Models and. See moreAEM Headless APIs and React. React example. The project used in this chapter will serve as the basis for an implementation of the WKND SPA and is built upon in future chapters. AEM must know where the remotely-rendered content can be retrieved. Following AEM Headless best practices, the Next. New useEffect hooks can be created for each persisted query the React app uses. Q: “How is the GraphQL API for AEM different from Query Builder API?” A: “The AEM GraphQL API offers total control on the JSON output, and is an industry standard for querying content. react. The AEM Headless quick setup gets you hands-on with AEM Headless using content from the WKND Site sample project, and a sample React App (a SPA) that consumes the content over AEM Headless GraphQL APIs. The. More tutorials. Prerequisites. The advanced tutorial illustrates in-depth aspects of working with Content Fragment Models, Content Fragments, and the AEM GraphQL persisted queries, including using the GraphQL persisted queries. Wrap the React app with an initialized ModelManager, and render the React app. Below is a summary of how the Next. This document provides and overview of the different models and describes the levels of SPA integration. React is a popular JavaScript library for building user interfaces, known for its simplicity, reusability, and component-based architecture. Learn how to create a SPA using the React JS framework with AEM's SPA Editor. AEM Headless Translation Journey - This documentation journey gives you a broad understanding of headless. Next. The advanced tutorial illustrates in-depth aspects of working with Content Fragment Models, Content Fragments, and the AEM GraphQL persisted. Organize and structure content for your site or app. The srcset and sources use a custom setParams function to append the web-optimized delivery query parameter to the _dynamicUrl of the. The AEM Headless SDK is set of libraries that can be used by clients to quickly and easily interact with AEM Headless APIs over HTTP. Welcome to a multi-part tutorial designed for developers new to the SPA Editor feature in Adobe Experience. Prerequisites. This example, loosely based on the AEM Headless React app, illustrates how AEM GraphQL API requests can be configured to connect to different AEM Services based on environment variables. Certain points on the SPA can also be enabled to allow limited editing in AEM. In a real application, you would use a larger. It also provides an optional challenge to apply your AEM. This EditableTitle React component wraps the Title React component, wrapping and decorating it to be editable in AEM SPA Editor. AEM offers the flexibility to exploit the advantages of both models in one project. If you are using Webpack 5. Next page. This is the same framework used to translate other AEM content, such as Pages, Experience Fragments, Assets, and Forms. Command line parameters define: The AEM as a Cloud Service Author. AEM’s headless features. Hi , The Headless implementation of AEM uses Content Fragments Models and Content Fragments to focus on the creation of structured, channel-neutral, and reusable fragments of content and their cross-channel delivery. The completed SPA, deployed to AEM, can be dynamically authored with traditional in-line editing tools of. package. AEM Headless APIs and React. This end-to-end tutorial continues the basic tutorial that covered the fundamentals of Adobe Experience Manager (AEM) Headless and GraphQL. Following AEM Headless best practices, the React application uses AEM GraphQL persisted queries to query adventure. This chapter walks you through the steps to integrate the persisted queries with the WKND client application (aka WKND App) using HTTP GET requests within existing React components. This user guide contains videos and tutorials helping you maximize your value from AEM. Image. AEM Headless tutorials - If you prefer to learn by doing and have existing knowledge of AEM, take our hands-on tutorials organized by API and framework, that explore creating and using applications built on AEM Headless. AEM Headless clients operating in a production capacity typically interact with AEM Publish, which contains the approved, published content. Created for: Intermediate. Example applications are a great way to explore the headless capabilities of Adobe Experience Manager (AEM). There are several other imports from @adobe/aem-core-components-react-spa and @adobe/aem-core-components-react-base. Prerequisites. Ensure the new Single line text input is selected on the left, and the Properties. AEM as a Cloud Service lets you capitalize on the AEM applications in a cloud-native way, so that you can: Scale your DevOps efforts with Cloud Manager: CI/CD framework, autoscaling, API connectivity, flexible deployment modes, code quality gates, service delivery transparency, and guided updates. Prerequisites. We have come up with a comprehensive step-by-step guide to help you out while working on AEM 6. The advanced tutorial illustrates in-depth aspects of working with Content Fragment Models, Content Fragments, and the AEM GraphQL persisted queries, including using the GraphQL. Repeat the above steps to create a fragment representing Alison Smith:4 - Build a React app; Advanced Tutorial. 5 and React integration. Typical AEM as a Cloud Service headless deployment. Update the WKND App. Courses Recommended courses Tutorials Certification Events Instructor-led training Browse content library View all. Click Create and give the new endpoint a name and choose the newly created configuration. Under the hood, Atomic relies on the Coveo Headless library to interface with Coveo and handle the search application state. For publishing from AEM Sites using Edge Delivery Services, click here. Persisted queries. AEM Forms Headless Adaptive Forms provide a fast and efficient way to create forms for various platforms including Headless or Headful CMS, React applications, Single Page Applications (SPA), Web Apps, Mobile apps, Amazon Alexa, Google Assistant, WhatsApp, and more. New useEffect hooks can be created for each persisted query the React app uses. These are importing the React Core components and making them available in the current project. 4 - Build a React app; Advanced Tutorial. Following AEM Headless best practices, the React application uses AEM GraphQL persisted queries to. Navigate to Tools > General > Content Fragment Models. This tutorial explores how AEM Content Services can be used to power the experience of an Mobile App that displays Event information (music, performance, art, etc. Explore the power of a headless CMS with a free, hands-on trial. Below is a summary of how the React application is built, how it connects to AEM Headless to retrieve content using GraphQL persisted queries, and how that data is presented. The following are required to follow this quick setup: AEM as a Cloud Service Sandbox environment. Content Fragment models define the data schema that is. 5 has enhanced its digital customer experience services by providing better content personalization, content fragment enhancements, and easier authoring. Example applications are a great way to explore the headless capabilities of Adobe Experience Manager (AEM). Understand how the Content Fragment Model. Content populating the editable React components, must be exposed via AEM pages that extend the SPA Page component. The tagged content node’s NodeType must include the cq:Taggable mixin. This tutorial uses a simple Node. Example applications are a great way to explore the headless capabilities of Adobe Experience Manager (AEM). In this video, the following capabilities or features are covered: These consoles let you import and manage digital assets such as images, videos, documents and audio files. Once headless content has been translated,. By leveraging AEM Headless APIs, you can retrieve content, assets, and data from your AEM instance and use them to power your React application. This is done via the RemoteContentRenderer - Configuration Factory OSGi service. This method can then be consumed by your own applications. AEM has multiple options for defining headless endpoints and delivering its content as JSON. These are then mapped to project specific AEM components using the MapTo, just like with the Text component. AEM provides a Translation Integration Framework for headless content, allowing Content Fragments and supporting assets to be easily translated for use across locales. Clients interacting with AEM Author need to take special care, as. AEM pages. GraphQL queries. Next, explore the power of AEM’s GraphQL API using the built-in GraphiQL Explorer. Learn how to develop author dialogs and Sling Models to extend the JSON model to populate a custom component. Learn to use the delegation pattern for extending Sling Models and. The minimal set of dependencies for the React app to use AEM React Editable Components v2 are: @adobe/aem-react-editable-components, @adobe/aem-spa-component-mapping, and @adobe/aem-spa-page-model-manager. js implements custom React hooks. Adobe Experience Manager projects can be implemented in both headful and headless models, but the choice is not binary. Example applications are a great way to explore the headless capabilities of Adobe Experience Manager (AEM). Now viewingReact Spectrum. The AEM Headless quick setup gets you hands-on with AEM Headless using content from the WKND Site sample project, and a sample React App (a SPA) that consumes the content over AEM Headless GraphQL APIs. Example applications are a great way to explore the headless capabilities of Adobe Experience Manager (AEM). Update Policies in AEM. Learn to use modern front-end tools, like a webpack dev server, to rapidly develop the SPA against the AEM JSON model API. GraphQL, a flexible query language for APIs, provides an efficient and precise way to request specific data from your AEM instance, enabling a seamless integration between React and AEM. To tag content and use the AEM Tagging infrastructure : The tag must exist as a node of type cq:Tag under the taxonomy root node. Build from existing content model templates or create your own. The srcset and sources use a custom setParams function to append the web-optimized delivery query parameter to the _dynamicUrl of the. Webpack 5+ The AEM Headless JS SDK has dependencies on util which is not included in Webpack 5+ by default. View again. Learn how to create a SPA using the React JS framework with AEM's SPA Editor. js: Execute SSR/ISR from AEM GraphQL API on a separate server that is not AEM. Following AEM Headless best practices, the Next. Prerequisites. Option 1: Centralize the logic and broadcast to the necessary components for example by using React Context. This server-to-server application demonstrates how to query content using AEM’s GraphQL APIs using persisted queries and print it on terminal. Welcome to this tutorial chapter where we will explore configuring a React app to connect with Adobe Experience Manager (AEM) Headless APIs using the AEM Headless SDK. In this video you will: Learn how to create and define a Content Fragment Model. This server-to-server application demonstrates how to. In 2018, the cruise port handled. AEM Headless tutorials - If you prefer to learn by doing and have existing knowledge of AEM, take our hands-on tutorials organized by API and framework, that explore creating and using applications built on AEM Headless. AEM Headless as a Cloud Service. With that said, AEM as a Cloud Service removes the cache header if it detects that it has been applied to what it detects to be uncacheable by Dispatcher, as described in Dispatcher documentation. APIs can then be called to retrieve this content. With a traditional AEM component, an HTL script is typically required. These are importing the React Core components and making them available in the current project. AEM supports client-defined GraphQL queries, however it is AEM best practice to use persisted GraphQL queries. Navigate to Tools > GraphQL. An end-to-end tutorial illustrating advanced concepts of Adobe Experience Manager (AEM) GraphQL APIs. Getting Started with AEM Headless; Getting Started with AEM SPA Editor and React; Getting Started with AEM and Adobe Target; AEM 6. This simple React app uses the AEM Headless SDK to query AEM Headless APIs for an Adventure content, and displays the web-optimized image using img element with srcset and picture element. This React application demonstrates how to query content using AEM’s GraphQL APIs using persisted queries. AEM Headless single-page app (SPA) deployments involve JavaScript-based applications built using frameworks such as React or Vue, that consume and interact with content in AEM in a headless manner. The AEM project is bootstrapped with a very simple starting point for the Angular SPA. With Headless Adaptive Forms, you can streamline the process of. React has three advanced patterns to build highly-reusable functional components. The following video provides an overview of basic handling when using the AEM author environment. Example applications are a great way to explore the headless capabilities of Adobe Experience Manager (AEM). Below is a summary of how the React application is built, how it connects to AEM Headless to retrieve content using GraphQL persisted queries, and how that data is presented. The AEM Headless quick setup gets you hands-on with AEM Headless using content from the WKND Site sample project, and a sample React App (a SPA) that consumes the content over AEM Headless GraphQL APIs. supports headless CMS scenarios where external client applications render experiences using content managed in AEM. Learn how to integrate AEM Headless with Adobe Target, by exporting AEM Content Fragments to Adobe Target, and use them to personalize headless experiences using the Adobe Experience Platform Web SDK’s alloy. AEM supports client-defined GraphQL queries, however it is AEM best practice to use persisted GraphQL queries. AEM has multiple options for defining headless endpoints and delivering its content as JSON. AEM Headless as a Cloud Service. This session dedicated to the query builder is useful for an overview and use of the tool. Enable developers to add automation. How to organize and AEM Headless project. AEM supports client-defined GraphQL queries, however it is AEM best practice to use persisted GraphQL queries. For convenience, this quick start connects the React app to AEM Author. X) the GraphiQL Explorer (aka GraphiQL IDE) tool needs to be manually installed, follow instruction from here. AEM Headless Tutorial - React App by Adobe Docs Abstract Example applications are a great way to explore the headless capabilities of Adobe Experience. Looking for a hands-on. Learn about the various deployment considerations for AEM Headless apps. Experience League. Select Edit from the mode-selector. View the source code on GitHub. Headful and Headless in AEM; Headless Experience Management. The AEM Headless Client for JavaScript is used to execute the GraphQL persisted queries that power the app. js app is built, how it connects to AEM Headless to retrieve content using GraphQL persisted queries, and how that data is presented. Create your first React Single Page Application (SPA) that is editable in Adobe Experience Manager AEM with the WKND SPA. AEM supports client-defined GraphQL queries, however it is AEM best practice to use persisted GraphQL queries. AEM Headless Translation Journey - This documentation journey gives you a broad understanding of headless. Slider and richtext are two sample custom components available in the starter app. Build Engaging Forms Using Core Components and Headless Adaptive Forms on AEM 6. Welcome to this tutorial chapter where we will explore configuring a React app to connect with Adobe Experience Manager (AEM) Headless APIs using the AEM Headless SDK. AEM Local Development Access Tokens are used to accelerate the development of integrations with AEM as a Cloud Service that programmatically interacts with AEM Author or Publish services over HTTP. The absence of a headless architecture can lead to several challenges, including siloed development, slower time-to-market, heavy IT dependency, difficulty in. 5 also includes several digital experience platform features such as GraphQL support, built-in Adobe Target integration, and a new user interface for the AEM Screens device. GraphQL, a flexible query language for APIs, provides an efficient and precise way to request specific data from your AEM instance, enabling a seamless integration between React and AEM. 4 - Build a React app; Advanced Tutorial. The GraphiQL tool enables developers to create and test queries against content on the current AEM environment. AEM Preview is intended for internal audiences, and not for the general delivery of content. The engine’s state depends on a set of features (i.