tailwindcss 3.3.7 → 3.4.1

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/CHANGELOG.md CHANGED
@@ -9,6 +9,47 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
9
9
 
10
10
  - Nothing yet!
11
11
 
12
+ ## [3.4.1] - 2014-01-05
13
+
14
+ ### Fixed
15
+
16
+ - Don't remove keyframe stops when using important utilities ([#12639](https://github.com/tailwindlabs/tailwindcss/pull/12639))
17
+ - Don't add spaces to gradients and grid track names when followed by `calc()` ([#12704](https://github.com/tailwindlabs/tailwindcss/pull/12704))
18
+ - Restore old behavior for `class` dark mode strategy ([#12717](https://github.com/tailwindlabs/tailwindcss/pull/12717))
19
+
20
+ ### Added
21
+
22
+ - Add new `selector` and `variant` strategies for dark mode ([#12717](https://github.com/tailwindlabs/tailwindcss/pull/12717))
23
+
24
+ ### Changed
25
+
26
+ - Support `rtl` and `ltr` variants on same element as `dir` attribute ([#12717](https://github.com/tailwindlabs/tailwindcss/pull/12717))
27
+
28
+ ## [3.4.0] - 2023-12-19
29
+
30
+ ### Added
31
+
32
+ - Add `svh`, `lvh`, and `dvh` values to default `height`/`min-height`/`max-height` theme ([#11317](https://github.com/tailwindlabs/tailwindcss/pull/11317))
33
+ - Add `has-*` variants for `:has(...)` pseudo-class ([#11318](https://github.com/tailwindlabs/tailwindcss/pull/11318))
34
+ - Add `text-wrap` utilities including `text-balance` and `text-pretty` ([#11320](https://github.com/tailwindlabs/tailwindcss/pull/11320), [#12031](https://github.com/tailwindlabs/tailwindcss/pull/12031))
35
+ - Extend default `opacity` scale to include all steps of 5 ([#11832](https://github.com/tailwindlabs/tailwindcss/pull/11832))
36
+ - Update Preflight `html` styles to include shadow DOM `:host` pseudo-class ([#11200](https://github.com/tailwindlabs/tailwindcss/pull/11200))
37
+ - Increase default values for `grid-rows-*` utilities from 1–6 to 1–12 ([#12180](https://github.com/tailwindlabs/tailwindcss/pull/12180))
38
+ - Add `size-*` utilities ([#12287](https://github.com/tailwindlabs/tailwindcss/pull/12287))
39
+ - Add utilities for CSS subgrid ([#12298](https://github.com/tailwindlabs/tailwindcss/pull/12298))
40
+ - Add spacing scale to `min-w-*`, `min-h-*`, and `max-w-*` utilities ([#12300](https://github.com/tailwindlabs/tailwindcss/pull/12300))
41
+ - Add `forced-color-adjust` utilities ([#11931](https://github.com/tailwindlabs/tailwindcss/pull/11931))
42
+ - Add `forced-colors` variant ([#11694](https://github.com/tailwindlabs/tailwindcss/pull/11694), [#12582](https://github.com/tailwindlabs/tailwindcss/pull/12582))
43
+ - Add `appearance-auto` utility ([#12404](https://github.com/tailwindlabs/tailwindcss/pull/12404))
44
+ - Add logical property values for `float` and `clear` utilities ([#12480](https://github.com/tailwindlabs/tailwindcss/pull/12480))
45
+ - Add `*` variant for targeting direct children ([#12551](https://github.com/tailwindlabs/tailwindcss/pull/12551))
46
+
47
+ ### Changed
48
+
49
+ - Simplify the `sans` font-family stack ([#11748](https://github.com/tailwindlabs/tailwindcss/pull/11748))
50
+ - Disable the tap highlight overlay on iOS ([#12299](https://github.com/tailwindlabs/tailwindcss/pull/12299))
51
+ - Improve relative precedence of `rtl`, `ltr`, `forced-colors`, and `dark` variants ([#12584](https://github.com/tailwindlabs/tailwindcss/pull/12584))
52
+
12
53
  ## [3.3.7] - 2023-12-18
13
54
 
14
55
  ### Fixed
@@ -2310,7 +2351,9 @@ No release notes
2310
2351
 
2311
2352
  - Everything!
2312
2353
 
2313
- [unreleased]: https://github.com/tailwindlabs/tailwindcss/compare/v3.3.7...HEAD
2354
+ [unreleased]: https://github.com/tailwindlabs/tailwindcss/compare/v3.4.1...HEAD
2355
+ [3.4.1]: https://github.com/tailwindlabs/tailwindcss/compare/v3.4.0...v3.4.1
2356
+ [3.4.0]: https://github.com/tailwindlabs/tailwindcss/compare/v3.3.7...v3.4.0
2314
2357
  [3.3.7]: https://github.com/tailwindlabs/tailwindcss/compare/v3.3.6...v3.3.7
2315
2358
  [3.3.6]: https://github.com/tailwindlabs/tailwindcss/compare/v3.3.5...v3.3.6
2316
2359
  [3.3.5]: https://github.com/tailwindlabs/tailwindcss/compare/v3.3.4...v3.3.5
@@ -32,6 +32,7 @@ const _default = [
32
32
  "lineClamp",
33
33
  "display",
34
34
  "aspectRatio",
35
+ "size",
35
36
  "height",
36
37
  "maxHeight",
37
38
  "minHeight",
@@ -98,6 +99,7 @@ const _default = [
98
99
  "textOverflow",
99
100
  "hyphens",
100
101
  "whitespace",
102
+ "textWrap",
101
103
  "wordBreak",
102
104
  "borderRadius",
103
105
  "borderWidth",
@@ -183,5 +185,6 @@ const _default = [
183
185
  "transitionDuration",
184
186
  "transitionTimingFunction",
185
187
  "willChange",
186
- "content"
188
+ "content",
189
+ "forcedColorAdjust"
187
190
  ];
@@ -81,6 +81,9 @@ function _interop_require_wildcard(obj, nodeInterop) {
81
81
  return newObj;
82
82
  }
83
83
  let variantPlugins = {
84
+ childVariant: ({ addVariant })=>{
85
+ addVariant("*", "& > *");
86
+ },
84
87
  pseudoElementVariants: ({ addVariant })=>{
85
88
  addVariant("first-letter", "&::first-letter");
86
89
  addVariant("first-line", "&::first-line");
@@ -264,15 +267,15 @@ let variantPlugins = {
264
267
  }
265
268
  },
266
269
  directionVariants: ({ addVariant })=>{
267
- addVariant("ltr", ':is([dir="ltr"] &)');
268
- addVariant("rtl", ':is([dir="rtl"] &)');
270
+ addVariant("ltr", '&:where([dir="ltr"], [dir="ltr"] *)');
271
+ addVariant("rtl", '&:where([dir="rtl"], [dir="rtl"] *)');
269
272
  },
270
273
  reducedMotionVariants: ({ addVariant })=>{
271
274
  addVariant("motion-safe", "@media (prefers-reduced-motion: no-preference)");
272
275
  addVariant("motion-reduce", "@media (prefers-reduced-motion: reduce)");
273
276
  },
274
277
  darkVariants: ({ config , addVariant })=>{
275
- let [mode, className = ".dark"] = [].concat(config("darkMode", "media"));
278
+ let [mode, selector = ".dark"] = [].concat(config("darkMode", "media"));
276
279
  if (mode === false) {
277
280
  mode = "media";
278
281
  _log.default.warn("darkmode-false", [
@@ -281,10 +284,48 @@ let variantPlugins = {
281
284
  "https://tailwindcss.com/docs/upgrade-guide#remove-dark-mode-configuration"
282
285
  ]);
283
286
  }
284
- if (mode === "class") {
285
- addVariant("dark", `:is(${className} &)`);
287
+ if (mode === "variant") {
288
+ let formats;
289
+ if (Array.isArray(selector)) {
290
+ formats = selector;
291
+ } else if (typeof selector === "function") {
292
+ formats = selector;
293
+ } else if (typeof selector === "string") {
294
+ formats = [
295
+ selector
296
+ ];
297
+ }
298
+ // TODO: We could also add these warnings if the user passes a function that returns string | string[]
299
+ // But this is an advanced enough use case that it's probably not necessary
300
+ if (Array.isArray(formats)) {
301
+ for (let format of formats){
302
+ if (format === ".dark") {
303
+ mode = false;
304
+ _log.default.warn("darkmode-variant-without-selector", [
305
+ "When using `variant` for `darkMode`, you must provide a selector.",
306
+ 'Example: `darkMode: ["variant", ".your-selector &"]`'
307
+ ]);
308
+ } else if (!format.includes("&")) {
309
+ mode = false;
310
+ _log.default.warn("darkmode-variant-without-ampersand", [
311
+ "When using `variant` for `darkMode`, your selector must contain `&`.",
312
+ 'Example `darkMode: ["variant", ".your-selector &"]`'
313
+ ]);
314
+ }
315
+ }
316
+ }
317
+ selector = formats;
318
+ }
319
+ if (mode === "selector") {
320
+ // New preferred behavior
321
+ addVariant("dark", `&:where(${selector}, ${selector} *)`);
286
322
  } else if (mode === "media") {
287
323
  addVariant("dark", "@media (prefers-color-scheme: dark)");
324
+ } else if (mode === "variant") {
325
+ addVariant("dark", selector);
326
+ } else if (mode === "class") {
327
+ // Old behavior
328
+ addVariant("dark", `:is(${selector} &)`);
288
329
  }
289
330
  },
290
331
  printVariant: ({ addVariant })=>{
@@ -419,6 +460,17 @@ let variantPlugins = {
419
460
  values: (_theme = theme("supports")) !== null && _theme !== void 0 ? _theme : {}
420
461
  });
421
462
  },
463
+ hasVariants: ({ matchVariant })=>{
464
+ matchVariant("has", (value)=>`&:has(${(0, _dataTypes.normalize)(value)})`, {
465
+ values: {}
466
+ });
467
+ matchVariant("group-has", (value, { modifier })=>modifier ? `:merge(.group\\/${modifier}):has(${(0, _dataTypes.normalize)(value)}) &` : `:merge(.group):has(${(0, _dataTypes.normalize)(value)}) &`, {
468
+ values: {}
469
+ });
470
+ matchVariant("peer-has", (value, { modifier })=>modifier ? `:merge(.peer\\/${modifier}):has(${(0, _dataTypes.normalize)(value)}) ~ &` : `:merge(.peer):has(${(0, _dataTypes.normalize)(value)}) ~ &`, {
471
+ values: {}
472
+ });
473
+ },
422
474
  ariaVariants: ({ matchVariant , theme })=>{
423
475
  var _theme;
424
476
  matchVariant("aria", (value)=>`&[aria-${(0, _dataTypes.normalize)(value)}]`, {
@@ -454,6 +506,9 @@ let variantPlugins = {
454
506
  prefersContrastVariants: ({ addVariant })=>{
455
507
  addVariant("contrast-more", "@media (prefers-contrast: more)");
456
508
  addVariant("contrast-less", "@media (prefers-contrast: less)");
509
+ },
510
+ forcedColorsVariants: ({ addVariant })=>{
511
+ addVariant("forced-colors", "@media (forced-colors: active)");
457
512
  }
458
513
  };
459
514
  let cssTransformValue = [
@@ -774,6 +829,12 @@ let corePlugins = {
774
829
  ]),
775
830
  float: ({ addUtilities })=>{
776
831
  addUtilities({
832
+ ".float-start": {
833
+ float: "inline-start"
834
+ },
835
+ ".float-end": {
836
+ float: "inline-end"
837
+ },
777
838
  ".float-right": {
778
839
  float: "right"
779
840
  },
@@ -787,6 +848,12 @@ let corePlugins = {
787
848
  },
788
849
  clear: ({ addUtilities })=>{
789
850
  addUtilities({
851
+ ".clear-start": {
852
+ clear: "inline-start"
853
+ },
854
+ ".clear-end": {
855
+ clear: "inline-end"
856
+ },
790
857
  ".clear-left": {
791
858
  clear: "left"
792
859
  },
@@ -970,6 +1037,15 @@ let corePlugins = {
970
1037
  ]
971
1038
  ]
972
1039
  ]),
1040
+ size: (0, _createUtilityPlugin.default)("size", [
1041
+ [
1042
+ "size",
1043
+ [
1044
+ "width",
1045
+ "height"
1046
+ ]
1047
+ ]
1048
+ ]),
973
1049
  height: (0, _createUtilityPlugin.default)("height", [
974
1050
  [
975
1051
  "h",
@@ -1613,6 +1689,9 @@ let corePlugins = {
1613
1689
  addUtilities({
1614
1690
  ".appearance-none": {
1615
1691
  appearance: "none"
1692
+ },
1693
+ ".appearance-auto": {
1694
+ appearance: "auto"
1616
1695
  }
1617
1696
  });
1618
1697
  },
@@ -2297,6 +2376,22 @@ let corePlugins = {
2297
2376
  }
2298
2377
  });
2299
2378
  },
2379
+ textWrap: ({ addUtilities })=>{
2380
+ addUtilities({
2381
+ ".text-wrap": {
2382
+ "text-wrap": "wrap"
2383
+ },
2384
+ ".text-nowrap": {
2385
+ "text-wrap": "nowrap"
2386
+ },
2387
+ ".text-balance": {
2388
+ "text-wrap": "balance"
2389
+ },
2390
+ ".text-pretty": {
2391
+ "text-wrap": "pretty"
2392
+ }
2393
+ });
2394
+ },
2300
2395
  wordBreak: ({ addUtilities })=>{
2301
2396
  addUtilities({
2302
2397
  ".break-normal": {
@@ -4173,5 +4268,15 @@ let corePlugins = {
4173
4268
  ]
4174
4269
  ]
4175
4270
  ]
4176
- ])
4271
+ ]),
4272
+ forcedColorAdjust: ({ addUtilities })=>{
4273
+ addUtilities({
4274
+ ".forced-color-adjust-auto": {
4275
+ "forced-color-adjust": "auto"
4276
+ },
4277
+ ".forced-color-adjust-none": {
4278
+ "forced-color-adjust": "none"
4279
+ }
4280
+ });
4281
+ }
4177
4282
  };
@@ -24,16 +24,19 @@
24
24
  4. Use the user's configured `sans` font-family by default.
25
25
  5. Use the user's configured `sans` font-feature-settings by default.
26
26
  6. Use the user's configured `sans` font-variation-settings by default.
27
+ 7. Disable tap highlights on iOS
27
28
  */
28
29
 
29
- html {
30
+ html,
31
+ :host {
30
32
  line-height: 1.5; /* 1 */
31
33
  -webkit-text-size-adjust: 100%; /* 2 */
32
34
  -moz-tab-size: 4; /* 3 */
33
35
  tab-size: 4; /* 3 */
34
- font-family: theme('fontFamily.sans', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"); /* 4 */
36
+ font-family: theme('fontFamily.sans', ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"); /* 4 */
35
37
  font-feature-settings: theme('fontFamily.sans[1].fontFeatureSettings', normal); /* 5 */
36
38
  font-variation-settings: theme('fontFamily.sans[1].fontVariationSettings', normal); /* 6 */
39
+ -webkit-tap-highlight-color: transparent; /* 7 */
37
40
  }
38
41
 
39
42
  /*
@@ -162,6 +162,9 @@ function applyImportant(matches, classCandidate) {
162
162
  return matches;
163
163
  }
164
164
  let result = [];
165
+ function isInKeyframes(rule) {
166
+ return rule.parent && rule.parent.type === "atrule" && rule.parent.name === "keyframes";
167
+ }
165
168
  for (let [meta, rule] of matches){
166
169
  let container = _postcss.default.root({
167
170
  nodes: [
@@ -169,6 +172,11 @@ function applyImportant(matches, classCandidate) {
169
172
  ]
170
173
  });
171
174
  container.walkRules((r)=>{
175
+ // Declarations inside keyframes cannot be marked as important
176
+ // They will be ignored by the browser
177
+ if (isInKeyframes(r)) {
178
+ return;
179
+ }
172
180
  let ast = (0, _postcssselectorparser.default)().astSync(r.selector);
173
181
  // Remove extraneous selectors that do not include the base candidate
174
182
  ast.each((sel)=>(0, _formatVariantSelector.eliminateIrrelevantSelectors)(sel, classCandidate));
@@ -751,21 +751,40 @@ function resolvePlugins(context, root) {
751
751
  // TODO: This is a workaround for backwards compatibility, since custom variants
752
752
  // were historically sorted before screen/stackable variants.
753
753
  let beforeVariants = [
754
+ _corePlugins.variantPlugins["childVariant"],
754
755
  _corePlugins.variantPlugins["pseudoElementVariants"],
755
756
  _corePlugins.variantPlugins["pseudoClassVariants"],
757
+ _corePlugins.variantPlugins["hasVariants"],
756
758
  _corePlugins.variantPlugins["ariaVariants"],
757
759
  _corePlugins.variantPlugins["dataVariants"]
758
760
  ];
759
761
  let afterVariants = [
760
762
  _corePlugins.variantPlugins["supportsVariants"],
761
- _corePlugins.variantPlugins["directionVariants"],
762
763
  _corePlugins.variantPlugins["reducedMotionVariants"],
763
764
  _corePlugins.variantPlugins["prefersContrastVariants"],
764
- _corePlugins.variantPlugins["darkVariants"],
765
- _corePlugins.variantPlugins["printVariant"],
766
765
  _corePlugins.variantPlugins["screenVariants"],
767
- _corePlugins.variantPlugins["orientationVariants"]
766
+ _corePlugins.variantPlugins["orientationVariants"],
767
+ _corePlugins.variantPlugins["directionVariants"],
768
+ _corePlugins.variantPlugins["darkVariants"],
769
+ _corePlugins.variantPlugins["forcedColorsVariants"],
770
+ _corePlugins.variantPlugins["printVariant"]
768
771
  ];
772
+ // This is a compatibility fix for the pre 3.4 dark mode behavior
773
+ // `class` retains the old behavior, but `selector` keeps the new behavior
774
+ let isLegacyDarkMode = context.tailwindConfig.darkMode === "class" || Array.isArray(context.tailwindConfig.darkMode) && context.tailwindConfig.darkMode[0] === "class";
775
+ if (isLegacyDarkMode) {
776
+ afterVariants = [
777
+ _corePlugins.variantPlugins["supportsVariants"],
778
+ _corePlugins.variantPlugins["reducedMotionVariants"],
779
+ _corePlugins.variantPlugins["prefersContrastVariants"],
780
+ _corePlugins.variantPlugins["darkVariants"],
781
+ _corePlugins.variantPlugins["screenVariants"],
782
+ _corePlugins.variantPlugins["orientationVariants"],
783
+ _corePlugins.variantPlugins["directionVariants"],
784
+ _corePlugins.variantPlugins["forcedColorsVariants"],
785
+ _corePlugins.variantPlugins["printVariant"]
786
+ ];
787
+ }
769
788
  return [
770
789
  ...corePluginList,
771
790
  ...beforeVariants,
@@ -140,7 +140,13 @@ function normalize(value, context = null, isRoot = true) {
140
140
  "keyboard-inset-bottom",
141
141
  "keyboard-inset-left",
142
142
  "keyboard-inset-width",
143
- "keyboard-inset-height"
143
+ "keyboard-inset-height",
144
+ "radial-gradient",
145
+ "linear-gradient",
146
+ "conic-gradient",
147
+ "repeating-radial-gradient",
148
+ "repeating-linear-gradient",
149
+ "repeating-conic-gradient"
144
150
  ];
145
151
  return value.replace(/(calc|min|max|clamp)\(.+\)/g, (match)=>{
146
152
  let result = "";
@@ -186,6 +192,10 @@ function normalize(value, context = null, isRoot = true) {
186
192
  result += consumeUntil([
187
193
  ")"
188
194
  ]);
195
+ } else if (peek("[")) {
196
+ result += consumeUntil([
197
+ "]"
198
+ ]);
189
199
  } else if ([
190
200
  "+",
191
201
  "-",
@@ -114,6 +114,9 @@ let elementProperties = {
114
114
  "terminal",
115
115
  "jumpable"
116
116
  ],
117
+ ":where": [],
118
+ ":is": [],
119
+ ":has": [],
117
120
  // The default value is used when the pseudo-element is not recognized
118
121
  // Because it's not recognized, we don't know if it's terminal or not
119
122
  // So we assume it can be moved AND can have user-action pseudo classes attached to it
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tailwindcss",
3
- "version": "3.3.7",
3
+ "version": "3.4.1",
4
4
  "description": "A utility-first CSS framework for rapidly building custom user interfaces.",
5
5
  "license": "MIT",
6
6
  "main": "lib/index.js",
@@ -1 +1 @@
1
- export default ["preflight","container","accessibility","pointerEvents","visibility","position","inset","isolation","zIndex","order","gridColumn","gridColumnStart","gridColumnEnd","gridRow","gridRowStart","gridRowEnd","float","clear","margin","boxSizing","lineClamp","display","aspectRatio","height","maxHeight","minHeight","width","minWidth","maxWidth","flex","flexShrink","flexGrow","flexBasis","tableLayout","captionSide","borderCollapse","borderSpacing","transformOrigin","translate","rotate","skew","scale","transform","animation","cursor","touchAction","userSelect","resize","scrollSnapType","scrollSnapAlign","scrollSnapStop","scrollMargin","scrollPadding","listStylePosition","listStyleType","listStyleImage","appearance","columns","breakBefore","breakInside","breakAfter","gridAutoColumns","gridAutoFlow","gridAutoRows","gridTemplateColumns","gridTemplateRows","flexDirection","flexWrap","placeContent","placeItems","alignContent","alignItems","justifyContent","justifyItems","gap","space","divideWidth","divideStyle","divideColor","divideOpacity","placeSelf","alignSelf","justifySelf","overflow","overscrollBehavior","scrollBehavior","textOverflow","hyphens","whitespace","wordBreak","borderRadius","borderWidth","borderStyle","borderColor","borderOpacity","backgroundColor","backgroundOpacity","backgroundImage","gradientColorStops","boxDecorationBreak","backgroundSize","backgroundAttachment","backgroundClip","backgroundPosition","backgroundRepeat","backgroundOrigin","fill","stroke","strokeWidth","objectFit","objectPosition","padding","textAlign","textIndent","verticalAlign","fontFamily","fontSize","fontWeight","textTransform","fontStyle","fontVariantNumeric","lineHeight","letterSpacing","textColor","textOpacity","textDecoration","textDecorationColor","textDecorationStyle","textDecorationThickness","textUnderlineOffset","fontSmoothing","placeholderColor","placeholderOpacity","caretColor","accentColor","opacity","backgroundBlendMode","mixBlendMode","boxShadow","boxShadowColor","outlineStyle","outlineWidth","outlineOffset","outlineColor","ringWidth","ringColor","ringOpacity","ringOffsetWidth","ringOffsetColor","blur","brightness","contrast","dropShadow","grayscale","hueRotate","invert","saturate","sepia","filter","backdropBlur","backdropBrightness","backdropContrast","backdropGrayscale","backdropHueRotate","backdropInvert","backdropOpacity","backdropSaturate","backdropSepia","backdropFilter","transitionProperty","transitionDelay","transitionDuration","transitionTimingFunction","willChange","content"]
1
+ export default ["preflight","container","accessibility","pointerEvents","visibility","position","inset","isolation","zIndex","order","gridColumn","gridColumnStart","gridColumnEnd","gridRow","gridRowStart","gridRowEnd","float","clear","margin","boxSizing","lineClamp","display","aspectRatio","size","height","maxHeight","minHeight","width","minWidth","maxWidth","flex","flexShrink","flexGrow","flexBasis","tableLayout","captionSide","borderCollapse","borderSpacing","transformOrigin","translate","rotate","skew","scale","transform","animation","cursor","touchAction","userSelect","resize","scrollSnapType","scrollSnapAlign","scrollSnapStop","scrollMargin","scrollPadding","listStylePosition","listStyleType","listStyleImage","appearance","columns","breakBefore","breakInside","breakAfter","gridAutoColumns","gridAutoFlow","gridAutoRows","gridTemplateColumns","gridTemplateRows","flexDirection","flexWrap","placeContent","placeItems","alignContent","alignItems","justifyContent","justifyItems","gap","space","divideWidth","divideStyle","divideColor","divideOpacity","placeSelf","alignSelf","justifySelf","overflow","overscrollBehavior","scrollBehavior","textOverflow","hyphens","whitespace","textWrap","wordBreak","borderRadius","borderWidth","borderStyle","borderColor","borderOpacity","backgroundColor","backgroundOpacity","backgroundImage","gradientColorStops","boxDecorationBreak","backgroundSize","backgroundAttachment","backgroundClip","backgroundPosition","backgroundRepeat","backgroundOrigin","fill","stroke","strokeWidth","objectFit","objectPosition","padding","textAlign","textIndent","verticalAlign","fontFamily","fontSize","fontWeight","textTransform","fontStyle","fontVariantNumeric","lineHeight","letterSpacing","textColor","textOpacity","textDecoration","textDecorationColor","textDecorationStyle","textDecorationThickness","textUnderlineOffset","fontSmoothing","placeholderColor","placeholderOpacity","caretColor","accentColor","opacity","backgroundBlendMode","mixBlendMode","boxShadow","boxShadowColor","outlineStyle","outlineWidth","outlineOffset","outlineColor","ringWidth","ringColor","ringOpacity","ringOffsetWidth","ringOffsetColor","blur","brightness","contrast","dropShadow","grayscale","hueRotate","invert","saturate","sepia","filter","backdropBlur","backdropBrightness","backdropContrast","backdropGrayscale","backdropHueRotate","backdropInvert","backdropOpacity","backdropSaturate","backdropSepia","backdropFilter","transitionProperty","transitionDelay","transitionDuration","transitionTimingFunction","willChange","content","forcedColorAdjust"]
@@ -25,6 +25,9 @@ import { normalize } from './util/dataTypes'
25
25
  import { INTERNAL_FEATURES } from './lib/setupContextUtils'
26
26
 
27
27
  export let variantPlugins = {
28
+ childVariant: ({ addVariant }) => {
29
+ addVariant('*', '& > *')
30
+ },
28
31
  pseudoElementVariants: ({ addVariant }) => {
29
32
  addVariant('first-letter', '&::first-letter')
30
33
  addVariant('first-line', '&::first-line')
@@ -204,8 +207,8 @@ export let variantPlugins = {
204
207
  },
205
208
 
206
209
  directionVariants: ({ addVariant }) => {
207
- addVariant('ltr', ':is([dir="ltr"] &)')
208
- addVariant('rtl', ':is([dir="rtl"] &)')
210
+ addVariant('ltr', '&:where([dir="ltr"], [dir="ltr"] *)')
211
+ addVariant('rtl', '&:where([dir="rtl"], [dir="rtl"] *)')
209
212
  },
210
213
 
211
214
  reducedMotionVariants: ({ addVariant }) => {
@@ -214,7 +217,7 @@ export let variantPlugins = {
214
217
  },
215
218
 
216
219
  darkVariants: ({ config, addVariant }) => {
217
- let [mode, className = '.dark'] = [].concat(config('darkMode', 'media'))
220
+ let [mode, selector = '.dark'] = [].concat(config('darkMode', 'media'))
218
221
 
219
222
  if (mode === false) {
220
223
  mode = 'media'
@@ -225,10 +228,49 @@ export let variantPlugins = {
225
228
  ])
226
229
  }
227
230
 
228
- if (mode === 'class') {
229
- addVariant('dark', `:is(${className} &)`)
231
+ if (mode === 'variant') {
232
+ let formats
233
+ if (Array.isArray(selector)) {
234
+ formats = selector
235
+ } else if (typeof selector === 'function') {
236
+ formats = selector
237
+ } else if (typeof selector === 'string') {
238
+ formats = [selector]
239
+ }
240
+
241
+ // TODO: We could also add these warnings if the user passes a function that returns string | string[]
242
+ // But this is an advanced enough use case that it's probably not necessary
243
+ if (Array.isArray(formats)) {
244
+ for (let format of formats) {
245
+ if (format === '.dark') {
246
+ mode = false
247
+ log.warn('darkmode-variant-without-selector', [
248
+ 'When using `variant` for `darkMode`, you must provide a selector.',
249
+ 'Example: `darkMode: ["variant", ".your-selector &"]`',
250
+ ])
251
+ } else if (!format.includes('&')) {
252
+ mode = false
253
+ log.warn('darkmode-variant-without-ampersand', [
254
+ 'When using `variant` for `darkMode`, your selector must contain `&`.',
255
+ 'Example `darkMode: ["variant", ".your-selector &"]`',
256
+ ])
257
+ }
258
+ }
259
+ }
260
+
261
+ selector = formats
262
+ }
263
+
264
+ if (mode === 'selector') {
265
+ // New preferred behavior
266
+ addVariant('dark', `&:where(${selector}, ${selector} *)`)
230
267
  } else if (mode === 'media') {
231
268
  addVariant('dark', '@media (prefers-color-scheme: dark)')
269
+ } else if (mode === 'variant') {
270
+ addVariant('dark', selector)
271
+ } else if (mode === 'class') {
272
+ // Old behavior
273
+ addVariant('dark', `:is(${selector} &)`)
232
274
  }
233
275
  },
234
276
 
@@ -392,6 +434,26 @@ export let variantPlugins = {
392
434
  )
393
435
  },
394
436
 
437
+ hasVariants: ({ matchVariant }) => {
438
+ matchVariant('has', (value) => `&:has(${normalize(value)})`, { values: {} })
439
+ matchVariant(
440
+ 'group-has',
441
+ (value, { modifier }) =>
442
+ modifier
443
+ ? `:merge(.group\\/${modifier}):has(${normalize(value)}) &`
444
+ : `:merge(.group):has(${normalize(value)}) &`,
445
+ { values: {} }
446
+ )
447
+ matchVariant(
448
+ 'peer-has',
449
+ (value, { modifier }) =>
450
+ modifier
451
+ ? `:merge(.peer\\/${modifier}):has(${normalize(value)}) ~ &`
452
+ : `:merge(.peer):has(${normalize(value)}) ~ &`,
453
+ { values: {} }
454
+ )
455
+ },
456
+
395
457
  ariaVariants: ({ matchVariant, theme }) => {
396
458
  matchVariant('aria', (value) => `&[aria-${normalize(value)}]`, { values: theme('aria') ?? {} })
397
459
  matchVariant(
@@ -441,6 +503,10 @@ export let variantPlugins = {
441
503
  addVariant('contrast-more', '@media (prefers-contrast: more)')
442
504
  addVariant('contrast-less', '@media (prefers-contrast: less)')
443
505
  },
506
+
507
+ forcedColorsVariants: ({ addVariant }) => {
508
+ addVariant('forced-colors', '@media (forced-colors: active)')
509
+ },
444
510
  }
445
511
 
446
512
  let cssTransformValue = [
@@ -666,6 +732,8 @@ export let corePlugins = {
666
732
 
667
733
  float: ({ addUtilities }) => {
668
734
  addUtilities({
735
+ '.float-start': { float: 'inline-start' },
736
+ '.float-end': { float: 'inline-end' },
669
737
  '.float-right': { float: 'right' },
670
738
  '.float-left': { float: 'left' },
671
739
  '.float-none': { float: 'none' },
@@ -674,6 +742,8 @@ export let corePlugins = {
674
742
 
675
743
  clear: ({ addUtilities }) => {
676
744
  addUtilities({
745
+ '.clear-start': { clear: 'inline-start' },
746
+ '.clear-end': { clear: 'inline-end' },
677
747
  '.clear-left': { clear: 'left' },
678
748
  '.clear-right': { clear: 'right' },
679
749
  '.clear-both': { clear: 'both' },
@@ -759,6 +829,8 @@ export let corePlugins = {
759
829
 
760
830
  aspectRatio: createUtilityPlugin('aspectRatio', [['aspect', ['aspect-ratio']]]),
761
831
 
832
+ size: createUtilityPlugin('size', [['size', ['width', 'height']]]),
833
+
762
834
  height: createUtilityPlugin('height', [['h', ['height']]]),
763
835
  maxHeight: createUtilityPlugin('maxHeight', [['max-h', ['maxHeight']]]),
764
836
  minHeight: createUtilityPlugin('minHeight', [['min-h', ['minHeight']]]),
@@ -1109,6 +1181,7 @@ export let corePlugins = {
1109
1181
  appearance: ({ addUtilities }) => {
1110
1182
  addUtilities({
1111
1183
  '.appearance-none': { appearance: 'none' },
1184
+ '.appearance-auto': { appearance: 'auto' },
1112
1185
  })
1113
1186
  },
1114
1187
 
@@ -1509,6 +1582,15 @@ export let corePlugins = {
1509
1582
  })
1510
1583
  },
1511
1584
 
1585
+ textWrap: ({ addUtilities }) => {
1586
+ addUtilities({
1587
+ '.text-wrap': { 'text-wrap': 'wrap' },
1588
+ '.text-nowrap': { 'text-wrap': 'nowrap' },
1589
+ '.text-balance': { 'text-wrap': 'balance' },
1590
+ '.text-pretty': { 'text-wrap': 'pretty' },
1591
+ })
1592
+ },
1593
+
1512
1594
  wordBreak: ({ addUtilities }) => {
1513
1595
  addUtilities({
1514
1596
  '.break-normal': { 'overflow-wrap': 'normal', 'word-break': 'normal' },
@@ -2852,4 +2934,10 @@ export let corePlugins = {
2852
2934
  content: createUtilityPlugin('content', [
2853
2935
  ['content', ['--tw-content', ['content', 'var(--tw-content)']]],
2854
2936
  ]),
2937
+ forcedColorAdjust: ({ addUtilities }) => {
2938
+ addUtilities({
2939
+ '.forced-color-adjust-auto': { 'forced-color-adjust': 'auto' },
2940
+ '.forced-color-adjust-none': { 'forced-color-adjust': 'none' },
2941
+ })
2942
+ },
2855
2943
  }
@@ -24,16 +24,19 @@
24
24
  4. Use the user's configured `sans` font-family by default.
25
25
  5. Use the user's configured `sans` font-feature-settings by default.
26
26
  6. Use the user's configured `sans` font-variation-settings by default.
27
+ 7. Disable tap highlights on iOS
27
28
  */
28
29
 
29
- html {
30
+ html,
31
+ :host {
30
32
  line-height: 1.5; /* 1 */
31
33
  -webkit-text-size-adjust: 100%; /* 2 */
32
34
  -moz-tab-size: 4; /* 3 */
33
35
  tab-size: 4; /* 3 */
34
- font-family: theme('fontFamily.sans', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"); /* 4 */
36
+ font-family: theme('fontFamily.sans', ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"); /* 4 */
35
37
  font-feature-settings: theme('fontFamily.sans[1].fontFeatureSettings', normal); /* 5 */
36
38
  font-variation-settings: theme('fontFamily.sans[1].fontVariationSettings', normal); /* 6 */
39
+ -webkit-tap-highlight-color: transparent; /* 7 */
37
40
  }
38
41
 
39
42
  /*
@@ -119,10 +119,20 @@ function applyImportant(matches, classCandidate) {
119
119
 
120
120
  let result = []
121
121
 
122
+ function isInKeyframes(rule) {
123
+ return rule.parent && rule.parent.type === 'atrule' && rule.parent.name === 'keyframes'
124
+ }
125
+
122
126
  for (let [meta, rule] of matches) {
123
127
  let container = postcss.root({ nodes: [rule.clone()] })
124
128
 
125
129
  container.walkRules((r) => {
130
+ // Declarations inside keyframes cannot be marked as important
131
+ // They will be ignored by the browser
132
+ if (isInKeyframes(r)) {
133
+ return
134
+ }
135
+
126
136
  let ast = selectorParser().astSync(r.selector)
127
137
 
128
138
  // Remove extraneous selectors that do not include the base candidate
@@ -756,22 +756,46 @@ function resolvePlugins(context, root) {
756
756
  // TODO: This is a workaround for backwards compatibility, since custom variants
757
757
  // were historically sorted before screen/stackable variants.
758
758
  let beforeVariants = [
759
+ variantPlugins['childVariant'],
759
760
  variantPlugins['pseudoElementVariants'],
760
761
  variantPlugins['pseudoClassVariants'],
762
+ variantPlugins['hasVariants'],
761
763
  variantPlugins['ariaVariants'],
762
764
  variantPlugins['dataVariants'],
763
765
  ]
764
766
  let afterVariants = [
765
767
  variantPlugins['supportsVariants'],
766
- variantPlugins['directionVariants'],
767
768
  variantPlugins['reducedMotionVariants'],
768
769
  variantPlugins['prefersContrastVariants'],
769
- variantPlugins['darkVariants'],
770
- variantPlugins['printVariant'],
771
770
  variantPlugins['screenVariants'],
772
771
  variantPlugins['orientationVariants'],
772
+ variantPlugins['directionVariants'],
773
+ variantPlugins['darkVariants'],
774
+ variantPlugins['forcedColorsVariants'],
775
+ variantPlugins['printVariant'],
773
776
  ]
774
777
 
778
+ // This is a compatibility fix for the pre 3.4 dark mode behavior
779
+ // `class` retains the old behavior, but `selector` keeps the new behavior
780
+ let isLegacyDarkMode =
781
+ context.tailwindConfig.darkMode === 'class' ||
782
+ (Array.isArray(context.tailwindConfig.darkMode) &&
783
+ context.tailwindConfig.darkMode[0] === 'class')
784
+
785
+ if (isLegacyDarkMode) {
786
+ afterVariants = [
787
+ variantPlugins['supportsVariants'],
788
+ variantPlugins['reducedMotionVariants'],
789
+ variantPlugins['prefersContrastVariants'],
790
+ variantPlugins['darkVariants'],
791
+ variantPlugins['screenVariants'],
792
+ variantPlugins['orientationVariants'],
793
+ variantPlugins['directionVariants'],
794
+ variantPlugins['forcedColorsVariants'],
795
+ variantPlugins['printVariant'],
796
+ ]
797
+ }
798
+
775
799
  return [...corePluginList, ...beforeVariants, ...userPlugins, ...afterVariants, ...layerPlugins]
776
800
  }
777
801
 
@@ -106,6 +106,13 @@ function normalizeMathOperatorSpacing(value) {
106
106
  'keyboard-inset-left',
107
107
  'keyboard-inset-width',
108
108
  'keyboard-inset-height',
109
+
110
+ 'radial-gradient',
111
+ 'linear-gradient',
112
+ 'conic-gradient',
113
+ 'repeating-radial-gradient',
114
+ 'repeating-linear-gradient',
115
+ 'repeating-conic-gradient',
109
116
  ]
110
117
 
111
118
  return value.replace(/(calc|min|max|clamp)\(.+\)/g, (match) => {
@@ -161,6 +168,11 @@ function normalizeMathOperatorSpacing(value) {
161
168
  result += consumeUntil([')'])
162
169
  }
163
170
 
171
+ // Don't break CSS grid track names
172
+ else if (peek('[')) {
173
+ result += consumeUntil([']'])
174
+ }
175
+
164
176
  // Handle operators
165
177
  else if (
166
178
  ['+', '-', '*', '/'].includes(char) &&
@@ -60,6 +60,10 @@ let elementProperties = {
60
60
  ':first-letter': ['terminal', 'jumpable'],
61
61
  ':first-line': ['terminal', 'jumpable'],
62
62
 
63
+ ':where': [],
64
+ ':is': [],
65
+ ':has': [],
66
+
63
67
  // The default value is used when the pseudo-element is not recognized
64
68
  // Because it's not recognized, we don't know if it's terminal or not
65
69
  // So we assume it can be moved AND can have user-action pseudo classes attached to it
@@ -303,13 +303,6 @@ module.exports = {
303
303
  sans: [
304
304
  'ui-sans-serif',
305
305
  'system-ui',
306
- '-apple-system',
307
- 'BlinkMacSystemFont',
308
- '"Segoe UI"',
309
- 'Roboto',
310
- '"Helvetica Neue"',
311
- 'Arial',
312
- '"Noto Sans"',
313
306
  'sans-serif',
314
307
  '"Apple Color Emoji"',
315
308
  '"Segoe UI Emoji"',
@@ -451,6 +444,12 @@ module.exports = {
451
444
  'span-4': 'span 4 / span 4',
452
445
  'span-5': 'span 5 / span 5',
453
446
  'span-6': 'span 6 / span 6',
447
+ 'span-7': 'span 7 / span 7',
448
+ 'span-8': 'span 8 / span 8',
449
+ 'span-9': 'span 9 / span 9',
450
+ 'span-10': 'span 10 / span 10',
451
+ 'span-11': 'span 11 / span 11',
452
+ 'span-12': 'span 12 / span 12',
454
453
  'span-full': '1 / -1',
455
454
  },
456
455
  gridRowEnd: {
@@ -462,6 +461,12 @@ module.exports = {
462
461
  5: '5',
463
462
  6: '6',
464
463
  7: '7',
464
+ 8: '8',
465
+ 9: '9',
466
+ 10: '10',
467
+ 11: '11',
468
+ 12: '12',
469
+ 13: '13',
465
470
  },
466
471
  gridRowStart: {
467
472
  auto: 'auto',
@@ -472,9 +477,16 @@ module.exports = {
472
477
  5: '5',
473
478
  6: '6',
474
479
  7: '7',
480
+ 8: '8',
481
+ 9: '9',
482
+ 10: '10',
483
+ 11: '11',
484
+ 12: '12',
485
+ 13: '13',
475
486
  },
476
487
  gridTemplateColumns: {
477
488
  none: 'none',
489
+ subgrid: 'subgrid',
478
490
  1: 'repeat(1, minmax(0, 1fr))',
479
491
  2: 'repeat(2, minmax(0, 1fr))',
480
492
  3: 'repeat(3, minmax(0, 1fr))',
@@ -490,12 +502,19 @@ module.exports = {
490
502
  },
491
503
  gridTemplateRows: {
492
504
  none: 'none',
505
+ subgrid: 'subgrid',
493
506
  1: 'repeat(1, minmax(0, 1fr))',
494
507
  2: 'repeat(2, minmax(0, 1fr))',
495
508
  3: 'repeat(3, minmax(0, 1fr))',
496
509
  4: 'repeat(4, minmax(0, 1fr))',
497
510
  5: 'repeat(5, minmax(0, 1fr))',
498
511
  6: 'repeat(6, minmax(0, 1fr))',
512
+ 7: 'repeat(7, minmax(0, 1fr))',
513
+ 8: 'repeat(8, minmax(0, 1fr))',
514
+ 9: 'repeat(9, minmax(0, 1fr))',
515
+ 10: 'repeat(10, minmax(0, 1fr))',
516
+ 11: 'repeat(11, minmax(0, 1fr))',
517
+ 12: 'repeat(12, minmax(0, 1fr))',
499
518
  },
500
519
  height: ({ theme }) => ({
501
520
  auto: 'auto',
@@ -517,6 +536,9 @@ module.exports = {
517
536
  '5/6': '83.333333%',
518
537
  full: '100%',
519
538
  screen: '100vh',
539
+ svh: '100svh',
540
+ lvh: '100lvh',
541
+ dvh: '100dvh',
520
542
  min: 'min-content',
521
543
  max: 'max-content',
522
544
  fit: 'fit-content',
@@ -621,13 +643,16 @@ module.exports = {
621
643
  none: 'none',
622
644
  full: '100%',
623
645
  screen: '100vh',
646
+ svh: '100svh',
647
+ lvh: '100lvh',
648
+ dvh: '100dvh',
624
649
  min: 'min-content',
625
650
  max: 'max-content',
626
651
  fit: 'fit-content',
627
652
  }),
628
653
  maxWidth: ({ theme, breakpoints }) => ({
654
+ ...theme('spacing'),
629
655
  none: 'none',
630
- 0: '0rem',
631
656
  xs: '20rem',
632
657
  sm: '24rem',
633
658
  md: '28rem',
@@ -646,21 +671,24 @@ module.exports = {
646
671
  prose: '65ch',
647
672
  ...breakpoints(theme('screens')),
648
673
  }),
649
- minHeight: {
650
- 0: '0px',
674
+ minHeight: ({ theme }) => ({
675
+ ...theme('spacing'),
651
676
  full: '100%',
652
677
  screen: '100vh',
678
+ svh: '100svh',
679
+ lvh: '100lvh',
680
+ dvh: '100dvh',
653
681
  min: 'min-content',
654
682
  max: 'max-content',
655
683
  fit: 'fit-content',
656
- },
657
- minWidth: {
658
- 0: '0px',
684
+ }),
685
+ minWidth: ({ theme }) => ({
686
+ ...theme('spacing'),
659
687
  full: '100%',
660
688
  min: 'min-content',
661
689
  max: 'max-content',
662
690
  fit: 'fit-content',
663
- },
691
+ }),
664
692
  objectPosition: {
665
693
  bottom: 'bottom',
666
694
  center: 'center',
@@ -676,15 +704,21 @@ module.exports = {
676
704
  0: '0',
677
705
  5: '0.05',
678
706
  10: '0.1',
707
+ 15: '0.15',
679
708
  20: '0.2',
680
709
  25: '0.25',
681
710
  30: '0.3',
711
+ 35: '0.35',
682
712
  40: '0.4',
713
+ 45: '0.45',
683
714
  50: '0.5',
715
+ 55: '0.55',
684
716
  60: '0.6',
717
+ 65: '0.65',
685
718
  70: '0.7',
686
719
  75: '0.75',
687
720
  80: '0.8',
721
+ 85: '0.85',
688
722
  90: '0.9',
689
723
  95: '0.95',
690
724
  100: '1',
@@ -936,6 +970,40 @@ module.exports = {
936
970
  '3/4': '75%',
937
971
  full: '100%',
938
972
  }),
973
+ size: ({ theme }) => ({
974
+ auto: 'auto',
975
+ ...theme('spacing'),
976
+ '1/2': '50%',
977
+ '1/3': '33.333333%',
978
+ '2/3': '66.666667%',
979
+ '1/4': '25%',
980
+ '2/4': '50%',
981
+ '3/4': '75%',
982
+ '1/5': '20%',
983
+ '2/5': '40%',
984
+ '3/5': '60%',
985
+ '4/5': '80%',
986
+ '1/6': '16.666667%',
987
+ '2/6': '33.333333%',
988
+ '3/6': '50%',
989
+ '4/6': '66.666667%',
990
+ '5/6': '83.333333%',
991
+ '1/12': '8.333333%',
992
+ '2/12': '16.666667%',
993
+ '3/12': '25%',
994
+ '4/12': '33.333333%',
995
+ '5/12': '41.666667%',
996
+ '6/12': '50%',
997
+ '7/12': '58.333333%',
998
+ '8/12': '66.666667%',
999
+ '9/12': '75%',
1000
+ '10/12': '83.333333%',
1001
+ '11/12': '91.666667%',
1002
+ full: '100%',
1003
+ min: 'min-content',
1004
+ max: 'max-content',
1005
+ fit: 'fit-content',
1006
+ }),
939
1007
  width: ({ theme }) => ({
940
1008
  auto: 'auto',
941
1009
  ...theme('spacing'),
@@ -967,6 +1035,9 @@ module.exports = {
967
1035
  '11/12': '91.666667%',
968
1036
  full: '100%',
969
1037
  screen: '100vw',
1038
+ svw: '100svw',
1039
+ lvw: '100lvw',
1040
+ dvw: '100dvw',
970
1041
  min: 'min-content',
971
1042
  max: 'max-content',
972
1043
  fit: 'fit-content',
package/types/config.d.ts CHANGED
@@ -74,6 +74,13 @@ type DarkModeConfig =
74
74
  | 'class'
75
75
  // Use the `class` strategy with a custom class instead of `.dark`.
76
76
  | ['class', string]
77
+ // Use the `selector` strategy — same as `class` but uses `:where()` for more predicable behavior
78
+ | 'selector'
79
+ // Use the `selector` strategy with a custom selector instead of `.dark`.
80
+ | ['selector', string]
81
+ // Use the `variant` strategy, which allows you to completely customize the selector
82
+ // It takes a string or an array of strings, which are passed directly to `addVariant()`
83
+ | ['variant', string | string[]]
77
84
 
78
85
  type Screen = { raw: string } | { min: string } | { max: string } | { min: string; max: string }
79
86
  type ScreensConfig = string[] | KeyValuePair<string, string | Screen | Screen[]>
@@ -1 +1 @@
1
- export type CorePluginList = 'preflight' | 'container' | 'accessibility' | 'pointerEvents' | 'visibility' | 'position' | 'inset' | 'isolation' | 'zIndex' | 'order' | 'gridColumn' | 'gridColumnStart' | 'gridColumnEnd' | 'gridRow' | 'gridRowStart' | 'gridRowEnd' | 'float' | 'clear' | 'margin' | 'boxSizing' | 'lineClamp' | 'display' | 'aspectRatio' | 'height' | 'maxHeight' | 'minHeight' | 'width' | 'minWidth' | 'maxWidth' | 'flex' | 'flexShrink' | 'flexGrow' | 'flexBasis' | 'tableLayout' | 'captionSide' | 'borderCollapse' | 'borderSpacing' | 'transformOrigin' | 'translate' | 'rotate' | 'skew' | 'scale' | 'transform' | 'animation' | 'cursor' | 'touchAction' | 'userSelect' | 'resize' | 'scrollSnapType' | 'scrollSnapAlign' | 'scrollSnapStop' | 'scrollMargin' | 'scrollPadding' | 'listStylePosition' | 'listStyleType' | 'listStyleImage' | 'appearance' | 'columns' | 'breakBefore' | 'breakInside' | 'breakAfter' | 'gridAutoColumns' | 'gridAutoFlow' | 'gridAutoRows' | 'gridTemplateColumns' | 'gridTemplateRows' | 'flexDirection' | 'flexWrap' | 'placeContent' | 'placeItems' | 'alignContent' | 'alignItems' | 'justifyContent' | 'justifyItems' | 'gap' | 'space' | 'divideWidth' | 'divideStyle' | 'divideColor' | 'divideOpacity' | 'placeSelf' | 'alignSelf' | 'justifySelf' | 'overflow' | 'overscrollBehavior' | 'scrollBehavior' | 'textOverflow' | 'hyphens' | 'whitespace' | 'wordBreak' | 'borderRadius' | 'borderWidth' | 'borderStyle' | 'borderColor' | 'borderOpacity' | 'backgroundColor' | 'backgroundOpacity' | 'backgroundImage' | 'gradientColorStops' | 'boxDecorationBreak' | 'backgroundSize' | 'backgroundAttachment' | 'backgroundClip' | 'backgroundPosition' | 'backgroundRepeat' | 'backgroundOrigin' | 'fill' | 'stroke' | 'strokeWidth' | 'objectFit' | 'objectPosition' | 'padding' | 'textAlign' | 'textIndent' | 'verticalAlign' | 'fontFamily' | 'fontSize' | 'fontWeight' | 'textTransform' | 'fontStyle' | 'fontVariantNumeric' | 'lineHeight' | 'letterSpacing' | 'textColor' | 'textOpacity' | 'textDecoration' | 'textDecorationColor' | 'textDecorationStyle' | 'textDecorationThickness' | 'textUnderlineOffset' | 'fontSmoothing' | 'placeholderColor' | 'placeholderOpacity' | 'caretColor' | 'accentColor' | 'opacity' | 'backgroundBlendMode' | 'mixBlendMode' | 'boxShadow' | 'boxShadowColor' | 'outlineStyle' | 'outlineWidth' | 'outlineOffset' | 'outlineColor' | 'ringWidth' | 'ringColor' | 'ringOpacity' | 'ringOffsetWidth' | 'ringOffsetColor' | 'blur' | 'brightness' | 'contrast' | 'dropShadow' | 'grayscale' | 'hueRotate' | 'invert' | 'saturate' | 'sepia' | 'filter' | 'backdropBlur' | 'backdropBrightness' | 'backdropContrast' | 'backdropGrayscale' | 'backdropHueRotate' | 'backdropInvert' | 'backdropOpacity' | 'backdropSaturate' | 'backdropSepia' | 'backdropFilter' | 'transitionProperty' | 'transitionDelay' | 'transitionDuration' | 'transitionTimingFunction' | 'willChange' | 'content'
1
+ export type CorePluginList = 'preflight' | 'container' | 'accessibility' | 'pointerEvents' | 'visibility' | 'position' | 'inset' | 'isolation' | 'zIndex' | 'order' | 'gridColumn' | 'gridColumnStart' | 'gridColumnEnd' | 'gridRow' | 'gridRowStart' | 'gridRowEnd' | 'float' | 'clear' | 'margin' | 'boxSizing' | 'lineClamp' | 'display' | 'aspectRatio' | 'size' | 'height' | 'maxHeight' | 'minHeight' | 'width' | 'minWidth' | 'maxWidth' | 'flex' | 'flexShrink' | 'flexGrow' | 'flexBasis' | 'tableLayout' | 'captionSide' | 'borderCollapse' | 'borderSpacing' | 'transformOrigin' | 'translate' | 'rotate' | 'skew' | 'scale' | 'transform' | 'animation' | 'cursor' | 'touchAction' | 'userSelect' | 'resize' | 'scrollSnapType' | 'scrollSnapAlign' | 'scrollSnapStop' | 'scrollMargin' | 'scrollPadding' | 'listStylePosition' | 'listStyleType' | 'listStyleImage' | 'appearance' | 'columns' | 'breakBefore' | 'breakInside' | 'breakAfter' | 'gridAutoColumns' | 'gridAutoFlow' | 'gridAutoRows' | 'gridTemplateColumns' | 'gridTemplateRows' | 'flexDirection' | 'flexWrap' | 'placeContent' | 'placeItems' | 'alignContent' | 'alignItems' | 'justifyContent' | 'justifyItems' | 'gap' | 'space' | 'divideWidth' | 'divideStyle' | 'divideColor' | 'divideOpacity' | 'placeSelf' | 'alignSelf' | 'justifySelf' | 'overflow' | 'overscrollBehavior' | 'scrollBehavior' | 'textOverflow' | 'hyphens' | 'whitespace' | 'textWrap' | 'wordBreak' | 'borderRadius' | 'borderWidth' | 'borderStyle' | 'borderColor' | 'borderOpacity' | 'backgroundColor' | 'backgroundOpacity' | 'backgroundImage' | 'gradientColorStops' | 'boxDecorationBreak' | 'backgroundSize' | 'backgroundAttachment' | 'backgroundClip' | 'backgroundPosition' | 'backgroundRepeat' | 'backgroundOrigin' | 'fill' | 'stroke' | 'strokeWidth' | 'objectFit' | 'objectPosition' | 'padding' | 'textAlign' | 'textIndent' | 'verticalAlign' | 'fontFamily' | 'fontSize' | 'fontWeight' | 'textTransform' | 'fontStyle' | 'fontVariantNumeric' | 'lineHeight' | 'letterSpacing' | 'textColor' | 'textOpacity' | 'textDecoration' | 'textDecorationColor' | 'textDecorationStyle' | 'textDecorationThickness' | 'textUnderlineOffset' | 'fontSmoothing' | 'placeholderColor' | 'placeholderOpacity' | 'caretColor' | 'accentColor' | 'opacity' | 'backgroundBlendMode' | 'mixBlendMode' | 'boxShadow' | 'boxShadowColor' | 'outlineStyle' | 'outlineWidth' | 'outlineOffset' | 'outlineColor' | 'ringWidth' | 'ringColor' | 'ringOpacity' | 'ringOffsetWidth' | 'ringOffsetColor' | 'blur' | 'brightness' | 'contrast' | 'dropShadow' | 'grayscale' | 'hueRotate' | 'invert' | 'saturate' | 'sepia' | 'filter' | 'backdropBlur' | 'backdropBrightness' | 'backdropContrast' | 'backdropGrayscale' | 'backdropHueRotate' | 'backdropInvert' | 'backdropOpacity' | 'backdropSaturate' | 'backdropSepia' | 'backdropFilter' | 'transitionProperty' | 'transitionDelay' | 'transitionDuration' | 'transitionTimingFunction' | 'willChange' | 'content' | 'forcedColorAdjust'
@@ -206,16 +206,38 @@ export type DefaultTheme = {
206
206
  string
207
207
  >
208
208
  gridRow: Record<
209
- 'auto' | 'span-1' | 'span-2' | 'span-3' | 'span-4' | 'span-5' | 'span-6' | 'span-full',
209
+ | 'auto'
210
+ | 'span-1'
211
+ | 'span-2'
212
+ | 'span-3'
213
+ | 'span-4'
214
+ | 'span-5'
215
+ | 'span-6'
216
+ | 'span-7'
217
+ | 'span-8'
218
+ | 'span-9'
219
+ | 'span-10'
220
+ | 'span-11'
221
+ | 'span-12'
222
+ | 'span-full',
223
+ string
224
+ >
225
+ gridRowEnd: Record<
226
+ '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '10' | '11' | '12' | '13' | 'auto',
227
+ string
228
+ >
229
+ gridRowStart: Record<
230
+ '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '10' | '11' | '12' | '13' | 'auto',
210
231
  string
211
232
  >
212
- gridRowEnd: Record<'1' | '2' | '3' | '4' | '5' | '6' | '7' | 'auto', string>
213
- gridRowStart: Record<'1' | '2' | '3' | '4' | '5' | '6' | '7' | 'auto', string>
214
233
  gridTemplateColumns: Record<
215
- '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '10' | '11' | '12' | 'none',
234
+ '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '10' | '11' | '12' | 'none' | 'subgrid',
235
+ string
236
+ >
237
+ gridTemplateRows: Record<
238
+ '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '10' | '11' | '12' | 'none' | 'subgrid',
216
239
  string
217
240
  >
218
- gridTemplateRows: Record<'1' | '2' | '3' | '4' | '5' | '6' | 'none', string>
219
241
  hueRotate: Record<'0' | '15' | '30' | '60' | '90' | '180', string>
220
242
  invert: Record<'0' | 'DEFAULT', string>
221
243
  keyframes: Record<'spin' | 'ping' | 'pulse' | 'bounce', Record<string, CSSDeclarationList>>
@@ -240,8 +262,6 @@ export type DefaultTheme = {
240
262
  listStyleType: Record<'none' | 'disc' | 'decimal', string>
241
263
  listStyleImage: Record<'none', string>
242
264
  lineClamp: Record<'1' | '2' | '3' | '4' | '5' | '6', string>
243
- minHeight: Record<'0' | 'full' | 'screen' | 'min' | 'max' | 'fit', string>
244
- minWidth: Record<'0' | 'full' | 'min' | 'max' | 'fit', string>
245
265
  objectPosition: Record<
246
266
  | 'bottom'
247
267
  | 'center'
@@ -258,15 +278,21 @@ export type DefaultTheme = {
258
278
  | '0'
259
279
  | '5'
260
280
  | '10'
281
+ | '15'
261
282
  | '20'
262
283
  | '25'
263
284
  | '30'
285
+ | '35'
264
286
  | '40'
287
+ | '45'
265
288
  | '50'
289
+ | '55'
266
290
  | '60'
291
+ | '65'
267
292
  | '70'
268
293
  | '75'
269
294
  | '80'
295
+ | '85'
270
296
  | '90'
271
297
  | '95'
272
298
  | '100',