Add Tailwind Use the svelte-add
CLI to add Tailwind CSS to your project.
npx svelte-add@latest tailwindcss
select package manager npm Copy Add dependencies Add the following dependencies to your project:
npm install tailwind-variants clsx tailwind-merge
select package manager npm Copy Add icon library If you're using the default
style, install lucide-svelte
:
npm install lucide-svelte
Copy If you're using the new-york
style, install svelte-radix
:
npm install svelte-radix
select package manager npm Copy If you are using SvelteKit and are not using the default alias $lib
, you'll need to update your svelte.config.js
file to include those aliases.
svelte.config.js const config = {
// ... other config
kit : {
// ... other config
alias : {
"@/*" : "./path/to/lib/*" ,
},
},
};
Copy If you are not using SvelteKit, then you'll need to update your path aliases in your tsconfig.json
and vite.config.ts
.
tsconfig.json {
" compilerOptions " : {
// ... other options
" paths " : {
" $lib " : [ "./src/lib" ],
" $lib/* " : [ "./src/lib/*" ]
}
}
}
Copy vite.config.ts import path from "path" ;
export default defineConfig ({
// ... other options
resolve : {
alias : {
$lib : path . resolve ( "./src/lib" ),
},
},
});
Copy This is what this project's tailwind.config.js
file looks like:
tailwind.config.js import { fontFamily } from "tailwindcss/defaultTheme" ;
/** @type { import('tailwindcss').Config } */
const config = {
darkMode : [ "class" ],
content : [ "./src/**/*.{html,js,svelte,ts}" ],
safelist : [ "dark" ],
theme : {
container : {
center : true,
padding : "2rem" ,
screens : {
"2xl" : "1400px" ,
},
},
extend : {
colors : {
border : "hsl(var(--border) / <alpha-value>)" ,
input : "hsl(var(--input) / <alpha-value>)" ,
ring : "hsl(var(--ring) / <alpha-value>)" ,
background : "hsl(var(--background) / <alpha-value>)" ,
foreground : "hsl(var(--foreground) / <alpha-value>)" ,
primary : {
DEFAULT : "hsl(var(--primary) / <alpha-value>)" ,
foreground : "hsl(var(--primary-foreground) / <alpha-value>)" ,
},
secondary : {
DEFAULT : "hsl(var(--secondary) / <alpha-value>)" ,
foreground : "hsl(var(--secondary-foreground) / <alpha-value>)" ,
},
destructive : {
DEFAULT : "hsl(var(--destructive) / <alpha-value>)" ,
foreground : "hsl(var(--destructive-foreground) / <alpha-value>)" ,
},
muted : {
DEFAULT : "hsl(var(--muted) / <alpha-value>)" ,
foreground : "hsl(var(--muted-foreground) / <alpha-value>)" ,
},
accent : {
DEFAULT : "hsl(var(--accent) / <alpha-value>)" ,
foreground : "hsl(var(--accent-foreground) / <alpha-value>)" ,
},
popover : {
DEFAULT : "hsl(var(--popover) / <alpha-value>)" ,
foreground : "hsl(var(--popover-foreground) / <alpha-value>)" ,
},
card : {
DEFAULT : "hsl(var(--card) / <alpha-value>)" ,
foreground : "hsl(var(--card-foreground) / <alpha-value>)" ,
},
},
borderRadius : {
lg : "var(--radius)" ,
md : "calc(var(--radius) - 2px)" ,
sm : "calc(var(--radius) - 4px)" ,
},
fontFamily : {
sans : [ "Inter" , ... fontFamily . sans ],
},
},
},
};
export default config ;
Copy Feel free to add or modify as needed to suit your project.
Add the following to your src/app.pcss
file. You can learn more about using CSS variables for theming in the theming section .
src/app.pcss @tailwind base ;
@tailwind components ;
@tailwind utilities ;
@layer base {
: root {
--background : 0 0% 100%;
--foreground : 222.2 47.4% 11.2%;
--muted : 210 40% 96.1%;
--muted-foreground : 215.4 16.3% 46.9%;
--popover : 0 0% 100%;
--popover-foreground : 222.2 47.4% 11.2%;
--border : 214.3 31.8% 91.4%;
--input : 214.3 31.8% 91.4%;
--card : 0 0% 100%;
--card-foreground : 222.2 47.4% 11.2%;
--primary : 222.2 47.4% 11.2%;
--primary-foreground : 210 40% 98%;
--secondary : 210 40% 96.1%;
--secondary-foreground : 222.2 47.4% 11.2%;
--accent : 210 40% 96.1%;
--accent-foreground : 222.2 47.4% 11.2%;
--destructive : 0 92% 38%;
--destructive-foreground : 210 40% 98%;
--ring : 215 20.2% 65.1%;
--radius : 0.5rem;
}
. dark {
--background : 224 71% 4%;
--foreground : 213 31% 91%;
--muted : 223 47% 11%;
--muted-foreground : 215.4 16.3% 56.9%;
--accent : 216 34% 17%;
--accent-foreground : 210 40% 98%;
--popover : 224 71% 4%;
--popover-foreground : 215 20.2% 65.1%;
--border : 216 34% 17%;
--input : 216 34% 17%;
--card : 224 71% 4%;
--card-foreground : 213 31% 91%;
--primary : 210 40% 98%;
--primary-foreground : 222.2 47.4% 1.2%;
--secondary : 222.2 47.4% 11.2%;
--secondary-foreground : 210 40% 98%;
--destructive : 359 51% 48%;
--destructive-foreground : 210 40% 98%;
--ring : 216 34% 17%;
--radius : 0.5rem;
}
}
@layer base {
* {
@apply border-border ;
}
body {
@apply bg-background text-foreground ;
font-feature-settings :
"rlig" 1,
"calt" 1;
}
}
Copy You'll want to create a cn
helper to make it easier to conditionally add Tailwind CSS classes. Additionally, you'll want to add the custom transition that is used by various components.
src/lib/utils.ts import { type ClassValue , clsx } from "clsx" ;
import { twMerge } from "tailwind-merge" ;
import { cubicOut } from "svelte/easing" ;
import type { TransitionConfig } from "svelte/transition" ;
export function cn (... inputs : ClassValue []) {
return twMerge ( clsx ( inputs ));
}
type FlyAndScaleParams = {
y ?: number ;
x ?: number ;
start ?: number ;
duration ?: number ;
};
export const flyAndScale = (
node : Element ,
params : FlyAndScaleParams = { y : -8, x : 0, start : 0.95, duration : 150 }
): TransitionConfig => {
const style = getComputedStyle ( node );
const transform = style . transform === "none" ? "" : style . transform ;
const scaleConversion = (
valueA : number ,
scaleA : [ number , number ],
scaleB : [ number , number ]
) => {
const [ minA , maxA ] = scaleA ;
const [ minB , maxB ] = scaleB ;
const percentage = ( valueA - minA ) / ( maxA - minA );
const valueB = percentage * ( maxB - minB ) + minB ;
return valueB ;
};
const styleToString = (
style : Record < string , number | string | undefined >
): string => {
return Object . keys ( style ). reduce (( str , key ) => {
if ( style [ key ] === undefined) return str ;
return str + key + ":" + style [ key ] + ";" ;
}, "" );
};
return {
duration : params . duration ?? 200,
delay : 0,
css : ( t ) => {
const y = scaleConversion ( t , [0, 1], [ params . y ?? 5, 0]);
const x = scaleConversion ( t , [0, 1], [ params . x ?? 0, 0]);
const scale = scaleConversion ( t , [0, 1], [ params . start ?? 0.95, 1]);
return styleToString ({
transform :
transform +
"translate3d(" +
x +
"px, " +
y +
"px, 0) scale(" +
scale +
")" ,
opacity : t ,
});
},
easing : cubicOut ,
};
};
Copy Import styles to your app Create src/routes/+layout.svelte
and import the styles:
src/routes/+layout.svelte < script lang = "ts" >
import "../app.pcss" ;
</ script >
<slot />
Copy That's it You can now start adding components to your project.
npx shadcn-svelte@latest add button
select package manager npm Copy