Qu’est-ce que la bibliothèque sidekick ?

La bibliothèque sidekick est une extension du sidekick AEM qui permet aux équipes de développement de créer des outils pilotés par l’interface utilisateur pour les auteurs et autrices de contenu. Elle comprend un plug-in de blocs intégré qui peut afficher intuitivement une liste de tous les blocs pour les auteurs et autrices, ce qui leur évite de mémoriser ou de rechercher chaque variation d’un bloc. Les équipes de développement peuvent également écrire leurs propres plug-ins pour la bibliothèque sidekick.

Comment utiliser la bibliothèque Sidekick ?

Les étapes ci-dessous expliquent comment configurer la bibliothèque du sidekick et le plug-in Blocs.

Configuration feuille bibliothèque

La bibliothèque du sidekick est renseignée avec vos modules externes et le contenu du module externe à l’aide d’une feuille.

1. Commencez par créer un répertoire dans sharepoint ou gdrive où vous souhaitez stocker le contenu de la bibliothèque. Nous vous recommandons de stocker le contenu dans /tools/sidekick (ou tout autre nom) à la racine du point de montage. Les étapes suivantes supposent que le répertoire est appelé /tools/sidekick.

2. Créez ensuite un classeur (fichier Excel) dans le répertoire /tools/sidekick appelé library (ou tout autre nom). Chaque feuille du classeur représente un module externe qui sera chargé par la bibliothèque Sidekick. Le nom de la feuille détermine le nom du module externe qui sera chargé. Toutes les données contenues dans la feuille seront transmises au plug-in lors du chargement. Le nom de la feuille du plug-in doit être précédé de helix-. Par exemple, si vous souhaitez charger un module externe appelé tags, vous devez créer une feuille nommée helix-tags.

3. Pour ce tutoriel, nous allons créer une feuille pour notre plug-in blocks. Créez une feuille (ou renommez la feuille par défaut) et appelez-la `helix-blocs`, puis laissez-la vide pour l’instant.

Plug-in Blocks

La bibliothèque Sidekick est fournie avec un plug-in blocks.

Configuration du plug-in Blocks

Pour générer du contenu pour le module externe Blocs, vous devez préparer un document Word distinct pour chaque bloc que vous souhaitez inclure.

1. Créez un répertoire à l’intérieur du répertoire /tools/sidekick dans lequel vous stockerez toutes les variations de bloc. Par exemple, vous pouvez créer un répertoire appelé blocks à l’intérieur de /tools/sidekick.
2. Pour cet exemple, supposons que nous voulions définir toutes les variations d’un bloc appelé columns. Créez d’abord un document Word appelé columns dans le répertoire blocks et fournissez des exemples de toutes les variations du bloc columns. Après chaque variante du bloc, ajoutez un délimiteur de section.
3. Prévisualisez et publiez le document columns.
4. Ouvrez le classeur de bibliothèque créé dans la dernière section, à l’intérieur de la feuille de helix-blocks, créez deux colonnes appelées name et path.
6. Nous devons ensuite ajouter une ligne pour notre bloc de columns. Ajoutez le nom du bloc dans la première colonne et l’URL au document qui définit les variations du bloc dans la seconde colonne. Par exemple, si vous souhaitez ajouter le bloc columns, vous pouvez créer une ligne avec le nom Columns et le chemin d’accès /tools/sidekick/blocks/columns. Pour que la bibliothèque fonctionne dans plusieurs environnements (page, ligne, production), vous ne devez pas utiliser d’URL absolue pour la colonne de chemin d’accès.
7. Prévisualisez et publiez le classeur library.

> Comme les exemples de blocs sont en cours de publication, vous devez utiliser métadonnées en bloc pour exclure le contenu de /tools/** de l’indexation.

Capture d’écran 2024-04-09 à 14 54 19

Exemple library.xlsx

Métadonnées de bibliothèque

Les modules externes de blocs prennent en charge un type spécial de bloc appelé library metadata, qui permet aux développeurs d’indiquer au module externe de blocs certaines informations sur le bloc ou sur la manière dont il doit être rendu.

Options de métadonnées de bibliothèque prises en charge

Nom de la clé
Valeur
Description
Requis
name
Nom du bloc
Permet de définir un personnalisé nom du bloc
false
Description
Description du bloc
Permet de définir un personnalisé description d’un bloc
false
Type
Type du bloc
Cette option indique les blocs plug-in comment regrouper le contenu qui constitue votre bloc. Les options possibles sont les suivantes modèle ou section (détails ci-dessous)
false
inclure les sections suivantes
Nombre de sections à ajouter inclure dans l’élément de bloc
Utilisez si votre bloc requiert contenu de la sous-séquence pour render. Doit être un nombre valeur indiquant comment de nombreuses sections suivantes à inclure.
false
searchtags
Liste de caractères séparés par des virgules termes de recherche
Permet de définir d’autres termes qui pourraient être utilisés lors de la recherche de ceci bloc dans le plug-in blocs
false
tableHeaderBackgroundColor
Couleur hexadécimale (ex #ff3300)
remplace l’en-tête du tableau ; couleur d’arrière-plan pour tout blocs dans la section ou page.
false
tableHeaderForegroundColor
Couleur hexadécimale (ex #ffffff)
remplace l’en-tête du tableau ; couleur de premier plan pour tout blocs dans la section ou page.
false
contentEditable
Valeur booléenne (par défaut : true)
Définissez sur false pour désactiver modification de contenu dans fenêtre de prévisualisation.
false
disableCopy
Valeur booléenne (par défaut : false)
Définissez sur true pour désactiver bouton copier dans l’aperçu fenêtre.
false
hideDetailsView
Valeur booléenne (par défaut : false)
Masquer les détails du bloc panneau à l’intérieur de l’aperçu fenêtre.
false

Métadonnées de bibliothèque par défaut par rapport aux métadonnées de bibliothèque

Il existe deux types de library metadata. Métadonnées de bibliothèque qui résident dans une section contenant le bloc, ou library metadata par défaut qui s’applique au document dans son ensemble et qui réside dans une section à part entière (bloc appelé library metadata en tant qu’enfant unique d’une section).

Prenons un exemple de bloc de héros qui comporte 5 variantes. Supposons que vous souhaitiez ajouter la même description pour chaque variation du bloc, plutôt que de dupliquer la library metadata avec la description dans chaque section contenant les variations. Vous pouvez plutôt utiliser l’library metadata par défaut pour appliquer la même description à chaque variation du bloc. Si vous décidez qu’une variation nécessite en fait une description légèrement différente, vous pouvez ajouter des library metadata à la section contenant la variation et elle remplacera la description library metadata par défaut lors de son rendu dans le plug-in Blocs.

Création de noms et de descriptions de blocs à l’aide des métadonnées de bibliothèque

Par défaut, le nom du bloc (avec variation) est utilisé pour effectuer le rendu de l’élément dans le plug-in des blocs. Par exemple, si le nom du bloc est columns (center, background), il est utilisé comme libellé lors de son rendu dans le plug-in Blocs . Cette opération peut être personnalisée en créant une section library metadata dans la même section que le bloc. Les métadonnées de bibliothèque peuvent également être utilisées pour créer une description du bloc et pour ajouter des searchTags afin d’inclure un alias pour le bloc lors de l’utilisation de la fonction de recherche.

Exemple de bloc avec nom et description personnalisés

Contenu

Capture d’écran 2023-06-08 à 13 11 09

Affichage

Capture d’écran 2023-06-08 à 13 32

Blocages automatiques et contenu par défaut

Le plug-in Blocs peut effectuer le rendu contenu par défaut et blocs automatiques. Pour ce faire, il est nécessaire de placer votre default content ou votre autoblock dans une section dédiée, qui doit inclure un tableau library metadata définissant une propriété name, comme décrit précédemment. Si aucun nom n’est spécifié dans les métadonnées de la bibliothèque, l’élément est étiqueté comme « Élément sans nom ».

Blocs composés de contenu dans les sections suivantes

Dans certains cas, les développeurs peuvent vouloir qu’un bloc soit constitué de contenu provenant des sections suivantes. Ce modèle est déconseillé pour les raisons indiquées ici, mais si vous choisissez de l’utiliser, le plug-in Blocs peut effectuer le rendu de ces éléments à l’aide de la propriété include next sections dans library metadata.

Modèles

Les modèles permettent de regrouper un document entier en un seul élément dans la bibliothèque du sidekick. Pour marquer un document en tant que modèle, définissez type sur template dans default library metadata.

> Important, le library metadata doit se trouver dans sa propre section et être le seul enfant à être considéré comme default library metadata.

La prise en charge des metadata est également souhaitable pour les modèles. Pour ajouter un tableau de métadonnées au modèle, vous pouvez utiliser un bloc de Page metadata.

266064147-12883ee0-147b-4171-b89a-c313e33eef24

Lorsque le modèle est copié, un metadata avec les valeurs est ajouté avec le contenu dans le presse-papiers.

Configuration du plug-in Sidekick

La bibliothèque de sidekick étant hébergée sur la même origine que le contenu, une page HTML statique doit être créée pour charger et configurer le contenu.

1. Créez un fichier appelé library.html dans tools/sidekick/ ;

2. Collez le code suivant dans library.html.

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0, viewport-fit=cover"
    />
    <meta name="Description" content="AEM Sidekick Library" />
    <meta name="robots" content="noindex" />
    <base href="/" />

    <style>
      html,
      body {
        margin: 0;
        padding: 0;
        font-family: sans-serif;
        background-color: #ededed;
        height: 100%;
      }

      helix-sidekick { display: none }
    </style>
    <title>Sidekick Library</title>
  </head>

  <body>
    <script
      type="module"
      src="https://www.aem.live/tools/sidekick/library/index.js"
    ></script>
    <script>
      const library = document.createElement('sidekick-library')
      library.config = {
        base: '/tools/sidekick/library.json',
      }

      document.body.prepend(library)
    </script>
  </body>
</html>

Dans le code ci-dessus, nous chargeons la bibliothèque de sidekick à partir de aem.live, puis nous créons un élément de sidekick-library personnalisé et l’ajoutons à la page. L’élément sidekick-library accepte un objet config requis pour configurer la bibliothèque du sidekick.

Paramètres de configuration pris en charge

Nom du paramètre
Valeur
Description
Requis
socle
Chemin d’accès à la bibliothèque
Bibliothèque de base à définir chargé
true
étend
URL absolue vers le bibliothèque étendue
Une bibliothèque pour étendre bibliothèque de base avec
false
plugins
Un objet contenant modules externes pour l’enregistrement la bibliothèque sidekick.
L’objet plugins peut être utilisé pour enregistrer des modules externes et configurer les données qui : doit être transmis à . plugin
false

Le module externe de blocs prend en charge les propriétés de configuration suivantes, qui peuvent être définies à l’aide de l’objet plugins.

Bloque les paramètres de configuration du plug-in

Nom du paramètre
Valeur
Description
Requis
encodeImages
Une valeur booléenne qui indique si les images doivent : être codé pendant la copie opérations
Si votre site comporte un zéro accès au réseau de confiance (ZTNA) service activé, tel que Accès à Cloudflare, puis les images doivent être codées pour les opérations de copier/coller utiliser correctement images.
true
viewPorts
Complète ou simplifiée objet de configuration, voir exemples ci-dessous.
Configuration à remplacer les tailles de fenêtre d’affichage par défaut. La valeur par défaut est de 480 px fo mobile, 768 px pour tablette et 100 % du courant fenêtre pour le bureau.
false
contentEditable
Valeur booléenne à désactiver modification globale de contenu dans aperçus.
Définissez sur false pour désactiver modification de contenu.
false

Exemples

Codage d’images

const library = document.createElement('sidekick-library')
library.config = {
  base: '/tools/sidekick/library.json',
  plugins: {
    blocks: {
      encodeImages: true,
    }
  }
}

Fenêtres d’affichage personnalisées (forme abrégée)

const library = document.createElement('sidekick-library')
library.config = {
  base: '/tools/sidekick/library.json',
  plugins: {
    blocks: {
      viewPorts: [600, 900],
    }
  }
}

Fenêtres d’affichage personnalisées

const library = document.createElement('sidekick-library')
library.config = {
  base: '/tools/sidekick/library.json',
  plugins: {
    blocks: {
      viewPorts: [
        {
          width: '599px',
          label: 'Small',
          icon: 'device-phone',
        },
        {
          width: '899px',
          label: 'Medium',
          icon: 'device-tablet',
        },
        {
          width: '100%',
          label: 'Large',
          icon: 'device-desktop',
          default: true,
        },
      ],
    }
  }
}

Couleurs d’en-tête de tableau personnalisées

Vous pouvez personnaliser la couleur d’arrière-plan et de premier plan de l’en-tête du tableau lors du collage d’un bloc, de métadonnées de section ou de métadonnées copiés à partir du plug-in Blocs.

Les styles par défaut peuvent être définis dans library.html à l’aide de variables CSS.

 <style>
    :root {
      --sk-block-table-background-color: #03A;
      --sk-block-table-foreground-color: #fff;

      --sk-section-metadata-table-background-color: #f30;
      --sk-section-metadata-table-foreground-color: #000;

      --sk-metadata-table-background-color: #000;
      --sk-metadata-table-foreground-color: #fff;
    }
  </style>

Ces valeurs peuvent être remplacées à l’aide de métadonnées de bibliothèque.

> En fonction du jeu de couleurs système sélectionné pour l'ordinateur des utilisateurs (mode sombre), Word peut modifier les couleurs sélectionnées dans le but d'améliorer l'accessibilité.

Configuration du plug-in personnalisé

L’exemple ci-dessous définit un module externe tags dans la configuration . Les clés de l’objet plugins doivent correspondre au nom du plug-in. Toute autre propriété définie dans l’objet plugin sera disponible pour le plug-in via l’argument contextuel de la méthode decoration.

const library = document.createElement('sidekick-library')
library.config = {
  base: '/tools/sidekick/library.json',
  plugins: {
    tags: {
      src: '/tools/sidekick/plugins/tags/tags.js',
      foo: 'bar'
    }
  }
}

Bibliothèques étendues

Dans certains cas, la fusion de deux bibliothèques de blocs peut être souhaitable. Lorsqu’une bibliothèque étendue est définie, l’application de bibliothèque du sidekick fusionne la bibliothèque de base et la bibliothèque étendue en une seule liste de bibliothèque pour les auteurs.

L’exemple ci-dessous définit une bibliothèque de base et une bibliothèque étendue (sur une autre origine) qui seront fusionnées dans la bibliothèque de base.

const library = document.createElement('sidekick-library')
library.config = {
  base: '/tools/sidekick/library.json',
  extends: 'https://main--repo--owner.hlx.live/tools/sidekick/library.json'
}

> Les en-têtes Access-Control-Allow-Origin doivent être définis sur les library.json et blocs de la bibliothèque étendue pour qu’ils puissent se charger dans la bibliothèque du sidekick. Voir En-têtes de réponse HTTP personnalisés pour plus d’informations.

> En raison des politiques de même origine appliquées par les navigateurs sur les iFrames, l’aperçu d’un bloc étendu ne peut pas être chargé pour le moment.

Configuration de Sidekick config.json

Ensuite, pour que la bibliothèque du sidekick apparaisse dans le sidekick, un fichier de configuration doit être créé à l’adresse tools/sidekick/config.json. Ce fichier de configuration doit être créé dans le bus de code et doit être archivé dans github.

{
  "project": "Example",
  "plugins": [
    {
      "id": "library",
      "title": "Library",
      "environments": ["edit"],
      "url": "/tools/sidekick/library.html",
      "includePaths": ["**.docx**"]
    }
  ]
}

La propriété url dans la configuration du plug-in indique l’emplacement à partir duquel le sidekick doit charger le plug-in. Cela devrait pointer vers le fichier library.html que nous avons précédemment créé.

> La configuration du sidekick doit être archivée dans la branche main pour que le plug-in apparaisse dans le sidekick.

> Si le fichier tools/sidekick/config.json n’existe pas dans votre référentiel github, il doit être créé. Pour plus d’informations sur les options de configuration du plug-in sidekick, consultez la documentation.

Remarques concernant la création de blocs pour la bibliothèque

La bibliothèque du sidekick effectue le rendu des blocs en récupérant d’abord le rendu plain.html du bloc, puis en le supprimant de tout autre bloc dans le contenu (par exemple, si la réponse contient plusieurs variations d’un bloc). Il demande ensuite la même page (sans .plain.html) et remplace l’élément main par le bloc supprimé et charge l’intégralité du document dans un iframe à l’aide de l’attribut srcdoc.

Utilisation des window.location

Puisque le bloc est chargé dans un iframe à l’aide de l’attribut srcdoc, l’instance de l’objet window.location utilisé par votre code de sites ne contiendra pas les valeurs standard attendues.

Exemple d’objet window.location lors de l’exécution dans la bibliothèque

{
  "host": "",
  "hostname": "",
  "href": "about:srcdoc"
  "origin": "null"
  "pathname": "srcdoc"
  "port": ""
  "protocol": "about:"
}

Pour cette raison, si votre bloc nécessite l'utilisation de l'objet window.location, nous vous recommandons d'ajouter les fonctions suivantes à votre fichier scripts.js et de les importer dans votre fonction pour les utiliser.

/**
 * Returns the true origin of the current page in the browser.
 * If the page is running in a iframe with srcdoc, the ancestor origin is returned.
 * @returns {String} The true origin
 */
export function getOrigin() {
  const { location } = window;
  return location.href === 'about:srcdoc' ? window.parent.location.origin : location.origin;
}

/**
 * Returns the true of the current page in the browser.mac
 * If the page is running in a iframe with srcdoc,
 * the ancestor origin + the path query param is returned.
 * @returns {String} The href of the current page or the href of the block running in the library
 */
export function getHref() {
  if (window.location.href !== 'about:srcdoc') return window.location.href;

  const { location: parentLocation } = window.parent;
  const urlParams = new URLSearchParams(parentLocation.search);
  return `${parentLocation.origin}${urlParams.get('path')}`;
}

Utilisation de createOptimizedPicture dans lib-aem

La fonction createOptimizedPicture dans lib-aem utilise également 🔗 window.location.href . Si vous utilisez cette fonction, nous vous recommandons de la déplacer dans scripts.js et de la modifier pour utiliser la fonction getHref() ci-dessus.

Vérification de la présence de la bibliothèque du sidekick

Parfois, vous pouvez vouloir savoir si la page ou le bloc est en cours d’exécution dans la bibliothèque du sidekick. Pour ce faire, il existe plusieurs options.

1. Vérifier si window.location.href === 'about:srcdoc'

2. L’élément main et l’élément de bloc contiennent la classe sidekick-library

Création d’un plug-in

Le développement d’un module externe est similaire à la construction d’un bloc dans AEM. Une fois qu’un utilisateur tente de charger le plug-in, la bibliothèque du sidekick déclenche la méthode decorate() sur votre plug-in. Cette méthode reçoit le conteneur pour effectuer le rendu du plug-in et de toutes les données incluses dans la feuille des plug-ins.

/**
 * Called when a user tries to load the plugin
 * @param {HTMLElement} container The container to render the plugin in
 * @param {Object} data The data contained in the plugin sheet
 * @param {String} query If search is active, the current search query
 * @param {Object} context contains any properties set when the plugin was registered
 */
export async function decorate(container, data, query, context) {
  // Render your plugin
}

> La fonction decorate() doit être exportée à partir du plug-in .

Exportation et recherche par défaut du plug-in

L’exportation par défaut à partir d’un module externe permet aux auteurs de personnaliser le nom du module externe affiché dans l’en-tête au chargement et d’activer la fonctionnalité de recherche dans la bibliothèque du sidekick.

export default {
  title: 'Tags',
  searchEnabled: true,
};

Lorsque la propriété searchEnabled est définie sur true, l’en-tête de la bibliothèque affiche une icône de recherche lors du chargement du module externe. Si l’utilisateur ou l’utilisatrice lance une recherche en saisissant une requête, la fonction de decorate() du module externe sera déclenchée à nouveau, cette fois avec la chaîne de recherche transmise dans le paramètre de requête de la fonction de decorate().

Composants web de plug-in

Les auteurs de plug-ins peuvent utiliser un ensemble sélectionné de composants web de Spectrum lors de la création d’un plug-in personnalisé.

Les composantes suivantes du spectre sont disponibles

Composant
Lien vers la documentation
sp-tooltip
Documents
sp-toast
Documents
sp-textfield
Documents
sp-sidenav-item
Documents
sp-sidenav
Documents
sp-search
Documents
sp-progress-circle
Documents
sp-picker
Documents
sp-menu-item
Documents
sp-menu-group
Documents
sp-menu-diviser
Documents
sp-menu
Documents
sp-picture-message
Documents
séparateur sp
Documents
carte sp
Documents
sp-button-group
Documents
sp-button
Documents
sp-action-button
Documents
déclencheur de recouvrement
Documents

Les icônes suivantes de Spectrum sont également disponibles

Composant
Lien vers la documentation
sp-icon-search
Documents
sp-icon-file-template
Documents
sp-icon-file-code
Documents
sp-icon-device-phone
Documents
sp-icon-device-tablet
Documents
sp-icon-device-desktop
Documents
sp-icon-magic-wand
Documents
sp-icon-copy
Documents
sp-icon-preview
Documents
sp-icon-info
Documents
sp-icon-view-detail
Documents
sp-icon-chevron-right
Documents
sp-icon-chevron-left
Documents

Événements de plug-in

Les auteurs de plug-ins peuvent distribuer des événements de leur plug-in à la bibliothèque du sidekick parent afin d’afficher un chargeur ou un message toast.

Messages toasts

import { PLUGIN_EVENTS } from 'https://www.aem.live/tools/sidekick/library/events/events.js';

export async function decorate(container, data, query) {
  // Show a toast message
  container.dispatchEvent(new CustomEvent(PLUGIN_EVENTS.TOAST,  { detail: { message: 'Toast Shown!', variant: 'positive | negative' } }))
}

Afficher et masquer le chargeur

import { PLUGIN_EVENTS } from 'https://www.aem.live/tools/sidekick/library/events/events.js';

export async function decorate(container, data, query) {
  // Show loader
  container.dispatchEvent(new CustomEvent(PLUGIN_EVENTS.SHOW_LOADER))
  ...
  // Hide loader
  container.dispatchEvent(new CustomEvent(PLUGIN_EVENTS.HIDE_LOADER))
}

Exemple de plug-in

Module externe Balises

Exemple d’API Plugin

recommendation-more-help
10a6ce9d-c5c5-48d9-8ce1-9797d2f0f3ec