react-native-web-tailwind-compat 1.0.0 → 1.1.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/README.md CHANGED
@@ -7,12 +7,10 @@ Tailwind 4 uses CSS layers to organise styles, but react-native-web does not yet
7
7
  npm install react-native-web-tailwind-compat
8
8
  ```
9
9
 
10
- Import the package at the top of your js entry point:
11
-
12
- ```ts
13
- // src/index.tsx
14
- import 'react-native-web-tailwind-compat';
15
- // Other imports...
10
+ You will then need to patch `react-native-web` with the following change in `dist/exports/StyleSheet/dom/index.js`
11
+ ```diff
12
+ -import createCSSStyleSheet from './createCSSStyleSheet';
13
+ +import {createCSSStyleSheet} from 'react-native-web-tailwind-compat';
16
14
  ```
17
15
 
18
16
  Define the layer *before* importing tailwind styles:
@@ -0,0 +1,44 @@
1
+ "use client";
2
+
3
+ const require_utils = require('./utils.cjs');
4
+
5
+ //#region src/createCSSStyleSheet.ts
6
+ let proxy = null;
7
+ function createCSSStyleSheet(id, rootNode, textContent) {
8
+ console.log("Hit da proxy");
9
+ return proxy ??= buildRNWProxy(textContent);
10
+ }
11
+ function buildRNWProxy(initialTextContent) {
12
+ if (typeof window === "undefined") return null;
13
+ const flattenedSheet = new CSSStyleSheet();
14
+ if (initialTextContent) flattenedSheet.replaceSync(initialTextContent);
15
+ let layeredSheet = document.getElementById(require_utils.NEW_SHEET_ID)?.sheet;
16
+ if (!layeredSheet) {
17
+ const styleElem = document.createElement("style");
18
+ styleElem.id = require_utils.NEW_SHEET_ID;
19
+ document.head.prepend(styleElem);
20
+ layeredSheet = styleElem.sheet;
21
+ }
22
+ if (!layeredSheet) return flattenedSheet;
23
+ if (!(layeredSheet.cssRules[0] instanceof CSSLayerBlockRule)) layeredSheet.insertRule("@layer rnw {}", 0);
24
+ flattenRules(layeredSheet.cssRules, flattenedSheet);
25
+ return new Proxy(flattenedSheet, { get(target, prop) {
26
+ if (prop === "insertRule") return function insertRule(text, index) {
27
+ flattenedSheet.insertRule(text, index);
28
+ const cutoffIndex = [...flattenedSheet.cssRules].findIndex((rule) => require_utils.layerBoundaryRegex.exec(rule.cssText));
29
+ if (cutoffIndex === -1 || index <= cutoffIndex) {
30
+ const layerRule = layeredSheet.cssRules[0];
31
+ layerRule.insertRule(text, layerRule.cssRules.length);
32
+ } else layeredSheet.insertRule(text, layeredSheet.cssRules.length);
33
+ };
34
+ const value = target[prop];
35
+ return typeof value === "function" ? value.bind(target) : value;
36
+ } });
37
+ }
38
+ function flattenRules(rules, targetSheet) {
39
+ for (const rule of rules) if (rule instanceof CSSLayerBlockRule) flattenRules(rule.cssRules, targetSheet);
40
+ else targetSheet.insertRule(rule.cssText, targetSheet.cssRules.length);
41
+ }
42
+
43
+ //#endregion
44
+ exports.createCSSStyleSheet = createCSSStyleSheet;
@@ -0,0 +1,5 @@
1
+ //#region src/createCSSStyleSheet.d.ts
2
+ declare function createCSSStyleSheet(id: string, rootNode?: any, textContent?: string): CSSStyleSheet | null;
3
+ //#endregion
4
+ export { createCSSStyleSheet };
5
+ //# sourceMappingURL=createCSSStyleSheet.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createCSSStyleSheet.d.cts","names":[],"sources":["../src/createCSSStyleSheet.ts"],"sourcesContent":[],"mappings":";iBAKgB,mBAAA,oDAIb"}
@@ -0,0 +1,5 @@
1
+ //#region src/createCSSStyleSheet.d.ts
2
+ declare function createCSSStyleSheet(id: string, rootNode?: any, textContent?: string): CSSStyleSheet | null;
3
+ //#endregion
4
+ export { createCSSStyleSheet };
5
+ //# sourceMappingURL=createCSSStyleSheet.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createCSSStyleSheet.d.mts","names":[],"sources":["../src/createCSSStyleSheet.ts"],"sourcesContent":[],"mappings":";iBAKgB,mBAAA,oDAIb"}
@@ -0,0 +1,45 @@
1
+ "use client";
2
+
3
+ import { NEW_SHEET_ID, layerBoundaryRegex } from "./utils.mjs";
4
+
5
+ //#region src/createCSSStyleSheet.ts
6
+ let proxy = null;
7
+ function createCSSStyleSheet(id, rootNode, textContent) {
8
+ console.log("Hit da proxy");
9
+ return proxy ??= buildRNWProxy(textContent);
10
+ }
11
+ function buildRNWProxy(initialTextContent) {
12
+ if (typeof window === "undefined") return null;
13
+ const flattenedSheet = new CSSStyleSheet();
14
+ if (initialTextContent) flattenedSheet.replaceSync(initialTextContent);
15
+ let layeredSheet = document.getElementById(NEW_SHEET_ID)?.sheet;
16
+ if (!layeredSheet) {
17
+ const styleElem = document.createElement("style");
18
+ styleElem.id = NEW_SHEET_ID;
19
+ document.head.prepend(styleElem);
20
+ layeredSheet = styleElem.sheet;
21
+ }
22
+ if (!layeredSheet) return flattenedSheet;
23
+ if (!(layeredSheet.cssRules[0] instanceof CSSLayerBlockRule)) layeredSheet.insertRule("@layer rnw {}", 0);
24
+ flattenRules(layeredSheet.cssRules, flattenedSheet);
25
+ return new Proxy(flattenedSheet, { get(target, prop) {
26
+ if (prop === "insertRule") return function insertRule(text, index) {
27
+ flattenedSheet.insertRule(text, index);
28
+ const cutoffIndex = [...flattenedSheet.cssRules].findIndex((rule) => layerBoundaryRegex.exec(rule.cssText));
29
+ if (cutoffIndex === -1 || index <= cutoffIndex) {
30
+ const layerRule = layeredSheet.cssRules[0];
31
+ layerRule.insertRule(text, layerRule.cssRules.length);
32
+ } else layeredSheet.insertRule(text, layeredSheet.cssRules.length);
33
+ };
34
+ const value = target[prop];
35
+ return typeof value === "function" ? value.bind(target) : value;
36
+ } });
37
+ }
38
+ function flattenRules(rules, targetSheet) {
39
+ for (const rule of rules) if (rule instanceof CSSLayerBlockRule) flattenRules(rule.cssRules, targetSheet);
40
+ else targetSheet.insertRule(rule.cssText, targetSheet.cssRules.length);
41
+ }
42
+
43
+ //#endregion
44
+ export { createCSSStyleSheet };
45
+ //# sourceMappingURL=createCSSStyleSheet.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createCSSStyleSheet.mjs","names":["proxy: CSSStyleSheet | null"],"sources":["../src/createCSSStyleSheet.ts"],"sourcesContent":["\"use client\";\nimport { layerBoundaryRegex, NEW_SHEET_ID } from \"./utils\";\n\nlet proxy: CSSStyleSheet | null = null;\n\nexport function createCSSStyleSheet(\n id: string,\n rootNode?: any,\n textContent?: string,\n): CSSStyleSheet | null {\n console.log(\"Hit da proxy\");\n return (proxy ??= buildRNWProxy(textContent));\n}\n\nfunction buildRNWProxy(initialTextContent?: string) {\n if (typeof window === \"undefined\") {\n return null;\n }\n const flattenedSheet = new CSSStyleSheet();\n if (initialTextContent) {\n flattenedSheet.replaceSync(initialTextContent);\n }\n let layeredSheet = (document.getElementById(NEW_SHEET_ID) as HTMLStyleElement)\n ?.sheet;\n\n if (!layeredSheet) {\n const styleElem = document.createElement(\"style\");\n styleElem.id = NEW_SHEET_ID;\n document.head.prepend(styleElem);\n layeredSheet = styleElem.sheet;\n }\n if (!layeredSheet) return flattenedSheet;\n // ensure that the first rule in the layered sheet is a layer\n if (!(layeredSheet.cssRules[0] instanceof CSSLayerBlockRule)) {\n layeredSheet.insertRule(\"@layer rnw {}\", 0);\n }\n // Traverse the layered sheet to build the flattened sheet\n flattenRules(layeredSheet.cssRules, flattenedSheet);\n\n return new Proxy(flattenedSheet, {\n get(target, prop) {\n if (prop === \"insertRule\") {\n return function insertRule(text: string, index: number) {\n flattenedSheet.insertRule(text, index);\n // find the index of the groups\n const cutoffIndex = [...flattenedSheet.cssRules].findIndex((rule) =>\n layerBoundaryRegex.exec(rule.cssText),\n );\n if (cutoffIndex === -1 || index <= cutoffIndex) {\n // insert into the layer\n const layerRule = layeredSheet.cssRules[0] as CSSLayerBlockRule;\n layerRule.insertRule(text, layerRule.cssRules.length);\n } else {\n // insert into the sheet normally\n layeredSheet.insertRule(text, layeredSheet.cssRules.length);\n }\n };\n }\n const value = (target as any)[prop];\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n}\n\nfunction flattenRules(\n rules: CSSRuleList | CSSRule[],\n targetSheet: CSSStyleSheet,\n) {\n for (const rule of rules) {\n if (rule instanceof CSSLayerBlockRule) {\n flattenRules(rule.cssRules, targetSheet);\n } else {\n targetSheet.insertRule(rule.cssText, targetSheet.cssRules.length);\n }\n }\n}\n"],"mappings":";;;;;AAGA,IAAIA,QAA8B;AAElC,SAAgB,oBACd,IACA,UACA,aACsB;AACtB,SAAQ,IAAI,eAAe;AAC3B,QAAQ,UAAU,cAAc,YAAY;;AAG9C,SAAS,cAAc,oBAA6B;AAClD,KAAI,OAAO,WAAW,YACpB,QAAO;CAET,MAAM,iBAAiB,IAAI,eAAe;AAC1C,KAAI,mBACF,gBAAe,YAAY,mBAAmB;CAEhD,IAAI,eAAgB,SAAS,eAAe,aAAa,EACrD;AAEJ,KAAI,CAAC,cAAc;EACjB,MAAM,YAAY,SAAS,cAAc,QAAQ;AACjD,YAAU,KAAK;AACf,WAAS,KAAK,QAAQ,UAAU;AAChC,iBAAe,UAAU;;AAE3B,KAAI,CAAC,aAAc,QAAO;AAE1B,KAAI,EAAE,aAAa,SAAS,cAAc,mBACxC,cAAa,WAAW,iBAAiB,EAAE;AAG7C,cAAa,aAAa,UAAU,eAAe;AAEnD,QAAO,IAAI,MAAM,gBAAgB,EAC/B,IAAI,QAAQ,MAAM;AAChB,MAAI,SAAS,aACX,QAAO,SAAS,WAAW,MAAc,OAAe;AACtD,kBAAe,WAAW,MAAM,MAAM;GAEtC,MAAM,cAAc,CAAC,GAAG,eAAe,SAAS,CAAC,WAAW,SAC1D,mBAAmB,KAAK,KAAK,QAAQ,CACtC;AACD,OAAI,gBAAgB,MAAM,SAAS,aAAa;IAE9C,MAAM,YAAY,aAAa,SAAS;AACxC,cAAU,WAAW,MAAM,UAAU,SAAS,OAAO;SAGrD,cAAa,WAAW,MAAM,aAAa,SAAS,OAAO;;EAIjE,MAAM,QAAS,OAAe;AAC9B,SAAO,OAAO,UAAU,aAAa,MAAM,KAAK,OAAO,GAAG;IAE7D,CAAC;;AAGJ,SAAS,aACP,OACA,aACA;AACA,MAAK,MAAM,QAAQ,MACjB,KAAI,gBAAgB,kBAClB,cAAa,KAAK,UAAU,YAAY;KAExC,aAAY,WAAW,KAAK,SAAS,YAAY,SAAS,OAAO"}
package/dist/index.cjs CHANGED
@@ -1,4 +1,5 @@
1
- require('./ReactNativeWebTailwindCompat.cjs');
1
+ const require_createCSSStyleSheet = require('./createCSSStyleSheet.cjs');
2
2
  const require_getServerStyleSheet = require('./getServerStyleSheet.cjs');
3
3
 
4
+ exports.createCSSStyleSheet = require_createCSSStyleSheet.createCSSStyleSheet;
4
5
  exports.getServerStyleSheet = require_getServerStyleSheet.getServerStyleSheet;
package/dist/index.d.cts CHANGED
@@ -1,2 +1,3 @@
1
+ import { createCSSStyleSheet } from "./createCSSStyleSheet.cjs";
1
2
  import { getServerStyleSheet } from "./getServerStyleSheet.cjs";
2
- export { getServerStyleSheet };
3
+ export { createCSSStyleSheet, getServerStyleSheet };
package/dist/index.d.mts CHANGED
@@ -1,2 +1,3 @@
1
+ import { createCSSStyleSheet } from "./createCSSStyleSheet.mjs";
1
2
  import { getServerStyleSheet } from "./getServerStyleSheet.mjs";
2
- export { getServerStyleSheet };
3
+ export { createCSSStyleSheet, getServerStyleSheet };
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import "./ReactNativeWebTailwindCompat.mjs";
1
+ import { createCSSStyleSheet } from "./createCSSStyleSheet.mjs";
2
2
  import { getServerStyleSheet } from "./getServerStyleSheet.mjs";
3
3
 
4
- export { getServerStyleSheet };
4
+ export { createCSSStyleSheet, getServerStyleSheet };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-web-tailwind-compat",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "author": "Alexander Nicholson",
5
5
  "description": "Adds CSS layers to react native web styles, allowing it to be used with TailwindCSS v4",
6
6
  "homepage": "https://github.com/a16n-dev/uniwind-plugin-next#readme",
@@ -1,41 +0,0 @@
1
- const require_utils = require('./utils.cjs');
2
-
3
- //#region src/ReactNativeWebTailwindCompat.ts
4
- if (typeof window !== "undefined") {
5
- let elemProxy;
6
- const _getElementById = document.getElementById;
7
- document.getElementById = function(id) {
8
- return id !== "react-native-stylesheet" ? _getElementById.call(document, id) : elemProxy ??= { sheet: buildRNWProxy() };
9
- };
10
- function buildRNWProxy() {
11
- const flattenedSheet = new CSSStyleSheet();
12
- let layeredSheet = document.getElementById(require_utils.NEW_SHEET_ID)?.sheet;
13
- if (!layeredSheet) {
14
- const styleElem = document.createElement("style");
15
- styleElem.id = require_utils.NEW_SHEET_ID;
16
- document.head.prepend(styleElem);
17
- layeredSheet = styleElem.sheet;
18
- }
19
- if (!layeredSheet) return flattenedSheet;
20
- if (!(layeredSheet.cssRules[0] instanceof CSSLayerBlockRule)) layeredSheet.insertRule("@layer rnw {}", 0);
21
- flattenRules(layeredSheet.cssRules, flattenedSheet);
22
- return new Proxy(flattenedSheet, { get(target, prop) {
23
- if (prop === "insertRule") return function insertRule(text, index) {
24
- flattenedSheet.insertRule(text, index);
25
- const cutoffIndex = [...flattenedSheet.cssRules].findIndex((rule) => require_utils.layerBoundaryRegex.exec(rule.cssText));
26
- if (cutoffIndex === -1 || index <= cutoffIndex) {
27
- const layerRule = layeredSheet.cssRules[0];
28
- layerRule.insertRule(text, layerRule.cssRules.length);
29
- } else layeredSheet.insertRule(text, layeredSheet.cssRules.length);
30
- };
31
- const value = target[prop];
32
- return typeof value === "function" ? value.bind(target) : value;
33
- } });
34
- }
35
- function flattenRules(rules, targetSheet) {
36
- for (const rule of rules) if (rule instanceof CSSLayerBlockRule) flattenRules(rule.cssRules, targetSheet);
37
- else targetSheet.insertRule(rule.cssText, targetSheet.cssRules.length);
38
- }
39
- }
40
-
41
- //#endregion
@@ -1,43 +0,0 @@
1
- import { NEW_SHEET_ID, layerBoundaryRegex } from "./utils.mjs";
2
-
3
- //#region src/ReactNativeWebTailwindCompat.ts
4
- if (typeof window !== "undefined") {
5
- let elemProxy;
6
- const _getElementById = document.getElementById;
7
- document.getElementById = function(id) {
8
- return id !== "react-native-stylesheet" ? _getElementById.call(document, id) : elemProxy ??= { sheet: buildRNWProxy() };
9
- };
10
- function buildRNWProxy() {
11
- const flattenedSheet = new CSSStyleSheet();
12
- let layeredSheet = document.getElementById(NEW_SHEET_ID)?.sheet;
13
- if (!layeredSheet) {
14
- const styleElem = document.createElement("style");
15
- styleElem.id = NEW_SHEET_ID;
16
- document.head.prepend(styleElem);
17
- layeredSheet = styleElem.sheet;
18
- }
19
- if (!layeredSheet) return flattenedSheet;
20
- if (!(layeredSheet.cssRules[0] instanceof CSSLayerBlockRule)) layeredSheet.insertRule("@layer rnw {}", 0);
21
- flattenRules(layeredSheet.cssRules, flattenedSheet);
22
- return new Proxy(flattenedSheet, { get(target, prop) {
23
- if (prop === "insertRule") return function insertRule(text, index) {
24
- flattenedSheet.insertRule(text, index);
25
- const cutoffIndex = [...flattenedSheet.cssRules].findIndex((rule) => layerBoundaryRegex.exec(rule.cssText));
26
- if (cutoffIndex === -1 || index <= cutoffIndex) {
27
- const layerRule = layeredSheet.cssRules[0];
28
- layerRule.insertRule(text, layerRule.cssRules.length);
29
- } else layeredSheet.insertRule(text, layeredSheet.cssRules.length);
30
- };
31
- const value = target[prop];
32
- return typeof value === "function" ? value.bind(target) : value;
33
- } });
34
- }
35
- function flattenRules(rules, targetSheet) {
36
- for (const rule of rules) if (rule instanceof CSSLayerBlockRule) flattenRules(rule.cssRules, targetSheet);
37
- else targetSheet.insertRule(rule.cssText, targetSheet.cssRules.length);
38
- }
39
- }
40
-
41
- //#endregion
42
- export { };
43
- //# sourceMappingURL=ReactNativeWebTailwindCompat.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ReactNativeWebTailwindCompat.mjs","names":["elemProxy: HTMLStyleElement"],"sources":["../src/ReactNativeWebTailwindCompat.ts"],"sourcesContent":["import { layerBoundaryRegex, NEW_SHEET_ID } from \"./utils\";\n\nif (typeof window !== \"undefined\") {\n let elemProxy: HTMLStyleElement;\n const _getElementById = document.getElementById;\n document.getElementById = function (id: string) {\n return id !== \"react-native-stylesheet\"\n ? _getElementById.call(document, id)\n : (elemProxy ??= { sheet: buildRNWProxy() } as HTMLStyleElement);\n };\n\n function buildRNWProxy() {\n const flattenedSheet = new CSSStyleSheet();\n let layeredSheet = (\n document.getElementById(NEW_SHEET_ID) as HTMLStyleElement\n )?.sheet;\n\n if (!layeredSheet) {\n const styleElem = document.createElement(\"style\");\n styleElem.id = NEW_SHEET_ID;\n document.head.prepend(styleElem);\n layeredSheet = styleElem.sheet;\n }\n if (!layeredSheet) return flattenedSheet;\n // ensure that the first rule in the layered sheet is a layer\n if (!(layeredSheet.cssRules[0] instanceof CSSLayerBlockRule)) {\n layeredSheet.insertRule(\"@layer rnw {}\", 0);\n }\n // Traverse the layered sheet to build the flattened sheet\n flattenRules(layeredSheet.cssRules, flattenedSheet);\n\n return new Proxy(flattenedSheet, {\n get(target, prop) {\n if (prop === \"insertRule\") {\n return function insertRule(text: string, index: number) {\n flattenedSheet.insertRule(text, index);\n // find the index of the groups\n const cutoffIndex = [...flattenedSheet.cssRules].findIndex((rule) =>\n layerBoundaryRegex.exec(rule.cssText),\n );\n if (cutoffIndex === -1 || index <= cutoffIndex) {\n // insert into the layer\n const layerRule = layeredSheet.cssRules[0] as CSSLayerBlockRule;\n layerRule.insertRule(text, layerRule.cssRules.length);\n } else {\n // insert into the sheet normally\n layeredSheet.insertRule(text, layeredSheet.cssRules.length);\n }\n };\n }\n const value = (target as any)[prop];\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n }\n\n function flattenRules(\n rules: CSSRuleList | CSSRule[],\n targetSheet: CSSStyleSheet,\n ) {\n for (const rule of rules) {\n if (rule instanceof CSSLayerBlockRule) {\n flattenRules(rule.cssRules, targetSheet);\n } else {\n targetSheet.insertRule(rule.cssText, targetSheet.cssRules.length);\n }\n }\n }\n}\n"],"mappings":";;;AAEA,IAAI,OAAO,WAAW,aAAa;CACjC,IAAIA;CACJ,MAAM,kBAAkB,SAAS;AACjC,UAAS,iBAAiB,SAAU,IAAY;AAC9C,SAAO,OAAO,4BACV,gBAAgB,KAAK,UAAU,GAAG,GACjC,cAAc,EAAE,OAAO,eAAe,EAAE;;CAG/C,SAAS,gBAAgB;EACvB,MAAM,iBAAiB,IAAI,eAAe;EAC1C,IAAI,eACF,SAAS,eAAe,aAAa,EACpC;AAEH,MAAI,CAAC,cAAc;GACjB,MAAM,YAAY,SAAS,cAAc,QAAQ;AACjD,aAAU,KAAK;AACf,YAAS,KAAK,QAAQ,UAAU;AAChC,kBAAe,UAAU;;AAE3B,MAAI,CAAC,aAAc,QAAO;AAE1B,MAAI,EAAE,aAAa,SAAS,cAAc,mBACxC,cAAa,WAAW,iBAAiB,EAAE;AAG7C,eAAa,aAAa,UAAU,eAAe;AAEnD,SAAO,IAAI,MAAM,gBAAgB,EAC/B,IAAI,QAAQ,MAAM;AAChB,OAAI,SAAS,aACX,QAAO,SAAS,WAAW,MAAc,OAAe;AACtD,mBAAe,WAAW,MAAM,MAAM;IAEtC,MAAM,cAAc,CAAC,GAAG,eAAe,SAAS,CAAC,WAAW,SAC1D,mBAAmB,KAAK,KAAK,QAAQ,CACtC;AACD,QAAI,gBAAgB,MAAM,SAAS,aAAa;KAE9C,MAAM,YAAY,aAAa,SAAS;AACxC,eAAU,WAAW,MAAM,UAAU,SAAS,OAAO;UAGrD,cAAa,WAAW,MAAM,aAAa,SAAS,OAAO;;GAIjE,MAAM,QAAS,OAAe;AAC9B,UAAO,OAAO,UAAU,aAAa,MAAM,KAAK,OAAO,GAAG;KAE7D,CAAC;;CAGJ,SAAS,aACP,OACA,aACA;AACA,OAAK,MAAM,QAAQ,MACjB,KAAI,gBAAgB,kBAClB,cAAa,KAAK,UAAU,YAAY;MAExC,aAAY,WAAW,KAAK,SAAS,YAAY,SAAS,OAAO"}