Le markup présent dans un composant Svelte peut être vu comme du HTML++.
## Balises [!VO]Tags
Une balise en minuscules, comme `
`, représente un élément HTML standard. Une balise en
majuscules ou une balise utilisant un point, comme `` ou ``, représente un
_composant_.
```svelte
```
## Attributs des éléments [!VO]Element attributes
Par défaut, les attributs fonctionnent exactement comme leurs homologues HTML.
```svelte
```
Comme en HTML, les valeurs peuvent être fournies sans guillemets.
```svelte
```
Les valeurs d'attributs peuvent contenir des expressions JavaScript.
```svelte
page {p}
```
Ou peuvent _être_ des expressions JavaScript.
```svelte
```
Les attributs booléens sont inclus sur l'élément si leur valeur est
[truthy](https://developer.mozilla.org/fr/docs/Glossary/Truthy) et exclus si leur valeur est
[falsy](https://developer.mozilla.org/fr/docs/Glossary/Falsy).
Tous les autres attributs sont inclus sauf si leur valeur est
[nullish](https://developer.mozilla.org/fr/docs/Glossary/Nullish) (`null` ou `undefined`).
```svelte
Cette div n'a pas d'attribut de titre
```
> [!NOTE] Mettre une expression entre guillemets n'a pas d'effet sur comment la valeur est lue, mais
> en Svelte 6 cela entraînera la transformation de la valeur en string :
>
>
> ```svelte
>
> ```
Lorsque le nom de l'attribut correspond au nom de sa valeur (`name={name}`), l'écriture peut
être remplacée par `{name}`.
```svelte
```
## Props de composant [!VO]Component props
Par convention, les valeurs passées aux composants sont appelées _propriétés_, ou _props_, plutôt
qu'_attributs_, qui sont une fonctionnalité du DOM.
Comme pour les éléments, `name={name}` peut être remplacé par le raccourci `{name}`.
```svelte
```
Les _attributs décomposés_ permettre de fournir d'un coup plusieurs attributs ou propriétés à un
élément ou composant.
Un élément ou composant peut avoir plusieurs attributs décomposés, ponctués d'attributs normaux.
```svelte
```
## Évènements [!VO]Events
Écouter des évènements DOM est possible en ajoutant à un élément des attributs commençant par `on`.
Par exemple, pour écouter l'évènement `click`, ajoutez l'attribut `onclick` à un bouton :
```svelte
```
Les attributs d'évènements sont sensibles à la casse. `onclick` écoute l'évènement `click`,
`onClick` écoute l'évènement `Click`, ce qui n'est pas la même chose. Ceci vous assure de pouvoir
écouter des évènements personnalisés ayant des majuscules dans leur nom.
Puisque les évènements sont juste des attributs, les règles des attributs s'appliquent :
- vous pouvez utiliser la forme raccourcie : ``
- vous pouvez les décomposer : ``
En termes de timing, les attributs d'évènement sont toujours déclenchés après les évènements venant
de liaisons (par ex. `oninput` est toujours déclenché après une mise à jour via `bind:value`). Sous
le capot, certains gestionnaires d'évènement sont directement attachés avec `addEventListener`,
tandis que d'autres sont _délégués_.
Lors de l'utilisation d'attributs d'évènement `ontouchstart` et `ontouchmove`, les gestionnaires
sont
[passifs](https://developer.mozilla.org/fr/docs/Web/API/EventTarget/addEventListener#using_passive_listeners)
pour des raisons de performance. Cela améliore notablement la responsivité en laissant le navigateur
parcourir le document immédiatement, plutôt que d'attendre de savoir si le gestionnaire d'évènement
exécute `event.preventDefault()`.
Dans les rares cas où vous auriez besoin d'empêcher le comportement par défaut de ces évènements,
vous devriez plutôt utiliser [`on`](svelte-events#on) (par exemple dans une action).
### Délégation d'évènement [!VO]Event delegation
Pour réduire l'empreinte mémoire et améliorer les performances, Svelte utilise une technique appelée
délégation d'évènement. Ceci signifie que pour certains évènements — voir la liste plus bas — un
unique gestionnaire d'évènement "racine" prend la responsabilité de jouer tout gestionnaire présent
dans le parcours de l'évènement.
Il y a quelques inconvénients à avoir en tête :
- lorsque vous générez manuellement un évènement avec un gestionnaire délégué, assurez-vous de
définir l'option `{ bubbles: true }` ou bien l'évènement n'atteindra jamais la racine de
l'application.
- lorsque vous utilisez `addEventListener` directement, éviter d'appeler `stopPropagation` ou bien
l'évènement n'atteindra pas la racine de l'application et les gestionnaires ne seront pas invoqués.
De même, les gestionnaires ajoutés manuellement à la racine de l'application seront exécutés _avant_
les gestionnaires ajoutés déclarativement plus profondément dans le DOM (c-à-d avec
`onclick={...}`), à la fois pour les phases de capture et de bubbling. C'est pour ces raisons qu'il
est préférable d'utiliser la fonction `on` importée depuis `svelte/events` plutôt que d'utiliser
`addEventListener`, puisque cela vous assurera que l'ordre est préservé et que `stopPropagation` est
géré correctement.
Les gestionnaires des évènements suivants sont délégués :
- `beforeinput`
- `click`
- `change`
- `dblclick`
- `contextmenu`
- `focusin`
- `focusout`
- `input`
- `keydown`
- `keyup`
- `mousedown`
- `mousemove`
- `mouseout`
- `mouseover`
- `mouseup`
- `pointerdown`
- `pointermove`
- `pointerout`
- `pointerover`
- `pointerup`
- `touchend`
- `touchmove`
- `touchstart`
## Expressions texte [!VO]Text expressions
Une expression JavaScript peut être incluse en tant que texte en l'entourant d'accolades.
```svelte
{expression}
```
Les expressions qui sont `null` ou `undefined` seront omises ; toutes les autres seront
[transformées en chaînes de
caractères](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String#string_coercion).
Les accolades peuvent être incluses dans un template Svelte en utilisant leur chaîne de caractères
d'[entité HTML](https://developer.mozilla.org/fr/docs/Glossary/Entity) : `{`, `{`, or
`{` pour `{` et `}`, `}`, ou `}` pour `}`.
Si vous utilisez la [notation
litérale](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/RegExp#literal_notation_and_constructor)
d'une expression régulière (`RegExp`), vous devrez l'entourer de parenthèses :
```svelte
Hello {name}!
{a} + {b} = {a + b}.
{(/^[A-Za-z ]+$/).test(value) ? x : y}
```
L'expression sera transformée en chaîne de caractères et échappée pour éviter les injections de
code. Si vous souhaitez afficher du HTML, utilisez plutôt la balise `{@html}`.
```svelte
{@html uneChaineDeCaracteresPotentiellementDangereuse}
```
> [!NOTE] Assurez-vous soit d'échapper la chaîne fournie, soit de ne fournir que des valeurs qui
> sont sous votre contrôle pour votre protéger d'éventuelles attaques
> [XSS](https://owasp.org/www-community/attacks/xss/).
## Commentaires [!VO]Comments
Vous pouvez écrire des commentaires HTML au sein de vos composants.
```svelte
Coucou tout le monde
```
Les commentaires commençant par `svelte-ignore` désactivent les warnings pour le bloc de markup
suivant. Ces sont généralement des warnings d'accessibilité ; ne les désactivez que pour une bonne
raison.
```svelte
```
Vous pouvez ajouter un commentaire spécial commençant par `@component` qui s'affichera lorsque vous
survolerez le nom du composant dans d'autres fichiers.
````svelte