Getting Started
Components
Search for a command to run...
This is the recommended approach for new React applications. You own the component code, customize freely, and get the full shadcn/ui experience with Strongtie branding.
Why this approach? Components are copied into your project, not installed as dependencies. You own the code and never worry about breaking changes from package updates.
The fastest way to get started is using shadcn's preset feature:
This creates a new Vite + React project with Strongtie design standards pre-configured.
Already have a project? Follow the manual setup steps below.
Follow the guide from shadcn
Add components using the shadcn CLI:
Components are copied to your components/ui/ directory where you can customize them.
Best Practice: When adding custom functionality, create abstracted
components instead of editing shadcn components directly. For example, if you
need a button with custom props, create components/custom-button.tsx that
wraps components/ui/button.tsx. This keeps shadcn components pristine and
makes updates easier.
All major AI coding assistants (Claude, ChatGPT, Cursor, etc.) have native knowledge of shadcn/ui. Just ask "use shadcn to add a button" and they know exactly what to do. Plus, with the shadcn MCP server available, AI agents can directly add and modify components in your project—making UI development faster and more intuitive than ever.
shadcn/ui supports two UI primitive libraries:
To use Base-UI instead:
Both produce the same visual output. The difference is the underlying accessibility primitives.
If your project uses @strongtie/design-system as a package dependency (rather than copying components via the shadcn CLI), you need to import the design system's styles. The approach depends on whether your app already has its own Tailwind CSS setup.
For Next.js applications or any project that already imports Tailwind CSS, use the modular imports. This avoids duplicate Tailwind output and works correctly with Turbopack's lightningCSS processor.
In your globals.css:
/* 1. SST fonts and design tokens (pre-compiled, no Tailwind directives) */
@import "@strongtie/design-system/styles/tokens";
/* 2. Tailwind CSS — single source of utility classes */
@import "tailwindcss";
/* 3. Design system theme — must come AFTER tailwindcss */
@import "@strongtie/design-system/styles/theme";
/* 4. Animations (optional) */
@import "tw-animate-css";
/* Tell Tailwind to scan your app AND design system components */
@source "../app";
@source "../components";
@source "../node_modules/@strongtie/design-system/dist";
/* Map SST font to Tailwind's font-sans utility */
@theme {
--font-sans: var(--font-family);
}What each import provides:
./styles/tokens — SST font-face declarations and design token CSS custom properties (--space-*, --font-size-*, etc.)./styles/theme — CSS custom properties for light/dark modes, @theme inline mappings for Tailwind utilities (bg-primary, text-foreground, etc.), @custom-variant dark, and @layer base rulesThe @source directive for the design system dist is required. Without
it, Tailwind won't generate utility classes used by design system components
and they will render unstyled.
Why not ./styles? The monolithic ./styles export includes its own
@import "tailwindcss" which conflicts with your app's Tailwind setup. The
modular imports let your app own the single Tailwind framework import.
For projects that don't have their own Tailwind CSS setup, use the monolithic import:
@import "@strongtie/design-system/styles";This includes everything: Tailwind CSS, SST fonts, design tokens, theme configuration, and base styles. No @source directive is needed since Tailwind is bundled within the import.
Since you own the code, modify components directly:
// Add custom variants to match your needs
const buttonVariants = cva(
"inline-flex items-center justify-center rounded-md text-sm font-medium transition-all",
{
variants: {
variant: {
default: "bg-primary text-primary-foreground hover:bg-primary/90",
destructive: "bg-destructive text-white hover:bg-destructive/90",
outline: "border bg-background hover:bg-accent",
secondary:
"bg-secondary text-secondary-foreground hover:bg-secondary/80",
ghost: "hover:bg-accent hover:text-accent-foreground",
link: "text-primary underline-offset-4 hover:underline",
// Add your own
brand: "bg-orange-500 text-white hover:bg-orange-600",
},
// ...
},
}
)Tailwind CSS handles nearly all styling needs, but custom CSS is acceptable on a case-by-case basis when Tailwind lacks native utilities.
When custom CSS may be appropriate:
@media print) with specific requirementsRequirements for custom CSS:
var(--spacing), var(--primary), etc.) to maintain theme compatibilityThis is not blanket permission to write custom CSS. Each case should be evaluated to ensure Tailwind utilities or plugins cannot accomplish the same result.
See the Design Standards FAQ for detailed guidance.
Ensure your CSS variables match the example above. shadcn components rely on variables like --background, --foreground, --primary, etc.
Cmd/Ctrl + Shift + P > "TypeScript: Restart TS Server"tsconfig.json:{
"compilerOptions": {
"paths": {
"@/*": ["./*"]
}
}
}globals.css is imported in your root layoutcontent paths in your Tailwind config