Loading...
Loading...
Best practices for setup and use of shadcn-svelte library to develop UX/UI in Svelte projects. Use this skill when project is using Svelte/SvelteKit framework as main app framework, when user attempts to setup new project or when user is developing on existing project using shadcn-svelte components.
npx skill4agent add tapforce/agents-skills tapforce-shadcn-sveltecomponents.json# Check if components.json exists
ls -la components.jsonpnpm dlx shadcn-svelte@latest init@latestpackage.jsoncomponents.json$libsvelte.config.jsconst config = {
// ... other config
kit: {
// ... other config
alias: {
"@/*": "./path/to/lib/*",
},
},
};pnpm dlx shadcn-svelte@latest init-c, --cwd <path>-o, --overwrite--no-deps--skip-preflight--base-color <name>--css <path>--components-alias <path>--lib-alias <path>--utils-alias <path>--hooks-alias <path>--ui-alias <path>--proxy <proxy>pnpm dlx shadcn-svelte@latest add [component]pnpm dlx shadcn-svelte@latest add button-c, --cwd <path>--no-deps--skip-preflight-a, --all-y, --yes-o, --overwrite--proxy <proxy><script lang="ts">
import { Button } from "$lib/components/ui/button";
</script>
<Button>Click me</Button>import { Button } from "$lib/components/ui/button"import { Card, CardHeader, CardTitle } from "$lib/components/ui/card"import * as Button from "$lib/components/ui/button"/index.js--primary: oklch(0.208 0.042 265.755);
--primary-foreground: oklch(0.984 0.003 247.858);var(--primary)var(--primary-foreground)<div class="bg-primary text-primary-foreground">Hello</div>init@custom-variant dark (&:is(.dark *)):root.dark@theme inline@layer base| Variable | Purpose |
|---|---|
| Page background and text |
| Card component colors |
| Popover/dropdown colors |
| Primary action colors |
| Secondary action colors |
| Muted/subtle content |
| Accent/highlight colors |
| Destructive action color |
| Border color |
| Input border color |
| Focus ring color |
| Chart colors |
| Sidebar-specific variants |
| Base border radius |
@theme inlinebg-primarytext-foregroundborder-border@theme inline {
--radius-sm: calc(var(--radius) - 4px);
--radius-md: calc(var(--radius) - 2px);
--radius-lg: var(--radius);
--radius-xl: calc(var(--radius) + 4px);
--color-background: var(--background);
--color-foreground: var(--foreground);
--color-primary: var(--primary);
--color-primary-foreground: var(--primary-foreground);
/* ... maps all CSS variables to Tailwind color utilities */
}
@layer base {
* {
@apply border-border outline-ring/50;
}
body {
@apply bg-background text-foreground;
}
}pnpm i mode-watcher<script lang="ts">
import { ModeWatcher } from "mode-watcher";
let { children } = $props();
</script>
<ModeWatcher />
{@render children?.()}<script lang="ts">
import SunIcon from "@lucide/svelte/icons/sun";
import MoonIcon from "@lucide/svelte/icons/moon";
import { toggleMode } from "mode-watcher";
import { Button } from "$lib/components/ui/button";
</script>
<Button onclick={toggleMode} variant="outline" size="icon">
<SunIcon class="h-[1.2rem] w-[1.2rem] scale-100 rotate-0 !transition-all dark:scale-0 dark:-rotate-90" />
<MoonIcon class="absolute h-[1.2rem] w-[1.2rem] scale-0 rotate-90 !transition-all dark:scale-100 dark:rotate-0" />
<span class="sr-only">Toggle theme</span>
</Button><script lang="ts">
import SunIcon from "@lucide/svelte/icons/sun";
import MoonIcon from "@lucide/svelte/icons/moon";
import { resetMode, setMode } from "mode-watcher";
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger
} from "$lib/components/ui/dropdown-menu";
import { buttonVariants } from "$lib/components/ui/button";
</script>
<DropdownMenu>
<DropdownMenuTrigger class={buttonVariants({ variant: "outline", size: "icon" })}>
<SunIcon class="h-[1.2rem] w-[1.2rem] scale-100 rotate-0 !transition-all dark:scale-0 dark:-rotate-90" />
<MoonIcon class="absolute h-[1.2rem] w-[1.2rem] scale-0 rotate-90 !transition-all dark:scale-100 dark:rotate-0" />
<span class="sr-only">Toggle theme</span>
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
<DropdownMenuItem onclick={() => setMode("light")}>Light</DropdownMenuItem>
<DropdownMenuItem onclick={() => setMode("dark")}>Dark</DropdownMenuItem>
<DropdownMenuItem onclick={() => resetMode()}>System</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>