@sylix/coworker 2.0.11 → 2.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/slash/config.d.ts.map +1 -1
- package/dist/commands/slash/config.js +22 -4
- package/dist/commands/slash/config.js.map +1 -1
- package/dist/core/CoWorkerAgent.d.ts.map +1 -1
- package/dist/core/CoWorkerAgent.js +6 -3
- package/dist/core/CoWorkerAgent.js.map +1 -1
- package/dist/skills/defaults/accessibility/screen-reader-testing.md +545 -0
- package/dist/skills/defaults/accessibility/wcag-audit-patterns.md +555 -0
- package/dist/skills/defaults/ai-ml/rag.md +276 -0
- package/dist/skills/defaults/backend-development/api-design-principles.md +528 -0
- package/dist/skills/defaults/backend-development/api-design.md +285 -0
- package/dist/skills/defaults/backend-development/architecture-patterns.md +494 -0
- package/dist/skills/defaults/backend-development/async-python.md +237 -0
- package/dist/skills/defaults/backend-development/auth-implementation-patterns.md +638 -0
- package/dist/skills/defaults/backend-development/bazel-build-optimization.md +387 -0
- package/dist/skills/defaults/backend-development/billing-automation/SKILL.md +566 -0
- package/dist/skills/defaults/backend-development/code-review-excellence.md +538 -0
- package/dist/skills/defaults/backend-development/cqrs-implementation.md +554 -0
- package/dist/skills/defaults/backend-development/database-design.md +305 -0
- package/dist/skills/defaults/backend-development/debugging-strategies.md +536 -0
- package/dist/skills/defaults/backend-development/e2e-testing-patterns.md +544 -0
- package/dist/skills/defaults/backend-development/error-handling-patterns.md +641 -0
- package/dist/skills/defaults/backend-development/fastapi-templates.md +559 -0
- package/dist/skills/defaults/backend-development/fastapi.md +309 -0
- package/dist/skills/defaults/backend-development/git-advanced-workflows.md +405 -0
- package/dist/skills/defaults/backend-development/microservices-patterns.md +595 -0
- package/dist/skills/defaults/backend-development/microservices.md +284 -0
- package/dist/skills/defaults/backend-development/monorepo-management.md +623 -0
- package/dist/skills/defaults/backend-development/nodejs-backend-patterns.md +1048 -0
- package/dist/skills/defaults/backend-development/nx-workspace-patterns.md +457 -0
- package/dist/skills/defaults/backend-development/paypal-integration/SKILL.md +478 -0
- package/dist/skills/defaults/backend-development/pci-compliance/SKILL.md +480 -0
- package/dist/skills/defaults/backend-development/python-anti-patterns.md +349 -0
- package/dist/skills/defaults/backend-development/python-background-jobs.md +364 -0
- package/dist/skills/defaults/backend-development/python-code-style.md +360 -0
- package/dist/skills/defaults/backend-development/python-configuration.md +368 -0
- package/dist/skills/defaults/backend-development/python-design-patterns.md +296 -0
- package/dist/skills/defaults/backend-development/python-error-handling.md +323 -0
- package/dist/skills/defaults/backend-development/python-packaging.md +887 -0
- package/dist/skills/defaults/backend-development/python-performance-optimization.md +874 -0
- package/dist/skills/defaults/backend-development/python-project-structure.md +252 -0
- package/dist/skills/defaults/backend-development/python-resilience.md +376 -0
- package/dist/skills/defaults/backend-development/python-resource-management.md +421 -0
- package/dist/skills/defaults/backend-development/python-type-safety.md +428 -0
- package/dist/skills/defaults/backend-development/sql-optimization-patterns.md +509 -0
- package/dist/skills/defaults/backend-development/stripe-integration/SKILL.md +522 -0
- package/dist/skills/defaults/backend-development/turborepo-caching.md +376 -0
- package/dist/skills/defaults/blockchain/defi-protocol-templates.md +430 -0
- package/dist/skills/defaults/blockchain/nft-standards.md +364 -0
- package/dist/skills/defaults/blockchain/solidity-security.md +514 -0
- package/dist/skills/defaults/blockchain/web3-testing.md +360 -0
- package/dist/skills/defaults/business/competitive-landscape/SKILL.md +527 -0
- package/dist/skills/defaults/business/market-sizing-analysis/SKILL.md +451 -0
- package/dist/skills/defaults/business/startup-financial-modeling/SKILL.md +494 -0
- package/dist/skills/defaults/business/startup-metrics-framework/SKILL.md +564 -0
- package/dist/skills/defaults/business/team-composition-analysis.md +437 -0
- package/dist/skills/defaults/compliance/employment-contract-templates/SKILL.md +527 -0
- package/dist/skills/defaults/compliance/gdpr-data-handling/SKILL.md +630 -0
- package/dist/skills/defaults/data-engineering/airflow-dag-patterns.md +436 -0
- package/dist/skills/defaults/data-engineering/airflow.md +519 -0
- package/dist/skills/defaults/data-engineering/data-quality.md +583 -0
- package/dist/skills/defaults/data-engineering/dbt-transformation-patterns.md +482 -0
- package/dist/skills/defaults/data-engineering/dbt.md +556 -0
- package/dist/skills/defaults/data-engineering/ml-pipeline-workflow/SKILL.md +247 -0
- package/dist/skills/defaults/data-engineering/spark-optimization.md +348 -0
- package/dist/skills/defaults/data-engineering/spark.md +411 -0
- package/dist/skills/defaults/database/postgresql.md +202 -0
- package/dist/skills/defaults/debugging/systematic-debugging.md +249 -0
- package/dist/skills/defaults/devops/architecture-decision-records.md +448 -0
- package/dist/skills/defaults/devops/changelog-automation.md +580 -0
- package/dist/skills/defaults/devops/cicd.md +314 -0
- package/dist/skills/defaults/devops/cloud.md +263 -0
- package/dist/skills/defaults/devops/code-review-excellence.md +299 -0
- package/dist/skills/defaults/devops/cost-optimization.md +295 -0
- package/dist/skills/defaults/devops/deployment-pipeline-design.md +356 -0
- package/dist/skills/defaults/devops/docker.md +281 -0
- package/dist/skills/defaults/devops/git-workflows.md +205 -0
- package/dist/skills/defaults/devops/github-actions.md +311 -0
- package/dist/skills/defaults/devops/gitlab-ci-patterns.md +266 -0
- package/dist/skills/defaults/devops/hybrid-cloud-networking.md +241 -0
- package/dist/skills/defaults/devops/istio-traffic-management.md +327 -0
- package/dist/skills/defaults/devops/kubernetes.md +339 -0
- package/dist/skills/defaults/devops/linkerd-patterns.md +311 -0
- package/dist/skills/defaults/devops/multi-cloud-architecture.md +181 -0
- package/dist/skills/defaults/devops/observability.md +243 -0
- package/dist/skills/defaults/devops/openapi-spec-generation.md +1024 -0
- package/dist/skills/defaults/devops/postmortem-writing.md +396 -0
- package/dist/skills/defaults/devops/prometheus-configuration.md +265 -0
- package/dist/skills/defaults/devops/secrets-management.md +341 -0
- package/dist/skills/defaults/devops/service-mesh-observability.md +385 -0
- package/dist/skills/defaults/devops/terraform-module-library.md +244 -0
- package/dist/skills/defaults/finance/backtesting-frameworks/SKILL.md +663 -0
- package/dist/skills/defaults/finance/risk-metrics-calculation/SKILL.md +557 -0
- package/dist/skills/defaults/frontend/accessibility-compliance.md +420 -0
- package/dist/skills/defaults/frontend/design-system-patterns.md +337 -0
- package/dist/skills/defaults/frontend/interaction-design.md +327 -0
- package/dist/skills/defaults/frontend/javascript.md +311 -0
- package/dist/skills/defaults/frontend/modern-javascript-patterns.md +927 -0
- package/dist/skills/defaults/frontend/react-native-design.md +440 -0
- package/dist/skills/defaults/frontend/react.md +345 -0
- package/dist/skills/defaults/frontend/responsive-design.md +472 -0
- package/dist/skills/defaults/frontend/tailwind-design-system.md +337 -0
- package/dist/skills/defaults/frontend/typescript-advanced-types.md +724 -0
- package/dist/skills/defaults/frontend/typescript.md +334 -0
- package/dist/skills/defaults/frontend/visual-design-foundations.md +326 -0
- package/dist/skills/defaults/frontend/web-component-design.md +279 -0
- package/dist/skills/defaults/game-development/godot-gdscript-patterns.md +188 -0
- package/dist/skills/defaults/game-development/unity-ecs-patterns.md +594 -0
- package/dist/skills/defaults/kubernetes/gitops-workflow.md +285 -0
- package/dist/skills/defaults/kubernetes/gitops.md +280 -0
- package/dist/skills/defaults/kubernetes/helm-chart-scaffolding.md +553 -0
- package/dist/skills/defaults/kubernetes/helm.md +343 -0
- package/dist/skills/defaults/kubernetes/k8s-manifest-generator.md +501 -0
- package/dist/skills/defaults/kubernetes/k8s-security-policies.md +342 -0
- package/dist/skills/defaults/kubernetes/manifests.md +330 -0
- package/dist/skills/defaults/kubernetes/security.md +337 -0
- package/dist/skills/defaults/llm-application/embedding-strategies.md +608 -0
- package/dist/skills/defaults/llm-application/hybrid-search-implementation.md +570 -0
- package/dist/skills/defaults/llm-application/hybrid-search.md +570 -0
- package/dist/skills/defaults/llm-application/langchain-architecture.md +666 -0
- package/dist/skills/defaults/llm-application/langchain.md +259 -0
- package/dist/skills/defaults/llm-application/llm-evaluation.md +695 -0
- package/dist/skills/defaults/llm-application/prompt-engineering-patterns.md +449 -0
- package/dist/skills/defaults/llm-application/prompt-engineering.md +219 -0
- package/dist/skills/defaults/llm-application/rag-implementation.md +434 -0
- package/dist/skills/defaults/llm-application/similarity-search-patterns.md +560 -0
- package/dist/skills/defaults/llm-application/similarity-search.md +560 -0
- package/dist/skills/defaults/llm-application/vector-index-tuning.md +523 -0
- package/dist/skills/defaults/mobile/mobile-android-design.md +440 -0
- package/dist/skills/defaults/mobile/mobile-ios-design.md +266 -0
- package/dist/skills/defaults/monitoring/distributed-tracing.md +436 -0
- package/dist/skills/defaults/monitoring/grafana-dashboards.md +370 -0
- package/dist/skills/defaults/monitoring/prometheus-configuration.md +379 -0
- package/dist/skills/defaults/monitoring/slo-implementation.md +323 -0
- package/dist/skills/defaults/refactoring/code-refactoring.md +349 -0
- package/dist/skills/defaults/security/anti-reversing-techniques/SKILL.md +559 -0
- package/dist/skills/defaults/security/auditor.md +168 -0
- package/dist/skills/defaults/security/binary-analysis-patterns/SKILL.md +438 -0
- package/dist/skills/defaults/security/memory-forensics/SKILL.md +483 -0
- package/dist/skills/defaults/security/mtls-configuration.md +349 -0
- package/dist/skills/defaults/security/protocol-reverse-engineering/SKILL.md +520 -0
- package/dist/skills/defaults/security/sast-configuration.md +182 -0
- package/dist/skills/defaults/security/security.md +313 -0
- package/dist/skills/defaults/security/stride-analysis.md +273 -0
- package/dist/skills/defaults/security/threat-mitigation-mapping.md +290 -0
- package/dist/skills/defaults/systems/bash-defensive-patterns/SKILL.md +539 -0
- package/dist/skills/defaults/systems/bats-testing-patterns/SKILL.md +631 -0
- package/dist/skills/defaults/systems/go-concurrency-patterns.md +657 -0
- package/dist/skills/defaults/systems/memory-safety-patterns.md +605 -0
- package/dist/skills/defaults/systems/rust-async-patterns.md +519 -0
- package/dist/skills/defaults/systems/shellcheck-configuration/SKILL.md +456 -0
- package/dist/skills/defaults/team-collaboration/multi-reviewer-patterns.md +126 -0
- package/dist/skills/defaults/team-collaboration/parallel-feature-development.md +151 -0
- package/dist/skills/defaults/testing/javascript-testing-patterns.md +1021 -0
- package/dist/skills/defaults/testing/python-testing-patterns.md +351 -0
- package/dist/skills/defaults/testing/testing.md +332 -0
- package/dist/skills/defaults/workflows/context-driven-development.md +384 -0
- package/dist/skills/defaults/workflows/track-management.md +592 -0
- package/dist/skills/defaults/workflows/workflow-patterns.md +622 -0
- package/dist/skills/index.d.ts +11 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +129 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/utils/character.js +4 -4
- package/dist/utils/character.js.map +1 -1
- package/dist/utils/inputbar.d.ts.map +1 -1
- package/dist/utils/inputbar.js +7 -0
- package/dist/utils/inputbar.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tailwind-design-system
|
|
3
|
+
description: Build scalable design systems with Tailwind CSS v4, design tokens, component libraries, and responsive patterns. Use when creating component libraries, implementing design systems, or standardizing UI patterns.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Tailwind Design System (v4)
|
|
7
|
+
|
|
8
|
+
Build production-ready design systems with Tailwind CSS v4, including CSS-first configuration, design tokens, component variants, responsive patterns, and accessibility.
|
|
9
|
+
|
|
10
|
+
## When to Use This Skill
|
|
11
|
+
|
|
12
|
+
- Creating a component library with Tailwind v4
|
|
13
|
+
- Implementing design tokens and theming with CSS-first configuration
|
|
14
|
+
- Building responsive and accessible components
|
|
15
|
+
- Standardizing UI patterns across a codebase
|
|
16
|
+
- Migrating from Tailwind v3 to v4
|
|
17
|
+
- Setting up dark mode with native CSS features
|
|
18
|
+
|
|
19
|
+
## Key v4 Changes
|
|
20
|
+
|
|
21
|
+
| v3 Pattern | v4 Pattern |
|
|
22
|
+
| ------------------------------------- | --------------------------------------------------------------------- |
|
|
23
|
+
| `tailwind.config.ts` | `@theme` in CSS |
|
|
24
|
+
| `@tailwind base/components/utilities` | `@import "tailwindcss"` |
|
|
25
|
+
| `darkMode: "class"` | `@custom-variant dark (&:where(.dark, .dark *))` |
|
|
26
|
+
| `theme.extend.colors` | `@theme { --color-*: value }` |
|
|
27
|
+
| `require("tailwindcss-animate")` | CSS `@keyframes` in `@theme` + `@starting-style` |
|
|
28
|
+
|
|
29
|
+
## Quick Start
|
|
30
|
+
|
|
31
|
+
```css
|
|
32
|
+
/* app.css - Tailwind v4 CSS-first configuration */
|
|
33
|
+
@import "tailwindcss";
|
|
34
|
+
|
|
35
|
+
/* Define your theme with @theme */
|
|
36
|
+
@theme {
|
|
37
|
+
/* Semantic color tokens using OKLCH */
|
|
38
|
+
--color-background: oklch(100% 0 0);
|
|
39
|
+
--color-foreground: oklch(14.5% 0.025 264);
|
|
40
|
+
|
|
41
|
+
--color-primary: oklch(14.5% 0.025 264);
|
|
42
|
+
--color-primary-foreground: oklch(98% 0.01 264);
|
|
43
|
+
|
|
44
|
+
--color-secondary: oklch(96% 0.01 264);
|
|
45
|
+
--color-muted: oklch(96% 0.01 264);
|
|
46
|
+
--color-destructive: oklch(53% 0.22 27);
|
|
47
|
+
|
|
48
|
+
--color-border: oklch(91% 0.01 264);
|
|
49
|
+
--radius-sm: 0.25rem;
|
|
50
|
+
--radius-md: 0.375rem;
|
|
51
|
+
--radius-lg: 0.5rem;
|
|
52
|
+
|
|
53
|
+
--animate-fade-in: fade-in 0.2s ease-out;
|
|
54
|
+
|
|
55
|
+
@keyframes fade-in {
|
|
56
|
+
from { opacity: 0; }
|
|
57
|
+
to { opacity: 1; }
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/* Dark mode variant */
|
|
62
|
+
@custom-variant dark (&:where(.dark, .dark *));
|
|
63
|
+
|
|
64
|
+
.dark {
|
|
65
|
+
--color-background: oklch(14.5% 0.025 264);
|
|
66
|
+
--color-foreground: oklch(98% 0.01 264);
|
|
67
|
+
--color-primary: oklch(98% 0.01 264);
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Core Concepts
|
|
72
|
+
|
|
73
|
+
### 1. Design Token Hierarchy
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
Brand Tokens (abstract)
|
|
77
|
+
└── Semantic Tokens (purpose)
|
|
78
|
+
└── Component Tokens (specific)
|
|
79
|
+
|
|
80
|
+
Example:
|
|
81
|
+
oklch(45% 0.2 260) → --color-primary → bg-primary
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Patterns
|
|
85
|
+
|
|
86
|
+
### Pattern 1: CVA (Class Variance Authority) Components
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
import { Slot } from '@radix-ui/react-slot'
|
|
90
|
+
import { cva, type VariantProps } from 'class-variance-authority'
|
|
91
|
+
|
|
92
|
+
const buttonVariants = cva(
|
|
93
|
+
'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50',
|
|
94
|
+
{
|
|
95
|
+
variants: {
|
|
96
|
+
variant: {
|
|
97
|
+
default: 'bg-primary text-primary-foreground hover:bg-primary/90',
|
|
98
|
+
destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',
|
|
99
|
+
outline: 'border border-border bg-background hover:bg-accent',
|
|
100
|
+
secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',
|
|
101
|
+
ghost: 'hover:bg-accent hover:text-accent-foreground',
|
|
102
|
+
link: 'text-primary underline-offset-4 hover:underline',
|
|
103
|
+
},
|
|
104
|
+
size: {
|
|
105
|
+
default: 'h-10 px-4 py-2',
|
|
106
|
+
sm: 'h-9 rounded-md px-3',
|
|
107
|
+
lg: 'h-11 rounded-md px-8',
|
|
108
|
+
icon: 'size-10',
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
defaultVariants: {
|
|
112
|
+
variant: 'default',
|
|
113
|
+
size: 'default',
|
|
114
|
+
},
|
|
115
|
+
}
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
export interface ButtonProps
|
|
119
|
+
extends React.ButtonHTMLAttributes<HTMLButtonElement>,
|
|
120
|
+
VariantProps<typeof buttonVariants> {
|
|
121
|
+
asChild?: boolean
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export function Button({ className, variant, size, asChild = false, ...props }: ButtonProps) {
|
|
125
|
+
const Comp = asChild ? Slot : 'button'
|
|
126
|
+
return <Comp className={buttonVariants({ variant, size, className })} {...props} />
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Usage
|
|
130
|
+
<Button variant="destructive" size="lg">Delete</Button>
|
|
131
|
+
<Button asChild><Link href="/home">Home</Link></Button>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Pattern 2: Compound Components
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
export function Card({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {
|
|
138
|
+
return (
|
|
139
|
+
<div
|
|
140
|
+
className="rounded-lg border border-border bg-card text-card-foreground shadow-sm"
|
|
141
|
+
{...props}
|
|
142
|
+
/>
|
|
143
|
+
)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export function CardHeader({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {
|
|
147
|
+
return <div className="flex flex-col space-y-1.5 p-6" {...props} />
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export function CardTitle({ className, ...props }: React.HTMLAttributes<HTMLHeadingElement>) {
|
|
151
|
+
return <h3 className="text-2xl font-semibold leading-none tracking-tight" {...props} />
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export function CardDescription({ className, ...props }: React.HTMLAttributes<HTMLParagraphElement>) {
|
|
155
|
+
return <p className="text-sm text-muted-foreground" {...props} />
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export function CardContent({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {
|
|
159
|
+
return <div className="p-6 pt-0" {...props} />
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Usage
|
|
163
|
+
<Card>
|
|
164
|
+
<CardHeader>
|
|
165
|
+
<CardTitle>Account</CardTitle>
|
|
166
|
+
<CardDescription>Manage your account settings</CardDescription>
|
|
167
|
+
</CardHeader>
|
|
168
|
+
<CardContent>
|
|
169
|
+
<form>...</form>
|
|
170
|
+
</CardContent>
|
|
171
|
+
</Card>
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Pattern 3: Form Components
|
|
175
|
+
|
|
176
|
+
```typescript
|
|
177
|
+
export interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {
|
|
178
|
+
error?: string
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export function Input({ className, type, error, ...props }: InputProps) {
|
|
182
|
+
return (
|
|
183
|
+
<div className="relative">
|
|
184
|
+
<input
|
|
185
|
+
type={type}
|
|
186
|
+
className={cn(
|
|
187
|
+
'flex h-10 w-full rounded-md border border-border bg-background px-3 py-2 text-sm',
|
|
188
|
+
'placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',
|
|
189
|
+
'disabled:cursor-not-allowed disabled:opacity-50',
|
|
190
|
+
error && 'border-destructive focus-visible:ring-destructive',
|
|
191
|
+
className
|
|
192
|
+
)}
|
|
193
|
+
aria-invalid={!!error}
|
|
194
|
+
{...props}
|
|
195
|
+
/>
|
|
196
|
+
{error && (
|
|
197
|
+
<p className="mt-1 text-sm text-destructive" role="alert">
|
|
198
|
+
{error}
|
|
199
|
+
</p>
|
|
200
|
+
)}
|
|
201
|
+
</div>
|
|
202
|
+
)
|
|
203
|
+
}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### Pattern 4: Responsive Grid System
|
|
207
|
+
|
|
208
|
+
```typescript
|
|
209
|
+
const gridVariants = cva('grid', {
|
|
210
|
+
variants: {
|
|
211
|
+
cols: {
|
|
212
|
+
1: 'grid-cols-1',
|
|
213
|
+
2: 'grid-cols-1 sm:grid-cols-2',
|
|
214
|
+
3: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3',
|
|
215
|
+
4: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-4',
|
|
216
|
+
},
|
|
217
|
+
gap: {
|
|
218
|
+
sm: 'gap-2',
|
|
219
|
+
md: 'gap-4',
|
|
220
|
+
lg: 'gap-6',
|
|
221
|
+
},
|
|
222
|
+
},
|
|
223
|
+
defaultVariants: {
|
|
224
|
+
cols: 3,
|
|
225
|
+
gap: 'md',
|
|
226
|
+
},
|
|
227
|
+
})
|
|
228
|
+
|
|
229
|
+
export function Grid({ className, cols, gap, ...props }: GridProps) {
|
|
230
|
+
return <div className={gridVariants({ cols, gap, className })} {...props} />
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Usage
|
|
234
|
+
<Grid cols={4} gap="lg">
|
|
235
|
+
{products.map((product) => (
|
|
236
|
+
<ProductCard key={product.id} product={product} />
|
|
237
|
+
))}
|
|
238
|
+
</Grid>
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### Pattern 5: Native CSS Animations (v4)
|
|
242
|
+
|
|
243
|
+
```css
|
|
244
|
+
@theme {
|
|
245
|
+
--animate-dialog-in: dialog-fade-in 0.2s ease-out;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
@keyframes dialog-fade-in {
|
|
249
|
+
from {
|
|
250
|
+
opacity: 0;
|
|
251
|
+
transform: scale(0.95);
|
|
252
|
+
}
|
|
253
|
+
to {
|
|
254
|
+
opacity: 1;
|
|
255
|
+
transform: scale(1);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/* Native popover animations using @starting-style */
|
|
260
|
+
[popover] {
|
|
261
|
+
transition: opacity 0.2s, transform 0.2s, display 0.2s allow-discrete;
|
|
262
|
+
opacity: 0;
|
|
263
|
+
transform: scale(0.95);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
[popover]:popover-open {
|
|
267
|
+
opacity: 1;
|
|
268
|
+
transform: scale(1);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
@starting-style {
|
|
272
|
+
[popover]:popover-open {
|
|
273
|
+
opacity: 0;
|
|
274
|
+
transform: scale(0.95);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### Pattern 6: Dark Mode with CSS (v4)
|
|
280
|
+
|
|
281
|
+
```typescript
|
|
282
|
+
export function ThemeToggle() {
|
|
283
|
+
const { resolvedTheme, setTheme } = useTheme()
|
|
284
|
+
|
|
285
|
+
return (
|
|
286
|
+
<Button
|
|
287
|
+
variant="ghost"
|
|
288
|
+
size="icon"
|
|
289
|
+
onClick={() => setTheme(resolvedTheme === 'dark' ? 'light' : 'dark')}
|
|
290
|
+
>
|
|
291
|
+
<Sun className="size-5 rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" />
|
|
292
|
+
<Moon className="absolute size-5 rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" />
|
|
293
|
+
<span className="sr-only">Toggle theme</span>
|
|
294
|
+
</Button>
|
|
295
|
+
)
|
|
296
|
+
}
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
## Utility Functions
|
|
300
|
+
|
|
301
|
+
```typescript
|
|
302
|
+
import { type ClassValue, clsx } from "clsx";
|
|
303
|
+
import { twMerge } from "tailwind-merge";
|
|
304
|
+
|
|
305
|
+
export function cn(...inputs: ClassValue[]) {
|
|
306
|
+
return twMerge(clsx(inputs));
|
|
307
|
+
}
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
## v3 to v4 Migration Checklist
|
|
311
|
+
|
|
312
|
+
- [ ] Replace `tailwind.config.ts` with CSS `@theme` block
|
|
313
|
+
- [ ] Change `@tailwind base/components/utilities` to `@import "tailwindcss"`
|
|
314
|
+
- [ ] Move color definitions to `@theme { --color-*: value }`
|
|
315
|
+
- [ ] Replace `darkMode: "class"` with `@custom-variant dark`
|
|
316
|
+
- [ ] Move `@keyframes` inside `@theme` blocks
|
|
317
|
+
- [ ] Replace `require("tailwindcss-animate")` with native CSS animations
|
|
318
|
+
- [ ] Update `h-10 w-10` to `size-10` (new utility)
|
|
319
|
+
- [ ] Consider OKLCH colors for better color perception
|
|
320
|
+
- [ ] Replace custom plugins with `@utility` directives
|
|
321
|
+
|
|
322
|
+
## Best Practices
|
|
323
|
+
|
|
324
|
+
### Do's
|
|
325
|
+
|
|
326
|
+
- **Use `@theme` blocks** - CSS-first configuration is v4's core pattern
|
|
327
|
+
- **Use OKLCH colors** - Better perceptual uniformity than HSL
|
|
328
|
+
- **Compose with CVA** - Type-safe variants
|
|
329
|
+
- **Use semantic tokens** - `bg-primary` not `bg-blue-500`
|
|
330
|
+
- **Add accessibility** - ARIA attributes, focus states
|
|
331
|
+
|
|
332
|
+
### Don'ts
|
|
333
|
+
|
|
334
|
+
- **Don't use `tailwind.config.ts`** - Use CSS `@theme` instead
|
|
335
|
+
- **Don't use `@tailwind` directives** - Use `@import "tailwindcss"`
|
|
336
|
+
- **Don't hardcode colors** - Use semantic tokens
|
|
337
|
+
- **Don't forget dark mode** - Test both themes
|