# Bienvenue sur RunRunWeb

Un concept innovant de gestion de contenus, c'est le CMS qui s'adapte à vos pages et non le contraire !

{% hint style="info" %}
La documentation est en cours de rédaction, elle sera complétée dans les semaines à venir.
{% endhint %}

RunRunWeb est à la fois une solution de conception de site web et d'hébergement. Vous créez votre design en HTML en définissant vos zones de contenus modifiables et votre site est instantanément en ligne. Pas de CMS à maintenir à jour, pas de base de données à administrer, pas de serveur HTTP à paramétrer, vous restez concentré sur votre site et ses contenus. Toute les taches techniques de l'administration d'un site sont gérées par RunRunWeb: configuration, mises à jour, sécurité, ...&#x20;

### Comment ça fonctionne ?

Grâce à l'éditeur HTML en ligne intégré dans RunRunWeb, vous créez une page HTML classique comme vous le feriez pour un site statique, c'est le [*modèle de page*](/#le-modele-de-page). Pour rendre le contenu modifiable par le rédacteur du site, il suffit alors de placer des [*widgets*](/#les-widgets) en lieu et place du contenu HTML:

```markup
<html>
<head></head>
<body>
    <H1><rrw:text id="mytitle" /></H1>
    <rrw:editor id="myeditor" />

    Voici une image editable : <BR>
    <rrw:image id="myimg" width="300" height="200" />
</body>
</html>
```

### Le modèle de page

Conçu en code HTML, il définit le design de la page Web avec toute la richesse et la liberté que permet le language, votre imagination est votre seule limite.  Vous pouvez éditer directement en ligne la feuille de style associée à la page en utilisant les possibilités étendues du langage LESS, un compilateur vers CSS est intégré à RunRunWeb. Un éditeur de code Javascript complète la palette d'outils pour créer des pages web attractives et dynamiques.&#x20;

### &#x20;Les widgets

Les widgets sont les composants fondateurs de RunRunWeb, ils rendent une page HTML statique en contenu modifiable directement dans la page sans la complexité d'un back-office et sans toucher au design défini dans le modèle de page. Techniquement ces widgets sont interprétés par le serveur et remplacés par leur équivalent HTML dans la page générée.&#x20;

Zone de texte, Image, Formulaire de contact, ... Il existe un widget pour chaque contenu constitutif de votre page Web.

### Les fichiers

A partir de de l'éditeur de modèle de page, vous pouvez charger vos propres fichiers pour les intégrer en tant que ressources pour vos pages web (librairie JS, images, documents PDF, ...).

{% hint style="info" %}
RunRunWeb est conçue pour optimiser les performances de votre site, les images PNG et JPG seront optimisées en cochant l'option *'optimiser les images'*.&#x20;

L'option *'compresser les fichiers'* permet au serveur d'optimiser les performances de votre site lorsqu'il envoie un de vos fichiers.
{% endhint %}


# Pour débuter

Vous devez commencer par créer un site sur la page d'accueil [runrunweb.net](https://runrunweb.net). Il suffit de renseigner votre adresse e-mail, un message vous sera envoyé pour confirmer votre adresse et valider la création du site.

{% hint style="warning" %}
Les adresses jetables/temporaires ne sont pas autorisées. L'e-mail est notre seul moyen de vous identifier et de communiquer avec vous alors nous ne pouvons pas accepter les fausses adresses ! Nous ne vous spammerons pas, nous ne revendrons pas votre e-mail.
{% endhint %}

{% hint style="info" %}
Vous pouvez vous identifier avec votre compte Google ou Facebook, cela vous évite de vous rappeler d'un nouveau mot de passe. Rassurez-vous cela nous donne aucune visibilité ni aucun droit sur votre compte associé.
{% endhint %}

Dès la procédure de création du site terminée, une adresse http\://*xxxx*.sketchup.runrunweb.net vous est attribuée, vous recevrez un email récapitulatif.&#x20;

Pour vous connecter à votre site et commencer à éditer le modèle de page cliquez sur l'icône <img src="https://3272782693-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L_qUR94B0wzcL66XTLq%2F-L_w_rzwDf9Oc1BxaO1M%2F-L_woeTSNYpndclTffcM%2Flogin_icon.png?alt=media&amp;token=568571f3-ec2e-412c-9a06-39ba53ab01b8" alt="" data-size="line"> en bas à droite de la page. L'écran de connexion vous invite à authentifier selon la méthode choisie lors de la création du site.

<img src="https://3272782693-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L_qUR94B0wzcL66XTLq%2F-L_xAQ6_VeCTWxcsZeK5%2F-L_xAlz1ynaitE2bUTUl%2Fmenu_ico.png?alt=media&amp;token=6f70702f-b538-4723-afae-5445a1a1855b" alt="" data-size="original"> En bas à droite, le menu affiche au survol les options pour éditer la page

* <img src="https://3272782693-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L_qUR94B0wzcL66XTLq%2F-L_xAQ6_VeCTWxcsZeK5%2F-L_xAlz7OD1UG2voiokm%2Fpreview_ico.png?alt=media&amp;token=88b259b9-d259-441d-b02f-09143942634c" alt="" data-size="original"> Visualise la page avec les dernières modifications telle qu'elle apparaitra pour les visiteurs du site après la publication de la page.<br>
* <img src="https://3272782693-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L_qUR94B0wzcL66XTLq%2F-L_xAQ6_VeCTWxcsZeK5%2F-L_xAlyxy3iP44MeEhyI%2Fedit_ico.png?alt=media&amp;token=05c2bc52-d64b-4d6e-91ae-ba57acae78ef" alt="" data-size="original"> Ouvre l'éditeur de modèle de page, de style CSS et du code Javascript.<br>
* <img src="https://3272782693-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L_qUR94B0wzcL66XTLq%2F-L_xAQ6_VeCTWxcsZeK5%2F-L_xAlzANTirXWtnNzOM%2Fpublish_ico.png?alt=media&amp;token=94204d6a-9cb3-43b4-995e-cc36d3adc5b2" alt="" data-size="original"> Publie les dernières modifications de la page.<br>
* <img src="https://3272782693-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L_qUR94B0wzcL66XTLq%2F-L_xAQ6_VeCTWxcsZeK5%2F-L_xAlz37kdFfIw8ym5k%2Fmeta_ico.png?alt=media&amp;token=02598680-e1dd-4333-8146-76e687095e09" alt="" data-size="original"> Edite le titre, la description et le favicon de la page.<br>
* <img src="https://3272782693-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L_qUR94B0wzcL66XTLq%2F-L_xAQ6_VeCTWxcsZeK5%2F-L_xAlzDfq17pc8AWfWW%2Fuser_ico.png?alt=media&amp;token=a36e2633-7155-477c-a4ce-62a451bde1d9" alt="" data-size="original"> Ajoute/Modifie les utilisateurs et leurs droits pour éditer le modèle de page ou modifier le contenu du site.<br>
* <img src="https://3272782693-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L_qUR94B0wzcL66XTLq%2F-L_xAQ6_VeCTWxcsZeK5%2F-L_xAlz5pB-x7-BC3OvD%2Fpage_ico.png?alt=media&amp;token=78e3812d-c492-404f-8508-55bd037076b1" alt="" data-size="original"> Ajoute une page au site.<br>
* <img src="https://3272782693-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L_qUR94B0wzcL66XTLq%2F-L_xAQ6_VeCTWxcsZeK5%2F-L_xAlz-5rwzoRKd9gUz%2Flogout_ico.png?alt=media&amp;token=414f3b17-054e-475e-9298-a53b103b2c42" alt="" data-size="original"> Déconnecte l'utilisateur du mode édition.


# C'est quoi un widget ?

Un widget est un composant de contenu de RunRunWeb, dans le code source du modèle de page il se présente comme une balise HTML :

```markup
<rrw:widget id="myid" attname="attvalue" />
```

* **widget** : nom du widget
* **id="myid"** : identifiant unique du widget, ce doit être une valeur alphanumérique sans espace
* **attname="attvalue"** : attribut du widget, ils peuvent être obligatoires ou facultatifs

\
Lors de l'édition de la page, le widget offre un bloc d'édition ergonomique qui permet simplement aux rédacteurs de modifier les contenus, sans connaissance technique, par exemple :&#x20;

```markup
<rrw:editor id="myeditor" />
```

![Le widget "editor" en mode édition](https://3272782693-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L_qUR94B0wzcL66XTLq%2F-L_y2fvuddKKuzpabv-i%2F-L_y7VqZ2YAm1DbtO7Kl%2Feditor.png?alt=media\&token=1eb0ee45-e466-49e9-9e3e-7a1887876378)

Les boutons en bas à droite de la page permettent de quitter le mode d'édition :

* <img src="https://3272782693-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L_qUR94B0wzcL66XTLq%2F-L_y8I8giMDjYGR9uUTU%2F-L_yCVdCaayZUEjPOcSK%2Fsave_ico.png?alt=media&amp;token=b127f31b-2938-4e5f-9fb2-a6171a997bb5" alt="" data-size="original"> Enregistrer les modifications du contenu
* <img src="https://3272782693-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L_qUR94B0wzcL66XTLq%2F-L_y8I8giMDjYGR9uUTU%2F-L_yCaDWw5gmDPKY9EmF%2Fcancel_ico.png?alt=media&amp;token=4d45b9ac-88a1-41a4-8559-9282b08ccca9" alt="" data-size="original"> Annuler les changements

\
Les termes widget **enfant** et widget **parent** font référence à leur imbrication :

```markup
<rrw:widget_parent>
    <rrw:widget_enfant />
</rrw:widget_parent>
```


# \<rrw:text>

Ce widget fournit une ligne de texte modifiable

```markup
<rrw:text id="mytext">texte par défaut</rrw:text>
```

Le widget `<rrw:text>` est rendu comme un `<span>` lors de la publication de la page.

Les attributs disponibles sont :

* `id="xxx"`  **\[obligatoire]** L'identifiant unique du widget Text, caractères alphanumériques uniquement.
* `class="xxx"` *\[optionnel]*  Liste de classes associées à cette ligne de texte

Le "`texte par défaut`" est *optionnel*, il s'affiche lorsque le widget n'a jamais été édité.

Le widget Text n'accepte aucun widget enfant.


# \<rrw:editor>

Ce widget fournit un bloc de texte modifiable

```markup
<rrw:editor id="myeditor">
    contenu HTML par défaut
</rrw:editor>
```

Le widget `<rrw:editor>` est rendu comme un bloc `<div>` lors de la publication de la page.

Les attributs disponibles sont :

* `id="xxx"`  **\[obligatoire]** L'identifiant unique du widget Editor, caractères alphanumériques uniquement.
* `class="xxx"` *\[optionnel]* Liste de classes associées à ce bloc de texte
* `data-rrw-edit-bgcolor="#HexColor"` *\[optionnel]* Lorsque le widget est en mode édition, #hexColor est appliquée comme couleur de fond.
* `data-rrw-edit-fgcolor="#HexColor"` *\[optionnel]* Lorsque le widget est en mode édition, #hexColor est appliquée comme couleur de texte.

Le "`contenu HTML par défaut`" est optionnel, il s'affiche lorsque le widget n'a jamais été édité. Ce peut être n'importe quelle balise HTML.

Le widget Editor accepte les widgets enfants suivants :

* [\<rrw:image>](/widgets/widget-image)
* [\<rrw:video>](/widgets/widget-video)


# \<rrw:image>

Ce widget fournit une image modifiable

```markup
<rrw:image id="myimg" width="xxx" height="xxx" />
```

Le widget `<rrw:image>` est rendu comme un image `<img>` lors de la publication.

Les attributs disponibles sont :

* `id="xxx"`  **\[obligatoire]** L'identifiant unique du widget Image, caractères alphanumériques uniquement.
* `width="xxx"` **\[obligatoire]** La largeur en pixel de l'image
* `height="xxx"` **\[obligatoire]** La hauteur en pixel de l'image
* `class="xxx"` *\[optionnel]* Liste de classes associées à cette image
* `alt="texte alternatif"` *\[optionnel]* Texte alternatif à l'affichage de l'image
* `data-rrw-lazy="no"` *\[optionnel]* Désactive le [chargement différé](/widgets/widget-image#chargement-differe-ou-lazy-loading) de l'image
* `data-rrw-srcset="auto"` *\[optionnel]* Définit les tailles alternatives de l'image selon la taille de l'écran pour [les images responsive](/widgets/widget-image#image-responsive).

#### Optimisation de l'image

Quelque soit la taille de l'image sur votre ordinateur, elle sera redimensionnée dans les dimensions définies par les attributs du widget. Un action sur la molette de la souris permet de zoomer/dézoomer l'image, un cliquer/déplacer permet de la recadrer.

Conformément aux bonnes pratiques SEO, les images PNG et JPG sont également optimisées pour réduire leur taille et accroitre les performances de votre site.

#### Chargement différé ou lazy-loading

Le chargement différé consiste à ne charger l'image depuis le serveur au moment ou celle-ci va apparaitre à l'écran, cela permet d'optimiser les temps de chargement de page. Par défaut cette fonctionnalité est activé par RunRunWeb lors de l'utilisation du widget Image, elle peut être désactivée en précisant l'attribut `data-rrw-lazy="no"`.

#### Image responsive

Sur un site responsive, c'est à dire qui s'adapte à la taille de l'écran (ordinateur, mobile, tablette), une même image peut avoir une taille différente. HTML prévoit cette fonctionnalité avec l'attribut `srcset` d'une balise `<IMG>`.  RunRunWeb va automatiquement générer plusieurs déclinaisons de l'image dans une taille différente et créer le rendu HTML avec les attributs qui conviennent.&#x20;

Pour activer cette fonctionnalité, il faut ajouter l'attribut `data-rrw-srcset="auto"`.  Selon la taille initiale de l'image, deux versions, 640px de largeur et 320px de largeur, vont être créés et proposés au chargement (la hauteur est calculée pour conserver les proportions de l'image). Ces valeurs automatiques peuvent être personnalisées, en remplaçant la valeur `auto` par la taille en pixel suivie de w, par exemple `500w` pour une largeur de 500px. Plusieurs tailles sont possibles en séparant les tailles par une virgule, par exemple, `100w,500w,800w` va générer les tailles 100 pixels de large, 500 et 800.


# \<rrw:video>

Ce widget fournit un lecteur vidéo pour youtube, vimeo et dailymotion

```markup
<rrw:video id="myvid" width="xxx" height="xxx" />
```

Les attributs disponibles sont :

* `id="xxx"`  **\[obligatoire]** L'identifiant unique du widget Video, caractères alphanumériques uniquement.
* `width="xxx"` **\[obligatoire]** La largeur en pixel de la vidéo
* `height="xxx"` **\[obligatoire]** La hauteur en pixel de la vidéo
* `class="xxx"` *\[optionnel]* Liste de classes associées à cette vidéo
* `data-rrw-lazy="no"` *\[optionnel]* Désactive le [chargement différé](/widgets/widget-image#chargement-differe-ou-lazy-loading) de la vignette associée à la vidéo

Ce widget encapsule le lecteur selon le fournisseur de la vidéo (youtube, vimeo, dailymotion). Le chargement se fait uniquement au lancement de la vidéo et optimise ainsi le chargement de la page.

Si plusieurs vidéos sont intégrées à la page, la lecture de l'une arrête automatiquement la lecture des autres.


# \<rrw:block>

Ce widget encapsule un ensemble de widgets ou de code HTML.

```markup
<rrw:block id="myblock">
    HTML et/ou autres widgets
</rrw:block>
```

Les attributs disponibles sont :

* `id="xxx"`  **\[obligatoire]** L'identifiant unique du widget Block, caractères alphanumériques uniquement.
* `data-rrw-wrapper="xxx"` \[optionnel] définit la balise qui sera rendu lors de la publication de la page. un bloc `<div>` est définit par défaut.
* `class="xxx"` *\[optionnel]* Liste de classes associées à ce bloc de contenus

Ce widget est particulièrement utile pour réutiliser un même bloc de contenu dans plusieurs page via le mécanisme de [widget externe](/widgets/widgets-externes), par exemple une entête ou un bandeau.

Le widget Block accepte les widgets enfants suivants :

* [text](/widgets/widget-text)
* [editor](/widgets/widget-editor)
* [image](/widgets/widget-image)
* [video](/widgets/widget-video)
* [iterator](/widgets/widget-iterator)
* [pattern](/widgets/widget-pattern)
* [form](/widgets/widget-form)


# \<rrw:iterator>

Ce widget permet de générer une liste de contenus qui partage le même modèle.

```markup
<rrw:iterator id="myite">
    HTML et/ou widgets
</rrw:iterator>
```

Les attributs disponibles sont :

* `id="xxx"`  **\[obligatoire]** L'identifiant unique du widget Iterator, caractères alphanumériques uniquement.
* `data-rrw-wrapper="xxx"` *\[optionnel]* définit la balise qui sera rendu lors de la publication de la page. un bloc `<div>` est définit par défaut.
* `data-rrw-insert="first|last"` *\[optionnel]* indique si l'ajout d'un élément à la liste se fait au début '`first`' ou à la fin '`last`'.
* `class="xxx"` *\[optionnel]* Liste de classes associées à ce bloc de contenus

Le contenu défini dans la balise `rrw:iterator` sert de modèle pour chaque élément de la liste ainsi créée. Si un widget est utilisé dans le modèle, celui-ci ne doit pas déclarer d'attribut `id`, il sera généré automatiquement à chaque nouvel élément de la liste. <br>

Par exemple :

```markup
<h2>Menu</h2>
<rrw:iterator id="menu" data-rrw-wrapper="ul">
    <li><rrw:text /></li>
</rrw:iterator>
```

:arrow\_up: ce template génère une liste de contenu éditable :arrow\_down:&#x20;

```markup
<h2>Menu</h2>
<ul>
    <li>text1 modifiable</li>
    <li>text2 modifiable</li>
    ...
</ul>
```

Le widget Iterator accepte les widgets enfants suivants :

* [text](/widgets/widget-text)
* [editor](/widgets/widget-editor)
* [image](/widgets/widget-image)
* [video](/widgets/widget-video)
* [pattern](/widgets/widget-pattern)


# \<rrw:pattern>

Ce widget fournit un modèle via la syntaxe mustache à partir d'une source de données externe.

```markup
<rrw:pattern id="mypat">
    <rrw:dataform /> | <rrw:rss />
    syntaxe mustache ici {{myfield}} qui peut être mixée avec 
    du code html <h3>{{data}}</h3>
</rrw:pattern>
```

Le [template mustache](https://defeo.lu/aws/lessons/mustache) s'appuie sur une source de données fournit par les balises `rrw:dataform`,  `rrw:rss`. Les données disponibles sont consultables via l'icône  <img src="https://3272782693-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L_qUR94B0wzcL66XTLq%2F-Lteo_fC1mJ4F7BHoU2d%2F-Lteovn0V-FpxpQN5wwS%2Fdata_ico.png?alt=media&amp;token=6b66f83c-f004-4b44-bcd2-54fd606ee1ee" alt="" data-size="original">&#x20;

```markup
<rrw:dataform>
    <label for="myfield">My field</label>
    <input type="textbox" name="myfield" />
</rrw:dataform>
```

`<rrw:dataform>` fournit un formulaire de données qui pourront être mise en forme via la notation mustache du widget `rrw:pattern`. Les données sont nommées par l'attribut name des balises HTML `<input>`, `<select>` ou encore `<textarea>`.

```markup
<rrw:rss data-rrw-url="https://rss-data-source.xml" />
```

`<rrw:rss>` récupère une source de données externe au format RSS fournit par l'URL `data-rrw-url`.


# \<rrw:form>

Ce widget génère un formulaire de contact qui sera transmis par email au destinataire désigné.

```markup
<rrw:form id="myform" data-rrw-recipient="recipient@address.email">
    <label for="fullname">Nom</label>
		<input type="text" name="fullname" data-rrw-validator="notempty" data-rrw-name="Expediteur">
    
    <label for="email">Email</label>
		<input type="email" name="email" data-rrw-validator="email" data-rrw-name="Email de l'expediteur">

    <label for="message">Message</label>
		<textarea name="message" rows="3" data-rrw-validator="notempty" data-rrw-name="Message"></textarea>

    <button type="submit" class="submit btn btn-default pull-right">Envoyer</button>
</rrw:form>
```

Les attributs disponibles sont :

* `id="xxx"`  **\[obligatoire]** L'identifiant unique du widget Form, caractères alphanumériques uniquement.
* `data-rrw-recipient="xxx"` **\[obligatoire]** définit l'adresse email du destinataire lors de l'envoi d'un formulaire.
* `data-rrw-sender="xxx"` *\[facultatif]* le nom du champ \<input> (la valeur de son attribut name) qui contient l'adresse email de l'expéditeur du formulaire. Cela permet de définir l'adresse de réponse à un formulaire directement à l'email émetteur.
* `data-rrw-subject="xxx"` *\[facultatif]* le sujet de l'email envoyé par le formulaire.
* `data-rrw-success="xxx"` *\[facultatif]* le message affiché si l'envoi du formulaire a réussi.
* `data-rrw-error="xxx"` *\[facultatif]* le message affiché si l'envoi du formulaire a échoué.

Lors de l'envoi d'un formulaire, RunRunWeb génère un email envoyé à l'adresse définit dans l'attribut `data-rrw-recipient` et qui contient chaque champ définit dans une balise `<input>`, `<select>` ou `<textarea>`.\
Par défaut c'est l'attribut name qui nomme la valeur du champ. L'attribut `data-rrw-name` permet de définir un nom plus explicite. Par ailleurs l'attribut `data-rrw-validator` permet de définir des règles sur la valeur du champ, `email` pour une adresse e-mail et `notempty` pour obliger un champ non vide.


# Widgets externes

Les widgets externes permettent de réutiliser un widget définit dans une page dans une autre page du site.

```markup
<rrw:editor id="nompage:idwidget" />
```

Dans le template d'une page il est possible de faire une référence à un widget d'une autre page en définissant son attribut id par le nom de la page suivi par deux points : puis son attribut id dans cette page. Par exemple, si dans la page `home` définit le widget `<rrw:editor id="myeditor" />` alors dans une autre page, il est possible de référence ce widget par`<rrw:editor id="home:myeditor" />`

Lors d'une référence à un widget externe, celui-ci n'est pas modifiable dans la page externe, y compris ses attributs `data-rrw-xxx`.


