@biggora/claude-plugins 1.1.1 → 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/.claude/settings.local.json +3 -1
- package/README.md +24 -17
- 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/codex-cli/SKILL.md +21 -11
- package/src/skills/gemini-cli/SKILL.md +27 -13
- package/src/skills/gemini-cli/references/commands.md +21 -14
- package/src/skills/gemini-cli/references/configuration.md +23 -18
- package/src/skills/gemini-cli/references/headless-and-scripting.md +7 -17
- package/src/skills/gemini-cli/references/mcp-and-extensions.md +12 -6
- 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/notebook-lm/SKILL.md +1 -1
- package/src/skills/screen-recording/SKILL.md +243 -213
- package/src/skills/screen-recording/references/design-patterns.md +4 -2
- package/src/skills/screen-recording/references/ffmpeg-recording.md +473 -0
- package/src/skills/screen-recording/references/{approach1-programmatic.md → programmatic-generation.md} +45 -22
- package/src/skills/screen-recording/references/python-fallback.md +222 -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/tm-search/SKILL.md +242 -106
- package/src/skills/tm-search/references/scraping-fallback.md +60 -95
- package/src/skills/tm-search/scripts/tm_search.py +453 -375
- 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/src/skills/screen-recording/references/approach2-xvfb.md +0 -232
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: features-content-detection
|
|
3
|
+
description: How Tailwind detects classes in source files and how to customize content scanning
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Detecting Classes in Source Files
|
|
7
|
+
|
|
8
|
+
Tailwind scans your project for utility classes and generates CSS based on what you've actually used.
|
|
9
|
+
|
|
10
|
+
## How Classes Are Detected
|
|
11
|
+
|
|
12
|
+
Tailwind treats all source files as plain text and looks for tokens that could be class names:
|
|
13
|
+
|
|
14
|
+
```jsx
|
|
15
|
+
export function Button({ color, children }) {
|
|
16
|
+
const colors = {
|
|
17
|
+
black: "bg-black text-white",
|
|
18
|
+
blue: "bg-blue-500 text-white",
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
return (
|
|
22
|
+
<button className={`${colors[color]} rounded-full px-2 py-1.5`}>
|
|
23
|
+
{children}
|
|
24
|
+
</button>
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Tailwind detects `bg-black`, `text-white`, `bg-blue-500`, `rounded-full`, `px-2`, and `py-1.5` from this file.
|
|
30
|
+
|
|
31
|
+
## Dynamic Class Names
|
|
32
|
+
|
|
33
|
+
Tailwind scans files as plain text, so it can't understand string concatenation or interpolation.
|
|
34
|
+
|
|
35
|
+
### ❌ Don't Construct Classes Dynamically
|
|
36
|
+
|
|
37
|
+
```html
|
|
38
|
+
<div class="text-{{ error ? 'red' : 'green' }}-600"></div>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
The strings `text-red-600` and `text-green-600` don't exist in the file, so Tailwind won't generate them.
|
|
42
|
+
|
|
43
|
+
### ✅ Use Complete Class Names
|
|
44
|
+
|
|
45
|
+
```html
|
|
46
|
+
<div class="{{ error ? 'text-red-600' : 'text-green-600' }}">
|
|
47
|
+
Content
|
|
48
|
+
</div>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### ❌ Don't Build Classes from Props
|
|
52
|
+
|
|
53
|
+
```jsx
|
|
54
|
+
function Button({ color, children }) {
|
|
55
|
+
return <button className={`bg-${color}-600 hover:bg-${color}-500`}>{children}</button>;
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### ✅ Map Props to Static Classes
|
|
60
|
+
|
|
61
|
+
```jsx
|
|
62
|
+
function Button({ color, children }) {
|
|
63
|
+
const colorVariants = {
|
|
64
|
+
blue: "bg-blue-600 hover:bg-blue-500",
|
|
65
|
+
red: "bg-red-600 hover:bg-red-500",
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
return <button className={`${colorVariants[color]} ...`}>{children}</button>;
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Which Files Are Scanned
|
|
73
|
+
|
|
74
|
+
Tailwind scans every file in your project except:
|
|
75
|
+
|
|
76
|
+
- Files in `.gitignore`
|
|
77
|
+
- Files in `node_modules`
|
|
78
|
+
- Binary files (images, videos, zip files)
|
|
79
|
+
- CSS files
|
|
80
|
+
- Common package manager lock files
|
|
81
|
+
|
|
82
|
+
## Explicitly Registering Sources
|
|
83
|
+
|
|
84
|
+
Use `@source` to explicitly register source paths:
|
|
85
|
+
|
|
86
|
+
```css
|
|
87
|
+
@import "tailwindcss";
|
|
88
|
+
@source "../node_modules/@acmecorp/ui-lib";
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
This is useful for external libraries built with Tailwind that are in `.gitignore`.
|
|
92
|
+
|
|
93
|
+
## Setting Base Path
|
|
94
|
+
|
|
95
|
+
Set the base path for source detection:
|
|
96
|
+
|
|
97
|
+
```css
|
|
98
|
+
@import "tailwindcss" source("../src");
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Useful in monorepos where build commands run from the root.
|
|
102
|
+
|
|
103
|
+
## Ignoring Specific Paths
|
|
104
|
+
|
|
105
|
+
Use `@source not` to ignore paths:
|
|
106
|
+
|
|
107
|
+
```css
|
|
108
|
+
@import "tailwindcss";
|
|
109
|
+
@source not "../src/components/legacy";
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Disabling Automatic Detection
|
|
113
|
+
|
|
114
|
+
Use `source(none)` to disable automatic detection:
|
|
115
|
+
|
|
116
|
+
```css
|
|
117
|
+
@import "tailwindcss" source(none);
|
|
118
|
+
|
|
119
|
+
@source "../admin";
|
|
120
|
+
@source "../shared";
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Useful for projects with multiple Tailwind stylesheets.
|
|
124
|
+
|
|
125
|
+
## Safelisting Utilities
|
|
126
|
+
|
|
127
|
+
Force Tailwind to generate specific classes with `@source inline()`:
|
|
128
|
+
|
|
129
|
+
```css
|
|
130
|
+
@import "tailwindcss";
|
|
131
|
+
@source inline("underline");
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Safelisting with Variants
|
|
135
|
+
|
|
136
|
+
Generate classes with variants:
|
|
137
|
+
|
|
138
|
+
```css
|
|
139
|
+
@import "tailwindcss";
|
|
140
|
+
@source inline("{hover:,focus:,}underline");
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Safelisting with Ranges
|
|
144
|
+
|
|
145
|
+
Use brace expansion to generate multiple classes:
|
|
146
|
+
|
|
147
|
+
```css
|
|
148
|
+
@import "tailwindcss";
|
|
149
|
+
@source inline("{hover:,}bg-red-{50,{100..900..100},950}");
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
This generates `bg-red-50` through `bg-red-950` with hover variants.
|
|
153
|
+
|
|
154
|
+
## Explicitly Excluding Classes
|
|
155
|
+
|
|
156
|
+
Use `@source not inline()` to prevent specific classes from being generated:
|
|
157
|
+
|
|
158
|
+
```css
|
|
159
|
+
@import "tailwindcss";
|
|
160
|
+
@source not inline("{hover:,focus:,}bg-red-{50,{100..900..100},950}");
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## Key Points
|
|
164
|
+
|
|
165
|
+
- Tailwind scans files as plain text
|
|
166
|
+
- Always use complete class names, never construct them dynamically
|
|
167
|
+
- Map props/state to static class names
|
|
168
|
+
- Use `@source` to explicitly register or ignore paths
|
|
169
|
+
- Use `@source inline()` to safelist utilities
|
|
170
|
+
- Brace expansion works in inline sources for ranges
|
|
171
|
+
|
|
172
|
+
<!--
|
|
173
|
+
Source references:
|
|
174
|
+
- https://tailwindcss.com/docs/detecting-classes-in-source-files
|
|
175
|
+
-->
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: features-custom-styles
|
|
3
|
+
description: Adding custom styles, utilities, variants, and working with arbitrary values
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Adding Custom Styles
|
|
7
|
+
|
|
8
|
+
Tailwind is designed to be extensible. This guide covers customizing your theme, using arbitrary values, adding custom CSS, and extending the framework.
|
|
9
|
+
|
|
10
|
+
## Customizing Your Theme
|
|
11
|
+
|
|
12
|
+
Add custom design tokens using `@theme`:
|
|
13
|
+
|
|
14
|
+
```css
|
|
15
|
+
@import "tailwindcss";
|
|
16
|
+
|
|
17
|
+
@theme {
|
|
18
|
+
--font-display: "Satoshi", "sans-serif";
|
|
19
|
+
--breakpoint-3xl: 120rem;
|
|
20
|
+
--color-brand-500: oklch(0.65 0.2 250);
|
|
21
|
+
--ease-fluid: cubic-bezier(0.3, 0, 0, 1);
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Arbitrary Values
|
|
26
|
+
|
|
27
|
+
Use square bracket notation for one-off values that don't belong in your theme:
|
|
28
|
+
|
|
29
|
+
```html
|
|
30
|
+
<!-- Arbitrary values -->
|
|
31
|
+
<div class="top-[117px] bg-[#bada55] text-[22px]">
|
|
32
|
+
Content
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
<!-- With variants -->
|
|
36
|
+
<div class="top-[117px] lg:top-[344px]">
|
|
37
|
+
Content
|
|
38
|
+
</div>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### CSS Variables as Arbitrary Values
|
|
42
|
+
|
|
43
|
+
Reference CSS variables:
|
|
44
|
+
|
|
45
|
+
```html
|
|
46
|
+
<div class="fill-(--my-brand-color)">
|
|
47
|
+
Content
|
|
48
|
+
</div>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
This is shorthand for `fill-[var(--my-brand-color)]`.
|
|
52
|
+
|
|
53
|
+
## Arbitrary Properties
|
|
54
|
+
|
|
55
|
+
Use square brackets for CSS properties Tailwind doesn't have utilities for:
|
|
56
|
+
|
|
57
|
+
```html
|
|
58
|
+
<div class="[mask-type:luminance]">
|
|
59
|
+
Content
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<!-- With variants -->
|
|
63
|
+
<div class="[mask-type:luminance] hover:[mask-type:alpha]">
|
|
64
|
+
Content
|
|
65
|
+
</div>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### CSS Variables
|
|
69
|
+
|
|
70
|
+
Set CSS variables with arbitrary properties:
|
|
71
|
+
|
|
72
|
+
```html
|
|
73
|
+
<div class="[--scroll-offset:56px] lg:[--scroll-offset:44px]">
|
|
74
|
+
Content
|
|
75
|
+
</div>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Arbitrary Variants
|
|
79
|
+
|
|
80
|
+
Create custom selectors on the fly:
|
|
81
|
+
|
|
82
|
+
```html
|
|
83
|
+
<ul>
|
|
84
|
+
<li class="lg:[&:nth-child(-n+3)]:hover:underline">Item</li>
|
|
85
|
+
</ul>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Handling Whitespace
|
|
89
|
+
|
|
90
|
+
Use underscores for spaces in arbitrary values:
|
|
91
|
+
|
|
92
|
+
```html
|
|
93
|
+
<div class="grid-cols-[1fr_500px_2fr]">
|
|
94
|
+
Content
|
|
95
|
+
</div>
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Tailwind converts underscores to spaces, except in contexts where underscores are valid (like URLs).
|
|
99
|
+
|
|
100
|
+
## Custom Utilities
|
|
101
|
+
|
|
102
|
+
Add custom utilities with `@utility`:
|
|
103
|
+
|
|
104
|
+
```css
|
|
105
|
+
@import "tailwindcss";
|
|
106
|
+
|
|
107
|
+
@utility tab-4 {
|
|
108
|
+
tab-size: 4;
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Now you can use `tab-4` utility class, and it works with variants:
|
|
113
|
+
|
|
114
|
+
```html
|
|
115
|
+
<div class="tab-4 hover:tab-8">
|
|
116
|
+
Content
|
|
117
|
+
</div>
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Custom Variants
|
|
121
|
+
|
|
122
|
+
Add custom variants with `@custom-variant`:
|
|
123
|
+
|
|
124
|
+
```css
|
|
125
|
+
@import "tailwindcss";
|
|
126
|
+
|
|
127
|
+
@custom-variant theme-midnight (&:where([data-theme="midnight"] *));
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Now you can use `theme-midnight:` variant:
|
|
131
|
+
|
|
132
|
+
```html
|
|
133
|
+
<div class="theme-midnight:bg-black theme-midnight:text-white">
|
|
134
|
+
Content
|
|
135
|
+
</div>
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Using Variants in CSS
|
|
139
|
+
|
|
140
|
+
Apply Tailwind variants to custom CSS with `@variant`:
|
|
141
|
+
|
|
142
|
+
```css
|
|
143
|
+
.my-element {
|
|
144
|
+
background: white;
|
|
145
|
+
|
|
146
|
+
@variant dark {
|
|
147
|
+
background: black;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
@variant hover {
|
|
151
|
+
background: gray;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Base Styles
|
|
157
|
+
|
|
158
|
+
Add base styles to the `base` layer:
|
|
159
|
+
|
|
160
|
+
```css
|
|
161
|
+
@layer base {
|
|
162
|
+
h1 {
|
|
163
|
+
font-size: var(--text-2xl);
|
|
164
|
+
font-weight: 600;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
h2 {
|
|
168
|
+
font-size: var(--text-xl);
|
|
169
|
+
font-weight: 600;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
a {
|
|
173
|
+
color: var(--color-blue-600);
|
|
174
|
+
text-decoration-line: underline;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Component Styles
|
|
180
|
+
|
|
181
|
+
Add component styles to the `components` layer:
|
|
182
|
+
|
|
183
|
+
```css
|
|
184
|
+
@layer components {
|
|
185
|
+
.btn-primary {
|
|
186
|
+
@apply bg-blue-500 hover:bg-blue-600 text-white font-semibold py-2 px-4 rounded;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## Key Points
|
|
192
|
+
|
|
193
|
+
- Use `@theme` to customize design tokens
|
|
194
|
+
- Arbitrary values with `[]` for one-off values
|
|
195
|
+
- Arbitrary properties for CSS properties without utilities
|
|
196
|
+
- `@utility` for custom utilities
|
|
197
|
+
- `@custom-variant` for custom variants
|
|
198
|
+
- `@layer` for organizing base and component styles
|
|
199
|
+
|
|
200
|
+
<!--
|
|
201
|
+
Source references:
|
|
202
|
+
- https://tailwindcss.com/docs/adding-custom-styles
|
|
203
|
+
-->
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: features-dark-mode
|
|
3
|
+
description: Implementing dark mode with Tailwind's dark variant and custom dark mode strategies
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Dark Mode
|
|
7
|
+
|
|
8
|
+
Tailwind includes a `dark` variant that lets you style your site differently when dark mode is enabled.
|
|
9
|
+
|
|
10
|
+
## Overview
|
|
11
|
+
|
|
12
|
+
Use the `dark:` variant to apply styles in dark mode:
|
|
13
|
+
|
|
14
|
+
```html
|
|
15
|
+
<div class="bg-white dark:bg-gray-800 text-gray-900 dark:text-white">
|
|
16
|
+
Content
|
|
17
|
+
</div>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Default Behavior
|
|
21
|
+
|
|
22
|
+
By default, the `dark` variant uses the `prefers-color-scheme` CSS media feature:
|
|
23
|
+
|
|
24
|
+
```css
|
|
25
|
+
@media (prefers-color-scheme: dark) {
|
|
26
|
+
.dark\:bg-gray-800 {
|
|
27
|
+
background-color: rgb(31 41 55);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Manual Toggle with Class
|
|
33
|
+
|
|
34
|
+
Override the `dark` variant to use a class selector:
|
|
35
|
+
|
|
36
|
+
```css
|
|
37
|
+
@import "tailwindcss";
|
|
38
|
+
|
|
39
|
+
@custom-variant dark (&:where(.dark, .dark *));
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Now dark mode utilities apply when the `dark` class is present:
|
|
43
|
+
|
|
44
|
+
```html
|
|
45
|
+
<html class="dark">
|
|
46
|
+
<body>
|
|
47
|
+
<div class="bg-white dark:bg-black">Content</div>
|
|
48
|
+
</body>
|
|
49
|
+
</html>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Manual Toggle with Data Attribute
|
|
53
|
+
|
|
54
|
+
Use a data attribute instead:
|
|
55
|
+
|
|
56
|
+
```css
|
|
57
|
+
@import "tailwindcss";
|
|
58
|
+
|
|
59
|
+
@custom-variant dark (&:where([data-theme=dark], [data-theme=dark] *));
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
```html
|
|
63
|
+
<html data-theme="dark">
|
|
64
|
+
<body>
|
|
65
|
+
<div class="bg-white dark:bg-black">Content</div>
|
|
66
|
+
</body>
|
|
67
|
+
</html>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Three-Way Theme Toggle
|
|
71
|
+
|
|
72
|
+
Support light mode, dark mode, and system preference:
|
|
73
|
+
|
|
74
|
+
```js
|
|
75
|
+
// On page load
|
|
76
|
+
document.documentElement.classList.toggle(
|
|
77
|
+
"dark",
|
|
78
|
+
localStorage.theme === "dark" ||
|
|
79
|
+
(!("theme" in localStorage) &&
|
|
80
|
+
window.matchMedia("(prefers-color-scheme: dark)").matches)
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
// Set light mode
|
|
84
|
+
localStorage.theme = "light";
|
|
85
|
+
document.documentElement.classList.remove("dark");
|
|
86
|
+
|
|
87
|
+
// Set dark mode
|
|
88
|
+
localStorage.theme = "dark";
|
|
89
|
+
document.documentElement.classList.add("dark");
|
|
90
|
+
|
|
91
|
+
// Respect system preference
|
|
92
|
+
localStorage.removeItem("theme");
|
|
93
|
+
document.documentElement.classList.toggle(
|
|
94
|
+
"dark",
|
|
95
|
+
window.matchMedia("(prefers-color-scheme: dark)").matches
|
|
96
|
+
);
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Common Patterns
|
|
100
|
+
|
|
101
|
+
### Cards
|
|
102
|
+
|
|
103
|
+
```html
|
|
104
|
+
<div class="bg-white dark:bg-gray-800 rounded-lg shadow-lg dark:shadow-none">
|
|
105
|
+
<h2 class="text-gray-900 dark:text-white">Title</h2>
|
|
106
|
+
<p class="text-gray-500 dark:text-gray-400">Description</p>
|
|
107
|
+
</div>
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Borders
|
|
111
|
+
|
|
112
|
+
```html
|
|
113
|
+
<div class="border border-gray-200 dark:border-gray-700">
|
|
114
|
+
Content
|
|
115
|
+
</div>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Buttons
|
|
119
|
+
|
|
120
|
+
```html
|
|
121
|
+
<button class="bg-blue-500 hover:bg-blue-600 dark:bg-blue-600 dark:hover:bg-blue-700 text-white">
|
|
122
|
+
Button
|
|
123
|
+
</button>
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Key Points
|
|
127
|
+
|
|
128
|
+
- Use `dark:` variant for dark mode styles
|
|
129
|
+
- Default uses `prefers-color-scheme` media query
|
|
130
|
+
- Override with `@custom-variant` for manual toggles
|
|
131
|
+
- Can use class or data attribute selectors
|
|
132
|
+
- Combine with responsive variants: `dark:md:bg-gray-800`
|
|
133
|
+
|
|
134
|
+
<!--
|
|
135
|
+
Source references:
|
|
136
|
+
- https://tailwindcss.com/docs/dark-mode
|
|
137
|
+
-->
|