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
select package manager npm 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.5 rem ;
}
.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.5 rem ;
}
}
@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