算法艺术创作
algorithmic-art
通过代码和可调参数创作生成艺术与交互式视觉效果。
setup-tailwind-typescript【设计与创意】Configure Tailwind CSS with TypeScript in a Next.js or React project. Covers installation, configuration, custom theme extensions, component patterns, and type-safe styling utilities. Use when adding Tailwind CSS to an existing TypeScript project, customizing the Tailwind theme for a project's design system, setting up type-safe component styling pat…
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Configure Tailwind CSS in TypeScript project with custom theme, utilities, type-safe patterns.
npm install -D tailwindcss @tailwindcss/postcss postcss
For Next.js (if not already included).
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p
Got: tailwindcss, postcss, autoprefixer installed as dev deps. For Next.js, tailwind.config.ts + postcss.config.js generated by npx tailwindcss init -p.
If fail: npx tailwindcss init fails? Install Tailwind first with npm install -D tailwindcss, retry. Monorepo? Run from app's root dir, not workspace root.
import type { Config } from "tailwindcss";
const config: Config = {
content: [
"./src/pages/**/*.{js,ts,jsx,tsx,mdx}",
"./src/components/**/*.{js,ts,jsx,tsx,mdx}",
"./src/app/**/*.{js,ts,jsx,tsx,mdx}",
],
theme: {
extend: {
colors: {
primary: {
50: "#eff6ff",
100: "#dbeafe",
500: "#3b82f6",
600: "#2563eb",
700: "#1d4ed8",
900: "#1e3a5f",
},
secondary: {
500: "#6366f1",
600: "#4f46e5",
},
},
fontFamily: {
sans: ["Inter", "system-ui", "sans-serif"],
mono: ["JetBrains Mono", "monospace"],
},
spacing: {
"18": "4.5rem",
"88": "22rem",
},
},
},
plugins: [],
};
export default config;
Got: tailwind.config.ts has content array matching project's file locations, custom colors + fonts under theme.extend, proper TypeScript typing with Config import.
If fail: Custom classes do not render? Verify content paths match actual dir structure. Paths are glob patterns relative to project root. Missing paths = Tailwind will not scan those files for class usage.
Edit src/app/globals.css.
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
html {
@apply antialiased;
}
body {
@apply bg-white text-gray-900 dark:bg-gray-950 dark:text-gray-100;
}
}
@layer components {
.btn-primary {
@apply bg-primary-600 text-white px-4 py-2 rounded-lg
hover:bg-primary-700 focus:outline-none focus:ring-2
focus:ring-primary-500 focus:ring-offset-2
transition-colors duration-200;
}
}
Got: globals.css contains three Tailwind directives (@tailwind base, @tailwind components, @tailwind utilities) + any custom base + component layer styles. File imported in root layout.
If fail: Styles not applied? Verify globals.css imported in layout.tsx (or _app.tsx for Pages Router). Check Tailwind directives present + not commented out.
Make src/lib/cn.ts.
import { type ClassValue, clsx } from "clsx";
import { twMerge } from "tailwind-merge";
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));
}
Install deps.
npm install clsx tailwind-merge
Usage in components.
import { cn } from "@/lib/cn";
interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
variant?: "primary" | "secondary" | "outline";
}
export function Button({ className, variant = "primary", ...props }: ButtonProps) {
return (
<button
className={cn(
"px-4 py-2 rounded-lg font-medium transition-colors",
variant === "primary" && "bg-primary-600 text-white hover:bg-primary-700",
variant === "secondary" && "bg-secondary-500 text-white hover:bg-secondary-600",
variant === "outline" && "border border-gray-300 hover:bg-gray-50",
className
)}
{...props}
/>
);
}
Got: src/lib/cn.ts exports cn() function. clsx + tailwind-merge installed as deps. Components use cn() to merge class names without conflicts.
If fail: clsx or tailwind-merge not found? Run npm install clsx tailwind-merge. TypeScript reports type errors in cn.ts? Verify ClassValue type imported from clsx.
Update tailwind.config.ts.
const config: Config = {
darkMode: "class", // or "media" for system preference
// ... rest of config
};
Toggle implementation.
"use client";
import { useEffect, useState } from "react";
export function ThemeToggle() {
const [dark, setDark] = useState(false);
useEffect(() => {
document.documentElement.classList.toggle("dark", dark);
}, [dark]);
return (
<button onClick={() => setDark(!dark)}>
{dark ? "Light" : "Dark"} Mode
</button>
);
}
Got: Dark mode toggles correctly between light + dark themes. dark class applied to <html> element, dark: prefixed utility classes respond accordingly.
If fail: Dark mode does not toggle? Verify darkMode: "class" set in tailwind.config.ts. Ensure dark class toggled on <html> element (not <body>). For system-preference mode, use darkMode: "media".
npm install -D @tailwindcss/typography @tailwindcss/forms
// tailwind.config.ts
import typography from "@tailwindcss/typography";
import forms from "@tailwindcss/forms";
const config: Config = {
// ...
plugins: [typography, forms],
};
Got: Plugins installed as dev deps + registered in plugins array of tailwind.config.ts. Plugin-provided classes (prose from typography, styled form elements from forms) available in components.
If fail: Plugin classes do not render? Verify plugin both installed (npm ls @tailwindcss/typography) + added to plugins array. Restart dev server after config changes.
cn() utility merges classes without conflictscontent array in config matches file locationstailwind-merge (via cn()) to prevent conflicting utility classesextend (to add) not at theme root (which replaces defaults)darkMode setting + that dark class on <html> not <body>scaffold-nextjs-app - project setup before Tailwind configdeploy-to-vercel - deploy styled application