Skip to content

Commit

Permalink
encapsulate local styles inside global ones - fixes #1618
Browse files Browse the repository at this point in the history
  • Loading branch information
Rich-Harris committed Aug 4, 2018
1 parent 6012c96 commit 7eaf5dc
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 5 deletions.
12 changes: 7 additions & 5 deletions src/css/Selector.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ export default class Selector {

apply(node: Node, stack: Node[]) {
const toEncapsulate: Node[] = [];

applySelector(this.stylesheet, this.localBlocks.slice(), node, stack.slice(), toEncapsulate);

if (toEncapsulate.length > 0) {
Expand Down Expand Up @@ -132,10 +133,6 @@ export default class Selector {
}
}

function isDescendantSelector(selector: Node) {
return selector.type === 'WhiteSpace' || selector.type === 'Combinator';
}

function applySelector(stylesheet: Stylesheet, blocks: Block[], node: Node, stack: Node[], toEncapsulate: any[]): boolean {
const block = blocks.pop();
if (!block) return false;
Expand All @@ -145,7 +142,6 @@ function applySelector(stylesheet: Stylesheet, blocks: Block[], node: Node, stac
}

let i = block.selectors.length;
let j = stack.length;

while (i--) {
const selector = block.selectors[i];
Expand Down Expand Up @@ -202,12 +198,18 @@ function applySelector(stylesheet: Stylesheet, blocks: Block[], node: Node, stac
}
}

if (blocks.every(block => block.global)) {
toEncapsulate.push({ node, block });
return true;
}

return false;
} else if (block.combinator.name === '>') {
if (applySelector(stylesheet, blocks, stack.pop(), stack, toEncapsulate)) {
toEncapsulate.push({ node, block });
return true;
}

return false;
}

Expand Down
1 change: 1 addition & 0 deletions test/css/samples/local-inside-global/expected.css
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
div .foo.svelte-xyz{color:red}div>.foo.svelte-xyz{font-weight:bold}
11 changes: 11 additions & 0 deletions test/css/samples/local-inside-global/input.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<p class='foo'>red/bold</p>

<style>
:global(div) .foo {
color: red;
}

:global(div) > .foo {
font-weight: bold;
}
</style>

0 comments on commit 7eaf5dc

Please sign in to comment.