skills/tapforce-shadcn-svelte/SKILL.md
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 skillsauth add tapforce/agents-skills tapforce-shadcn-svelteInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill provides comprehensive guidance for setting up and using the shadcn-svelte library in Svelte projects. It covers installation, configuration, component usage, theming, and best practices.
You must check if shadcn-svelte is already installed in the project. To check, look for the components.json file in the project root directory.
# Check if components.json exists
ls -la components.json
If the file exists, shadcn-svelte is already configured in the project.
Project requires SvelteKit ^2 and TailwindCSS ^4 ready before initializing shadcn-svelte.
pnpm dlx shadcn-svelte@latest init
The @latest tag indicates installing the latest version. For adding components by command, you need to get the real version from package.json and use it in the command.
You will be asked a few questions to configure components.json:
If you are not using the default alias $lib, you'll need to update your svelte.config.js file to include those aliases:
const config = {
// ... other config
kit: {
// ... other config
alias: {
"@/*": "./path/to/lib/*",
},
},
};
pnpm dlx shadcn-svelte@latest init
Options:
-c, --cwd <path>: the working directory (default: the current directory)-o, --overwrite: overwrite existing files (default: false)--no-deps: disable adding & installing dependencies--skip-preflight: ignore preflight checks and continue (default: false)--base-color <name>: the base color for the components (choices: "slate", "gray", "zinc", "neutral", "stone")--css <path>: path to the global CSS file--components-alias <path>: import alias for components--lib-alias <path>: import alias for lib--utils-alias <path>: import alias for utils--hooks-alias <path>: import alias for hooks--ui-alias <path>: import alias for ui--proxy <proxy>: fetch items from registry using a proxypnpm dlx shadcn-svelte@latest add [component]
Example:
pnpm dlx shadcn-svelte@latest add button
Options:
-c, --cwd <path>: the working directory (default: the current directory)--no-deps: skips adding & installing package dependencies--skip-preflight: ignore preflight checks and continue (default: false)-a, --all: install all components to your project (default: false)-y, --yes: skip confirmation prompt (default: false)-o, --overwrite: overwrite existing files (default: false)--proxy <proxy>: fetch components from registry using a proxyAfter adding a component, you can import it like this:
<script lang="ts">
import { Button } from "$lib/components/ui/button";
</script>
<Button>Click me</Button>
Import Guidelines:
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 suffixshadcn-svelte uses a simple background and foreground convention for colors. The background variable is used for the background color of the component and the foreground variable is used for the text color.
For example, given these CSS variables:
--primary: oklch(0.208 0.042 265.755);
--primary-foreground: oklch(0.984 0.003 247.858);
The background color will be var(--primary) and the foreground color will be var(--primary-foreground):
<div class="bg-primary text-primary-foreground">Hello</div>
The init command generates the full CSS structure in your global CSS file. The exact oklch values depend on the chosen base color (slate, gray, zinc, neutral, stone). The generated file includes:
@custom-variant dark (&:is(.dark *)):root CSS variables for light mode colors.dark CSS variables for dark mode colors@theme inline block mapping CSS variables to TailwindCSS v4 utilities@layer base block for default border and background stylesThe following variables are available (values shown are for the slate base color):
| Variable | Purpose |
|----------|---------|
| --background / --foreground | Page background and text |
| --card / --card-foreground | Card component colors |
| --popover / --popover-foreground | Popover/dropdown colors |
| --primary / --primary-foreground | Primary action colors |
| --secondary / --secondary-foreground | Secondary action colors |
| --muted / --muted-foreground | Muted/subtle content |
| --accent / --accent-foreground | Accent/highlight colors |
| --destructive | Destructive action color |
| --border | Border color |
| --input | Input border color |
| --ring | Focus ring color |
| --chart-1 through --chart-5 | Chart colors |
| --sidebar-* | Sidebar-specific variants |
| --radius | Base border radius |
The init command also generates a @theme inline block required by TailwindCSS v4 to map CSS variables to Tailwind utility classes (e.g., bg-primary, text-foreground, border-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
Import the ModeWatcher component and use it in your root layout:
<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>
This skill includes the following rules:
development
Best practices for setting up and developing UX/UI for projects using Tailwind CSS ^4. Use when setting up new projects with Tailwind CSS support or when projects have Tailwind CSS installed.
development
Best practices for setting up and developing Svelte projects using SvelteKit ^2.0.0. Use when considering setup or development based on SvelteKit framework.
tools
Best practices for using pnpm ^10.0.0 in Node.js projects. Use when working with Node.js-based projects.
development
Maintainer-only workflow for handling GitHub Secret Scanning alerts on OpenClaw. Use when Codex needs to triage, redact, clean up, and resolve secret leakage found in issue comments, issue bodies, PR comments, or other GitHub content.