Basic Svelte
Introduction
Bindings
Advanced Svelte
Advanced reactivity
Motion
Advanced bindings
Advanced transitions
Context API
Special elements
<script module>
Next steps
Basic SvelteKit
Introduction
Routing
Loading data
Headers and cookies
Shared modules
API routes
Stores
Errors and redirects
Advanced SvelteKit
Page options
Link options
Advanced routing
Advanced loading
Environment variables
Conclusion
As we saw in the routing introduction, layouts are a way to share UI and data loading logic between different routes.
Sometimes it’s useful to use layouts without affecting the route — for example, you might need your /app
and /account
routes to be behind authentication, while your /about
page is open to the world. We can do this with a route group, which is a directory in parentheses.
Create an (authed)
group by renaming account
to (authed)/account
then renaming app
to (authed)/app
.
Now we can control access to these routes by creating src/routes/(authed)/+layout.server.js
:
import { redirect } from '@sveltejs/kit';
export function load({ cookies, url }) {
if (!cookies.get('logged_in')) {
redirect(303, `/login?redirectTo=${url.pathname}`);
}
}
If you try to visit these pages, you’ll be redirected to the /login
route, which has a form action in src/routes/login/+page.server.js
that sets the logged_in
cookie.
We can also add some UI to these two routes by adding a src/routes/(authed)/+layout.svelte
file:
<script>
let { children } = $props();
</script>
<form method="POST" action="/logout">
<button>log out</button>
</form>
<h1>home</h1>
<p>this is the home page.</p>