A starter template to help you quickly launch a new project with Svelte / Sveltekit, Typescript, TailwindCSS, Pug. I call it the "Skinnypug" stack.
This starter was developed for the Lightning Jar team. It's designed to get one up and running quickly on a new project using the core technologies Svelte, Sveltekit, Typescript, TailwindCSS, Pug + a few other bells and whistles ( see the full breakdown below).
Autoprefixer - CSS vendor prefixing
PostCSS - CSS transformations
TailwindCSS - CSS framework
tailwindcss/typography - prose styling
tailwindcss/forms - form styling
Prettier - formatter
@prettier/plugin-pug - Pug formatting
prettier-plugin-svelte - Svelte formatting
ESLint - linter
eslint-config-prettier - compatibility w/ prettier
typescript-eslint/parser - TS parsing
Once you've created a project and installed dependencies with npm install
(or pnpm install
or yarn
), start a development server:
npm run dev
# or start the server and open the app in a new browser tab
npm run dev -- --open
To create a production version of your app:
npm run build
You can preview the production build with npm run preview
.
Sveltekit is a new framework for building web applications. It's built on top of Svelte, which is a component framework for building user interfaces. Sveltekit is a great tool for building modern web applications.
If you get stuck working with SvelteKit you can reach out for help in the SvelteKit Discord chatroom.
I love Pug, and the first thing I figured out when I started working with Svelte, was how to use Pug inside Svelte files. Thankfully other devs had already solved the technical challenges for me.
This starter uses the svelte-preprocess package.It is a Svelte preprocessor with sensible defaults and support for: PostCSS, SCSS, Less, Stylus, CoffeeScript, TypeScript, Pug and much more.
Note: Special syntax is required to write Pug inside Svelte templates. Some basics are included below. You can learn more here.**
Because some of Svelte's template syntax is invalid in Pug svelte-preprocess
provides some pug mixins to represent svelte's {#...}{/...}
blocks: +if()
, +else()
, +elseif()
, +each()
, +key()
, +await()
, +then()
, +catch()
, +html()
, +const()
, +debug()
.
ul
+if('posts && posts.length > 1')
+each('posts as post')
li
a(
href="blog/{post.slug}",
rel="prefetch") { post.title }
+else
span No posts :c
Pug encodes everything inside an element attribute to html entities, so attr="{foo && bar}"
becomes attr="foo && bar"
. To prevent this from happening, instead of using the =
operator use !=
which won't encode your attribute value:
button(disabled!="{ foo && bar }")
This is also necessary to pass callbacks:
button(on:click!="{ (e) => doTheThing(e) }")
It is not possible to use template literals for attribute values. You can't write attr=`Hello ${value ? 'Foo' : 'Bar'}`
, instead write attr="Hello {value ? 'Foo' : 'Bar'}"
.
To spread props into a pug element, wrap the {...object}
expression with quotes "
.
This:
button.big(
disabled,
type="button",
{...slide.props}) Send
Becomes:
<button
class="big"
type="button"
disabled
{...slide.props}
>
Send
</button>
Syntax to use Svelte Element directives with Pug
input(bind:value="{ foo }")
input(on:input="{ bar }")
The following shortcuts and corresponding folders come pre-configured in this template:
If you are using VSCode, we recommend these extensions:
note: This template includes a .vscode
folder with some pre-configured settings for VSCode. Set "editor.formatOnSave": true
to activate formatting on save.
note: Tf you are using the ESLint extension, you will need to set "eslint.experimental.useFlatConfig": true
in your VSCode settings, so the extension can read the 'eslint.config.js' file used in this project.
This starter is optimized for quick deployment of your projects to Vercel using the Vercel for GitHub integration. You can learn more in the Vercel documentation.
This starter uses the Vite adapter for Vercel.
For more universal use, switch back to the Auto adapter by changing the adapter in the svelte.config.js
file.
This starter can be used with multiple package managers. It is tested with PNPM, but should work with NPM or Yarn as well. The engine is not set in stone, but the starter is tested with Node 20.0.0.