@dr-ishaan/rehype-perfect-code-blocks 1.3.2 → 2.0.0
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 +112 -0
- package/dist/astro.d.ts.map +1 -1
- package/dist/astro.js +17 -2
- package/dist/astro.js.map +1 -1
- package/dist/copy-script.d.ts +0 -0
- package/dist/copy-script.d.ts.map +0 -0
- package/dist/copy-script.js +0 -0
- package/dist/copy-script.js.map +0 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/styles.css +65 -0
- package/dist/tokens.d.ts +62 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +168 -0
- package/dist/tokens.js.map +1 -0
- package/dist/transformer.d.ts.map +1 -1
- package/dist/transformer.js +5 -0
- package/dist/transformer.js.map +1 -1
- package/dist/types.d.ts +150 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/astro.ts +20 -2
- package/src/copy-script.ts +0 -0
- package/src/index.ts +10 -1
- package/src/styles.css +65 -0
- package/src/tokens.ts +223 -0
- package/src/transformer.ts +5 -0
- package/src/types.ts +157 -0
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,118 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [2.0.0] — 2026-06-20
|
|
9
|
+
|
|
10
|
+
### Summary
|
|
11
|
+
|
|
12
|
+
**Major release** implementing the four P0 CSS architecture items from the v2.0.0 roadmap. These are the foundational cascade-control features that every production site needs to adopt the plugin without fighting the CSS cascade. No breaking changes — all new features are opt-in with backward-compatible defaults.
|
|
13
|
+
|
|
14
|
+
### Features
|
|
15
|
+
|
|
16
|
+
#### P0-1: `@layer` CSS injection support
|
|
17
|
+
|
|
18
|
+
New `cssInjection` and `cssLayer` options:
|
|
19
|
+
|
|
20
|
+
- `cssInjection: 'inline'` (default, backward-compatible) — injects CSS in a `<style>` tag as before
|
|
21
|
+
- `cssInjection: 'layer'` — wraps CSS in `@layer <cssLayer> { ... }` so it sits in the correct cascade layer on sites using `@layer` (Tailwind v3+, daisyUI, etc.)
|
|
22
|
+
- `cssInjection: 'import'` — does NOT inject CSS; user imports manually via `import '@dr-ishaan/rehype-perfect-code-blocks/styles.css'`
|
|
23
|
+
- `cssLayer: 'pcb'` (default) — the layer name to use when `cssInjection: 'layer'`
|
|
24
|
+
|
|
25
|
+
Example:
|
|
26
|
+
```js
|
|
27
|
+
perfectCode({
|
|
28
|
+
cssInjection: 'layer',
|
|
29
|
+
cssLayer: 'components',
|
|
30
|
+
})
|
|
31
|
+
// User's CSS: @layer base, components, utilities;
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
#### P0-2: Design-token bridge
|
|
35
|
+
|
|
36
|
+
New `tokens` option — provide 5 core values and the plugin auto-derives 20+ `--pcb-*` variables using `color-mix(in oklch, ...)`:
|
|
37
|
+
|
|
38
|
+
```js
|
|
39
|
+
perfectCode({
|
|
40
|
+
tokens: {
|
|
41
|
+
bg: 'var(--bg-subtle)',
|
|
42
|
+
fg: 'var(--ink)',
|
|
43
|
+
border: 'var(--rule)',
|
|
44
|
+
radius: 'var(--radius-card)',
|
|
45
|
+
monoFont: 'var(--font-mono)',
|
|
46
|
+
},
|
|
47
|
+
})
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
The plugin generates `--pcb-ln-fg`, `--pcb-bg-header`, `--pcb-line-highlight`, `--pcb-line-add`, `--pcb-line-del`, `--pcb-line-focus`, `--pcb-copy-hover-bg`, `--pcb-word-bg`, and more — all derived from the 5 core tokens. Applied via `:where(.pcb)` (zero specificity) so user CSS still wins.
|
|
51
|
+
|
|
52
|
+
Uses `color-mix(in oklch, ...)` (Chrome 111+, Safari 16.4+, Firefox 113+). For older browsers, the v1.3.0 theme-aware defaults from Shiki still apply.
|
|
53
|
+
|
|
54
|
+
#### P0-3: Dark mode strategy options
|
|
55
|
+
|
|
56
|
+
New `darkMode` option — controls how the plugin switches between light and dark themes:
|
|
57
|
+
|
|
58
|
+
- `strategy: 'media'` (default, backward-compatible) — uses `@media (prefers-color-scheme: dark)`
|
|
59
|
+
- `strategy: 'attribute'` — switches on `html[data-theme="dark"]` (configurable attribute + value)
|
|
60
|
+
- `strategy: 'class'` — switches on `html.dark` (configurable class name)
|
|
61
|
+
- `strategy: 'custom'` — switches on a user-provided CSS selector
|
|
62
|
+
|
|
63
|
+
Example:
|
|
64
|
+
```js
|
|
65
|
+
perfectCode({
|
|
66
|
+
darkMode: { strategy: 'class', class: 'dark' },
|
|
67
|
+
})
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
#### P0-4: CSS containment scope
|
|
71
|
+
|
|
72
|
+
New `scope` option — prefixes all generated CSS selectors with the given scope:
|
|
73
|
+
|
|
74
|
+
```js
|
|
75
|
+
perfectCode({
|
|
76
|
+
scope: '.prose',
|
|
77
|
+
})
|
|
78
|
+
// All selectors become: .prose .pcb { ... }, .prose .pcb__copy { ... }, etc.
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Applied to ALL generated CSS including the framework-reset overrides, token-bridge CSS, and dark-mode selectors.
|
|
82
|
+
|
|
83
|
+
### New exports
|
|
84
|
+
|
|
85
|
+
- `generateTokenStyles(tokens, scope?)` — generates the derived `--pcb-*` CSS
|
|
86
|
+
- `applyScopeToCss(css, scope)` — prefixes all selectors in a CSS string
|
|
87
|
+
- `generateDarkModeSelector(darkMode, scope?)` — generates the dark-mode CSS selector
|
|
88
|
+
- `generateLightModeSelector(darkMode, scope?)` — generates the light-mode CSS selector
|
|
89
|
+
- `DesignTokens` type — the token bridge input interface
|
|
90
|
+
|
|
91
|
+
### Verification
|
|
92
|
+
|
|
93
|
+
- All 1134 pre-existing tests pass (no regressions).
|
|
94
|
+
- New `test-v2-css-architecture.mjs` adds 43 regression tests covering all 4 P0 features.
|
|
95
|
+
- Total: 1177/1177 tests passing.
|
|
96
|
+
|
|
97
|
+
## [1.3.3] — 2026-06-20
|
|
98
|
+
|
|
99
|
+
### Summary
|
|
100
|
+
|
|
101
|
+
Patch release fixing CSS conflicts between the plugin and Tailwind CSS Preflight (and similar framework base resets). The plugin's `:where()` zero-specificity design — normally a feature — meant Tailwind's bare-element resets (`pre { overflow-x: auto }`, `code { font-family: ui-monospace }`, `button { background: transparent }`, `* { border-width: 0 }`) overrode the plugin's critical rules. This caused double scrollbars, wrong mono font, stripped copy-button styling, and long lines wrapping instead of scrolling. The fix adds a small block of "framework-reset overrides" with real specificity that beat framework base resets without `!important`.
|
|
102
|
+
|
|
103
|
+
### Bug fixes
|
|
104
|
+
|
|
105
|
+
- **Tailwind Preflight / daisyUI CSS conflict** — Added a block of "framework-reset overrides" in `src/styles.css` with REAL specificity (`.pcb pre` = (0,1,1), `.pcb__copy` = (0,1,0), `.pcb__bar` = (0,1,0), `.pcb__code` = (0,1,0)) that beat framework base resets targeting bare `pre`/`code`/`button`/`*` elements (specificity (0,0,1) or (0,0,0)). The overrides cover:
|
|
106
|
+
- `.pcb pre { overflow: visible }` — prevents Tailwind's `pre { overflow-x: auto }` from creating a double scrollbar (one on `<pre>`, one on `.pcb__body`).
|
|
107
|
+
- `.pcb pre, .pcb code { font-family: var(--pcb-font-mono) }` — prevents Tailwind's `pre, code { font-family: ui-monospace }` from overriding the plugin's `--pcb-font-mono`.
|
|
108
|
+
- `.pcb__copy { appearance: none; background: transparent; border: 1px solid transparent; cursor: pointer }` — prevents Tailwind's `button { background: transparent; background-image: none }` from stripping the copy button's base styling.
|
|
109
|
+
- `.pcb__bar { border-bottom: 1px solid var(--pcb-border) }` — prevents Tailwind's `* { border-width: 0 }` from nuking the header bar's bottom border.
|
|
110
|
+
- `.pcb__code { white-space: pre }` — prevents Tailwind utilities like `break-words` or global `pre { white-space: pre-wrap }` from wrapping long lines instead of scrolling.
|
|
111
|
+
|
|
112
|
+
The `:where()` zero-specificity rules are preserved for all other styling — user CSS still wins without `!important` arms races. The new overrides only set the properties that frameworks clobber; everything else stays in `:where()`. No `!important` is used in the override block — the specificity is high enough to beat framework resets on its own.
|
|
113
|
+
|
|
114
|
+
### Verification
|
|
115
|
+
|
|
116
|
+
- All 1114 pre-existing tests pass (no regressions).
|
|
117
|
+
- New `test-tailwind-compat.mjs` adds 20 regression tests covering: `:where()` rules preserved, framework-reset overrides exist with real specificity, overrides come after `:where()` rules (so they win on tie), no `!important` in override declarations, specificity verification (`.pcb pre` beats `pre`, `.pcb__copy` beats `button`, etc.), and documentation comments.
|
|
118
|
+
- Total: 1134/1134 tests passing.
|
|
119
|
+
|
|
8
120
|
## [1.3.2] — 2026-06-20
|
|
9
121
|
|
|
10
122
|
### Summary
|
package/dist/astro.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"astro.d.ts","sourceRoot":"","sources":["../src/astro.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAI9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"astro.d.ts","sourceRoot":"","sources":["../src/astro.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAI9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AA0DrD,MAAM,CAAC,OAAO,UAAU,WAAW,CACjC,OAAO,GAAE,kBAAuB,GAC/B,gBAAgB,CAyHlB"}
|
package/dist/astro.js
CHANGED
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
import { rehypePerfectCodeBlocks } from './index.js';
|
|
20
20
|
import { remarkPreserveCodeMeta } from './remark.js';
|
|
21
21
|
import { COPY_SCRIPT } from './copy-script.js';
|
|
22
|
+
import { generateTokenStyles, applyScopeToCss } from './tokens.js';
|
|
22
23
|
import { readFileSync } from 'node:fs';
|
|
23
24
|
import { readdirSync, writeFileSync, readFileSync as readFile } from 'node:fs';
|
|
24
25
|
import { fileURLToPath } from 'node:url';
|
|
@@ -112,9 +113,23 @@ export default function perfectCode(options = {}) {
|
|
|
112
113
|
// so they pass a strict Content-Security-Policy.
|
|
113
114
|
const nonceAttr = options.cspNonce ? ` nonce="${escapeAttr(options.cspNonce)}"` : '';
|
|
114
115
|
// CSS
|
|
115
|
-
if (options.injectStyles !== false) {
|
|
116
|
-
|
|
116
|
+
if (options.injectStyles !== false && options.cssInjection !== 'import') {
|
|
117
|
+
let css = loadCss();
|
|
117
118
|
if (css) {
|
|
119
|
+
// v2.0.0: Apply CSS scope if configured
|
|
120
|
+
if (options.scope) {
|
|
121
|
+
css = applyScopeToCss(css, options.scope);
|
|
122
|
+
}
|
|
123
|
+
// v2.0.0: Generate token-bridge CSS (derived --pcb-* variables)
|
|
124
|
+
const tokenCss = generateTokenStyles(options.tokens ?? {}, options.scope);
|
|
125
|
+
if (tokenCss) {
|
|
126
|
+
css = css + '\n' + tokenCss;
|
|
127
|
+
}
|
|
128
|
+
// v2.0.0: Wrap in @layer if configured
|
|
129
|
+
const layerName = options.cssLayer ?? 'pcb';
|
|
130
|
+
if (options.cssInjection === 'layer') {
|
|
131
|
+
css = `@layer ${layerName} {\n${css}\n}`;
|
|
132
|
+
}
|
|
118
133
|
injections.push(`<style data-pcb${nonceAttr}>${css}</style>`);
|
|
119
134
|
}
|
|
120
135
|
}
|
package/dist/astro.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"astro.js","sourceRoot":"","sources":["../src/astro.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,IAAI,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D;;;;;;;;;;GAUG;AACH,SAAS,OAAO;IACd,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;QAC1E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC;AAED,6EAA6E;AAC7E,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO;KACpE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACd,CAAC;AAED,oEAAoE;AACpE,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,OAAO,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC3C,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,2CAA2C;IAC7C,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,WAAW,CACjC,UAA8B,EAAE;IAEhC,OAAO;QACL,IAAI,EAAE,4BAA4B;QAClC,KAAK,EAAE;YACL,oBAAoB,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE;gBACzC,sEAAsE;gBACtE,MAAM,iBAAiB,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAc,CAAC;gBACrE,YAAY,CAAC;oBACX,QAAQ,EAAE;wBACR,eAAe,EAAE,OAAO;wBACxB,WAAW,EACT,OAAO,OAAO,CAAC,KAAK,EAAE,KAAK,KAAK,QAAQ;4BACtC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE;4BAChC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK;gCACpB,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE;gCACjC,CAAC,CAAC,SAAS;wBACjB,aAAa,EAAE,CAAC,sBAAsB,CAAC;wBACvC,aAAa,EAAE;4BACb,GAAG,iBAAiB;4BACpB,CAAC,uBAAuB,EAAE,OAAO,CAAC;4BAClC,2DAA2D;4BAC3D,iEAAiE;yBACzD;qBACX;iBACF,CAAC,CAAC;YACL,CAAC;YAED,kBAAkB,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE;gBAC9B,mEAAmE;gBACnE,gEAAgE;gBAChE,oEAAoE;gBACpE,sEAAsE;gBACtE,EAAE;gBACF,iEAAiE;gBACjE,iEAAiE;gBACjE,MAAM,UAAU,GAAa,EAAE,CAAC;gBAChC,wEAAwE;gBACxE,iDAAiD;gBACjD,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAErF,MAAM;gBACN,IAAI,OAAO,CAAC,YAAY,KAAK,KAAK,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"astro.js","sourceRoot":"","sources":["../src/astro.ts"],"names":[],"mappings":"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"}
|
package/dist/copy-script.d.ts
CHANGED
|
File without changes
|
|
File without changes
|
package/dist/copy-script.js
CHANGED
|
File without changes
|
package/dist/copy-script.js.map
CHANGED
|
File without changes
|
package/dist/index.d.ts
CHANGED
|
@@ -22,11 +22,14 @@ import { disposeHighlighter, runHighlighterTask } from './shiki.js';
|
|
|
22
22
|
import { remarkPreserveCodeMeta } from './remark.js';
|
|
23
23
|
import { wordDiff, hasChanges } from './word-diff.js';
|
|
24
24
|
import type { DiffToken } from './word-diff.js';
|
|
25
|
+
import { generateTokenStyles, applyScopeToCss, generateDarkModeSelector, generateLightModeSelector } from './tokens.js';
|
|
26
|
+
import type { DesignTokens } from './tokens.js';
|
|
25
27
|
import type { PerfectCodeOptions } from './types.js';
|
|
26
28
|
export { remarkPreserveCodeMeta };
|
|
27
29
|
export { disposeHighlighter, runHighlighterTask };
|
|
28
30
|
export { wordDiff, hasChanges };
|
|
29
|
-
export
|
|
31
|
+
export { generateTokenStyles, applyScopeToCss, generateDarkModeSelector, generateLightModeSelector };
|
|
32
|
+
export type { DiffToken, DesignTokens };
|
|
30
33
|
export declare const rehypePerfectCodeBlocks: Plugin<[PerfectCodeOptions?], Root>;
|
|
31
34
|
export default rehypePerfectCodeBlocks;
|
|
32
35
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,EAAuB,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACzF,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AAChC,YAAY,EAAE,SAAS,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,EAAuB,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACzF,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,CAAC;AACrG,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AAExC,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAmBrE,CAAC;AAEJ,eAAe,uBAAuB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -20,9 +20,11 @@ import { rehypePerfectCodeBlocks as transformer } from './transformer.js';
|
|
|
20
20
|
import { runShikiOnRawBlocks, disposeHighlighter, runHighlighterTask } from './shiki.js';
|
|
21
21
|
import { remarkPreserveCodeMeta } from './remark.js';
|
|
22
22
|
import { wordDiff, hasChanges } from './word-diff.js';
|
|
23
|
+
import { generateTokenStyles, applyScopeToCss, generateDarkModeSelector, generateLightModeSelector } from './tokens.js';
|
|
23
24
|
export { remarkPreserveCodeMeta };
|
|
24
25
|
export { disposeHighlighter, runHighlighterTask };
|
|
25
26
|
export { wordDiff, hasChanges };
|
|
27
|
+
export { generateTokenStyles, applyScopeToCss, generateDarkModeSelector, generateLightModeSelector };
|
|
26
28
|
export const rehypePerfectCodeBlocks = (options = {}) => {
|
|
27
29
|
const engine = options.engine ?? 'auto';
|
|
28
30
|
const opts = options;
|
|
@@ -143,6 +145,12 @@ function resolveDefaults(opts) {
|
|
|
143
145
|
preset: opts.preset ?? 'default',
|
|
144
146
|
injectStyles: opts.injectStyles ?? true,
|
|
145
147
|
theme: opts.theme ?? 'auto',
|
|
148
|
+
// v2.0.0: CSS Architecture options
|
|
149
|
+
cssInjection: opts.cssInjection ?? 'inline',
|
|
150
|
+
cssLayer: opts.cssLayer ?? 'pcb',
|
|
151
|
+
tokens: opts.tokens ?? undefined,
|
|
152
|
+
darkMode: opts.darkMode ?? undefined,
|
|
153
|
+
scope: opts.scope ?? undefined,
|
|
146
154
|
inline: opts.inline ?? false,
|
|
147
155
|
};
|
|
148
156
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,EAAE,uBAAuB,IAAI,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACzF,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/styles.css
CHANGED
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
- Solid gutter background hides code scrolling behind it
|
|
7
7
|
- All defaults use :where() for zero specificity so user CSS wins
|
|
8
8
|
- Every visual property is a --pcb-* CSS variable
|
|
9
|
+
- Framework-reset overrides (Tailwind/daisyUI compat) use real
|
|
10
|
+
specificity so they beat bare-element resets like `pre { ... }`
|
|
9
11
|
============================================================ */
|
|
10
12
|
|
|
11
13
|
:where(.pcb) {
|
|
@@ -251,6 +253,69 @@
|
|
|
251
253
|
display: block;
|
|
252
254
|
}
|
|
253
255
|
|
|
256
|
+
/* ============================================================
|
|
257
|
+
Framework-reset overrides (Tailwind Preflight / daisyUI compat)
|
|
258
|
+
------------------------------------------------------------
|
|
259
|
+
Tailwind Preflight targets bare `pre`, `code`, and `button`
|
|
260
|
+
elements with specificity (0,0,1). Our :where() rules above
|
|
261
|
+
have zero specificity (0,0,0), so Tailwind's resets WIN and
|
|
262
|
+
break the plugin's overflow model, font inheritance, and
|
|
263
|
+
copy-button styling.
|
|
264
|
+
|
|
265
|
+
These rules use REAL specificity (.pcb pre = (0,1,1),
|
|
266
|
+
.pcb__copy = (0,1,0)) to beat framework base resets WITHOUT
|
|
267
|
+
!important. They only set the properties that frameworks
|
|
268
|
+
clobber — everything else stays in :where() so user CSS
|
|
269
|
+
still wins.
|
|
270
|
+
|
|
271
|
+
If you're NOT using a CSS framework, these rules are harmless
|
|
272
|
+
(they set the same values as the :where() rules above).
|
|
273
|
+
============================================================ */
|
|
274
|
+
|
|
275
|
+
/* Tailwind sets `pre { overflow-x: auto }` which creates a double-
|
|
276
|
+
scrollbar (one on <pre>, one on .pcb__body). Force <pre> to
|
|
277
|
+
visible so only .pcb__body scrolls. */
|
|
278
|
+
.pcb pre {
|
|
279
|
+
overflow: visible;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/* Tailwind sets `pre, code { font-family: ui-monospace, ... }` which
|
|
283
|
+
overrides the plugin's `font: inherit` and ignores --pcb-font-mono.
|
|
284
|
+
Re-assert the plugin's font. */
|
|
285
|
+
.pcb pre,
|
|
286
|
+
.pcb code {
|
|
287
|
+
font-family: var(--pcb-font-mono);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/* Tailwind sets `button { background: transparent; background-image: none }`
|
|
291
|
+
which strips the copy button's hover background. Re-assert the plugin's
|
|
292
|
+
button base. (.pcb__copy already has specificity (0,1,0) which beats
|
|
293
|
+
Tailwind's `button` (0,0,1), but we re-assert here for clarity and to
|
|
294
|
+
catch cases where frameworks add higher-specificity button resets.) */
|
|
295
|
+
.pcb__copy {
|
|
296
|
+
appearance: none;
|
|
297
|
+
background: transparent;
|
|
298
|
+
border: 1px solid transparent;
|
|
299
|
+
cursor: pointer;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/* Tailwind sets `*, ::before, ::after { border-width: 0 }` which nukes
|
|
303
|
+
borders on the header bar and copy button. Re-assert. */
|
|
304
|
+
.pcb__bar {
|
|
305
|
+
border-bottom: 1px solid var(--pcb-border);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/* Tailwind's box-sizing: border-box is fine (the plugin expects it).
|
|
309
|
+
No override needed. */
|
|
310
|
+
|
|
311
|
+
/* Some Tailwind utilities (e.g., `@apply break-words` or global
|
|
312
|
+
`pre { white-space: pre-wrap }`) can clobber the plugin's
|
|
313
|
+
`white-space: pre` on .pcb__code, causing long lines to wrap
|
|
314
|
+
instead of scroll. Re-assert with real specificity. */
|
|
315
|
+
.pcb__code {
|
|
316
|
+
white-space: pre;
|
|
317
|
+
}
|
|
318
|
+
|
|
254
319
|
/* ---------- Row-based line grid ----------
|
|
255
320
|
Each <span class="pcb__line"> uses display:contents so its children
|
|
256
321
|
(.pcb__ln and .pcb__code) become grid items in the <code> container. */
|
package/dist/tokens.d.ts
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Design-token bridge — derives 20+ --pcb-* variables from 5 core values.
|
|
3
|
+
*
|
|
4
|
+
* v2.0.0 feature. Uses `color-mix(in oklch, ...)` for automatic color
|
|
5
|
+
* derivation, which is supported in all modern browsers (Chrome 111+,
|
|
6
|
+
* Safari 16.4+, Firefox 113+). For older browsers, the fallback values
|
|
7
|
+
* from the Shiki theme (Pattern 2, v1.3.0) still apply on the <pre> element.
|
|
8
|
+
*/
|
|
9
|
+
export interface DesignTokens {
|
|
10
|
+
bg?: string;
|
|
11
|
+
fg?: string;
|
|
12
|
+
border?: string;
|
|
13
|
+
radius?: string;
|
|
14
|
+
monoFont?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Generate a CSS style string containing all derived --pcb-* variables
|
|
18
|
+
* from the 5 core token values. Returns an empty string if no tokens
|
|
19
|
+
* are provided.
|
|
20
|
+
*
|
|
21
|
+
* The generated CSS is applied to `:where(.pcb)` so it has zero
|
|
22
|
+
* specificity — user CSS always wins.
|
|
23
|
+
*/
|
|
24
|
+
export declare function generateTokenStyles(tokens: DesignTokens, scope?: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* Generate the dark-mode CSS selector based on the user's dark mode strategy.
|
|
27
|
+
*
|
|
28
|
+
* Returns the selector prefix that should be placed before `.pcb` in CSS rules.
|
|
29
|
+
* For 'media' strategy, returns empty string (the rules are wrapped in @media).
|
|
30
|
+
*/
|
|
31
|
+
export declare function generateDarkModeSelector(darkMode?: {
|
|
32
|
+
strategy?: 'media' | 'attribute' | 'class' | 'custom';
|
|
33
|
+
attribute?: string;
|
|
34
|
+
attributeValue?: string;
|
|
35
|
+
class?: string;
|
|
36
|
+
customSelector?: string;
|
|
37
|
+
}, scope?: string): {
|
|
38
|
+
selector: string;
|
|
39
|
+
mediaQuery: string | null;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Generate the light-mode CSS selector (the inverse of dark mode).
|
|
43
|
+
* When dark mode is NOT active, light mode defaults apply.
|
|
44
|
+
*/
|
|
45
|
+
export declare function generateLightModeSelector(darkMode?: {
|
|
46
|
+
strategy?: 'media' | 'attribute' | 'class' | 'custom';
|
|
47
|
+
attribute?: string;
|
|
48
|
+
attributeValue?: string;
|
|
49
|
+
class?: string;
|
|
50
|
+
customSelector?: string;
|
|
51
|
+
}, scope?: string): {
|
|
52
|
+
selector: string;
|
|
53
|
+
mediaQuery: string | null;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Apply a scope prefix to all CSS selectors in a stylesheet.
|
|
57
|
+
* This is a simple regex-based approach that handles the plugin's CSS
|
|
58
|
+
* structure. It prefixes every selector that starts with `.pcb` or
|
|
59
|
+
* `:where(.pcb` or `html` with the scope.
|
|
60
|
+
*/
|
|
61
|
+
export declare function applyScopeToCss(css: string, scope: string): string;
|
|
62
|
+
//# sourceMappingURL=tokens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,YAAY;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CA+DhF;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,CAAC,EAAE;IACT,QAAQ,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAC;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,EACD,KAAK,CAAC,EAAE,MAAM,GACb;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAkCjD;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,CAAC,EAAE;IACT,QAAQ,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAC;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,EACD,KAAK,CAAC,EAAE,MAAM,GACb;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAiCjD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CA2BlE"}
|
package/dist/tokens.js
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Design-token bridge — derives 20+ --pcb-* variables from 5 core values.
|
|
3
|
+
*
|
|
4
|
+
* v2.0.0 feature. Uses `color-mix(in oklch, ...)` for automatic color
|
|
5
|
+
* derivation, which is supported in all modern browsers (Chrome 111+,
|
|
6
|
+
* Safari 16.4+, Firefox 113+). For older browsers, the fallback values
|
|
7
|
+
* from the Shiki theme (Pattern 2, v1.3.0) still apply on the <pre> element.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Generate a CSS style string containing all derived --pcb-* variables
|
|
11
|
+
* from the 5 core token values. Returns an empty string if no tokens
|
|
12
|
+
* are provided.
|
|
13
|
+
*
|
|
14
|
+
* The generated CSS is applied to `:where(.pcb)` so it has zero
|
|
15
|
+
* specificity — user CSS always wins.
|
|
16
|
+
*/
|
|
17
|
+
export function generateTokenStyles(tokens, scope) {
|
|
18
|
+
if (!tokens || Object.keys(tokens).length === 0)
|
|
19
|
+
return '';
|
|
20
|
+
const { bg, fg, border, radius, monoFont } = tokens;
|
|
21
|
+
if (!bg && !fg && !border && !radius && !monoFont)
|
|
22
|
+
return '';
|
|
23
|
+
const scopePrefix = scope ? `${scope} ` : '';
|
|
24
|
+
const lines = [];
|
|
25
|
+
// Direct mappings (1:1)
|
|
26
|
+
if (bg)
|
|
27
|
+
lines.push(` --pcb-bg: ${bg};`);
|
|
28
|
+
if (fg)
|
|
29
|
+
lines.push(` --pcb-fg: ${fg};`);
|
|
30
|
+
if (border)
|
|
31
|
+
lines.push(` --pcb-border: ${border};`);
|
|
32
|
+
if (radius)
|
|
33
|
+
lines.push(` --pcb-radius: ${radius};`);
|
|
34
|
+
if (monoFont)
|
|
35
|
+
lines.push(` --pcb-font-mono: ${monoFont};`);
|
|
36
|
+
// Derived mappings (auto-computed from core values via color-mix)
|
|
37
|
+
// Only derive if BOTH bg and fg are available (needed for color-mix)
|
|
38
|
+
if (bg && fg) {
|
|
39
|
+
// Line numbers: muted (50% mix of fg over bg)
|
|
40
|
+
lines.push(` --pcb-text-muted: color-mix(in oklch, ${fg}, ${bg} 50%);`);
|
|
41
|
+
lines.push(` --pcb-ln-fg: color-mix(in oklch, ${fg}, ${bg} 50%);`);
|
|
42
|
+
// Header bar background: slightly different from body (5% fg over bg)
|
|
43
|
+
lines.push(` --pcb-bg-header: color-mix(in oklch, ${fg} 5%, ${bg});`);
|
|
44
|
+
// Header text: muted (30% fg mixed toward bg)
|
|
45
|
+
lines.push(` --pcb-text-bar: color-mix(in oklch, ${fg}, ${bg} 30%);`);
|
|
46
|
+
// Line highlight: subtle tint (12% fg over bg)
|
|
47
|
+
lines.push(` --pcb-line-highlight: color-mix(in oklch, ${fg} 12%, ${bg});`);
|
|
48
|
+
// Diff add: green tint (18% green over bg)
|
|
49
|
+
lines.push(` --pcb-line-add: color-mix(in oklch, #2ea043 18%, ${bg});`);
|
|
50
|
+
// Diff del: red tint (18% red over bg)
|
|
51
|
+
lines.push(` --pcb-line-del: color-mix(in oklch, #f85149 18%, ${bg});`);
|
|
52
|
+
// Focus: blue tint (18% blue over bg)
|
|
53
|
+
lines.push(` --pcb-line-focus: color-mix(in oklch, #58a6ff 18%, ${bg});`);
|
|
54
|
+
// Copy button hover background: subtle (8% fg over bg)
|
|
55
|
+
lines.push(` --pcb-copy-hover-bg: color-mix(in oklch, ${fg} 8%, ${bg});`);
|
|
56
|
+
// Gutter background: same as bg by default
|
|
57
|
+
lines.push(` --pcb-bg-gutter: ${bg};`);
|
|
58
|
+
// Caption background: slightly different (like header)
|
|
59
|
+
lines.push(` --pcb-caption-bg: color-mix(in oklch, ${fg} 5%, ${bg});`);
|
|
60
|
+
// Caption color: muted (like header text)
|
|
61
|
+
lines.push(` --pcb-caption-color: color-mix(in oklch, ${fg}, ${bg} 30%);`);
|
|
62
|
+
// Word highlight: gold tint (30% gold over bg)
|
|
63
|
+
lines.push(` --pcb-word-bg: color-mix(in oklch, #bb8009 30%, ${bg});`);
|
|
64
|
+
// Word highlight (id): blue tint (30% blue over bg)
|
|
65
|
+
lines.push(` --pcb-word-bg-id: color-mix(in oklch, #58a6ff 30%, ${bg});`);
|
|
66
|
+
}
|
|
67
|
+
if (lines.length === 0)
|
|
68
|
+
return '';
|
|
69
|
+
return `:where(${scopePrefix}.pcb) {\n${lines.join('\n')}\n}`;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Generate the dark-mode CSS selector based on the user's dark mode strategy.
|
|
73
|
+
*
|
|
74
|
+
* Returns the selector prefix that should be placed before `.pcb` in CSS rules.
|
|
75
|
+
* For 'media' strategy, returns empty string (the rules are wrapped in @media).
|
|
76
|
+
*/
|
|
77
|
+
export function generateDarkModeSelector(darkMode, scope) {
|
|
78
|
+
const scopePrefix = scope ? `${scope} ` : '';
|
|
79
|
+
if (!darkMode || darkMode.strategy === 'media' || !darkMode.strategy) {
|
|
80
|
+
// Default: prefers-color-scheme media query
|
|
81
|
+
return { selector: '', mediaQuery: 'prefers-color-scheme: dark' };
|
|
82
|
+
}
|
|
83
|
+
if (darkMode.strategy === 'attribute') {
|
|
84
|
+
const attr = darkMode.attribute ?? 'data-theme';
|
|
85
|
+
const val = darkMode.attributeValue ?? 'dark';
|
|
86
|
+
return {
|
|
87
|
+
selector: `html[${attr}="${val}"] ${scopePrefix}`.trim(),
|
|
88
|
+
mediaQuery: null,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
if (darkMode.strategy === 'class') {
|
|
92
|
+
const cls = darkMode.class ?? 'dark';
|
|
93
|
+
return {
|
|
94
|
+
selector: `html.${cls} ${scopePrefix}`.trim(),
|
|
95
|
+
mediaQuery: null,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
if (darkMode.strategy === 'custom') {
|
|
99
|
+
const sel = darkMode.customSelector ?? ':root';
|
|
100
|
+
return {
|
|
101
|
+
selector: `${sel} ${scopePrefix}`.trim(),
|
|
102
|
+
mediaQuery: null,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
return { selector: '', mediaQuery: 'prefers-color-scheme: dark' };
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Generate the light-mode CSS selector (the inverse of dark mode).
|
|
109
|
+
* When dark mode is NOT active, light mode defaults apply.
|
|
110
|
+
*/
|
|
111
|
+
export function generateLightModeSelector(darkMode, scope) {
|
|
112
|
+
const scopePrefix = scope ? `${scope} ` : '';
|
|
113
|
+
if (!darkMode || darkMode.strategy === 'media' || !darkMode.strategy) {
|
|
114
|
+
return { selector: '', mediaQuery: 'prefers-color-scheme: light' };
|
|
115
|
+
}
|
|
116
|
+
if (darkMode.strategy === 'attribute') {
|
|
117
|
+
const attr = darkMode.attribute ?? 'data-theme';
|
|
118
|
+
const val = darkMode.attributeValue ?? 'dark';
|
|
119
|
+
// Light = when the attribute is NOT the dark value
|
|
120
|
+
return {
|
|
121
|
+
selector: `html:not([${attr}="${val}"]) ${scopePrefix}`.trim(),
|
|
122
|
+
mediaQuery: null,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
if (darkMode.strategy === 'class') {
|
|
126
|
+
const cls = darkMode.class ?? 'dark';
|
|
127
|
+
return {
|
|
128
|
+
selector: `html:not(.${cls}) ${scopePrefix}`.trim(),
|
|
129
|
+
mediaQuery: null,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
if (darkMode.strategy === 'custom') {
|
|
133
|
+
// For custom, light = when the custom selector does NOT match
|
|
134
|
+
// This is tricky — we can't easily negate an arbitrary selector.
|
|
135
|
+
// Fall back to media query for the light case.
|
|
136
|
+
return { selector: '', mediaQuery: 'prefers-color-scheme: light' };
|
|
137
|
+
}
|
|
138
|
+
return { selector: '', mediaQuery: 'prefers-color-scheme: light' };
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Apply a scope prefix to all CSS selectors in a stylesheet.
|
|
142
|
+
* This is a simple regex-based approach that handles the plugin's CSS
|
|
143
|
+
* structure. It prefixes every selector that starts with `.pcb` or
|
|
144
|
+
* `:where(.pcb` or `html` with the scope.
|
|
145
|
+
*/
|
|
146
|
+
export function applyScopeToCss(css, scope) {
|
|
147
|
+
if (!scope)
|
|
148
|
+
return css;
|
|
149
|
+
// Don't double-prefix if the scope is already present
|
|
150
|
+
if (css.includes(`${scope} .pcb`) || css.includes(`${scope}.pcb`))
|
|
151
|
+
return css;
|
|
152
|
+
// Prefix selectors that target .pcb or html.no-js
|
|
153
|
+
let result = css;
|
|
154
|
+
// :where(.pcb) → :where(scope .pcb)
|
|
155
|
+
result = result.replace(/:where\(\.pcb\)/g, `:where(${scope} .pcb)`);
|
|
156
|
+
// :where(html:not(...)) :where(.pcb:not(...)) → :where(scope html:not(...)) :where(scope .pcb:not(...))
|
|
157
|
+
// This is complex — for nested :where() with html, just prefix the whole compound
|
|
158
|
+
result = result.replace(/:where\(html/g, `:where(${scope} html`);
|
|
159
|
+
// .pcb pre → scope .pcb pre (the framework-reset overrides)
|
|
160
|
+
result = result.replace(/^(\.pcb\s)/gm, `${scope} $1`);
|
|
161
|
+
// .pcb__copy → scope .pcb__copy (note: .pcb__ starts with a dot, don't add another)
|
|
162
|
+
result = result.replace(/^(\.pcb__)/gm, `${scope} $1`);
|
|
163
|
+
// html.no-js .pcb__copy → scope html.no-js scope .pcb__copy
|
|
164
|
+
// (This is an edge case — the no-js rule needs both html and .pcb scoped)
|
|
165
|
+
result = result.replace(/html\.no-js\s+\.pcb/g, `${scope} html.no-js ${scope} .pcb`);
|
|
166
|
+
return result;
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformer.d.ts","sourceRoot":"","sources":["../src/transformer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAuC,IAAI,EAAQ,MAAM,MAAM,CAAC;AAI5E,OAAO,KAAK,EAAE,kBAAkB,EAA2C,MAAM,YAAY,CAAC;AA+C9F;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAMzE;AAoFD,wBAAgB,uBAAuB,CAAC,WAAW,GAAE,kBAAuB,
|
|
1
|
+
{"version":3,"file":"transformer.d.ts","sourceRoot":"","sources":["../src/transformer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAuC,IAAI,EAAQ,MAAM,MAAM,CAAC;AAI5E,OAAO,KAAK,EAAE,kBAAkB,EAA2C,MAAM,YAAY,CAAC;AA+C9F;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAMzE;AAoFD,wBAAgB,uBAAuB,CAAC,WAAW,GAAE,kBAAuB,IA8E5D,MAAM,IAAI,mBAqCzB"}
|
package/dist/transformer.js
CHANGED
|
@@ -229,6 +229,11 @@ export function rehypePerfectCodeBlocks(userOptions = {}) {
|
|
|
229
229
|
preset: 'default',
|
|
230
230
|
injectStyles: true,
|
|
231
231
|
theme: 'auto',
|
|
232
|
+
cssInjection: 'inline',
|
|
233
|
+
cssLayer: 'pcb',
|
|
234
|
+
tokens: undefined,
|
|
235
|
+
darkMode: undefined,
|
|
236
|
+
scope: undefined,
|
|
232
237
|
inline: false,
|
|
233
238
|
...rest,
|
|
234
239
|
};
|