@biggora/claude-plugins 1.2.0 → 1.2.2
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/README.md +11 -4
- package/package.json +1 -1
- package/registry/registry.json +319 -244
- package/specs/coding.md +24 -0
- package/specs/pod.md +2 -0
- package/src/skills/captcha/README.md +221 -0
- package/src/skills/captcha/SKILL.md +355 -0
- package/src/skills/captcha/references/captcha-types.md +254 -0
- package/src/skills/captcha/references/services.md +172 -0
- package/src/skills/captcha/references/stealth.md +238 -0
- package/src/skills/captcha/scripts/solve_captcha.py +323 -0
- package/src/skills/captcha/scripts/solve_image_grid.py +350 -0
- package/src/skills/google-merchant-api/SKILL.md +581 -0
- package/src/skills/google-merchant-api/references/accounts.md +247 -0
- package/src/skills/google-merchant-api/references/content-api-legacy.md +216 -0
- package/src/skills/google-merchant-api/references/datasources.md +233 -0
- package/src/skills/google-merchant-api/references/inventories.md +201 -0
- package/src/skills/google-merchant-api/references/migration.md +267 -0
- package/src/skills/google-merchant-api/references/products.md +316 -0
- package/src/skills/google-merchant-api/references/promotions.md +201 -0
- package/src/skills/google-merchant-api/references/reports.md +240 -0
- package/src/skills/lv-aggregators-api/SKILL.md +113 -0
- package/src/skills/lv-aggregators-api/references/integration-guide.md +368 -0
- package/src/skills/lv-aggregators-api/references/kurpirkt.md +103 -0
- package/src/skills/lv-aggregators-api/references/salidzini.md +122 -0
- package/src/skills/tailwindcss-best-practices/SKILL.md +180 -0
- package/src/skills/tailwindcss-best-practices/references/best-practices-utility-patterns.md +87 -0
- package/src/skills/tailwindcss-best-practices/references/core-installation.md +109 -0
- package/src/skills/tailwindcss-best-practices/references/core-preflight.md +200 -0
- package/src/skills/tailwindcss-best-practices/references/core-responsive.md +163 -0
- package/src/skills/tailwindcss-best-practices/references/core-source-detection.md +114 -0
- package/src/skills/tailwindcss-best-practices/references/core-theme.md +108 -0
- package/src/skills/tailwindcss-best-practices/references/core-utility-classes.md +59 -0
- package/src/skills/tailwindcss-best-practices/references/core-variants.md +204 -0
- package/src/skills/tailwindcss-best-practices/references/effects-form-controls.md +76 -0
- package/src/skills/tailwindcss-best-practices/references/effects-mask.md +91 -0
- package/src/skills/tailwindcss-best-practices/references/effects-scroll-snap.md +59 -0
- package/src/skills/tailwindcss-best-practices/references/effects-text-shadow.md +78 -0
- package/src/skills/tailwindcss-best-practices/references/effects-transition-animation.md +80 -0
- package/src/skills/tailwindcss-best-practices/references/effects-visibility-interactivity.md +82 -0
- package/src/skills/tailwindcss-best-practices/references/features-content-detection.md +175 -0
- package/src/skills/tailwindcss-best-practices/references/features-custom-styles.md +203 -0
- package/src/skills/tailwindcss-best-practices/references/features-dark-mode.md +137 -0
- package/src/skills/tailwindcss-best-practices/references/features-functions-directives.md +241 -0
- package/src/skills/tailwindcss-best-practices/references/features-upgrade.md +160 -0
- package/src/skills/tailwindcss-best-practices/references/layout-aspect-ratio.md +39 -0
- package/src/skills/tailwindcss-best-practices/references/layout-columns.md +80 -0
- package/src/skills/tailwindcss-best-practices/references/layout-display.md +110 -0
- package/src/skills/tailwindcss-best-practices/references/layout-flexbox.md +112 -0
- package/src/skills/tailwindcss-best-practices/references/layout-grid.md +87 -0
- package/src/skills/tailwindcss-best-practices/references/layout-height.md +97 -0
- package/src/skills/tailwindcss-best-practices/references/layout-inset.md +103 -0
- package/src/skills/tailwindcss-best-practices/references/layout-logical-properties.md +92 -0
- package/src/skills/tailwindcss-best-practices/references/layout-margin.md +126 -0
- package/src/skills/tailwindcss-best-practices/references/layout-min-max-sizing.md +63 -0
- package/src/skills/tailwindcss-best-practices/references/layout-object-fit-position.md +64 -0
- package/src/skills/tailwindcss-best-practices/references/layout-overflow.md +57 -0
- package/src/skills/tailwindcss-best-practices/references/layout-padding.md +77 -0
- package/src/skills/tailwindcss-best-practices/references/layout-position.md +85 -0
- package/src/skills/tailwindcss-best-practices/references/layout-tables.md +67 -0
- package/src/skills/tailwindcss-best-practices/references/layout-width.md +102 -0
- package/src/skills/tailwindcss-best-practices/references/transform-base.md +68 -0
- package/src/skills/tailwindcss-best-practices/references/transform-rotate.md +70 -0
- package/src/skills/tailwindcss-best-practices/references/transform-scale.md +83 -0
- package/src/skills/tailwindcss-best-practices/references/transform-skew.md +62 -0
- package/src/skills/tailwindcss-best-practices/references/transform-translate.md +77 -0
- package/src/skills/tailwindcss-best-practices/references/typography-font-text.md +142 -0
- package/src/skills/tailwindcss-best-practices/references/typography-list-style.md +65 -0
- package/src/skills/tailwindcss-best-practices/references/typography-text-align.md +60 -0
- package/src/skills/tailwindcss-best-practices/references/visual-background.md +76 -0
- package/src/skills/tailwindcss-best-practices/references/visual-border.md +108 -0
- package/src/skills/tailwindcss-best-practices/references/visual-effects.md +111 -0
- package/src/skills/tailwindcss-best-practices/references/visual-svg.md +82 -0
- package/src/skills/test-mobile-app/SKILL.md +11 -6
- package/src/skills/test-mobile-app/scripts/analyze_apk.py +15 -4
- package/src/skills/test-mobile-app/scripts/check_environment.py +5 -5
- package/src/skills/test-mobile-app/scripts/run_tests.py +1 -1
- package/src/skills/test-web-ui/SKILL.md +264 -84
- package/src/skills/test-web-ui/scripts/discover.py +25 -12
- package/src/skills/test-web-ui/scripts/run_tests.py +3 -2
- package/src/skills/vite-best-practices/SKILL.md +115 -0
- package/src/skills/vite-best-practices/references/build-and-ssr.md +255 -0
- package/src/skills/vite-best-practices/references/core-config.md +231 -0
- package/src/skills/vite-best-practices/references/core-features.md +222 -0
- package/src/skills/vite-best-practices/references/core-plugin-api.md +294 -0
- package/src/skills/vite-best-practices/references/environment-api.md +108 -0
- package/src/skills/vite-best-practices/references/rolldown-migration.md +242 -0
- package/codex-cli-workspace/iteration-1/benchmark.json +0 -122
- package/codex-cli-workspace/iteration-1/eval-1-ci-integration/eval_metadata.json +0 -13
- package/codex-cli-workspace/iteration-1/eval-1-ci-integration/with_skill/grading.json +0 -52
- package/codex-cli-workspace/iteration-1/eval-1-ci-integration/with_skill/outputs/response.md +0 -163
- package/codex-cli-workspace/iteration-1/eval-1-ci-integration/with_skill/timing.json +0 -5
- package/codex-cli-workspace/iteration-1/eval-1-ci-integration/without_skill/grading.json +0 -58
- package/codex-cli-workspace/iteration-1/eval-1-ci-integration/without_skill/outputs/response.md +0 -151
- package/codex-cli-workspace/iteration-1/eval-1-ci-integration/without_skill/timing.json +0 -5
- package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/eval_metadata.json +0 -13
- package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/grading.json +0 -52
- package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/outputs/response.md +0 -86
- package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/timing.json +0 -5
- package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/grading.json +0 -58
- package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/outputs/response.md +0 -164
- package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/timing.json +0 -5
- package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/eval_metadata.json +0 -13
- package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/with_skill/grading.json +0 -52
- package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/with_skill/outputs/response.md +0 -130
- package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/with_skill/timing.json +0 -5
- package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/without_skill/grading.json +0 -64
- package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/without_skill/outputs/response.md +0 -209
- package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/without_skill/timing.json +0 -5
- package/codex-cli-workspace/iteration-1/review.html +0 -1325
- package/gemini-cli-workspace/iteration-1/benchmark.json +0 -86
- package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/eval_metadata.json +0 -37
- package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/with_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/with_skill/outputs/response.md +0 -401
- package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/with_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/without_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/without_skill/outputs/response.md +0 -405
- package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/without_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/eval_metadata.json +0 -37
- package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/outputs/response.md +0 -212
- package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/outputs/response.md +0 -427
- package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/eval_metadata.json +0 -32
- package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/with_skill/grading.json +0 -32
- package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/with_skill/outputs/response.md +0 -171
- package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/with_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/without_skill/grading.json +0 -32
- package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/without_skill/outputs/response.md +0 -199
- package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/without_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-1/review.html +0 -1325
- package/gemini-cli-workspace/iteration-2/benchmark.json +0 -173
- package/gemini-cli-workspace/iteration-2/benchmark.md +0 -28
- package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/eval_metadata.json +0 -37
- package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/with_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/with_skill/outputs/response.md +0 -195
- package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/with_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/without_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/without_skill/outputs/response.md +0 -377
- package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/without_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/eval_metadata.json +0 -37
- package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/with_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/with_skill/outputs/response.md +0 -127
- package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/with_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/without_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/without_skill/outputs/response.md +0 -164
- package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/without_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/eval_metadata.json +0 -32
- package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/with_skill/grading.json +0 -32
- package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/with_skill/outputs/response.md +0 -91
- package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/with_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/without_skill/grading.json +0 -32
- package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/without_skill/outputs/response.md +0 -112
- package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/without_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-2/eval-viewer.html +0 -1325
- package/screen-recording-workspace/evals.json +0 -41
- package/screen-recording-workspace/iteration-1/benchmark.json +0 -102
- package/screen-recording-workspace/iteration-1/eval-0-fullscreen/eval_metadata.json +0 -31
- package/screen-recording-workspace/iteration-1/eval-0-fullscreen/with_skill/grading.json +0 -11
- package/screen-recording-workspace/iteration-1/eval-0-fullscreen/with_skill/outputs/demo.mp4 +0 -0
- package/screen-recording-workspace/iteration-1/eval-0-fullscreen/with_skill/timing.json +0 -5
- package/screen-recording-workspace/iteration-1/eval-0-fullscreen/without_skill/grading.json +0 -11
- package/screen-recording-workspace/iteration-1/eval-0-fullscreen/without_skill/outputs/demo.mp4 +0 -0
- package/screen-recording-workspace/iteration-1/eval-0-fullscreen/without_skill/timing.json +0 -5
- package/screen-recording-workspace/iteration-1/eval-1-region-audio/eval_metadata.json +0 -31
- package/screen-recording-workspace/iteration-1/eval-1-region-audio/with_skill/grading.json +0 -11
- package/screen-recording-workspace/iteration-1/eval-1-region-audio/with_skill/outputs/region_capture.mp4 +0 -0
- package/screen-recording-workspace/iteration-1/eval-1-region-audio/with_skill/timing.json +0 -5
- package/screen-recording-workspace/iteration-1/eval-1-region-audio/without_skill/grading.json +0 -11
- package/screen-recording-workspace/iteration-1/eval-1-region-audio/without_skill/outputs/region_capture.mp4 +0 -0
- package/screen-recording-workspace/iteration-1/eval-1-region-audio/without_skill/timing.json +0 -5
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/eval_metadata.json +0 -31
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/with_skill/grading.json +0 -11
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/with_skill/outputs/fallback_recording.mp4 +0 -0
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/with_skill/timing.json +0 -5
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/without_skill/grading.json +0 -11
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/without_skill/outputs/fallback_recording.mp4 +0 -0
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/without_skill/outputs/record_screen.py +0 -67
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/without_skill/timing.json +0 -5
- package/screen-recording-workspace/iteration-1/review.html +0 -1325
- package/src/skills/codex-cli/evals/evals.json +0 -47
- package/src/skills/gemini-cli/evals/evals.json +0 -46
- package/src/skills/tm-search/evals/evals.json +0 -23
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: core-responsive
|
|
3
|
+
description: Building responsive designs with Tailwind's mobile-first breakpoint system and container queries
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Responsive Design
|
|
7
|
+
|
|
8
|
+
Every utility class in Tailwind can be applied conditionally at different breakpoints using responsive variants.
|
|
9
|
+
|
|
10
|
+
## Mobile-First Breakpoints
|
|
11
|
+
|
|
12
|
+
Tailwind uses a mobile-first approach. Unprefixed utilities apply to all screen sizes, while prefixed utilities apply at that breakpoint and above.
|
|
13
|
+
|
|
14
|
+
```html
|
|
15
|
+
<!-- Center text on mobile, left align on sm screens and up -->
|
|
16
|
+
<div class="text-center sm:text-left">Content</div>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Default Breakpoints
|
|
20
|
+
|
|
21
|
+
| Breakpoint | Minimum Width | CSS |
|
|
22
|
+
|------------|---------------|-----|
|
|
23
|
+
| `sm` | 40rem (640px) | `@media (width >= 40rem)` |
|
|
24
|
+
| `md` | 48rem (768px) | `@media (width >= 48rem)` |
|
|
25
|
+
| `lg` | 64rem (1024px) | `@media (width >= 64rem)` |
|
|
26
|
+
| `xl` | 80rem (1280px) | `@media (width >= 80rem)` |
|
|
27
|
+
| `2xl` | 96rem (1536px) | `@media (width >= 96rem)` |
|
|
28
|
+
|
|
29
|
+
## Usage
|
|
30
|
+
|
|
31
|
+
Prefix any utility with a breakpoint name:
|
|
32
|
+
|
|
33
|
+
```html
|
|
34
|
+
<!-- Width of 16 by default, 32 on medium screens, 48 on large screens -->
|
|
35
|
+
<img class="w-16 md:w-32 lg:w-48" src="..." />
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Example: Responsive Card
|
|
39
|
+
|
|
40
|
+
```html
|
|
41
|
+
<div class="mx-auto max-w-md md:max-w-2xl">
|
|
42
|
+
<div class="md:flex">
|
|
43
|
+
<div class="md:shrink-0">
|
|
44
|
+
<img class="h-48 w-full object-cover md:h-full md:w-48" src="..." />
|
|
45
|
+
</div>
|
|
46
|
+
<div class="p-8">
|
|
47
|
+
<h2 class="text-lg font-semibold">Title</h2>
|
|
48
|
+
<p class="text-gray-500">Description</p>
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Targeting Mobile Screens
|
|
55
|
+
|
|
56
|
+
Use unprefixed utilities for mobile, not `sm:`. Think of `sm:` as "at the small breakpoint", not "on small screens".
|
|
57
|
+
|
|
58
|
+
```html
|
|
59
|
+
<!-- ❌ Only centers on screens 640px+, not mobile -->
|
|
60
|
+
<div class="sm:text-center"></div>
|
|
61
|
+
|
|
62
|
+
<!-- ✅ Centers on mobile, left aligns on 640px+ -->
|
|
63
|
+
<div class="text-center sm:text-left"></div>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Breakpoint Ranges
|
|
67
|
+
|
|
68
|
+
Target a specific breakpoint range by stacking responsive variants with `max-*` variants:
|
|
69
|
+
|
|
70
|
+
```html
|
|
71
|
+
<!-- Only applies between md and xl -->
|
|
72
|
+
<div class="md:max-xl:flex">Content</div>
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Max-Width Variants
|
|
76
|
+
|
|
77
|
+
Tailwind generates `max-*` variants for each breakpoint:
|
|
78
|
+
|
|
79
|
+
| Variant | Media Query |
|
|
80
|
+
|---------|-------------|
|
|
81
|
+
| `max-sm` | `@media (width < 40rem)` |
|
|
82
|
+
| `max-md` | `@media (width < 48rem)` |
|
|
83
|
+
| `max-lg` | `@media (width < 64rem)` |
|
|
84
|
+
| `max-xl` | `@media (width < 80rem)` |
|
|
85
|
+
| `max-2xl` | `@media (width < 96rem)` |
|
|
86
|
+
|
|
87
|
+
## Custom Breakpoints
|
|
88
|
+
|
|
89
|
+
Add custom breakpoints using `--breakpoint-*` theme variables:
|
|
90
|
+
|
|
91
|
+
```css
|
|
92
|
+
@theme {
|
|
93
|
+
--breakpoint-xs: 30rem;
|
|
94
|
+
--breakpoint-3xl: 120rem;
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
```html
|
|
99
|
+
<div class="xs:grid-cols-2 3xl:grid-cols-6">Content</div>
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Arbitrary Breakpoints
|
|
103
|
+
|
|
104
|
+
Use arbitrary values for one-off breakpoints:
|
|
105
|
+
|
|
106
|
+
```html
|
|
107
|
+
<div class="min-[320px]:text-center max-[600px]:bg-sky-300">
|
|
108
|
+
Content
|
|
109
|
+
</div>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Container Queries
|
|
113
|
+
|
|
114
|
+
Style elements based on parent container size instead of viewport:
|
|
115
|
+
|
|
116
|
+
```html
|
|
117
|
+
<!-- Mark container -->
|
|
118
|
+
<div class="@container">
|
|
119
|
+
<!-- Style based on container size -->
|
|
120
|
+
<div class="flex flex-col @md:flex-row">
|
|
121
|
+
Content
|
|
122
|
+
</div>
|
|
123
|
+
</div>
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Container Query Variants
|
|
127
|
+
|
|
128
|
+
| Variant | Minimum Width |
|
|
129
|
+
|---------|---------------|
|
|
130
|
+
| `@3xs` | 16rem (256px) |
|
|
131
|
+
| `@xs` | 20rem (320px) |
|
|
132
|
+
| `@sm` | 24rem (384px) |
|
|
133
|
+
| `@md` | 28rem (448px) |
|
|
134
|
+
| `@lg` | 32rem (512px) |
|
|
135
|
+
| `@xl` | 36rem (576px) |
|
|
136
|
+
| `@2xl` | 42rem (672px) |
|
|
137
|
+
| `@3xl` | 48rem (768px) |
|
|
138
|
+
| ... up to `@7xl` | 80rem (1280px) |
|
|
139
|
+
|
|
140
|
+
### Named Containers
|
|
141
|
+
|
|
142
|
+
Name containers to target specific ones in nested structures:
|
|
143
|
+
|
|
144
|
+
```html
|
|
145
|
+
<div class="@container/main">
|
|
146
|
+
<div class="flex flex-row @sm/main:flex-col">
|
|
147
|
+
Content
|
|
148
|
+
</div>
|
|
149
|
+
</div>
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Key Points
|
|
153
|
+
|
|
154
|
+
- Mobile-first: unprefixed = mobile, prefixed = breakpoint and up
|
|
155
|
+
- Use unprefixed utilities for mobile, not `sm:`
|
|
156
|
+
- Stack variants for complex responsive behavior
|
|
157
|
+
- Container queries enable component-based responsive design
|
|
158
|
+
- Customize breakpoints with theme variables
|
|
159
|
+
|
|
160
|
+
<!--
|
|
161
|
+
Source references:
|
|
162
|
+
- https://tailwindcss.com/docs/responsive-design
|
|
163
|
+
-->
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: core-source-detection
|
|
3
|
+
description: How Tailwind v4 detects classes in source files, @source directives, @source not, and @source inline() for safelisting
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Source Detection & Configuration
|
|
7
|
+
|
|
8
|
+
Tailwind v4 automatically scans your project for utility classes. This page covers how detection works and how to customize it.
|
|
9
|
+
|
|
10
|
+
## Automatic Detection
|
|
11
|
+
|
|
12
|
+
By default, Tailwind scans all files in your project except:
|
|
13
|
+
|
|
14
|
+
- Files matching `.gitignore` patterns
|
|
15
|
+
- `node_modules/` directory (ignored since v4.1)
|
|
16
|
+
- Binary files (images, videos, zips)
|
|
17
|
+
- CSS files
|
|
18
|
+
- Package manager lock files
|
|
19
|
+
|
|
20
|
+
Files are scanned as **plain text** — Tailwind does not parse your code. It looks for token patterns that match utility class names.
|
|
21
|
+
|
|
22
|
+
## Source Configuration
|
|
23
|
+
|
|
24
|
+
### Register additional sources
|
|
25
|
+
|
|
26
|
+
Scan files outside the project root (e.g., UI library in node_modules):
|
|
27
|
+
|
|
28
|
+
```css
|
|
29
|
+
@import "tailwindcss";
|
|
30
|
+
@source "../node_modules/@acmecorp/ui-lib";
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Set a base path
|
|
34
|
+
|
|
35
|
+
Restrict scanning to a specific directory (useful for monorepos):
|
|
36
|
+
|
|
37
|
+
```css
|
|
38
|
+
@import "tailwindcss" source("../src");
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Disable automatic detection
|
|
42
|
+
|
|
43
|
+
Scan only explicitly listed paths:
|
|
44
|
+
|
|
45
|
+
```css
|
|
46
|
+
@import "tailwindcss" source(none);
|
|
47
|
+
@source "../admin";
|
|
48
|
+
@source "../shared";
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Excluding Sources (v4.1+)
|
|
52
|
+
|
|
53
|
+
Exclude paths from scanning:
|
|
54
|
+
|
|
55
|
+
```css
|
|
56
|
+
@source not "../src/components/legacy";
|
|
57
|
+
@source not "./generated";
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Safelisting with @source inline() (v4.1+)
|
|
61
|
+
|
|
62
|
+
Force generation of classes not found in source files. This replaces the v3 `safelist` config option.
|
|
63
|
+
|
|
64
|
+
```css
|
|
65
|
+
/* Single utility */
|
|
66
|
+
@source inline("underline");
|
|
67
|
+
|
|
68
|
+
/* With variants */
|
|
69
|
+
@source inline("{hover:,focus:,}underline");
|
|
70
|
+
|
|
71
|
+
/* Color palette with brace expansion */
|
|
72
|
+
@source inline("{hover:,}bg-red-{50,{100..900..100},950}");
|
|
73
|
+
|
|
74
|
+
/* Exclude specific classes */
|
|
75
|
+
@source not inline("{hover:,focus:,}bg-red-{50,{100..900..100},950}");
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Brace expansion follows shell-style syntax:
|
|
79
|
+
- `{a,b,c}` — list of values
|
|
80
|
+
- `{100..900..100}` — range with step (100, 200, 300, ..., 900)
|
|
81
|
+
|
|
82
|
+
## Dynamic Class Names
|
|
83
|
+
|
|
84
|
+
Because Tailwind scans files as plain text, it cannot detect dynamically constructed class names:
|
|
85
|
+
|
|
86
|
+
```jsx
|
|
87
|
+
// BAD — Tailwind won't detect these
|
|
88
|
+
const color = 'red';
|
|
89
|
+
<div className={`bg-${color}-500`} />
|
|
90
|
+
|
|
91
|
+
// GOOD — Use complete class names
|
|
92
|
+
const colorClasses = {
|
|
93
|
+
red: 'bg-red-500',
|
|
94
|
+
blue: 'bg-blue-500',
|
|
95
|
+
};
|
|
96
|
+
<div className={colorClasses[color]} />
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
If you must use dynamic classes, safelist them with `@source inline()`.
|
|
100
|
+
|
|
101
|
+
## Key Points
|
|
102
|
+
|
|
103
|
+
- Automatic detection scans all non-ignored, non-binary files
|
|
104
|
+
- `@source "path"` adds additional scan paths
|
|
105
|
+
- `@source not "path"` excludes paths (v4.1+)
|
|
106
|
+
- `@source inline("classes")` safelists classes (v4.1+), replaces v3 `safelist`
|
|
107
|
+
- `source(none)` on the import disables auto-detection
|
|
108
|
+
- Always use complete class names — never string-interpolate utility names
|
|
109
|
+
|
|
110
|
+
<!--
|
|
111
|
+
Source references:
|
|
112
|
+
- https://tailwindcss.com/docs/detecting-classes-in-source-files
|
|
113
|
+
- https://tailwindcss.com/blog/tailwindcss-v4-1
|
|
114
|
+
-->
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: core-theme
|
|
3
|
+
description: Understanding theme variables, design tokens, and customizing Tailwind's default theme
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Theme Variables
|
|
7
|
+
|
|
8
|
+
Theme variables are special CSS variables defined using the `@theme` directive that influence which utility classes exist in your project.
|
|
9
|
+
|
|
10
|
+
## Overview
|
|
11
|
+
|
|
12
|
+
Theme variables store design tokens like colors, fonts, spacing, shadows, and breakpoints. They're defined using the `@theme` directive:
|
|
13
|
+
|
|
14
|
+
```css
|
|
15
|
+
@import "tailwindcss";
|
|
16
|
+
|
|
17
|
+
@theme {
|
|
18
|
+
--color-mint-500: oklch(0.72 0.11 178);
|
|
19
|
+
--font-display: "Satoshi", "sans-serif";
|
|
20
|
+
--breakpoint-3xl: 120rem;
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Now utilities like `bg-mint-500`, `font-display`, and `3xl:grid-cols-6` become available.
|
|
25
|
+
|
|
26
|
+
## Why @theme Instead of :root?
|
|
27
|
+
|
|
28
|
+
Theme variables aren't just CSS variables - they also instruct Tailwind to create new utility classes. Using `@theme` makes this explicit and ensures variables are defined top-level.
|
|
29
|
+
|
|
30
|
+
Use `@theme` for design tokens that map to utilities. Use `:root` for regular CSS variables that shouldn't have corresponding utilities.
|
|
31
|
+
|
|
32
|
+
## Theme Variable Namespaces
|
|
33
|
+
|
|
34
|
+
Theme variables are organized into namespaces that map to utility classes:
|
|
35
|
+
|
|
36
|
+
| Namespace | Utility Classes |
|
|
37
|
+
|-----------|----------------|
|
|
38
|
+
| `--color-*` | `bg-red-500`, `text-sky-300`, `border-indigo-600`, etc. |
|
|
39
|
+
| `--font-*` | `font-sans`, `font-serif`, `font-mono` |
|
|
40
|
+
| `--breakpoint-*` | Responsive variants like `md:`, `lg:`, `xl:` |
|
|
41
|
+
| `--spacing-*` | Spacing scale for padding, margin, gap utilities |
|
|
42
|
+
| `--shadow-*` | `shadow-sm`, `shadow-md`, `shadow-lg` |
|
|
43
|
+
| `--ease-*` | Transition timing functions |
|
|
44
|
+
|
|
45
|
+
## Extending the Default Theme
|
|
46
|
+
|
|
47
|
+
Add new theme variables to extend the default theme:
|
|
48
|
+
|
|
49
|
+
```css
|
|
50
|
+
@import "tailwindcss";
|
|
51
|
+
|
|
52
|
+
@theme {
|
|
53
|
+
/* Add new color */
|
|
54
|
+
--color-brand-500: oklch(0.65 0.2 250);
|
|
55
|
+
|
|
56
|
+
/* Add new breakpoint */
|
|
57
|
+
--breakpoint-3xl: 120rem;
|
|
58
|
+
|
|
59
|
+
/* Add new font */
|
|
60
|
+
--font-display: "Satoshi", "sans-serif";
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Using Theme Variables
|
|
65
|
+
|
|
66
|
+
Tailwind generates CSS variables for your theme variables, so you can reference them:
|
|
67
|
+
|
|
68
|
+
```html
|
|
69
|
+
<!-- Use utility classes -->
|
|
70
|
+
<div class="bg-brand-500 text-display">Content</div>
|
|
71
|
+
|
|
72
|
+
<!-- Reference CSS variables directly -->
|
|
73
|
+
<div style="background-color: var(--color-brand-500)">
|
|
74
|
+
Content
|
|
75
|
+
</div>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Default Theme
|
|
79
|
+
|
|
80
|
+
When you import `tailwindcss`, it includes default theme variables:
|
|
81
|
+
|
|
82
|
+
```css
|
|
83
|
+
@layer theme, base, components, utilities;
|
|
84
|
+
|
|
85
|
+
@import "./theme.css" layer(theme);
|
|
86
|
+
@import "./preflight.css" layer(base);
|
|
87
|
+
@import "./utilities.css" layer(utilities);
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
The default theme includes:
|
|
91
|
+
- Color palette (red, blue, green, etc. with 50-950 shades)
|
|
92
|
+
- Font families (sans, serif, mono)
|
|
93
|
+
- Spacing scale
|
|
94
|
+
- Shadows
|
|
95
|
+
- Breakpoints (sm, md, lg, xl, 2xl)
|
|
96
|
+
|
|
97
|
+
## Key Points
|
|
98
|
+
|
|
99
|
+
- Theme variables define which utilities exist in your project
|
|
100
|
+
- Use `@theme` directive to define design tokens
|
|
101
|
+
- Variables must be defined top-level, not nested
|
|
102
|
+
- Tailwind generates both utilities and CSS variables
|
|
103
|
+
- Default theme provides a solid starting point
|
|
104
|
+
|
|
105
|
+
<!--
|
|
106
|
+
Source references:
|
|
107
|
+
- https://tailwindcss.com/docs/theme
|
|
108
|
+
-->
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: core-utility-classes
|
|
3
|
+
description: Understanding Tailwind's utility-first approach and how to style elements with utility classes
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Utility Classes
|
|
7
|
+
|
|
8
|
+
Tailwind CSS uses a utility-first approach where you style elements by combining many single-purpose utility classes directly in your markup.
|
|
9
|
+
|
|
10
|
+
## Overview
|
|
11
|
+
|
|
12
|
+
Instead of writing custom CSS, you compose designs using utility classes:
|
|
13
|
+
|
|
14
|
+
```html
|
|
15
|
+
<div class="mx-auto flex max-w-sm items-center gap-x-4 rounded-xl bg-white p-6 shadow-lg">
|
|
16
|
+
<img class="size-12 shrink-0" src="/logo.svg" alt="Logo" />
|
|
17
|
+
<div>
|
|
18
|
+
<div class="text-xl font-medium text-black">ChitChat</div>
|
|
19
|
+
<p class="text-gray-500">You have a new message!</p>
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Benefits
|
|
25
|
+
|
|
26
|
+
- **Faster development** - No need to come up with class names or switch between HTML and CSS files
|
|
27
|
+
- **Safer changes** - Adding or removing utilities only affects that element
|
|
28
|
+
- **Easier maintenance** - Find the element and change classes, no need to remember custom CSS
|
|
29
|
+
- **More portable** - Copy entire UI chunks between projects easily
|
|
30
|
+
- **Smaller CSS** - Utilities are reusable, so CSS doesn't grow linearly
|
|
31
|
+
|
|
32
|
+
## Why Not Inline Styles?
|
|
33
|
+
|
|
34
|
+
Utility classes have important advantages over inline styles:
|
|
35
|
+
|
|
36
|
+
- **Design constraints** - Choose from a predefined design system instead of magic numbers
|
|
37
|
+
- **State variants** - Target hover, focus, and other states with variants like `hover:bg-blue-600`
|
|
38
|
+
- **Responsive design** - Use responsive variants like `md:flex` for media queries
|
|
39
|
+
|
|
40
|
+
## Utility Class Structure
|
|
41
|
+
|
|
42
|
+
Utility classes follow consistent naming patterns:
|
|
43
|
+
|
|
44
|
+
- **Property-value**: `bg-blue-500`, `text-lg`, `rounded-xl`
|
|
45
|
+
- **Responsive**: `md:flex`, `lg:text-center`
|
|
46
|
+
- **State variants**: `hover:bg-blue-600`, `focus:outline-2`
|
|
47
|
+
- **Arbitrary values**: `top-[117px]`, `bg-[#bada55]`
|
|
48
|
+
|
|
49
|
+
## Key Points
|
|
50
|
+
|
|
51
|
+
- Every utility class is single-purpose and composable
|
|
52
|
+
- Utilities can be combined with variants for conditional styling
|
|
53
|
+
- Use complete class names - Tailwind scans your files as plain text
|
|
54
|
+
- Avoid dynamically constructing class names with string interpolation
|
|
55
|
+
|
|
56
|
+
<!--
|
|
57
|
+
Source references:
|
|
58
|
+
- https://tailwindcss.com/docs/styling-with-utility-classes
|
|
59
|
+
-->
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: core-variants
|
|
3
|
+
description: Using variants to apply utilities conditionally based on states, pseudo-classes, and media queries
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Variants
|
|
7
|
+
|
|
8
|
+
Variants let you apply utility classes conditionally based on states, pseudo-classes, pseudo-elements, media queries, and more.
|
|
9
|
+
|
|
10
|
+
## Overview
|
|
11
|
+
|
|
12
|
+
Add a variant prefix to any utility class to apply it conditionally:
|
|
13
|
+
|
|
14
|
+
```html
|
|
15
|
+
<!-- Apply bg-sky-700 only on hover -->
|
|
16
|
+
<button class="bg-sky-500 hover:bg-sky-700">Save</button>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Variants can be stacked to target specific situations:
|
|
20
|
+
|
|
21
|
+
```html
|
|
22
|
+
<!-- Dark mode, medium breakpoint, on hover -->
|
|
23
|
+
<button class="dark:md:hover:bg-fuchsia-600">Save</button>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Pseudo-Class Variants
|
|
27
|
+
|
|
28
|
+
### Interactive States
|
|
29
|
+
|
|
30
|
+
```html
|
|
31
|
+
<button class="bg-violet-500 hover:bg-violet-600 focus:outline-2 focus:outline-violet-500 active:bg-violet-700">
|
|
32
|
+
Save changes
|
|
33
|
+
</button>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Common interactive variants:
|
|
37
|
+
- `hover:` - `:hover` pseudo-class
|
|
38
|
+
- `focus:` - `:focus` pseudo-class
|
|
39
|
+
- `active:` - `:active` pseudo-class
|
|
40
|
+
- `focus-visible:` - `:focus-visible`
|
|
41
|
+
- `focus-within:` - `:focus-within`
|
|
42
|
+
- `visited:` - `:visited`
|
|
43
|
+
|
|
44
|
+
### Structural Variants
|
|
45
|
+
|
|
46
|
+
```html
|
|
47
|
+
<ul>
|
|
48
|
+
<li class="py-4 first:pt-0 last:pb-0">Item 1</li>
|
|
49
|
+
<li class="py-4 first:pt-0 last:pb-0">Item 2</li>
|
|
50
|
+
<li class="py-4 first:pt-0 last:pb-0">Item 3</li>
|
|
51
|
+
</ul>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Common structural variants:
|
|
55
|
+
- `first:` - `:first-child`
|
|
56
|
+
- `last:` - `:last-child`
|
|
57
|
+
- `odd:` - `:nth-child(odd)`
|
|
58
|
+
- `even:` - `:nth-child(even)`
|
|
59
|
+
- `only:` - `:only-child`
|
|
60
|
+
|
|
61
|
+
### Form States
|
|
62
|
+
|
|
63
|
+
```html
|
|
64
|
+
<input class="border-gray-300 required:border-red-500 invalid:border-red-500" />
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Common form variants:
|
|
68
|
+
- `required:` - `:required`
|
|
69
|
+
- `optional:` - `:optional`
|
|
70
|
+
- `invalid:` - `:invalid`
|
|
71
|
+
- `valid:` - `:valid`
|
|
72
|
+
- `disabled:` - `:disabled`
|
|
73
|
+
- `enabled:` - `:enabled`
|
|
74
|
+
- `checked:` - `:checked`
|
|
75
|
+
- `user-valid:` - `:user-valid` (v4.1) — validation after user interaction
|
|
76
|
+
- `user-invalid:` - `:user-invalid` (v4.1) — invalid after user interaction
|
|
77
|
+
|
|
78
|
+
```html
|
|
79
|
+
<!-- Better UX: only show validation state after user interacts -->
|
|
80
|
+
<input required class="border user-valid:border-green-500 user-invalid:border-red-500" />
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Pseudo-Element Variants
|
|
84
|
+
|
|
85
|
+
```html
|
|
86
|
+
<input class="placeholder:text-gray-400 before:content-['*'] after:content-['required']" />
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Common pseudo-element variants:
|
|
90
|
+
- `before:` - `::before`
|
|
91
|
+
- `after:` - `::after`
|
|
92
|
+
- `placeholder:` - `::placeholder`
|
|
93
|
+
- `selection:` - `::selection`
|
|
94
|
+
- `first-line:` - `::first-line`
|
|
95
|
+
- `first-letter:` - `::first-letter`
|
|
96
|
+
|
|
97
|
+
## Media Query Variants
|
|
98
|
+
|
|
99
|
+
### Responsive Variants
|
|
100
|
+
|
|
101
|
+
```html
|
|
102
|
+
<div class="text-sm md:text-base lg:text-lg">Responsive text</div>
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Dark Mode
|
|
106
|
+
|
|
107
|
+
```html
|
|
108
|
+
<div class="bg-white dark:bg-gray-800 text-gray-900 dark:text-white">
|
|
109
|
+
Content
|
|
110
|
+
</div>
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
By default uses `prefers-color-scheme`, but can be customized to use a class or data attribute.
|
|
114
|
+
|
|
115
|
+
### Reduced Motion
|
|
116
|
+
|
|
117
|
+
```html
|
|
118
|
+
<div class="transition-all motion-reduce:transition-none">
|
|
119
|
+
Animated content
|
|
120
|
+
</div>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Pointer Device Variants (v4.1+)
|
|
124
|
+
|
|
125
|
+
Target specific input devices:
|
|
126
|
+
|
|
127
|
+
```html
|
|
128
|
+
<!-- Larger touch targets on touch devices -->
|
|
129
|
+
<button class="p-2 pointer-coarse:p-4 pointer-coarse:text-lg">
|
|
130
|
+
Touch-friendly button
|
|
131
|
+
</button>
|
|
132
|
+
|
|
133
|
+
<!-- Fine details only on mouse/trackpad -->
|
|
134
|
+
<div class="hidden pointer-fine:block">
|
|
135
|
+
Precise hover details
|
|
136
|
+
</div>
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
- `pointer-fine:` — precise pointing device (mouse, trackpad)
|
|
140
|
+
- `pointer-coarse:` — imprecise device (touchscreen)
|
|
141
|
+
- `pointer-none:` — no pointing device
|
|
142
|
+
- `any-pointer-fine:` / `any-pointer-coarse:` — any available device
|
|
143
|
+
|
|
144
|
+
### Other New Variants (v4.1+)
|
|
145
|
+
|
|
146
|
+
```html
|
|
147
|
+
<!-- Style <details> content -->
|
|
148
|
+
<details class="details-content:mt-3 details-content:p-4" open>
|
|
149
|
+
<summary>FAQ Question</summary>
|
|
150
|
+
<div>Answer content</div>
|
|
151
|
+
</details>
|
|
152
|
+
|
|
153
|
+
<!-- Show fallback when JS disabled -->
|
|
154
|
+
<div class="hidden noscript:block">Please enable JavaScript.</div>
|
|
155
|
+
|
|
156
|
+
<!-- Respect inverted colors preference -->
|
|
157
|
+
<img class="inverted-colors:hue-rotate-180" />
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
- `details-content:` — target content inside `<details>`
|
|
161
|
+
- `noscript:` — styles when JavaScript is disabled
|
|
162
|
+
- `inverted-colors:` — when user has inverted colors preference
|
|
163
|
+
|
|
164
|
+
## Attribute Selector Variants
|
|
165
|
+
|
|
166
|
+
```html
|
|
167
|
+
<!-- RTL support -->
|
|
168
|
+
<div class="text-left rtl:text-right">Content</div>
|
|
169
|
+
|
|
170
|
+
<!-- Open state -->
|
|
171
|
+
<details class="[&[open]]:bg-gray-100">Details</details>
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Arbitrary Variants
|
|
175
|
+
|
|
176
|
+
Use arbitrary variants for custom selectors:
|
|
177
|
+
|
|
178
|
+
```html
|
|
179
|
+
<ul>
|
|
180
|
+
<li class="lg:[&:nth-child(-n+3)]:hover:underline">Item</li>
|
|
181
|
+
</ul>
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
## Child Selector Variants
|
|
185
|
+
|
|
186
|
+
```html
|
|
187
|
+
<div class="[&>*]:mb-4 [&>*:last-child]:mb-0">
|
|
188
|
+
<p>Paragraph 1</p>
|
|
189
|
+
<p>Paragraph 2</p>
|
|
190
|
+
</div>
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## Key Points
|
|
194
|
+
|
|
195
|
+
- Variants prefix utilities to apply them conditionally
|
|
196
|
+
- Variants can be stacked: `dark:md:hover:bg-blue-600`
|
|
197
|
+
- Use variants for states, pseudo-classes, media queries, and more
|
|
198
|
+
- Arbitrary variants enable custom selector patterns
|
|
199
|
+
- Child selector variants target descendant elements
|
|
200
|
+
|
|
201
|
+
<!--
|
|
202
|
+
Source references:
|
|
203
|
+
- https://tailwindcss.com/docs/hover-focus-and-other-states
|
|
204
|
+
-->
|