---
title: Template syntax
---
### Tags
---
A lowercase tag, like `
`, denotes a regular HTML element. A capitalised tag, such as `` or ``, indicates a *component*.
```html
```
### Attributes and props
---
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
```
---
By convention, values passed to components are referred to as *properties* or *props* rather than *attributes*, which are a feature of the DOM.
As with elements, `name={name}` can be replaced with the `{name}` shorthand.
```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
```
---
*`$$props`* references all props that are passed to a component – including ones that are not declared with `export`. It is useful in rare cases, but not generally recommended, as it is difficult for Svelte to optimise.
```html
```
### Text expressions
```sv
{expression}
```
---
Text can also contain JavaScript expressions:
```html
Hello {name}!
{a} + {b} = {a + b}.
```
### Comments
---
You can use HTML comments inside components.
```html
Hello world
```
---
Comments beginning with `svelte-ignore` disable warnings for the next block of markup. Usually these are accessibility warnings; make sure that you're disabling them for a good reason.
```html
```
### {#if ...}
```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 ...}
```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. The key can be any object, but strings and numbers are recommended since they allow identity to persist when the objects themselves change.
```html
{#each items as item, i (item.id)}
{i + 1}: {item.name} x {item.qty}
{/each}
```
---
You can freely use destructuring and rest patterns in each blocks.
```html
{#each items as { id, name, qty }, i (id)}
{i + 1}: {name} x {qty}
{/each}
{#each objects as { id, ...rest }}
{id}
{/each}
{#each items as [id, ...rest]}
{id}
{/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 ...}
```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}
```
### {@html ...}
```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}
```
### {@debug ...}
```sv
{@debug}
```
```sv
{@debug var1, var2, ..., varN}
```
---
The `{@debug ...}` tag offers an alternative to `console.log(...)`. It logs the values of specific variables whenever they change, and pauses code execution if you have devtools open.
It accepts a comma-separated list of variable names (not arbitrary expressions).
```html
{@debug user}
Hello {user.firstname}!
```
---
`{@debug ...}` accepts a comma-separated list of variable names (not arbitrary expressions).
```html
{@debug user}
{@debug user1, user2, user3}
{@debug user.firstname}
{@debug myArray[0]}
{@debug !isReady}
{@debug typeof user === 'object'}
```
The `{@debug}` tag without any arguments will insert a `debugger` statement that gets triggered when *any* state changes, as opposed to the specified variables.
### Element directives
As well as attributes, elements can have *directives*, which control the element's behaviour in some way.
#### [on:*eventname*](on_element_event)
```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.
```html
```
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={...}`.
---
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
```
---
It's possible to have multiple event listeners for the same event:
```html
```
#### [bind:*property*](bind_element_property)
```sv
bind:property={variable}
```
---
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 `