Updated Mar 4, 2021
added solution for Sapper
https://github.com/timscodebase/newest-tim
I struggled for a time to get CSS Houdini working with SvelteKit. I finally figured it out!
Here is how to get it going.
Step 1
Setup Svelte kit
mkdir project && cd project
npm init svelte@next
npm install -D @sveltejs/adapter-node
npm install -D @sveltejs/adapter-static
npm install -D @sveltejs/adapter-netlify
npm install -D @sveltejs/adapter-vercel`
Setup sveltekit how you like.
Step 2
Import CSS Houdini
My first mistake attempting to use CSS Houdini in Svelte was trying to import CSS Houdini at the component level. That gave me the following error.
separator.svelte
<script>
if ("paintWorklet" in CSS) {
CSS.paintWorklet.addModule(
"https://rawcdn.githack.com/CSSHoudini/css- houdini/74a3e2482adf18b41882de48f601a5fc18fd9d5c/src/lines/dit/lines.js"
);
}
</script>
<div class="css-houdini lines" />
Error
ReferenceError: CSS is not defined
at eval (/_components/Separator.svelte.js:14:3)
at eval (/_components/Separator.svelte.js:16:4)
...
...
I found that even if I use onLoad
I would get the error. I decided it would be best if I import CSS Houdini at the highest possible level.
app.html
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
%svelte.head%
</head>
<body>
<div id="svelte">%svelte.body%</div>
<script>
(async function () {
if ('paintWorklet' in CSS) {
CSS.paintWorklet
.addModule('https://rawcdn.githack.com/CSSHoudini/csshoudini/74a3e2482adf18b41882de48f601a5fc18fd9d5c/src/lines/dist/lines.s');
}
})();
</script>
</body>
</html>
Step 3
Apply CSS Houdini
separator.svelte
...
...
<style>
:root {
--size: 300px;
}
@media (min-width: 600px) {
:root {
--size: 600px;
}
}
.css-houdini {
height: var(--size);
padding: 1em;
box-sizing: content-box;
width: var(--size);
}
.lines {
--lines-colors: #f94144, #f3722c, #f8961e, #f9844a, #f9c74f, #90be6d,
#43aa8b, #4d908e, #577590, #277da1;
--lines-widths: 10, 2, 3, 8;
--lines-gaps: 20, 4, 3, 7;
--lines-rotate: 0; /* In degrees */
background-image: paint(lines);
}
</style>
IT WORKS
Sapper
When adding CSS Houdini in Sapper is a bit different. Here is the solution that has worked for me.
Template.html
'
Add css-paint-polyfill
to the <head>
.
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<meta name="theme-color" content="#333333">
%sapper.base%
<!-- <link rel="stylesheet" href="global.css"> -->
<link rel="stylesheet" href="min.css">
<link rel="manifest" href="manifest.json" crossorigin="use-credentials">
<link rel="icon" type="image/png" href="favicon.png">
<script src="https://unpkg.com/css-paint-polyfill">
...
...
<script>
(async function () {
if ('paintWorklet' in CSS) {
CSS.paintWorklet.addModule('https://rawcdn.githack.com/CSSHoudini/css-houdini/74a3e2482adf18b41882de48f601a5fc18fd9d5c/src/lines/dist/lines.js');
}
})();
</script>
Top comments (1)
You can add whatever Worklet Library you want: houdini.how/