diff --git a/CODEOWNERS b/CODEOWNERS
index a630dbace1..f9d33fc4a7 100644
--- a/CODEOWNERS
+++ b/CODEOWNERS
@@ -5,7 +5,7 @@
# For more details, read the following article on GitHub: https://help.github.com/articles/about-codeowners/.
# These are the default owners for the whole content of the `luigi` repository. The default owners are automatically added as reviewers when you open a pull request, unless different owners are specified in the file.
-* @pekura @maxmarkus @jesusreal @hardl @antiheld @johannesdoberer @marynaKhromova @zarkosimic
+* @pekura @maxmarkus @hardl @antiheld @johannesdoberer @marynaKhromova @zarkosimic
# Owners of all .md files in the repository
*.md @bszwarc @kazydek @klaudiagrz @tomekpapiernik @mmitoraj @alexandra-simeonova @majakurcius
diff --git a/README.md b/README.md
index 017976160e..26c4ea1528 100644
--- a/README.md
+++ b/README.md
@@ -57,7 +57,8 @@ import {
// } from '@kyma-project/luigi-client';
```
->**NOTE**: The angular example application is not fully compatible with IE11.
+
+> **NOTE**: The angular example application is not fully compatible with IE11.
## Development
@@ -71,8 +72,8 @@ For security reasons, follow these guidelines when developing a micro frontend:
- Maintain a whitelist with trusted domains and compare it with the origin of the Luigi Core application. The origin will be passed when you call the init listener in your micro frontend. Stop further processing if the origin does not match.
->**NOTE**: Luigi follows these [sandbox rules for iframes](https://github.com/SAP/luigi/blob/af1deebb392dcec6490f72576e32eb5853a894bc/core/src/utilities/helpers/iframe-helpers.js#L140).
-
+
+> **NOTE**: Luigi follows these [sandbox rules for iframes](https://github.com/SAP/luigi/blob/af1deebb392dcec6490f72576e32eb5853a894bc/core/src/utilities/helpers/iframe-helpers.js#L140).
### Code formatting for contributors
diff --git a/client/public/luigi-client.d.ts b/client/public/luigi-client.d.ts
index 3a1259ec09..21e9a59b0c 100644
--- a/client/public/luigi-client.d.ts
+++ b/client/public/luigi-client.d.ts
@@ -395,7 +395,8 @@ export type getContext = () => Context;
/**
* Returns the node parameters of the active URL.
* Node parameters are defined like URL query parameters but with a specific prefix allowing Luigi to pass them to the micro frontend view. The default prefix is **~** and you can use it in the following way: `https://my.luigi.app/home/products?~sort=asc~page=3`.
- * >**NOTE:** some special characters (`<`, `>`, `"`, `'`, `/`) in node parameters are HTML-encoded.
+ *
+ * > **NOTE:** some special characters (`<`, `>`, `"`, `'`, `/`) in node parameters are HTML-encoded.
* @returns {Object} node parameters, where the object property name is the node parameter name without the prefix, and its value is the value of the node parameter. For example `{sort: 'asc', page: 3}`.
* @memberof Lifecycle
*/
@@ -406,7 +407,8 @@ export type getNodeParams = () => NodeParams;
* Returns the dynamic path parameters of the active URL.
* Path parameters are defined by navigation nodes with a dynamic **pathSegment** value starting with **:**, such as **productId**.
* All path parameters in the current navigation path (as defined by the active URL) are returned.
- * >**NOTE:** some special characters (`<`, `>`, `"`, `'`, `/`) in path parameters are HTML-encoded.
+ *
+ * > **NOTE:** some special characters (`<`, `>`, `"`, `'`, `/`) in path parameters are HTML-encoded.
* @returns {Object} path parameters, where the object property name is the path parameter name without the prefix, and its value is the actual value of the path parameter. For example ` {productId: 1234, ...}`.
* @memberof Lifecycle
*/
diff --git a/client/src/lifecycleManager.js b/client/src/lifecycleManager.js
index c9324210a2..d17cd73661 100644
--- a/client/src/lifecycleManager.js
+++ b/client/src/lifecycleManager.js
@@ -341,7 +341,8 @@ class LifecycleManager extends LuigiClientBase {
/**
* Returns the node parameters of the active URL.
* Node parameters are defined like URL query parameters but with a specific prefix allowing Luigi to pass them to the micro frontend view. The default prefix is **~** and you can use it in the following way: `https://my.luigi.app/home/products?~sort=asc~page=3`.
- * >**NOTE:** some special characters (`<`, `>`, `"`, `'`, `/`) in node parameters are HTML-encoded.
+ *
+ * > **NOTE:** some special characters (`<`, `>`, `"`, `'`, `/`) in node parameters are HTML-encoded.
* @returns {Object} node parameters, where the object property name is the node parameter name without the prefix, and its value is the value of the node parameter. For example `{sort: 'asc', page: 3}`
* @memberof Lifecycle
*/
@@ -352,7 +353,8 @@ class LifecycleManager extends LuigiClientBase {
* Returns the dynamic path parameters of the active URL.
* Path parameters are defined by navigation nodes with a dynamic **pathSegment** value starting with **:**, such as **productId**.
* All path parameters in the current navigation path (as defined by the active URL) are returned.
- * >**NOTE:** some special characters (`<`, `>`, `"`, `'`, `/`) in path parameters are HTML-encoded.
+ *
+ * > **NOTE:** some special characters (`<`, `>`, `"`, `'`, `/`) in path parameters are HTML-encoded.
* @returns {Object} path parameters, where the object property name is the path parameter name without the prefix, and its value is the actual value of the path parameter. For example ` {productId: 1234, ...}`
* @memberof Lifecycle
*/
diff --git a/client/src/linkManager.js b/client/src/linkManager.js
index 32680fc041..24a67c962d 100644
--- a/client/src/linkManager.js
+++ b/client/src/linkManager.js
@@ -84,8 +84,8 @@ export class linkManager extends LuigiClientBase {
* @example
* LuigiClient.linkManager().openAsModal('projects/pr1/users', {title:'Users', size:'m'});
*/
- openAsModal(path, modalSettings) {
- this.navigate(path, 0, true, modalSettings || {});
+ openAsModal(path, modalSettings = {}) {
+ this.navigate(path, 0, true, modalSettings);
}
/**
diff --git a/core/examples/luigi-sample-angular/README.md b/core/examples/luigi-sample-angular/README.md
index a94559fae6..fcb871deb1 100644
--- a/core/examples/luigi-sample-angular/README.md
+++ b/core/examples/luigi-sample-angular/README.md
@@ -4,7 +4,8 @@
This is the Angular-based sample application which runs with Luigi framework.
->**NOTE:** The authorization flow in this application is a mock implementation for local development. **DO NOT USE IN PRODUCTION!**
+
+> **NOTE:** The authorization flow in this application is a mock implementation for local development. **DO NOT USE IN PRODUCTION!**
## Development
diff --git a/core/src/utilities/helpers/routing-helpers.js b/core/src/utilities/helpers/routing-helpers.js
index 836c46a516..390ee12b38 100644
--- a/core/src/utilities/helpers/routing-helpers.js
+++ b/core/src/utilities/helpers/routing-helpers.js
@@ -30,7 +30,17 @@ class RoutingHelpersClass {
return lastElement.defaultChildNode;
} else if (children && children.length) {
const rootPath = pathData.navigationPath.length === 1;
- if (rootPath) return children[0].pathSegment;
+ if (rootPath) {
+ const firstNodeWithPathSegment = children.find(
+ child => child.pathSegment
+ );
+ return (
+ (firstNodeWithPathSegment && firstNodeWithPathSegment.pathSegment) ||
+ console.error(
+ 'At least one navigation node in the root hierarchy must have a pathSegment.'
+ )
+ );
+ }
const validChild = children.find(
child =>
child.pathSegment &&
diff --git a/docs/README.md b/docs/README.md
index 1d04ba330d..3af9b1e28e 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -32,9 +32,9 @@ To configure your Luigi application, simply edit the files in the `luigi-config`
* [Navigation (basic)](navigation-configuration.md) - configure basic top and side navigation, links, and categories.
* [Navigation (advanced)](navigation-advanced.md) - create a dynamic path, reuse micro frontends with the same origin, and configure additional navigation elements.
-* [Routing](navigation-parameters-reference.md#routing) - define routing options for your application.
+* [Full parameter reference](navigation-parameters-reference.md) - find all the parameters which you can use to configure Luigi navigation in one place.
* [Authorization](authorization-configuration.md) - configure login and security features for your application.
- * [Authorization events](authorization-events.md) - define event configuration used to react to Luigi authorization events.
+* [Authorization events](authorization-events.md) - define event configuration used to react to Luigi authorization events.
* [General settings](general-settings.md) - fully customize a micro frontend, define a header, make your application responsive, and more.
* [Lifecycle hooks](lifecycle-hooks.md) - execute custom logic on any of the Luigi lifecycle steps.
@@ -56,11 +56,12 @@ Read the Luigi Client API documentation to learn more about the functions and pa
* [UX Manager](luigi-client-api.md#uxmanager) - manage appearance options such as the behavior of backdrop or loading indicators.
## Advanced
-* [Communication](communication.md) describes how to send custom messages between Luigi Core and Client.
+
+[Communication](communication.md) describes how to send custom messages between Luigi Core and Client.
## Examples
-Check the Luigi [application examples](../core/examples/README.md) for an in-depth look at Luigi capabilities.
+Check the Luigi [application examples](../core/examples) for an in-depth look at Luigi capabilities.
## Development
diff --git a/docs/application-setup.md b/docs/application-setup.md
index 80b22f5877..8f46d75499 100644
--- a/docs/application-setup.md
+++ b/docs/application-setup.md
@@ -19,10 +19,10 @@ Prior to start developing with Luigi, you need to set up your application. This
Choose the framework to build your application:
-[Application setup without a framework](#noframework)
-[Angular 6](#angular6)
-[SAPUI5/OpenUI5](#sapui5)
-[VUE.JS](#vuejs)
+[Application setup without a framework](#application-setup-for-an-application-not-using-a-framework)
+[Angular 6](#application-setup-for-angular-6)
+[SAPUI5/OpenUI5](#application-setup-for-sapui5openui5)
+[VUE.JS](#application-setup-for-vuejs)
## Basic application setup
@@ -46,7 +46,8 @@ The examples on this page demonstrate commands that perform each of the necessar
### Application setup for an application not using a framework
->**NOTE:** You need a development server capable of hosting Single Page Applications. The recommended server is Live Server.
+
+> **NOTE:** You need a development server capable of hosting Single Page Applications. The recommended server is Live Server.
1. If you do not have Live Server installed, use this command to install it.
@@ -83,7 +84,8 @@ live-server --entry-file=index.html public
### Application setup for Angular 6
->**NOTE:** The Angular CLI is a prerequisite for this example.
+
+> **NOTE:** The Angular CLI is a prerequisite for this example.
1. If you do not have the Angular CLI installed, download and install it from [this URL](https://cli.angular.io/).
@@ -115,7 +117,8 @@ npm run start
### Application setup for SAPUI5/OpenUI5
->**NOTE:** Live Server must be installed as your development server.
+
+> **NOTE:** Live Server must be installed as your development server.
1. If you do not have Live Server installed, use this command to install it.
@@ -148,7 +151,8 @@ $ live-server --entry-file=index.html public
### Application setup for VUE.JS
->**NOTE:** The VUE CLI is a prerequisite for this example.
+
+> **NOTE:** The VUE CLI is a prerequisite for this example.
1. If you do not have VUE CLI installed, use this command to install it.
diff --git a/docs/authorization-configuration.md b/docs/authorization-configuration.md
index 10643c72de..e85b7fac34 100644
--- a/docs/authorization-configuration.md
+++ b/docs/authorization-configuration.md
@@ -15,7 +15,7 @@ meta -->
# Authorization configuration
-To configure authorization in Luigi, go to the `auth:` section of your project's `basicConfiguration.js` file. To see how authorization works, you can also go to the [Luigi Fiddle](https://fiddle.luigi-project.io) site and configure a sample application.
+To configure authorization in Luigi, go to the `auth:` section of your Luigi configuration file. To see how authorization works, you can also go to the [Luigi Fiddle](https://fiddle.luigi-project.io) site and configure a sample application.
Luigi provides OpenID Connect and OAuth2 Implicit Grant authorization out of the box. The **use** key defines the active authorization provider and the **disableAutoLogin** key allows you to disable the automatic login flow that is provided by default.
@@ -46,7 +46,7 @@ auth: {
openIdConnect: {
authority: 'https://example.com',
client_id: 'client',
- scope: 'audience:server:client_id:client openid profile email groups',
+ scope: 'audience:server:client_id:client openID profile email groups',
redirect_uri: '',
post_logout_redirect_uri: '/logout.html',
automaticSilentRenew: true,
diff --git a/docs/authorization-events.md b/docs/authorization-events.md
index 0c4d8c385e..c9a8348c4f 100644
--- a/docs/authorization-events.md
+++ b/docs/authorization-events.md
@@ -15,14 +15,15 @@ meta -->
# Authorization events
->**NOTE:** For learning and testing purposes, use the [Luigi Fiddle](https://fiddle.luigi-project.io) page where you can configure a sample Luigi application.
+
+>**TIP:** For learning and testing purposes, use the [Luigi Fiddle](https://fiddle.luigi-project.io) page where you can configure a sample Luigi application.
Luigi provides life cycle events which it can trigger internally or by authorization providers.
Events are part of the **auth** configuration object and have to be functions. They can be executed asynchronously.
An example events configuration looks as follows:
-```
+```javascript
auth: {
events: {
onAuthSuccessful: (settings, authData) => {},
@@ -45,7 +46,7 @@ You can disable the default behavior of `onAuthExpired` and `onAuthError` by mak
- `onAuthSuccessful` **[function](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/function)** is executed after logging in with the **authData** object parameter. If valid authorization data was found in the local storage, the function is not executed.
- `onAuthError` **[function](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/function)** is executed:
- by Luigi **reason** URL parameter with optional **error** URL parameter for detailed description was found on Luigi initialization. The OAuth2Provider uses this approach by redirecting from the authorization provider to `luigi.domain/?reason=someError&error=Error detail describe`.
- - by the OIDC provider if silent access token renewal fails
+ - by the OIDC provider if silent access token renewal fails
Return `false` to prevent redirecting to `logoutUrl` after executing this function. It goes to the Luigi main route `/` instead.
- `onAuthExpired` **[function](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/function)** is executed if the token expires during runtime, or if Luigi is opened with outdated authorization data in the local storage. Return `false` to prevent redirecting to `logoutUrl` after executing this function.
diff --git a/docs/communication.md b/docs/communication.md
index b2e44e1beb..95260ce844 100644
--- a/docs/communication.md
+++ b/docs/communication.md
@@ -15,7 +15,8 @@ meta -->
# Communication
->**NOTE:** For learning and testing purposes, use the [Luigi Fiddle](https://fiddle.luigi-project.io) page where you can configure a sample Luigi application.
+
+>**TIP:** For learning and testing purposes, use the [Luigi Fiddle](https://fiddle.luigi-project.io) page where you can configure a sample Luigi application.
## Custom messages
@@ -23,7 +24,7 @@ Luigi Core and Luigi Client can exchange custom messages in both directions.
### Luigi Client to Luigi Core
-For Luigi Client to send messages to Luigi Core, use the [*sendCustomMessage*](luigi-client-api.md#sendCustomMessage) method from Client API.
+For Luigi Client to send messages to Luigi Core, use the [sendCustomMessage](luigi-client-api.md#sendCustomMessage) method from Client API.
For Luigi Core to process custom messages, define a configuration similar to the following at the root level of your Luigi configuration object:
@@ -41,12 +42,12 @@ For Luigi Core to process custom messages, define a configuration similar to the
}
```
where the `my-custom-message.update-top-nav` key is the message id, and the value is the listener function for the custom message. The listener receives the following input parameters:
-- **customMessage** the [*message*](luigi-client-api.md#sendCustomMessage) sent by Luigi Client.
+- **customMessage** the [message](luigi-client-api.md#sendCustomMessage) sent by Luigi Client.
- **microfrontend** a micro frontend object as specified [here](luigi-core-api.md#getMicrofrontends).
- **navigation node** a [navigation node object](navigation-parameters-reference.md#Node-parameters).
### Luigi Core to Luigi Client
-For Luigi Core to send messages, use the [*customMessages*](luigi-core-api.md#customMessages) section from Core API. You can send a custom message to all rendered micro frontends, or to a specific one. For the latter, use the Core API [*elements*](luigi-core-api.md#elements) methods to retrieve micro frontends and select the one you want to send the custom message to.
+For Luigi Core to send messages, use the [customMessages](luigi-core-api.md#customMessages) section from Core API. You can send a custom message to all rendered micro frontends, or to a specific one. For the latter, use the Core API [elements](luigi-core-api.md#elements) methods to retrieve micro frontends and select the one you want to send the custom message to.
For Luigi Client to process the message, add and remove message listeners as described [here](luigi-client-api.md#addCustomMessageListener).
diff --git a/docs/faq.md b/docs/faq.md
new file mode 100644
index 0000000000..8bf1876436
--- /dev/null
+++ b/docs/faq.md
@@ -0,0 +1,69 @@
+
+
+# Frequently asked questions about Luigi
+
+
+
+### What is Luigi?
+
+Luigi is a micro frontend framework that helps you build modularizable, extensible, scalable and consistent UIs and web applications (for administrators and business users).
+
+### What are micro frontends?
+
+The term "micro frontends" extends the concepts of micro services to the frontend. It's an architectural style where big frontend monoliths are decomposed into smaller and simpler chunks to be developed, tested, deployed and maintained independently and rapidly (by many distributed teams), while still appearing to the customer as a one cohesive product.
+
+### Does Luigi deliver micro frontends?
+
+No, Luigi itself does not deliver any micro frontends. It is a framework that helps you develop micro frontends and connect them to web applications.
+
+### Where can I download Luigi?
+
+The Luigi project can be found on [GitHub](https://github.com/SAP/luigi). Depending on the UI framework you use, there are different setups for Luigi. You can find more information here: [application setup](application-setup.md).
+
+
+
+### The distributed development possibilities seem like a big advantage; is that just an additional benefit from using Luigi, or was that a main factor behind it?
+
+Development scalability was one of the main goals right from the beginning. There is a nice article on [martinfowler.com](https://martinfowler.com/articles/micro-frontends.html) explaining the benefits of a micro frontend architecture in general. All the disadvantages of the iframe approach mentioned in the article are solved with Luigi.
+
+### One of the potential issues with a micro frontend architecture is styling. You suggest to use the CSS elements of Fundamentals to solve that issue. Is that correct?
+
+It is crucial that all micro frontends in a solution follow the same design guidelines. Luigi's default UI styling is based on [Fundamentals](https://sap.github.io/fundamental-styles/) but it can be customised. If you don’t want to use Fundamentals, but Bootstrap, Material, or something else instead, you need to re-style the Luigi view components according to your design guidelines or replace them with your own components completely.
+
+
+
+
+
+### Luigi claims to be ‘technology agnostic’. Are you referring to the UI framework that can be used, or to some other technology?
+
+The main point is that you can choose any base frontend technology you prefer, such as UI5, Angular, React, or Vue. You can even mix them in one solution. One micro frontend can use UI5, while another is written in Angular and Fundamentals. The only thing that matters is that HTML/JavaScript/CSS resources are provided and served via HTTPS in the end. The fact that a micro frontend is its own web application also means that you have full freedom regarding your development toolchain and CI/CD solutions, and the web server you want to use (such as Nginx, Apache, Tomcat, or Github Pages).
+
+Last but not least, "technology agnostic" also means that there are no conflicts regarding any additional libraries you use, such as D3.js, Chart.js, or others. You can also avoid conflicts between different versions of the same library. Imagine a monolithic web application where a lot of teams are contributing and there has been a decision that Chart.js is the data visualization framework of choice, and then there is a need for updating the version, which potentially has breaking changes. In that case, all the teams have to be approached and asked if they use it, if their code is affected by the version update and, if so, when they can deliver the necessary changes. With Luigi, you don‘t have this management overhead at all.
+
+### Are there any equivalents of Luigi?
+
+Yes, there are several. Here are some of the most popular: [Mosaic](https://www.mosaic9.org/), [Single-spa](https://github.com/CanopyTax/single-spa), [OpenComponents](https://opencomponents.github.io/), [Piral](https://www.piral.io). Note that they are not 100% equivalents of Luigi!
+
+
+
+### Is Luigi already being used within any products, or is it still too new?
+
+Yes, it is already being used in production and close-to-production within SAP. For example in Kyma, SAP C/4HANA Cockpit, Context Driven Services, Konduit and Varkes. Outside of SAP, SAAS AG (partner) uses Luigi. Additionally, there are some POCs going on and we're supporting a few other customers and partners who want to start using Luigi soon.
+
diff --git a/docs/general-settings.md b/docs/general-settings.md
index 93d986f6d7..852acaea28 100644
--- a/docs/general-settings.md
+++ b/docs/general-settings.md
@@ -16,7 +16,7 @@ meta -->
# General settings
->**NOTE:** For learning and testing purposes, use the [Luigi Fiddle](https://fiddle.luigi-project.io) page where you can configure a sample Luigi application.
+>**TIP:** For learning and testing purposes, use the [Luigi Fiddle](https://fiddle.luigi-project.io) page where you can configure a sample Luigi application.
The configuration file contains a section called **Settings** in which you can configure additional Luigi options.
@@ -52,12 +52,12 @@ settings: {
* **header.altText** adds the HTML `alt` attribute to the logo image.
* **header.title** defines the top left navigation title.
* **header.favicon** defines the favicon. It requires a standard favicon file with the `.ico` extension, and 16x16px or 32x32px dimensions.
-* **responsiveNavigation** allows customizing the navigation display settings. For example, you can define a button which shows or completely hides the left navigation, or a button which collapses the navigation to only show the icons.
+* **responsiveNavigation** allows customizing the navigation display settings. For example, you can define a button which shows or completely hides the left navigation, or a button which collapses the navigation to only show the icons.
You can set the following values:
* `simple` displays the button on the left side of the top navigation regardless of the browser window´s size.
- * `simpleMobileOnly` displays the button on the left side of the top navigation when the browser window is narrower than `600px`.
+ * `simpleMobileOnly` displays the button on the left side of the top navigation when the browser window is narrower than `600px`.
* `semiCollapsible` displays the arrow button at the bottom of the left side navigation. Once you click the button, the navigation shows up or collapses.
-If you don't specify any value for **responsiveNavigation**, the buttons remain hidden. The same applies when you enable **hideSideNav** for the currently active navigation node.
+If you don't specify any value for **responsiveNavigation**, the buttons remain hidden. The same applies when you enable **hideSideNav** for the currently active navigation node.
* **sideNavFooterText** is a string displayed in a sticky footer inside the side navigation. It is a good place to display the version of your application.
* **customTranslationImplementation** provides a custom localization implementation. It can be an Object or a Function returning an Object. This Object must provide the **getTranslation** Function as property:
```javascript
@@ -67,17 +67,17 @@ If you don't specify any value for **responsiveNavigation**, the buttons remain
}
}
```
-
+
> **NOTE:** You can translate Luigi internal messages by providing translation for [these keys](../core/src/utilities/defaultLuigiTranslationTable.js).
* **customSandboxRules** is an array of custom rules for the content in the iframe. You can extend the [Luigi default sandbox rules](https://github.com/SAP/luigi/blob/af1deebb392dcec6490f72576e32eb5853a894bc/core/src/utilities/helpers/iframe-helpers.js#L140) by adding further rules.
-* **iframeCreationInterceptor** is a function called on iframe creation. It gives you full control over the created iframe DOM element. You can modify it to your needs just before it is added to the DOM tree.
-This function is called with these parameters:
+* **iframeCreationInterceptor** is a function called on iframe creation. It gives you full control over the created iframe DOM element. You can modify it to your needs just before it is added to the DOM tree.
+This function is called with these parameters:
* `iframe` is the iframe DOM element. It is not yet added to the DOM tree, but all attributes are already set.
* `viewGroup` is the view group associated with this iframe, if applicable.
- * `navigationNode` is the navigation node associated with this iframe. NOTE: the interceptor is called only once per iframe creation. If two or more navigation nodes share the same iframe (because they belong to the same view group) the interceptor is called with the first navigated node only.
+ * `navigationNode` is the navigation node associated with this iframe. NOTE: the interceptor is called only once per iframe creation. If two or more navigation nodes share the same iframe (because they belong to the same view group) the interceptor is called with the first navigated node only.
* `microFrontendType`, which is `main`, `modal` or `split-view` depending on where it is going to be rendered.
-
+
For example, to allow 'fullscreen' for non-modal iframes:
```javascript
{
diff --git a/docs/getting-started.md b/docs/getting-started.md
index 5d40755fff..8684491dc5 100644
--- a/docs/getting-started.md
+++ b/docs/getting-started.md
@@ -59,5 +59,5 @@ Follow these steps to create a global user interface and host a full web applica
Follow these steps to develop micro frontends and connect them to an already existing Luigi Core app:
-1. [Install Luigi Client](https://github.com/SAP/luigi/tree/master/client#luigi-client).
-2. Use the functions and parameters provided by the Luigi Client API. You can find them in the [Luigi Client documentation](https://github.com/SAP/luigi/tree/master/docs#luigi-client).
\ No newline at end of file
+1. [Install Luigi Client](luigi-client-setup.md).
+2. Use the functions and parameters provided by the Luigi Client API. You can find them in the [Luigi Client API documentation](luigi-client-api.md).
diff --git a/docs/lifecycle-hooks.md b/docs/lifecycle-hooks.md
index 51aa95da34..967fc3b772 100644
--- a/docs/lifecycle-hooks.md
+++ b/docs/lifecycle-hooks.md
@@ -35,5 +35,5 @@ You can use any of the Luigi lifecycle hooks by adding additional setup to the r
### luigiAfterInit()
-This method will be called after `Luigi.setConfig({})` is executed.
+This method will be called after [Luigi.setConfig({})](luigi-core-api.md#setconfig) is executed.
diff --git a/docs/luigi-client-api.md b/docs/luigi-client-api.md
index e6b64c7c4d..73346256ee 100644
--- a/docs/luigi-client-api.md
+++ b/docs/luigi-client-api.md
@@ -1,7 +1,7 @@
+
> **NOTE:** some special characters (`<`, `>`, `"`, `'`, `/`) in node parameters are HTML-encoded.
Returns **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)** node parameters, where the object property name is the node parameter name without the prefix, and its value is the value of the node parameter. For example `{sort: 'asc', page: 3}`
@@ -133,6 +135,8 @@ Returns the dynamic path parameters of the active URL.
Path parameters are defined by navigation nodes with a dynamic **pathSegment** value starting with **:**, such as **productId**.
All path parameters in the current navigation path (as defined by the active URL) are returned.
+
+
> **NOTE:** some special characters (`<`, `>`, `"`, `'`, `/`) in path parameters are HTML-encoded.
Returns **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)** path parameters, where the object property name is the path parameter name without the prefix, and its value is the actual value of the path parameter. For example `{productId: 1234, ...}`
@@ -228,7 +232,7 @@ Opens a view in a modal. You can specify the modal's title and size. If you don'
#### Parameters
- `path` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** navigation path
-- `modalSettings` **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)?** opens a view in a modal. Use these settings to configure the modal's title and size
+- `modalSettings` **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)?** opens a view in a modal. Use these settings to configure the modal's title and size (optional, default `{}`)
- `modalSettings.title` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** modal title. By default, it is the node label. If there is no label, it is left empty
- `modalSettings.size` **(`"l"` \| `"m"` \| `"s"`)** size of the modal (optional, default `"l"`)
diff --git a/docs/luigi-core-api.md b/docs/luigi-core-api.md
index 9d48dd6887..2f39917f48 100644
--- a/docs/luigi-core-api.md
+++ b/docs/luigi-core-api.md
@@ -1,7 +1,7 @@
# Luigi UX features
-### Rendering of Luigi application in the DOM
+## Rendering of Luigi application in the DOM
-By default, the Luigi content, including the top navigation, the left navigation, and the content iframed area, are rendered in the body tag of your Luigi Core application. As a result, the Luigi content takes the whole space from your browser window.
+By default, Luigi content, including the top navigation, left navigation, and the content iframe area, are rendered in the body tag of your Luigi Core application. As a result, Luigi content takes the whole space of your browser window.
-However, you can render the Luigi content in any other HTML container. It can be useful if you want to add a header or a footer on top of the Luigi content. To use this feature, add the `luigi-app-root` custom HTML attribute to the HTML tag in which you want to render the Luigi content.
+However, you can render Luigi content in any other HTML container. It can be useful if you want to add a header or a footer on top of the Luigi content. To use this feature, add the `luigi-app-root` custom HTML attribute to the HTML tag in which you want to render the Luigi content.
+
>**NOTE:** If you render the Luigi content in a custom container, the container is positioned relatively when you apply your own CSS. Also, set the height of the Luigi custom container either in **px** or **vh**.
-### Responsive application setup
+## Responsive application setup
You can quickly adjust the Luigi application to improve user experience on mobile devices, such as smartphones or tablets. Here are some examples:
@@ -35,11 +36,11 @@ You can quickly adjust the Luigi application to improve user experience on mobil
```
-* Define and apply [responsiveNavigation](general-settings.md) settings to make the left navigation responsive.
+* Define and apply [**responsiveNavigation**](general-settings.md) settings to make the left navigation responsive.
### App loading indicator
-To show a loading indicator before Luigi Core or your first micro frontend is ready, add a container with the `luigi-app-loading-indicator` attribute to your _index.html_ body or inside your [`luigi-app-root`](#rendering-of-luigi-application-in-the-dom) container.
+To show a loading indicator before Luigi Core or your first micro frontend is ready, add a container with the `luigi-app-loading-indicator` attribute to your `index.html` body or inside your `luigi-app-root` container.
```html