npm package: @govflanders/vl-widget-global-footer-types
Description: TypeScript definitions for GlobalFooterClient
Author: Maarten Van Steenkiste
Latest version: 1.0.28

## Introduction

This guide is for developers looking to integrate the Flanders Global Footer into their websites.



## Adding a Flanders Global Footer to Your Website

You can integrate the **Flanders Global Footer** into your website using one of two methods: the **entry script** or the **embed script**. Each serves a different purpose.

💡 **Note:** The embed URL has been updated to use `api/v2` instead of `api/v1`.

### Using the Embed Script (Automatic Mounting)

Use the embed script for quick and automatic integration with minimal setup. The embed script is meant to be placed directly inside the DOM where you want the footer to appear. It automatically renders the footer at the script's location in the HTML.

**Example of using the embed script:**

```html
<!DOCTYPE html>
<html lang="nl">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Global Footer Embed Script Example</title>
  </head>
  <body>
    <div class="your-website-code">👋 Hello world</div>
    <!-- For the UUID, you should use your widget-id -->
    <!-- If you want to use the TNI environment, use https://widgets.tni-vlaanderen.be instead -->
    <script src="https://widgets.vlaanderen.be/api/v2/widget/your-global-footer-id/embed"></script>
  </body>
</html>
```

⚠️ **Warning:** The `window.globalFooterClient` object will only be available after the script is resolved. If you need direct access to the `window.globalFooterClient`, use the entry script.

### Using the Entry Script (Manual Mounting)

Use the entry script if you need more control over when, where, and how the footer is mounted. The entry script should be placed in the `<head>` section of your HTML, preferably at the top. This ensures that the `window.globalFooterClient` object is available after the script has loaded. With the entry script, the footer does not render automatically, so you'll need to call the `mount` method to display it.

**Example of using the entry script:**

```html
<!DOCTYPE html>
<html lang="nl">
  <head>
    <!-- For the UUID, you should use your widget-id -->
    <!-- If you want to use the TNI environment, use https://widgets.tni-vlaanderen.be instead -->
    <script src="https://widgets.vlaanderen.be/api/v2/widget/your-global-footer-id/entry"></script>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Global Footer Entry Script Example</title>
  </head>
  <body>
    <div class="your-website-code">👋 Hello world</div>
    <script>
      window.globalFooterClient.mount(); // Mount the footer manually after the script has loaded
    </script>
  </body>
</html>
```

### Summary

- **Embed script**: Place directly in the DOM, automatically renders the footer at the script's location.
- **Entry script**: Use in the `<head>`, requires manual mounting with the `window.globalFooterClient.mount()` method.

## Using the `window.globalFooterClient` API

The widget is available on the global window object as `window.globalFooterClient`. You can import the types from `global-footer-types` to use them in your project, especially if you're using TypeScript (more info [here](#typescript-support)).

**Example of using the `window.globalFooterClient` object in JavaScript:**

```javascript
const client = window.globalFooterClient;

const privacyLink = {
  title: 'Privacy Policy',
  href: '/privacy-policy',
};

const termsLink = {
  title: 'Terms of Service',
  href: '/terms',
};

client.setNavigationLinks([
  privacyLink,
  termsLink,
]);
```

Checkout the [GlobalFooterClient](./interfaces/GlobalFooterClient.html) here to see all the available methods.

## Migration Guide: Upgrading from v4 to v5

If you’re currently using version 4 of the Global Footer Widget, please follow this guide to upgrade to version 5. This guide highlights the key changes and steps you need to take to ensure a smooth transition.

### Remove Client Library Script Links

No more client library or polyfill scripts: In version 5, you no longer need to include any additional client library or polyfill script links in your HTML. Access to the `window.globalFooterClient` object is automatically provided when you include either the entry script or the embed script.

**Action Required:**
- Remove any `<script>` tags that reference client libraries or polyfill libraries for the widget.
- Ensure that either the entry script or the embed script is included in your HTML.

### Eliminate Installable Packages

Script-based integration only: Version 5 removes the need for installable packages via npm or yarn. All functionalities are now accessible by including script tags directly in your HTML’s `<head>` or `<body>` section.

**Action Required:**
- Uninstall any npm or yarn packages related to the widget.
- Delete any import or require statements in your JavaScript code that reference the widget.

### Update Embed Script Links

**Version Update in Embed Links:** If you’re using the embed script method to include the widget, you need to update the version number in your script’s `src` URL from `v1` to `v2`. [Example here](#adding-a-flanders-global-footer-to-your-website).

### Update API Usage

**API Changes:** The `window.globalFooterClient` API has been updated in version 5. Methods, their signatures, and usage patterns may have changed. Refer to the [GlobalFooterClient](./interfaces/GlobalFooterClient.html) section for detailed information on the new methods and their parameters.

**Action Required:**
- Review all instances where you interact with `window.globalFooterClient`.
- Update your code to align with the new [GlobalFooterClient](./interfaces/GlobalFooterClient.html) methods and their signatures.
- Pay special attention to asynchronous methods that now return promises.

**Example:**

```diff
// Using widgets V4
- vl.widget.client.capture(
-   // Verplichte capture functie.
-   function(widget) {
-     if (widget.getPluginTypeId() === 'global_footer') {
-       widget.getUmbrella();
-     }
-   },
- );
// Using widgets V5
+ await globalFooterClient.getUmbrella();
```

### Accessing `window.globalFooterClient`

Unified Access via Scripts: In version 5, you can access the `window.globalFooterClient` object regardless of whether you use the entry script or the embed script.

**Action Required:**
- Ensure that you include either the entry script or the embed script in your HTML.
- Remove any additional scripts previously used to access `window.globalFooterClient`.

### Verify Styling and Rendering

After integrating version 5 of the widget into your website, it’s important to thoroughly review its appearance and functionality to ensure everything works as expected. Some styling adjustments might be necessary due to changes in the widget’s design or your site’s CSS.

**Action Required:**

- **Test Across Browsers:** Check the widget in all supported browsers to confirm consistent styling and behavior.
- **Inspect for Conflicts:** Look for any CSS conflicts between the widget and your site’s stylesheets.
- **Adjust Styles if Needed:** Modify your CSS or override styles to resolve any layout or design issues.
- **Seek Assistance:** If problems persist, don’t hesitate to [contact us](#contact-information) for support.

## Language Switching

The **Global Footer Widget** v5 now supports multiple languages. The widget automatically adapts to the language of the document. It observes the `lang` attribute on the `<html>` tag, so it's the implementer's responsibility to handle any language switching functionality. If the `lang` attribute changes, the widget will update to display the correct language.

**Supported languages:**
- nl (Dutch)
- fr (French)
- de (German)
- en (English)

To change the document language, you can use the following JavaScript snippet:

```js
window.document.documentElement.lang = 'nl'; // 'nl', 'en', 'de' or 'fr'
```

This will switch the document's language to Dutch, and the widget will automatically reflect the change.

**Notes:**
- When using a multilingual widget, ensure its configuration also supports multiple languages.
- Lang tag variants are also handled correctly (for example, `NL` or `nl-BE`).
- Take a look at the documentation for multilingual objects [here](./types/Translatable.html).

## Browser Support

The **Global Footer Widget** supports the two most recent versions of all major browsers:

- Google Chrome
- Mozilla Firefox
- Microsoft Edge
- Safari

Please ensure your users are on the latest versions of these browsers to guarantee full functionality of the widget.

## TypeScript Support

The **`@govflanders/vl-widget-global-footer-types`** package provides TypeScript types and interfaces for interacting with the **Global Footer Widget**. This widget is embedded in customer web pages and exposes a client object (`window.globalFooterClient`) that allows for dynamic configuration and interaction with the global footer.

By using the types defined in this package, developers can ensure type-safe interactions with the widget while improving their development experience (DX) by utilizing autocompletion and built-in documentation.

### Installation

To install the `global-footer-types` package, use the following command:

```bash
npm install -D @govflanders/vl-widget-global-footer-types
```
or
```bash
yarn add -D @govflanders/vl-widget-global-footer-types
```

**Note:** It’s recommended to use the caret (`^`) symbol in your `package.json` to stay updated with the latest minor and patch versions.

### Usage Example

**Example of using the types to interact with the widget:**

```typescript:packages/global-footer-types/README.md
import { GlobalFooterClient, NavigationLink } from '@govflanders/vl-widget-global-footer-types';

const client: GlobalFooterClient = window.globalFooterClient;

const privacyLink: NavigationLink = {
  title: 'Privacy Policy',
  href: '/privacy-policy',
};

const termsLink: NavigationLink = {
  title: 'Terms of Service',
  href: '/terms',
};

client.setNavigationLinks([
  privacyLink,
  termsLink,
]);
```

## Content Security Policy (CSP)

To ensure the secure integration of the **Global Footer Widget**, you need to configure your Content Security Policy (CSP) with the following directives:

### Production Environment CSP Configuration

The minimum required CSP directives for using the global-footer in a production environment are:

| Directive    | Value                                        |
|--------------|----------------------------------------------|
| `connect-src`| `https://widgets.vlaanderen.be`              |
| `font-src`   | `https://ui.vlaanderen.be`                   |
| `font-src`   | `https://assets.vlaanderen.be`               |
| `font-src`   | `https://widgets.vlaanderen.be`              |
| `img-src`    | `data:`                                      |
| `img-src`    | `https://assets.vlaanderen.be`               |
| `img-src`    | `https://widgets.vlaanderen.be`              |
| `script-src` | `https://widgets.vlaanderen.be`              |

### TNI Environment CSP Configuration

The minimum required CSP directives for using the global-footer in a TNI environment are:

| Directive    | Value                                     |
|--------------|-------------------------------------------|
| `connect-src`| `https://widgets.tni-vlaanderen.be`       |
| `font-src`   | `https://ui.vlaanderen.be`                |
| `font-src`   | `https://assets.vlaanderen.be`            |
| `font-src`   | `https://widgets.tni-vlaanderen.be`       |
| `img-src`    | `data:`                                   |
| `img-src`    | `https://assets.vlaanderen.be`            |
| `img-src`    | `https://widgets.tni-vlaanderen.be`       |
| `script-src` | `https://widgets.tni-vlaanderen.be`       |

## Contact Information

If you need assistance or have any questions regarding the **Global Footer Widget**, feel free to reach out to us:

- **Support Portal**: [Widget platform](https://vlaamseoverheid.atlassian.net/wiki/spaces/IKPubliek/pages/2339897467/Widget-platform)

Our team is here to help with any issues or inquiries you might have.

## Search Keywords

- Global Footer Integration
- Flanders Widget Setup
- Flanders Global Footer
- V5 Widget Migration
- GlobalFooterClient API
- Embed Script Example
- Entry Script Mounting
- Multilingual Global Footer
- Language Switching in Widgets
- Widget Browser Support
- Global Footer JavaScript API
- Dynamic Footer Links
- TypeScript Widget Integration
- Flanders Widget API Usage
- V4 to V5 Migration Guide