Skip to content

Commit 3907885

Browse files
authored
fix: replace CSS cascade layer with unlayered :where() default styles (#174)
1 parent 27afaf9 commit 3907885

5 files changed

Lines changed: 50 additions & 56 deletions

File tree

.changeset/rename-css-layer.md

Lines changed: 0 additions & 7 deletions
This file was deleted.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
"react-shiki": minor
3+
---
4+
5+
fix(css): default styles no longer use `@layer base`, which broke Tailwind v3 builds (its PostCSS plugin treats `@layer base` as a Tailwind directive). Default styles are now unlayered with zero-specificity `:where()` selectors: CSS resets (e.g. Tailwind preflight) can no longer override them, while any rule in your own CSS still can.
6+
7+
BREAKING CHANGE (css): There is a very small risk for breaking changes with this release:
8+
- If you have default styles enabled and override padding or border-radius on the `pre` element from inside a cascade layer (e.g. Tailwind utilities like `[&_pre]:p-3.5`), those overrides no longer apply; add `!` / `!important`, or disable default styles. Overrides in plain (unlayered) CSS are unaffected and need no change.

package/README.md

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -454,11 +454,7 @@ const highlightedCode = useShikiHighlighter(code, "javascript", "github-dark", {
454454
> import 'react-shiki/css';
455455
> ```
456456
457-
Component-internal default classes are namespaced under `rs-*` and shipped inside the `@layer react-shiki` cascade layer, so unlayered app CSS and later layers take precedence over them. To control precedence explicitly, declare the layer order at the top of your stylesheet:
458-
459-
```css
460-
@layer react-shiki, theme, base, components, utilities;
461-
```
457+
Component-internal default classes are namespaced under `rs-*` and written with zero-specificity `:where()` selectors, so they can't be clobbered by CSS resets (e.g. Tailwind preflight) regardless of stylesheet load order, while any rule in your own CSS — even a bare element selector — overrides them.
462458
463459
Available CSS variables for customization:
464460
```css

package/src/styles/component.css

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,23 @@
1-
@layer react-shiki {
2-
.rs-root {
3-
position: relative;
1+
/* Unlayered :where() defaults: immune to layered resets, overridden by any user rule. */
2+
:where(.rs-root) {
3+
position: relative;
4+
}
45

5-
&.rs-default-styles pre {
6-
overflow: auto;
7-
border-radius: 0.5rem;
8-
padding-left: 1.5rem;
9-
padding-right: 1.5rem;
10-
padding-top: 1.25rem;
11-
padding-bottom: 1.25rem;
12-
}
6+
:where(.rs-root.rs-default-styles) pre {
7+
overflow: auto;
8+
border-radius: 0.5rem;
9+
padding-left: 1.5rem;
10+
padding-right: 1.5rem;
11+
padding-top: 1.25rem;
12+
padding-bottom: 1.25rem;
13+
}
1314

14-
& .rs-language-label {
15-
position: absolute;
16-
right: 0.75rem;
17-
top: 0.5rem;
18-
font-family: monospace;
19-
font-size: 0.75rem;
20-
letter-spacing: -0.05em;
21-
color: rgba(107, 114, 128, 0.85);
22-
}
23-
}
15+
:where(.rs-root) .rs-language-label {
16+
position: absolute;
17+
right: 0.75rem;
18+
top: 0.5rem;
19+
font-family: monospace;
20+
font-size: 0.75rem;
21+
letter-spacing: -0.05em;
22+
color: rgba(107, 114, 128, 0.85);
2423
}

package/src/styles/features.css

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,23 @@
1-
@layer react-shiki {
2-
.rs-has-line-numbers {
3-
counter-reset: line-number calc(var(--line-start, 1) - 1);
1+
:where(.rs-has-line-numbers) {
2+
counter-reset: line-number calc(var(--line-start, 1) - 1);
3+
}
44

5-
& .rs-line-number::before {
6-
counter-increment: line-number;
7-
content: counter(line-number);
8-
display: inline-flex;
9-
justify-content: flex-end;
10-
align-items: flex-start;
11-
box-sizing: content-box;
12-
min-width: var(--rs-line-numbers-width, 2ch);
13-
padding-left: var(--rs-line-numbers-padding-left, 0ch);
14-
padding-right: var(--rs-line-numbers-padding-right, 2ch);
15-
color: var(--rs-line-numbers-foreground, rgba(107, 114, 128, 0.5));
16-
font-size: var(--rs-line-numbers-font-size, inherit);
17-
font-weight: var(--rs-line-numbers-font-weight, inherit);
18-
line-height: var(--rs-line-numbers-line-height, inherit);
19-
font-family: var(--rs-line-numbers-font-family, inherit);
20-
opacity: var(--rs-line-numbers-opacity, 1);
21-
user-select: none;
22-
pointer-events: none;
23-
}
24-
}
5+
:where(.rs-has-line-numbers .rs-line-number)::before {
6+
counter-increment: line-number;
7+
content: counter(line-number);
8+
display: inline-flex;
9+
justify-content: flex-end;
10+
align-items: flex-start;
11+
box-sizing: content-box;
12+
min-width: var(--rs-line-numbers-width, 2ch);
13+
padding-left: var(--rs-line-numbers-padding-left, 0ch);
14+
padding-right: var(--rs-line-numbers-padding-right, 2ch);
15+
color: var(--rs-line-numbers-foreground, rgba(107, 114, 128, 0.5));
16+
font-size: var(--rs-line-numbers-font-size, inherit);
17+
font-weight: var(--rs-line-numbers-font-weight, inherit);
18+
line-height: var(--rs-line-numbers-line-height, inherit);
19+
font-family: var(--rs-line-numbers-font-family, inherit);
20+
opacity: var(--rs-line-numbers-opacity, 1);
21+
user-select: none;
22+
pointer-events: none;
2523
}

0 commit comments

Comments
 (0)