---
title: Template syntax
---
### Tags
---
A lowercase tag, like `
`, denotes a regular HTML element. A capitalised tag, such as ``, indicates a *component*.
```html
```
### Attributes
---
By default, attributes work exactly like their HTML counterparts.
```html
```
---
As in HTML, values may be unquoted.
```html
```
---
Attribute values can contain JavaScript expressions.
```html
page {p}
```
---
Or they can *be* JavaScript expressions.
```html
```
---
An expression might include characters that would cause syntax highlighting to fail in regular HTML, so quoting the value is permitted. The quotes do not affect how the value is parsed:
```html
```
---
When the attribute name and value match (`name={name}`), they can be replaced with `{name}`.
```html
```
---
*Spread attributes* allow many attributes or properties to be passed to an element or component at once.
An element or component can have multiple spread attributes, interspersed with regular ones.
```html
```
### Text expressions
```sv
{expression}
```
---
Text can also contain JavaScript expressions:
```html
Hello {name}!
{a} + {b} = {a + b}.
```
### HTML expressions
```sv
{@html expression}
```
---
In a text expression, characters like `<` and `>` are escaped. With HTML expressions, they're not.
> Svelte does not sanitize expressions before injecting HTML. If the data comes from an untrusted source, you must sanitize it, or you are exposing your users to an XSS vulnerability.
```html
{post.title}
{@html post.content}
```
### If blocks
```sv
{#if expression}...{/if}
```
```sv
{#if expression}...{:else if expression}...{/if}
```
```sv
{#if expression}...{:else}...{/if}
```
---
Content that is conditionally rendered can be wrapped in an if block.
```html
{#if answer === 42}
what was the question?
{/if}
```
---
Additional conditions can be added with `{:else if expression}`, optionally ending in an `{:else}` clause.
```html
{#if porridge.temperature > 100}
too hot!
{:else if 80 > porridge.temperature}
too cold!
{:else}
just right!
{/if}
```
### Each blocks
```sv
{#each expression as name}...{/each}
```
```sv
{#each expression as name, index}...{/each}
```
```sv
{#each expression as name, index (key)}...{/each}
```
```sv
{#each expression as name}...{:else}...{/each}
```
---
Iterating over lists of values can be done with an each block.
```html
Shopping list
{#each items as item}
{item.name} x {item.qty}
{/each}
```
---
An each block can also specify an *index*, equivalent to the second argument in an `array.map(...)` callback:
```html
{#each items as item, i}
{i + 1}: {item.name} x {item.qty}
{/each}
```
---
If a *key* expression is provided — which must uniquely identify each list item — Svelte will use it to diff the list when data changes, rather than adding or removing items at the end.
```html
{#each items as item, i (item.id)}
{i + 1}: {item.name} x {item.qty}
{/each}
```
---
You can freely use destructuring patterns in each blocks.
```html
{#each items as { id, name, qty }, i (id)}
{i + 1}: {name} x {qty}
{/each}
```
---
An each block can also have an `{:else}` clause, which is rendered if the list is empty.
```html
{#each todos as todo}
{todo.text}
{:else}
No tasks today!
{/each}
```
### Await blocks
```sv
{#await expression}...{:then name}...{:catch name}...{/await}
```
```sv
{#await expression}...{:then name}...{/await}
```
```sv
{#await expression then name}...{/await}
```
---
Await blocks allow you to branch on the three possible states of a Promise — pending, fulfilled or rejected.
```html
{#await promise}
waiting for the promise to resolve...
{:then value}
The value is {value}
{:catch error}
Something went wrong: {error.message}
{/await}
```
---
The `catch` block can be omitted if you don't need to render anything when the promise rejects (or no error is possible).
```html
{#await promise}
waiting for the promise to resolve...
{:then value}
The value is {value}
{/await}
```
---
If you don't care about the pending state, you can also omit the initial block.
```html
{#await promise then value}
The value is {value}
{/await}
```
### DOM events
```sv
on:eventname={handler}
```
```sv
on:eventname|modifiers={handler}
```
---
Use the `on:` directive to listen to DOM events.
```html
```
---
Handlers can be declared inline with no performance penalty. As with attributes, directive values may be quoted for the sake of syntax highlighters.
```html
```
---
Add *modifiers* to DOM events with the `|` character.
The following modifiers are available:
* `preventDefault` — calls `event.preventDefault()` before running the handler
* `stopPropagation` — calls `event.stopPropagation()`, preventing the event reaching the next element
* `passive` — improves scrolling performance on touch/wheel events (Svelte will add it automatically where it's safe to do so)
* `capture` — fires the handler during the *capture* phase instead of the *bubbling* phase
* `once` — remove the handler after the first time it runs
Modifiers can be chained together, e.g. `on:click|once|capture={...}`.
```html
```
---
If the `on:` directive is used without a value, the component will *forward* the event, meaning that a consumer of the component can listen for it.
```html
```
### Component events
```sv
on:eventname={handler}
```
---
Components can emit events using [createEventDispatcher](docs#createeventdispatcher), or by forwarding DOM events. Listening for component events looks the same as listening for DOM events:
```html
```
### Element bindings
```sv
bind:property={variable}
```
```sv
bind:group={variable}
```
```sv
bind:this={dom_node}
```
---
Data ordinarily flows down, from parent to child. The `bind:` directive allows data to flow the other way, from child to parent. Most bindings are specific to particular elements.
The simplest bindings reflect the value of a property, such as `input.value`.
```html
```
---
If the name matches the value, you can use a shorthand.
```html
```
---
Numeric input values are coerced; even though `input.value` is a string as far as the DOM is concerned, Svelte will treat it as a number. If the input is empty or invalid (in the case of `type="number"`), the value is `undefined`.
```html
```
#### Binding related elements
---
Inputs that work together can use `bind:group`.
```html
```
#### Binding `