@kbach/react 1.0.0-beta.24 → 1.0.0-beta.26
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/AGENTS.md +17 -0
- package/dist/{chunk-QYTXXF22.mjs → chunk-KTRJZDVE.mjs} +22 -2
- package/dist/postcss-plugin.js +24 -2
- package/dist/postcss-plugin.mjs +1 -1
- package/dist/vite-plugin.js +22 -2
- package/dist/vite-plugin.mjs +1 -1
- package/package.json +2 -2
package/AGENTS.md
CHANGED
|
@@ -12,6 +12,23 @@ underlying engine is built, see the repo root's
|
|
|
12
12
|
|
|
13
13
|
## 1. Install + wire up the build
|
|
14
14
|
|
|
15
|
+
```sh
|
|
16
|
+
npx @kbach/cli init
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Automates everything below — installs `@kbach/react`, patches
|
|
20
|
+
`vite.config.ts` or `postcss.config.js` via a format-preserving codemod
|
|
21
|
+
(never string templating), and for the PostCSS path ensures the marker
|
|
22
|
+
pair exists in `globals.css`. Safe to re-run at any time (idempotent —
|
|
23
|
+
reports "already wired up" rather than duplicating an entry). See
|
|
24
|
+
[`packages/cli/AGENTS.md`](../cli/AGENTS.md) for exactly what it detects
|
|
25
|
+
and changes, and what it does when a codemod can't safely apply (prints
|
|
26
|
+
the same manual snippet shown below, rather than guessing).
|
|
27
|
+
|
|
28
|
+
The manual steps below are both the CLI's own fallback and the accurate
|
|
29
|
+
reference for what it actually does — start here if you're wiring this
|
|
30
|
+
up by hand, or the CLI reported it couldn't:
|
|
31
|
+
|
|
15
32
|
```sh
|
|
16
33
|
npm install @kbach/react@beta
|
|
17
34
|
```
|
|
@@ -299,11 +299,28 @@ function splitClassTokens(str) {
|
|
|
299
299
|
return str.split(/\s+/).filter(Boolean);
|
|
300
300
|
}
|
|
301
301
|
var NOT_A_CLASS_NAME_RE = /[${}]|-$|^[?:&|!"'=<>]+$/;
|
|
302
|
+
function hasUnbracketedParen(token) {
|
|
303
|
+
let bracketDepth = 0;
|
|
304
|
+
for (const ch of token) {
|
|
305
|
+
if (ch === "[") bracketDepth++;
|
|
306
|
+
else if (ch === "]") bracketDepth = Math.max(0, bracketDepth - 1);
|
|
307
|
+
else if ((ch === "(" || ch === ")") && bracketDepth === 0) return true;
|
|
308
|
+
}
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
302
311
|
function pushTokens(str, into) {
|
|
303
312
|
for (const tok of splitClassTokens(str)) {
|
|
304
|
-
if (tok && !NOT_A_CLASS_NAME_RE.test(tok)) into.add(tok);
|
|
313
|
+
if (tok && !NOT_A_CLASS_NAME_RE.test(tok) && !hasUnbracketedParen(tok)) into.add(tok);
|
|
305
314
|
}
|
|
306
315
|
}
|
|
316
|
+
var JSX_CHILD_CONTEXT_WINDOW = 40;
|
|
317
|
+
var JSX_CHILD_BEFORE_RE = />\s*\{\s*$/;
|
|
318
|
+
var JSX_CHILD_AFTER_RE = /^\s*\}\s*</;
|
|
319
|
+
function isJsxExpressionChildTemplateLiteral(code, matchStart, matchEnd) {
|
|
320
|
+
const before = code.slice(Math.max(0, matchStart - JSX_CHILD_CONTEXT_WINDOW), matchStart);
|
|
321
|
+
const after = code.slice(matchEnd, matchEnd + JSX_CHILD_CONTEXT_WINDOW);
|
|
322
|
+
return JSX_CHILD_BEFORE_RE.test(before) && JSX_CHILD_AFTER_RE.test(after);
|
|
323
|
+
}
|
|
307
324
|
function pushTemplateLiteralBody(body, into) {
|
|
308
325
|
const interpolationRe = /\$\{(?:[^{}]|\{[^{}]*\})*\}/g;
|
|
309
326
|
let im;
|
|
@@ -374,7 +391,10 @@ function extractClassStrings(rawCode) {
|
|
|
374
391
|
if (depth === 0) pushClassLikeStrings(block, found);
|
|
375
392
|
}
|
|
376
393
|
const templateRe = /`([^`]{1,2000})`/g;
|
|
377
|
-
while ((m = templateRe.exec(code)) !== null)
|
|
394
|
+
while ((m = templateRe.exec(code)) !== null) {
|
|
395
|
+
if (isJsxExpressionChildTemplateLiteral(code, m.index, templateRe.lastIndex)) continue;
|
|
396
|
+
pushTemplateLiteralBody(m[1], found);
|
|
397
|
+
}
|
|
378
398
|
return [...found];
|
|
379
399
|
}
|
|
380
400
|
var SKIP_DIRS = /* @__PURE__ */ new Set(["node_modules", "dist", "build", "out", ".next", ".output", ".git", ".svn", ".cache", "coverage"]);
|
package/dist/postcss-plugin.js
CHANGED
|
@@ -128,11 +128,28 @@ function splitClassTokens(str) {
|
|
|
128
128
|
return str.split(/\s+/).filter(Boolean);
|
|
129
129
|
}
|
|
130
130
|
var NOT_A_CLASS_NAME_RE = /[${}]|-$|^[?:&|!"'=<>]+$/;
|
|
131
|
+
function hasUnbracketedParen(token) {
|
|
132
|
+
let bracketDepth = 0;
|
|
133
|
+
for (const ch of token) {
|
|
134
|
+
if (ch === "[") bracketDepth++;
|
|
135
|
+
else if (ch === "]") bracketDepth = Math.max(0, bracketDepth - 1);
|
|
136
|
+
else if ((ch === "(" || ch === ")") && bracketDepth === 0) return true;
|
|
137
|
+
}
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
131
140
|
function pushTokens(str, into) {
|
|
132
141
|
for (const tok of splitClassTokens(str)) {
|
|
133
|
-
if (tok && !NOT_A_CLASS_NAME_RE.test(tok)) into.add(tok);
|
|
142
|
+
if (tok && !NOT_A_CLASS_NAME_RE.test(tok) && !hasUnbracketedParen(tok)) into.add(tok);
|
|
134
143
|
}
|
|
135
144
|
}
|
|
145
|
+
var JSX_CHILD_CONTEXT_WINDOW = 40;
|
|
146
|
+
var JSX_CHILD_BEFORE_RE = />\s*\{\s*$/;
|
|
147
|
+
var JSX_CHILD_AFTER_RE = /^\s*\}\s*</;
|
|
148
|
+
function isJsxExpressionChildTemplateLiteral(code, matchStart, matchEnd) {
|
|
149
|
+
const before = code.slice(Math.max(0, matchStart - JSX_CHILD_CONTEXT_WINDOW), matchStart);
|
|
150
|
+
const after = code.slice(matchEnd, matchEnd + JSX_CHILD_CONTEXT_WINDOW);
|
|
151
|
+
return JSX_CHILD_BEFORE_RE.test(before) && JSX_CHILD_AFTER_RE.test(after);
|
|
152
|
+
}
|
|
136
153
|
function pushTemplateLiteralBody(body, into) {
|
|
137
154
|
const interpolationRe = /\$\{(?:[^{}]|\{[^{}]*\})*\}/g;
|
|
138
155
|
let im;
|
|
@@ -203,7 +220,10 @@ function extractClassStrings(rawCode) {
|
|
|
203
220
|
if (depth === 0) pushClassLikeStrings(block, found);
|
|
204
221
|
}
|
|
205
222
|
const templateRe = /`([^`]{1,2000})`/g;
|
|
206
|
-
while ((m = templateRe.exec(code)) !== null)
|
|
223
|
+
while ((m = templateRe.exec(code)) !== null) {
|
|
224
|
+
if (isJsxExpressionChildTemplateLiteral(code, m.index, templateRe.lastIndex)) continue;
|
|
225
|
+
pushTemplateLiteralBody(m[1], found);
|
|
226
|
+
}
|
|
207
227
|
return [...found];
|
|
208
228
|
}
|
|
209
229
|
var SKIP_DIRS = /* @__PURE__ */ new Set(["node_modules", "dist", "build", "out", ".next", ".output", ".git", ".svn", ".cache", "coverage"]);
|
|
@@ -1251,3 +1271,5 @@ function kbachPostcss(options = {}) {
|
|
|
1251
1271
|
};
|
|
1252
1272
|
}
|
|
1253
1273
|
kbachPostcss.postcss = true;
|
|
1274
|
+
|
|
1275
|
+
module.exports = module.exports.default;
|
package/dist/postcss-plugin.mjs
CHANGED
package/dist/vite-plugin.js
CHANGED
|
@@ -919,11 +919,28 @@ function splitClassTokens(str) {
|
|
|
919
919
|
return str.split(/\s+/).filter(Boolean);
|
|
920
920
|
}
|
|
921
921
|
var NOT_A_CLASS_NAME_RE = /[${}]|-$|^[?:&|!"'=<>]+$/;
|
|
922
|
+
function hasUnbracketedParen(token) {
|
|
923
|
+
let bracketDepth = 0;
|
|
924
|
+
for (const ch of token) {
|
|
925
|
+
if (ch === "[") bracketDepth++;
|
|
926
|
+
else if (ch === "]") bracketDepth = Math.max(0, bracketDepth - 1);
|
|
927
|
+
else if ((ch === "(" || ch === ")") && bracketDepth === 0) return true;
|
|
928
|
+
}
|
|
929
|
+
return false;
|
|
930
|
+
}
|
|
922
931
|
function pushTokens(str, into) {
|
|
923
932
|
for (const tok of splitClassTokens(str)) {
|
|
924
|
-
if (tok && !NOT_A_CLASS_NAME_RE.test(tok)) into.add(tok);
|
|
933
|
+
if (tok && !NOT_A_CLASS_NAME_RE.test(tok) && !hasUnbracketedParen(tok)) into.add(tok);
|
|
925
934
|
}
|
|
926
935
|
}
|
|
936
|
+
var JSX_CHILD_CONTEXT_WINDOW = 40;
|
|
937
|
+
var JSX_CHILD_BEFORE_RE = />\s*\{\s*$/;
|
|
938
|
+
var JSX_CHILD_AFTER_RE = /^\s*\}\s*</;
|
|
939
|
+
function isJsxExpressionChildTemplateLiteral(code, matchStart, matchEnd) {
|
|
940
|
+
const before = code.slice(Math.max(0, matchStart - JSX_CHILD_CONTEXT_WINDOW), matchStart);
|
|
941
|
+
const after = code.slice(matchEnd, matchEnd + JSX_CHILD_CONTEXT_WINDOW);
|
|
942
|
+
return JSX_CHILD_BEFORE_RE.test(before) && JSX_CHILD_AFTER_RE.test(after);
|
|
943
|
+
}
|
|
927
944
|
function pushTemplateLiteralBody(body, into) {
|
|
928
945
|
const interpolationRe = /\$\{(?:[^{}]|\{[^{}]*\})*\}/g;
|
|
929
946
|
let im;
|
|
@@ -994,7 +1011,10 @@ function extractClassStrings(rawCode) {
|
|
|
994
1011
|
if (depth === 0) pushClassLikeStrings(block, found);
|
|
995
1012
|
}
|
|
996
1013
|
const templateRe = /`([^`]{1,2000})`/g;
|
|
997
|
-
while ((m = templateRe.exec(code)) !== null)
|
|
1014
|
+
while ((m = templateRe.exec(code)) !== null) {
|
|
1015
|
+
if (isJsxExpressionChildTemplateLiteral(code, m.index, templateRe.lastIndex)) continue;
|
|
1016
|
+
pushTemplateLiteralBody(m[1], found);
|
|
1017
|
+
}
|
|
998
1018
|
return [...found];
|
|
999
1019
|
}
|
|
1000
1020
|
var SKIP_DIRS = /* @__PURE__ */ new Set(["node_modules", "dist", "build", "out", ".next", ".output", ".git", ".svn", ".cache", "coverage"]);
|
package/dist/vite-plugin.mjs
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kbach/react",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.26",
|
|
4
4
|
"description": "A utility-first styling engine for React, powered by a real Rust/WASM core — Tailwind CSS v4 feature parity with Kbach's own color palette.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"css",
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
}
|
|
66
66
|
},
|
|
67
67
|
"scripts": {
|
|
68
|
-
"build": "tsup",
|
|
68
|
+
"build": "tsup && node scripts/fix-postcss-cjs-interop.mjs",
|
|
69
69
|
"dev": "tsup --watch",
|
|
70
70
|
"test": "vitest run --passWithNoTests",
|
|
71
71
|
"test:coverage": "vitest run --coverage --passWithNoTests",
|