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 +44 -1
- package/lib/corePluginList.js +4 -1
- package/lib/corePlugins.js +111 -6
- package/lib/css/preflight.css +5 -2
- package/lib/lib/generateRules.js +8 -0
- package/lib/lib/setupContextUtils.js +23 -4
- package/lib/util/dataTypes.js +11 -1
- package/lib/util/pseudoElements.js +3 -0
- package/package.json +1 -1
- package/src/corePluginList.js +1 -1
- package/src/corePlugins.js +93 -5
- package/src/css/preflight.css +5 -2
- package/src/lib/generateRules.js +10 -0
- package/src/lib/setupContextUtils.js +27 -3
- package/src/util/dataTypes.js +12 -0
- package/src/util/pseudoElements.js +4 -0
- package/stubs/config.full.js +85 -14
- package/types/config.d.ts +7 -0
- package/types/generated/corePluginList.d.ts +1 -1
- package/types/generated/default-theme.d.ts +33 -7
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.
|
|
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
|
package/lib/corePluginList.js
CHANGED
|
@@ -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
|
];
|
package/lib/corePlugins.js
CHANGED
|
@@ -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", '
|
|
268
|
-
addVariant("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,
|
|
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 === "
|
|
285
|
-
|
|
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
|
};
|
package/lib/css/preflight.css
CHANGED
|
@@ -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,
|
|
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
|
/*
|
package/lib/lib/generateRules.js
CHANGED
|
@@ -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,
|
package/lib/util/dataTypes.js
CHANGED
|
@@ -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
package/src/corePluginList.js
CHANGED
|
@@ -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"]
|
package/src/corePlugins.js
CHANGED
|
@@ -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', '
|
|
208
|
-
addVariant('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,
|
|
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 === '
|
|
229
|
-
|
|
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
|
}
|
package/src/css/preflight.css
CHANGED
|
@@ -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,
|
|
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
|
/*
|
package/src/lib/generateRules.js
CHANGED
|
@@ -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
|
|
package/src/util/dataTypes.js
CHANGED
|
@@ -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
|
package/stubs/config.full.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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',
|