Skip to content

Commit bf51ab5

Browse files
Fix escaped characters in selectors (#146)
1 parent ab33e2e commit bf51ab5

File tree

5 files changed

+19
-22
lines changed

5 files changed

+19
-22
lines changed

.changeset/fifty-emus-own.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@vanilla-extract/css': patch
3+
---
4+
5+
Fix escaped characters in selectors

fixtures/themed/src/styles.css.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,5 +82,7 @@ export const opacity = styleVariants(
8282
'1/2': fallbackVar(undefinedVar1, '0.5'),
8383
'1/4': fallbackVar(undefinedVar1, undefinedVar2, '0.25'),
8484
},
85-
(value) => ({ opacity: value }),
85+
(value) => ({
86+
selectors: { 'html &': { opacity: value } },
87+
}),
8688
);

packages/css/src/validateSelector.ts

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,6 @@ export const validateSelector = (selector: string, targetClassName: string) => {
2323
};
2424

2525
return selector.split(',').map((selectorPart) => {
26-
if (selectorPart.indexOf(targetClassName) === -1) {
27-
throw new Error(
28-
dedent`
29-
Invalid selector: ${replaceTarget()}
30-
31-
Selectors must target the ampersand character ('&'), which refers to the generated class name, e.g. '&:nth-child(2n)'
32-
`,
33-
);
34-
}
35-
3626
let currentRule;
3727

3828
try {
@@ -63,7 +53,7 @@ export const validateSelector = (selector: string, targetClassName: string) => {
6353
dedent`
6454
Invalid selector: ${replaceTarget()}
6555
66-
Style selectors must end with the '&' character (along with any modifiers), e.g. ${'`${parent} &`'} or ${'`${parent} &:hover`'}.
56+
Style selectors must target the '&' character (along with any modifiers), e.g. ${'`${parent} &`'} or ${'`${parent} &:hover`'}.
6757
6858
This is to ensure that each style block only affects the styling of a single class.
6959

tests/E2E/__snapshots__/styles.test.ts.snap

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,12 @@ Object {
9292
"animation-fill-mode" => "none",
9393
"animation-play-state" => "running",
9494
"animation-name" => "styles_slide__blj6yb1",
95-
"opacity" => "0.5",
9695
"border-radius" => "9999px",
9796
"border-top-left-radius" => "9999px",
9897
"border-top-right-radius" => "9999px",
9998
"border-bottom-right-radius" => "9999px",
10099
"border-bottom-left-radius" => "9999px",
100+
"opacity" => "0.5",
101101
"outline" => "red solid 5px",
102102
"outline-color" => "rgb(255, 0, 0)",
103103
"outline-style" => "solid",
@@ -538,12 +538,12 @@ Object {
538538
"animation-fill-mode" => "none",
539539
"animation-play-state" => "running",
540540
"animation-name" => "styles__jteyb11",
541-
"opacity" => "0.5",
542541
"border-radius" => "9999px",
543542
"border-top-left-radius" => "9999px",
544543
"border-top-right-radius" => "9999px",
545544
"border-bottom-right-radius" => "9999px",
546545
"border-bottom-left-radius" => "9999px",
546+
"opacity" => "0.5",
547547
"outline" => "5px solid red",
548548
"outline-color" => "rgb(255, 0, 0)",
549549
"outline-style" => "solid",
@@ -984,12 +984,12 @@ Object {
984984
"animation-fill-mode" => "none",
985985
"animation-play-state" => "running",
986986
"animation-name" => "styles__jteyb11",
987-
"opacity" => "0.5",
988987
"border-radius" => "9999px",
989988
"border-top-left-radius" => "9999px",
990989
"border-top-right-radius" => "9999px",
991990
"border-bottom-right-radius" => "9999px",
992991
"border-bottom-left-radius" => "9999px",
992+
"opacity" => "0.5",
993993
"outline" => "red solid 5px",
994994
"outline-color" => "rgb(255, 0, 0)",
995995
"outline-style" => "solid",
@@ -1430,12 +1430,12 @@ Object {
14301430
"animation-fill-mode" => "none",
14311431
"animation-play-state" => "running",
14321432
"animation-name" => "styles_slide__blj6yb1",
1433-
"opacity" => "0.5",
14341433
"border-radius" => "9999px",
14351434
"border-top-left-radius" => "9999px",
14361435
"border-top-right-radius" => "9999px",
14371436
"border-bottom-right-radius" => "9999px",
14381437
"border-bottom-left-radius" => "9999px",
1438+
"opacity" => "0.5",
14391439
"outline" => "5px solid red",
14401440
"outline-color" => "rgb(255, 0, 0)",
14411441
"outline-style" => "solid",
@@ -1876,12 +1876,12 @@ Object {
18761876
"animation-fill-mode" => "none",
18771877
"animation-play-state" => "running",
18781878
"animation-name" => "styles_slide__blj6yb1",
1879-
"opacity" => "0.5",
18801879
"border-radius" => "9999px",
18811880
"border-top-left-radius" => "9999px",
18821881
"border-top-right-radius" => "9999px",
18831882
"border-bottom-right-radius" => "9999px",
18841883
"border-bottom-left-radius" => "9999px",
1884+
"opacity" => "0.5",
18851885
"outline" => "5px solid red",
18861886
"outline-color" => "rgb(255, 0, 0)",
18871887
"outline-style" => "solid",
@@ -2322,12 +2322,12 @@ Object {
23222322
"animation-fill-mode" => "none",
23232323
"animation-play-state" => "running",
23242324
"animation-name" => "styles__jteyb11",
2325-
"opacity" => "0.5",
23262325
"border-radius" => "9999px",
23272326
"border-top-left-radius" => "9999px",
23282327
"border-top-right-radius" => "9999px",
23292328
"border-bottom-right-radius" => "9999px",
23302329
"border-bottom-left-radius" => "9999px",
2330+
"opacity" => "0.5",
23312331
"outline" => "5px solid red",
23322332
"outline-color" => "rgb(255, 0, 0)",
23332333
"outline-style" => "solid",

tests/E2E/__snapshots__/stylesheets.test.ts.snap

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,11 @@ exports[`Stylesheet sprinkles - webpack should create valid stylesheet 1`] = `
7979
`;
8080

8181
exports[`Stylesheet themed - esbuild should create valid stylesheet 1`] = `
82-
":root,.themes__cvta170{--colors-background-color__cvta171: blue;--colors-text__cvta172: white;--space-1__cvta173: 4px;--space-2__cvta174: 8px;--space-3__cvta175: 12px}.themes__cvta176{--colors-background-color__cvta171: green;--colors-text__cvta172: white;--space-1__cvta173: 8px;--space-2__cvta174: 12px;--space-3__cvta175: 16px}.themes__cvta177{--colors-background-color__cvta171: pink;--colors-text__cvta172: purple;--space-1__cvta173: 6px;--space-2__cvta174: 12px;--space-3__cvta175: 18px}@media screen and (min-width: 768px){.themes__cvta177{--colors-background-color__cvta171: purple;--colors-text__cvta172: pink}}.shared__4dtfen0{box-shadow:0 0 5px red}body{background-color:#87ceeb}@font-face{src:local(\\"Impact\\");font-family:\\"styles__jteyb10\\"}@font-face{src:local(\\"Comic Sans MS\\");font-family:MyGlobalComicSans}@keyframes styles__jteyb11{0%{transform:translateY(-4px)}to{transform:translateY(4px)}}@keyframes globalSlide{0%{transform:translateY(-4px)}to{transform:translateY(4px)}}.styles__jteyb12{animation:3s infinite alternate globalSlide ease-in-out;display:flex;flex-direction:column;gap:var(--space-2__cvta174);padding:var(--space-3__cvta175)}.styles__jteyb13{animation:3s infinite alternate styles__jteyb11 ease-in-out;font-family:\\"styles__jteyb10\\";background-color:var(--colors-background-color__cvta171, \\"THIS FALLBACK VALUE SHOULD NEVER BE USED\\");color:var(--colors-text__cvta172)}.themes__cvta176 .themes__cvta170 .styles__jteyb12 .styles__jteyb13{font-family:MyGlobalComicSans;outline:5px solid red}.styles_1\\\\/2__jteyb16{opacity:var(--jteyb14, .5)}.styles_1\\\\/4__jteyb17{opacity:var(--jteyb14, var(--jteyb15, .25))}@media only screen and (min-width: 500px){.styles__jteyb12{border:1px solid var(--colors-background-color__cvta171)}.styles__jteyb13{border-radius:9999px}}
82+
":root,.themes__cvta170{--colors-background-color__cvta171: blue;--colors-text__cvta172: white;--space-1__cvta173: 4px;--space-2__cvta174: 8px;--space-3__cvta175: 12px}.themes__cvta176{--colors-background-color__cvta171: green;--colors-text__cvta172: white;--space-1__cvta173: 8px;--space-2__cvta174: 12px;--space-3__cvta175: 16px}.themes__cvta177{--colors-background-color__cvta171: pink;--colors-text__cvta172: purple;--space-1__cvta173: 6px;--space-2__cvta174: 12px;--space-3__cvta175: 18px}@media screen and (min-width: 768px){.themes__cvta177{--colors-background-color__cvta171: purple;--colors-text__cvta172: pink}}.shared__4dtfen0{box-shadow:0 0 5px red}body{background-color:#87ceeb}@font-face{src:local(\\"Impact\\");font-family:\\"styles__jteyb10\\"}@font-face{src:local(\\"Comic Sans MS\\");font-family:MyGlobalComicSans}@keyframes styles__jteyb11{0%{transform:translateY(-4px)}to{transform:translateY(4px)}}@keyframes globalSlide{0%{transform:translateY(-4px)}to{transform:translateY(4px)}}.styles__jteyb12{animation:3s infinite alternate globalSlide ease-in-out;display:flex;flex-direction:column;gap:var(--space-2__cvta174);padding:var(--space-3__cvta175)}.styles__jteyb13{animation:3s infinite alternate styles__jteyb11 ease-in-out;font-family:\\"styles__jteyb10\\";background-color:var(--colors-background-color__cvta171, \\"THIS FALLBACK VALUE SHOULD NEVER BE USED\\");color:var(--colors-text__cvta172)}.themes__cvta176 .themes__cvta170 .styles__jteyb12 .styles__jteyb13{font-family:MyGlobalComicSans;outline:5px solid red}html .styles_1\\\\/2__jteyb16{opacity:var(--jteyb14, .5)}html .styles_1\\\\/4__jteyb17{opacity:var(--jteyb14, var(--jteyb15, .25))}@media only screen and (min-width: 500px){.styles__jteyb12{border:1px solid var(--colors-background-color__cvta171)}.styles__jteyb13{border-radius:9999px}}
8383
"
8484
`;
8585

86-
exports[`Stylesheet themed - vite should create valid stylesheet 1`] = `".themes__cvta170,:root{--colors-background-color__cvta171:blue;--colors-text__cvta172:white;--space-1__cvta173:4px;--space-2__cvta174:8px;--space-3__cvta175:12px}.themes__cvta176{--colors-background-color__cvta171:green;--colors-text__cvta172:white;--space-1__cvta173:8px;--space-2__cvta174:12px;--space-3__cvta175:16px}.themes__cvta177{--colors-background-color__cvta171:pink;--colors-text__cvta172:purple;--space-1__cvta173:6px;--space-2__cvta174:12px;--space-3__cvta175:18px}@media screen and (min-width:768px){.themes__cvta177{--colors-background-color__cvta171:purple;--colors-text__cvta172:pink}}.shared__4dtfen0{box-shadow:0 0 5px red}body{background-color:#87ceeb}@font-face{src:local(\\"Impact\\");font-family:styles__jteyb10}@font-face{src:local(\\"Comic Sans MS\\");font-family:MyGlobalComicSans}@keyframes styles__jteyb11{0%{transform:translateY(-4px)}100%{transform:translateY(4px)}}@keyframes globalSlide{0%{transform:translateY(-4px)}100%{transform:translateY(4px)}}.styles__jteyb12{animation:3s infinite alternate globalSlide ease-in-out;display:flex;flex-direction:column;gap:var(--space-2__cvta174);padding:var(--space-3__cvta175)}.styles__jteyb13{animation:3s infinite alternate styles__jteyb11 ease-in-out;font-family:styles__jteyb10;background-color:var(--colors-background-color__cvta171, \\"THIS FALLBACK VALUE SHOULD NEVER BE USED\\");color:var(--colors-text__cvta172)}.themes__cvta176 .themes__cvta170 .styles__jteyb12 .styles__jteyb13{font-family:MyGlobalComicSans;outline:5px solid red}.styles_1\\\\/2__jteyb16{opacity:var(--jteyb14,.5)}.styles_1\\\\/4__jteyb17{opacity:var(--jteyb14,var(--jteyb15,.25))}@media only screen and (min-width:500px){.styles__jteyb12{border:1px solid var(--colors-background-color__cvta171)}.styles__jteyb13{border-radius:9999px}}"`;
86+
exports[`Stylesheet themed - vite should create valid stylesheet 1`] = `".themes__cvta170,:root{--colors-background-color__cvta171:blue;--colors-text__cvta172:white;--space-1__cvta173:4px;--space-2__cvta174:8px;--space-3__cvta175:12px}.themes__cvta176{--colors-background-color__cvta171:green;--colors-text__cvta172:white;--space-1__cvta173:8px;--space-2__cvta174:12px;--space-3__cvta175:16px}.themes__cvta177{--colors-background-color__cvta171:pink;--colors-text__cvta172:purple;--space-1__cvta173:6px;--space-2__cvta174:12px;--space-3__cvta175:18px}@media screen and (min-width:768px){.themes__cvta177{--colors-background-color__cvta171:purple;--colors-text__cvta172:pink}}.shared__4dtfen0{box-shadow:0 0 5px red}body{background-color:#87ceeb}@font-face{src:local(\\"Impact\\");font-family:styles__jteyb10}@font-face{src:local(\\"Comic Sans MS\\");font-family:MyGlobalComicSans}@keyframes styles__jteyb11{0%{transform:translateY(-4px)}100%{transform:translateY(4px)}}@keyframes globalSlide{0%{transform:translateY(-4px)}100%{transform:translateY(4px)}}.styles__jteyb12{animation:3s infinite alternate globalSlide ease-in-out;display:flex;flex-direction:column;gap:var(--space-2__cvta174);padding:var(--space-3__cvta175)}.styles__jteyb13{animation:3s infinite alternate styles__jteyb11 ease-in-out;font-family:styles__jteyb10;background-color:var(--colors-background-color__cvta171, \\"THIS FALLBACK VALUE SHOULD NEVER BE USED\\");color:var(--colors-text__cvta172)}.themes__cvta176 .themes__cvta170 .styles__jteyb12 .styles__jteyb13{font-family:MyGlobalComicSans;outline:5px solid red}html .styles_1\\\\/2__jteyb16{opacity:var(--jteyb14,.5)}html .styles_1\\\\/4__jteyb17{opacity:var(--jteyb14,var(--jteyb15,.25))}@media only screen and (min-width:500px){.styles__jteyb12{border:1px solid var(--colors-background-color__cvta171)}.styles__jteyb13{border-radius:9999px}}"`;
8787

8888
exports[`Stylesheet themed - webpack should create valid stylesheet 1`] = `
8989
":root, .themes_theme__cdwe0v0 {
@@ -160,10 +160,10 @@ body {
160160
font-family: MyGlobalComicSans;
161161
outline: 5px solid red;
162162
}
163-
.styles_opacity_1\\\\/2__blj6yb6 {
163+
html .styles_opacity_1\\\\/2__blj6yb6 {
164164
opacity: var(--undefined-var1__blj6yb4, 0.5);
165165
}
166-
.styles_opacity_1\\\\/4__blj6yb7 {
166+
html .styles_opacity_1\\\\/4__blj6yb7 {
167167
opacity: var(--undefined-var1__blj6yb4, var(--undefined-var2__blj6yb5, 0.25));
168168
}
169169
@media only screen and (min-width: 500px) {

0 commit comments

Comments
 (0)