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: