Skip to content

Commit e55aa1b

Browse files
committed
Add deep support for scoped styles
1 parent a3b9275 commit e55aa1b

File tree

3 files changed

+45
-4
lines changed

3 files changed

+45
-4
lines changed

src/Utils/StyleBuilder.php

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,22 @@ public function compile(?DOMElement $styleElement): ?string
9393

9494
if ($styleElement->hasAttribute('scoped')) {
9595
$this->hasScoped = true;
96-
$style = preg_replace(
97-
'/((?:^|\s)\s*[^@\s,][a-z0-9-_]+?)((?::{1,2}[a-z-]+)?\s*[{,])/i',
98-
'$1[' . $this->scopedAttribute . ']$2',
99-
$style
96+
preg_match_all(
97+
'/(?:^|\s)\s*[^@\s,][\.a-z0-9-_:\/\s]+?\s*[{,]/i',
98+
$style,
99+
$matches,
100+
PREG_SET_ORDER
100101
);
102+
foreach ($matches as $match) {
103+
$regex = strpos($match[0], '/deep/') !== false
104+
? '/((?:^|\s)\s*[^@\s,][a-z0-9-_]+?)((?::{1,2}[a-z-]+)?\s*)(?:\/deep\/)/i'
105+
: '/((?:^|\s)\s*[^@\s,][a-z0-9-_]+?)((?::{1,2}[a-z-]+)?\s*[{,])/i';
106+
$style = str_replace(
107+
$match[0],
108+
preg_replace($regex, '$1[' . $this->scopedAttribute . ']$2', $match[0]),
109+
$style
110+
);
111+
}
101112
}
102113

103114
return '<style>' . $style . '</style>';
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<style>
2+
.foo[data-v-34e67cc3ec28c53ca40eb2cd78aa6d35] { color: red; }
3+
.foo[data-v-34e67cc3ec28c53ca40eb2cd78aa6d35] .bar { color: blue; }
4+
</style>
5+
<div data-v-34e67cc3ec28c53ca40eb2cd78aa6d35 {{ dataScopedStyleAttribute|default('') }} class="{{ class|default('') }}" style="{{ style|default('') }}">
6+
<div class="foo" data-v-34e67cc3ec28c53ca40eb2cd78aa6d35>
7+
foo
8+
</div>
9+
</div>
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<template>
2+
<div>
3+
<div class="foo">
4+
foo
5+
</div>
6+
</div>
7+
</template>
8+
9+
<style scoped>
10+
.foo {
11+
color: red;
12+
}
13+
.foo /deep/ .bar {
14+
color: blue;
15+
}
16+
</style>
17+
18+
<script>
19+
export default {
20+
}
21+
</script>

0 commit comments

Comments
 (0)