tailwind-styled-v4 5.1.14 → 5.1.16
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/dist/index.browser.mjs +27 -6
- package/dist/index.browser.mjs.map +1 -1
- package/dist/index.js +27 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +27 -6
- package/dist/index.mjs.map +1 -1
- package/dist/runtime-css.d.mts +1 -2
- package/dist/runtime-css.d.ts +1 -2
- package/dist/runtime-css.js +66 -89
- package/dist/runtime-css.js.map +1 -1
- package/dist/runtime-css.mjs +65 -83
- package/dist/runtime-css.mjs.map +1 -1
- package/dist/runtime.js +27 -6
- package/dist/runtime.js.map +1 -1
- package/dist/runtime.mjs +27 -6
- package/dist/runtime.mjs.map +1 -1
- package/dist/theme.js +27 -6
- package/dist/theme.js.map +1 -1
- package/dist/theme.mjs +27 -6
- package/dist/theme.mjs.map +1 -1
- package/package.json +4 -7
package/dist/runtime-css.d.mts
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export { useTwClasses } from '@tailwind-styled/runtime-css/server';
|
|
1
|
+
export { TwCssInjector, useTwClasses } from '@tailwind-styled/runtime-css/server';
|
package/dist/runtime-css.d.ts
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export { useTwClasses } from '@tailwind-styled/runtime-css/server';
|
|
1
|
+
export { TwCssInjector, useTwClasses } from '@tailwind-styled/runtime-css/server';
|
package/dist/runtime-css.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use client";
|
|
2
1
|
"use strict";
|
|
3
2
|
var __create = Object.create;
|
|
4
3
|
var __defProp = Object.defineProperty;
|
|
@@ -31,110 +30,88 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
31
30
|
// src/umbrella/runtime-css.ts
|
|
32
31
|
var runtime_css_exports = {};
|
|
33
32
|
__export(runtime_css_exports, {
|
|
34
|
-
|
|
35
|
-
flushBatchedCss: () => flushBatchedCss,
|
|
36
|
-
getBatchedCssStats: () => getBatchedCssStats,
|
|
37
|
-
isInjected: () => isInjected,
|
|
38
|
-
resetBatchedCss: () => resetBatchedCss,
|
|
39
|
-
syncInject: () => syncInject,
|
|
33
|
+
TwCssInjector: () => TwCssInjector,
|
|
40
34
|
useTwClasses: () => useTwClasses
|
|
41
35
|
});
|
|
42
36
|
module.exports = __toCommonJS(runtime_css_exports);
|
|
43
37
|
|
|
44
|
-
// packages/domain/runtime-css/dist/
|
|
45
|
-
var
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
console.warn("[tw] insertRule failed, falling back to textContent append for rule:", trimmed.slice(0, 80));
|
|
71
|
-
}
|
|
38
|
+
// packages/domain/runtime-css/dist/CssInjector.js
|
|
39
|
+
var import_react = __toESM(require("react"), 1);
|
|
40
|
+
async function TwCssInjector(props = {}) {
|
|
41
|
+
const { route, includeGlobal = true, minify = true, cssDir } = props;
|
|
42
|
+
let fs = null;
|
|
43
|
+
let path = null;
|
|
44
|
+
try {
|
|
45
|
+
fs = await import("fs");
|
|
46
|
+
path = await import("path");
|
|
47
|
+
} catch {
|
|
48
|
+
warnOnceDev(
|
|
49
|
+
"TwCssInjector dipanggil tapi gak bisa akses 'node:fs'/'node:path' (kemungkinan jalan di environment non-Node, misal Edge runtime). CSS injection di-skip \u2014 komponen tetap render normal, tapi route CSS lo gak ikut inline."
|
|
50
|
+
);
|
|
51
|
+
return import_react.default.createElement(import_react.default.Fragment, null);
|
|
52
|
+
}
|
|
53
|
+
const resolvedDir = cssDir ?? path.join(process.cwd(), ".next", "static", "css", "tw");
|
|
54
|
+
const manifestPath = path.join(resolvedDir, "css-manifest.json");
|
|
55
|
+
let manifest = {};
|
|
56
|
+
try {
|
|
57
|
+
if (fs.existsSync(manifestPath)) {
|
|
58
|
+
manifest = JSON.parse(fs.readFileSync(manifestPath, "utf-8"));
|
|
59
|
+
} else {
|
|
60
|
+
warnOnceDev(
|
|
61
|
+
`TwCssInjector aktif tapi manifest gak ketemu di "${manifestPath}". CSS injection di-skip diam-diam \u2014 biasanya ini berarti "routeCss: true" belum diset di withTailwindStyled(...) di next.config, atau dev/build server belum sempat generate manifest-nya. Cek konfigurasi sebelum lanjut.`
|
|
62
|
+
);
|
|
63
|
+
return import_react.default.createElement(import_react.default.Fragment, null);
|
|
72
64
|
}
|
|
65
|
+
} catch (err) {
|
|
66
|
+
warnOnceDev(
|
|
67
|
+
`TwCssInjector gagal parse manifest di "${manifestPath}": ${err instanceof Error ? err.message : String(err)}. CSS injection di-skip \u2014 manifest mungkin korup atau lagi setengah ditulis saat dibaca.`
|
|
68
|
+
);
|
|
69
|
+
return import_react.default.createElement(import_react.default.Fragment, null);
|
|
73
70
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
if (!cssRule || injected.has(cssRule)) return;
|
|
80
|
-
injected.add(cssRule);
|
|
81
|
-
pending.push(cssRule);
|
|
82
|
-
if (_state.rafHandle === null) {
|
|
83
|
-
_state.rafHandle = requestAnimationFrame(flushBatchedCss);
|
|
71
|
+
const cssChunks = [];
|
|
72
|
+
if (includeGlobal && manifest.routes?.["__global"]) {
|
|
73
|
+
const globalPath = path.join(resolvedDir, manifest.routes["__global"]);
|
|
74
|
+
const css = readFile(fs, globalPath);
|
|
75
|
+
if (css) cssChunks.push(css);
|
|
84
76
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
for (const rule of rules) {
|
|
91
|
-
insertRuleToSheet(rule);
|
|
77
|
+
const targetRoute = route ?? "/";
|
|
78
|
+
if (manifest.routes?.[targetRoute]) {
|
|
79
|
+
const routePath = path.join(resolvedDir, manifest.routes[targetRoute]);
|
|
80
|
+
const css = readFile(fs, routePath);
|
|
81
|
+
if (css) cssChunks.push(css);
|
|
92
82
|
}
|
|
83
|
+
if (cssChunks.length === 0) return import_react.default.createElement(import_react.default.Fragment, null);
|
|
84
|
+
const combined = cssChunks.join("\n");
|
|
85
|
+
const final = minify ? minifyCss(combined) : combined;
|
|
86
|
+
return import_react.default.createElement("style", {
|
|
87
|
+
dangerouslySetInnerHTML: { __html: final },
|
|
88
|
+
"data-tw-route": targetRoute,
|
|
89
|
+
"data-tw-injector": "true"
|
|
90
|
+
});
|
|
93
91
|
}
|
|
94
|
-
function
|
|
95
|
-
|
|
96
|
-
if (!cssRule || injected.has(cssRule)) return;
|
|
97
|
-
injected.add(cssRule);
|
|
98
|
-
insertRuleToSheet(cssRule);
|
|
92
|
+
function useTwClasses(classes) {
|
|
93
|
+
return classes;
|
|
99
94
|
}
|
|
100
|
-
|
|
101
|
-
|
|
95
|
+
var warnedKeys = /* @__PURE__ */ new Set();
|
|
96
|
+
function warnOnceDev(message) {
|
|
97
|
+
if (process.env.NODE_ENV === "production") return;
|
|
98
|
+
if (warnedKeys.has(message)) return;
|
|
99
|
+
warnedKeys.add(message);
|
|
100
|
+
console.warn(`[tailwind-styled-v4] ${message}`);
|
|
102
101
|
}
|
|
103
|
-
function
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
cancelAnimationFrame(_state.rafHandle);
|
|
108
|
-
_state.rafHandle = null;
|
|
109
|
-
}
|
|
110
|
-
if (typeof document !== "undefined" && _state.styleEl && document.head.contains(_state.styleEl)) {
|
|
111
|
-
document.head.removeChild(_state.styleEl);
|
|
112
|
-
_state.styleEl = null;
|
|
113
|
-
} else {
|
|
114
|
-
_state.styleEl = null;
|
|
102
|
+
function readFile(fs, filepath) {
|
|
103
|
+
try {
|
|
104
|
+
if (fs.existsSync(filepath)) return fs.readFileSync(filepath, "utf-8");
|
|
105
|
+
} catch {
|
|
115
106
|
}
|
|
107
|
+
return null;
|
|
116
108
|
}
|
|
117
|
-
function
|
|
118
|
-
return {
|
|
119
|
-
totalInjected: injected.size,
|
|
120
|
-
pendingCount: pending.length,
|
|
121
|
-
hasBatchScheduled: _state.rafHandle !== null
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// packages/domain/runtime-css/dist/CssInjector.js
|
|
126
|
-
var import_react = __toESM(require("react"), 1);
|
|
127
|
-
function useTwClasses(classes) {
|
|
128
|
-
return classes;
|
|
109
|
+
function minifyCss(css) {
|
|
110
|
+
return css.replace(/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g, "").replace(/\s+/g, " ").replace(/\s*{\s*/g, "{").replace(/\s*}\s*/g, "}").replace(/\s*;\s*/g, ";").trim();
|
|
129
111
|
}
|
|
130
112
|
// Annotate the CommonJS export names for ESM import in node:
|
|
131
113
|
0 && (module.exports = {
|
|
132
|
-
|
|
133
|
-
flushBatchedCss,
|
|
134
|
-
getBatchedCssStats,
|
|
135
|
-
isInjected,
|
|
136
|
-
resetBatchedCss,
|
|
137
|
-
syncInject,
|
|
114
|
+
TwCssInjector,
|
|
138
115
|
useTwClasses
|
|
139
116
|
});
|
|
140
117
|
/* tailwind-styled-v4 v5.1.9 | MIT | https://github.com/dictionar32/tailwind-styled-v4 */
|
package/dist/runtime-css.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/umbrella/runtime-css.ts","../packages/domain/runtime-css/dist/
|
|
1
|
+
{"version":3,"sources":["../src/umbrella/runtime-css.ts","../packages/domain/runtime-css/dist/CssInjector.js"],"sourcesContent":["// Server-safe entry — hanya export TwCssInjector (async RSC) dan useTwClasses.\n// batchedInjector SENGAJA tidak di-export di sini karena punya \"use client\"\n// yang akan membuat Next.js memperlakukan TwCssInjector sebagai Client Component.\n// Runtime CSS injection internal (stateEngine, containerQuery) mengakses\n// @tailwind-styled/runtime-css/batched secara langsung di module level mereka sendiri.\nexport { TwCssInjector, useTwClasses } from \"@tailwind-styled/runtime-css/server\"\n","import React from \"react\";\nasync function TwCssInjector(props = {}) {\n const { route, includeGlobal = true, minify = true, cssDir } = props;\n let fs = null;\n let path = null;\n try {\n fs = await import(\"node:fs\");\n path = await import(\"node:path\");\n } catch {\n warnOnceDev(\n \"TwCssInjector dipanggil tapi gak bisa akses 'node:fs'/'node:path' (kemungkinan jalan di environment non-Node, misal Edge runtime). CSS injection di-skip \\u2014 komponen tetap render normal, tapi route CSS lo gak ikut inline.\"\n );\n return React.createElement(React.Fragment, null);\n }\n const resolvedDir = cssDir ?? path.join(process.cwd(), \".next\", \"static\", \"css\", \"tw\");\n const manifestPath = path.join(resolvedDir, \"css-manifest.json\");\n let manifest = {};\n try {\n if (fs.existsSync(manifestPath)) {\n manifest = JSON.parse(fs.readFileSync(manifestPath, \"utf-8\"));\n } else {\n warnOnceDev(\n `TwCssInjector aktif tapi manifest gak ketemu di \"${manifestPath}\". CSS injection di-skip diam-diam \\u2014 biasanya ini berarti \"routeCss: true\" belum diset di withTailwindStyled(...) di next.config, atau dev/build server belum sempat generate manifest-nya. Cek konfigurasi sebelum lanjut.`\n );\n return React.createElement(React.Fragment, null);\n }\n } catch (err) {\n warnOnceDev(\n `TwCssInjector gagal parse manifest di \"${manifestPath}\": ${err instanceof Error ? err.message : String(err)}. CSS injection di-skip \\u2014 manifest mungkin korup atau lagi setengah ditulis saat dibaca.`\n );\n return React.createElement(React.Fragment, null);\n }\n const cssChunks = [];\n if (includeGlobal && manifest.routes?.[\"__global\"]) {\n const globalPath = path.join(resolvedDir, manifest.routes[\"__global\"]);\n const css = readFile(fs, globalPath);\n if (css) cssChunks.push(css);\n }\n const targetRoute = route ?? \"/\";\n if (manifest.routes?.[targetRoute]) {\n const routePath = path.join(resolvedDir, manifest.routes[targetRoute]);\n const css = readFile(fs, routePath);\n if (css) cssChunks.push(css);\n }\n if (cssChunks.length === 0) return React.createElement(React.Fragment, null);\n const combined = cssChunks.join(\"\\n\");\n const final = minify ? minifyCss(combined) : combined;\n return React.createElement(\"style\", {\n dangerouslySetInnerHTML: { __html: final },\n \"data-tw-route\": targetRoute,\n \"data-tw-injector\": \"true\"\n });\n}\nfunction useTwClasses(classes) {\n return classes;\n}\nconst warnedKeys = /* @__PURE__ */ new Set();\nfunction warnOnceDev(message) {\n if (process.env.NODE_ENV === \"production\") return;\n if (warnedKeys.has(message)) return;\n warnedKeys.add(message);\n console.warn(`[tailwind-styled-v4] ${message}`);\n}\nfunction readFile(fs, filepath) {\n try {\n if (fs.existsSync(filepath)) return fs.readFileSync(filepath, \"utf-8\");\n } catch {\n }\n return null;\n}\nfunction minifyCss(css) {\n return css.replace(/\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//g, \"\").replace(/\\s+/g, \" \").replace(/\\s*{\\s*/g, \"{\").replace(/\\s*}\\s*/g, \"}\").replace(/\\s*;\\s*/g, \";\").trim();\n}\nexport {\n TwCssInjector,\n useTwClasses\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAAkB;AAClB,eAAe,cAAc,QAAQ,CAAC,GAAG;AACvC,QAAM,EAAE,OAAO,gBAAgB,MAAM,SAAS,MAAM,OAAO,IAAI;AAC/D,MAAI,KAAK;AACT,MAAI,OAAO;AACX,MAAI;AACF,SAAK,MAAM,OAAO,IAAS;AAC3B,WAAO,MAAM,OAAO,MAAW;AAAA,EACjC,QAAQ;AACN;AAAA,MACE;AAAA,IACF;AACA,WAAO,aAAAA,QAAM,cAAc,aAAAA,QAAM,UAAU,IAAI;AAAA,EACjD;AACA,QAAM,cAAc,UAAU,KAAK,KAAK,QAAQ,IAAI,GAAG,SAAS,UAAU,OAAO,IAAI;AACrF,QAAM,eAAe,KAAK,KAAK,aAAa,mBAAmB;AAC/D,MAAI,WAAW,CAAC;AAChB,MAAI;AACF,QAAI,GAAG,WAAW,YAAY,GAAG;AAC/B,iBAAW,KAAK,MAAM,GAAG,aAAa,cAAc,OAAO,CAAC;AAAA,IAC9D,OAAO;AACL;AAAA,QACE,oDAAoD,YAAY;AAAA,MAClE;AACA,aAAO,aAAAA,QAAM,cAAc,aAAAA,QAAM,UAAU,IAAI;AAAA,IACjD;AAAA,EACF,SAAS,KAAK;AACZ;AAAA,MACE,0CAA0C,YAAY,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC9G;AACA,WAAO,aAAAA,QAAM,cAAc,aAAAA,QAAM,UAAU,IAAI;AAAA,EACjD;AACA,QAAM,YAAY,CAAC;AACnB,MAAI,iBAAiB,SAAS,SAAS,UAAU,GAAG;AAClD,UAAM,aAAa,KAAK,KAAK,aAAa,SAAS,OAAO,UAAU,CAAC;AACrE,UAAM,MAAM,SAAS,IAAI,UAAU;AACnC,QAAI,IAAK,WAAU,KAAK,GAAG;AAAA,EAC7B;AACA,QAAM,cAAc,SAAS;AAC7B,MAAI,SAAS,SAAS,WAAW,GAAG;AAClC,UAAM,YAAY,KAAK,KAAK,aAAa,SAAS,OAAO,WAAW,CAAC;AACrE,UAAM,MAAM,SAAS,IAAI,SAAS;AAClC,QAAI,IAAK,WAAU,KAAK,GAAG;AAAA,EAC7B;AACA,MAAI,UAAU,WAAW,EAAG,QAAO,aAAAA,QAAM,cAAc,aAAAA,QAAM,UAAU,IAAI;AAC3E,QAAM,WAAW,UAAU,KAAK,IAAI;AACpC,QAAM,QAAQ,SAAS,UAAU,QAAQ,IAAI;AAC7C,SAAO,aAAAA,QAAM,cAAc,SAAS;AAAA,IAClC,yBAAyB,EAAE,QAAQ,MAAM;AAAA,IACzC,iBAAiB;AAAA,IACjB,oBAAoB;AAAA,EACtB,CAAC;AACH;AACA,SAAS,aAAa,SAAS;AAC7B,SAAO;AACT;AACA,IAAM,aAA6B,oBAAI,IAAI;AAC3C,SAAS,YAAY,SAAS;AAC5B,MAAI,QAAQ,IAAI,aAAa,aAAc;AAC3C,MAAI,WAAW,IAAI,OAAO,EAAG;AAC7B,aAAW,IAAI,OAAO;AACtB,UAAQ,KAAK,wBAAwB,OAAO,EAAE;AAChD;AACA,SAAS,SAAS,IAAI,UAAU;AAC9B,MAAI;AACF,QAAI,GAAG,WAAW,QAAQ,EAAG,QAAO,GAAG,aAAa,UAAU,OAAO;AAAA,EACvE,QAAQ;AAAA,EACR;AACA,SAAO;AACT;AACA,SAAS,UAAU,KAAK;AACtB,SAAO,IAAI,QAAQ,mCAAmC,EAAE,EAAE,QAAQ,QAAQ,GAAG,EAAE,QAAQ,YAAY,GAAG,EAAE,QAAQ,YAAY,GAAG,EAAE,QAAQ,YAAY,GAAG,EAAE,KAAK;AACjK;","names":["React"]}
|
package/dist/runtime-css.mjs
CHANGED
|
@@ -1,97 +1,79 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
if (process.env.NODE_ENV === "development") {
|
|
28
|
-
console.warn("[tw] insertRule failed, falling back to textContent append for rule:", trimmed.slice(0, 80));
|
|
29
|
-
}
|
|
1
|
+
// packages/domain/runtime-css/dist/CssInjector.js
|
|
2
|
+
import React from "react";
|
|
3
|
+
async function TwCssInjector(props = {}) {
|
|
4
|
+
const { route, includeGlobal = true, minify = true, cssDir } = props;
|
|
5
|
+
let fs = null;
|
|
6
|
+
let path = null;
|
|
7
|
+
try {
|
|
8
|
+
fs = await import("fs");
|
|
9
|
+
path = await import("path");
|
|
10
|
+
} catch {
|
|
11
|
+
warnOnceDev(
|
|
12
|
+
"TwCssInjector dipanggil tapi gak bisa akses 'node:fs'/'node:path' (kemungkinan jalan di environment non-Node, misal Edge runtime). CSS injection di-skip \u2014 komponen tetap render normal, tapi route CSS lo gak ikut inline."
|
|
13
|
+
);
|
|
14
|
+
return React.createElement(React.Fragment, null);
|
|
15
|
+
}
|
|
16
|
+
const resolvedDir = cssDir ?? path.join(process.cwd(), ".next", "static", "css", "tw");
|
|
17
|
+
const manifestPath = path.join(resolvedDir, "css-manifest.json");
|
|
18
|
+
let manifest = {};
|
|
19
|
+
try {
|
|
20
|
+
if (fs.existsSync(manifestPath)) {
|
|
21
|
+
manifest = JSON.parse(fs.readFileSync(manifestPath, "utf-8"));
|
|
22
|
+
} else {
|
|
23
|
+
warnOnceDev(
|
|
24
|
+
`TwCssInjector aktif tapi manifest gak ketemu di "${manifestPath}". CSS injection di-skip diam-diam \u2014 biasanya ini berarti "routeCss: true" belum diset di withTailwindStyled(...) di next.config, atau dev/build server belum sempat generate manifest-nya. Cek konfigurasi sebelum lanjut.`
|
|
25
|
+
);
|
|
26
|
+
return React.createElement(React.Fragment, null);
|
|
30
27
|
}
|
|
28
|
+
} catch (err) {
|
|
29
|
+
warnOnceDev(
|
|
30
|
+
`TwCssInjector gagal parse manifest di "${manifestPath}": ${err instanceof Error ? err.message : String(err)}. CSS injection di-skip \u2014 manifest mungkin korup atau lagi setengah ditulis saat dibaca.`
|
|
31
|
+
);
|
|
32
|
+
return React.createElement(React.Fragment, null);
|
|
31
33
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
if (!cssRule || injected.has(cssRule)) return;
|
|
38
|
-
injected.add(cssRule);
|
|
39
|
-
pending.push(cssRule);
|
|
40
|
-
if (_state.rafHandle === null) {
|
|
41
|
-
_state.rafHandle = requestAnimationFrame(flushBatchedCss);
|
|
34
|
+
const cssChunks = [];
|
|
35
|
+
if (includeGlobal && manifest.routes?.["__global"]) {
|
|
36
|
+
const globalPath = path.join(resolvedDir, manifest.routes["__global"]);
|
|
37
|
+
const css = readFile(fs, globalPath);
|
|
38
|
+
if (css) cssChunks.push(css);
|
|
42
39
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
for (const rule of rules) {
|
|
49
|
-
insertRuleToSheet(rule);
|
|
40
|
+
const targetRoute = route ?? "/";
|
|
41
|
+
if (manifest.routes?.[targetRoute]) {
|
|
42
|
+
const routePath = path.join(resolvedDir, manifest.routes[targetRoute]);
|
|
43
|
+
const css = readFile(fs, routePath);
|
|
44
|
+
if (css) cssChunks.push(css);
|
|
50
45
|
}
|
|
46
|
+
if (cssChunks.length === 0) return React.createElement(React.Fragment, null);
|
|
47
|
+
const combined = cssChunks.join("\n");
|
|
48
|
+
const final = minify ? minifyCss(combined) : combined;
|
|
49
|
+
return React.createElement("style", {
|
|
50
|
+
dangerouslySetInnerHTML: { __html: final },
|
|
51
|
+
"data-tw-route": targetRoute,
|
|
52
|
+
"data-tw-injector": "true"
|
|
53
|
+
});
|
|
51
54
|
}
|
|
52
|
-
function
|
|
53
|
-
|
|
54
|
-
if (!cssRule || injected.has(cssRule)) return;
|
|
55
|
-
injected.add(cssRule);
|
|
56
|
-
insertRuleToSheet(cssRule);
|
|
55
|
+
function useTwClasses(classes) {
|
|
56
|
+
return classes;
|
|
57
57
|
}
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
var warnedKeys = /* @__PURE__ */ new Set();
|
|
59
|
+
function warnOnceDev(message) {
|
|
60
|
+
if (process.env.NODE_ENV === "production") return;
|
|
61
|
+
if (warnedKeys.has(message)) return;
|
|
62
|
+
warnedKeys.add(message);
|
|
63
|
+
console.warn(`[tailwind-styled-v4] ${message}`);
|
|
60
64
|
}
|
|
61
|
-
function
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
cancelAnimationFrame(_state.rafHandle);
|
|
66
|
-
_state.rafHandle = null;
|
|
67
|
-
}
|
|
68
|
-
if (typeof document !== "undefined" && _state.styleEl && document.head.contains(_state.styleEl)) {
|
|
69
|
-
document.head.removeChild(_state.styleEl);
|
|
70
|
-
_state.styleEl = null;
|
|
71
|
-
} else {
|
|
72
|
-
_state.styleEl = null;
|
|
65
|
+
function readFile(fs, filepath) {
|
|
66
|
+
try {
|
|
67
|
+
if (fs.existsSync(filepath)) return fs.readFileSync(filepath, "utf-8");
|
|
68
|
+
} catch {
|
|
73
69
|
}
|
|
70
|
+
return null;
|
|
74
71
|
}
|
|
75
|
-
function
|
|
76
|
-
return {
|
|
77
|
-
totalInjected: injected.size,
|
|
78
|
-
pendingCount: pending.length,
|
|
79
|
-
hasBatchScheduled: _state.rafHandle !== null
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// packages/domain/runtime-css/dist/CssInjector.js
|
|
84
|
-
import React from "react";
|
|
85
|
-
function useTwClasses(classes) {
|
|
86
|
-
return classes;
|
|
72
|
+
function minifyCss(css) {
|
|
73
|
+
return css.replace(/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g, "").replace(/\s+/g, " ").replace(/\s*{\s*/g, "{").replace(/\s*}\s*/g, "}").replace(/\s*;\s*/g, ";").trim();
|
|
87
74
|
}
|
|
88
75
|
export {
|
|
89
|
-
|
|
90
|
-
flushBatchedCss,
|
|
91
|
-
getBatchedCssStats,
|
|
92
|
-
isInjected,
|
|
93
|
-
resetBatchedCss,
|
|
94
|
-
syncInject,
|
|
76
|
+
TwCssInjector,
|
|
95
77
|
useTwClasses
|
|
96
78
|
};
|
|
97
79
|
/* tailwind-styled-v4 v5.1.9 | MIT | https://github.com/dictionar32/tailwind-styled-v4 */
|
package/dist/runtime-css.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../packages/domain/runtime-css/dist/
|
|
1
|
+
{"version":3,"sources":["../packages/domain/runtime-css/dist/CssInjector.js"],"sourcesContent":["import React from \"react\";\nasync function TwCssInjector(props = {}) {\n const { route, includeGlobal = true, minify = true, cssDir } = props;\n let fs = null;\n let path = null;\n try {\n fs = await import(\"node:fs\");\n path = await import(\"node:path\");\n } catch {\n warnOnceDev(\n \"TwCssInjector dipanggil tapi gak bisa akses 'node:fs'/'node:path' (kemungkinan jalan di environment non-Node, misal Edge runtime). CSS injection di-skip \\u2014 komponen tetap render normal, tapi route CSS lo gak ikut inline.\"\n );\n return React.createElement(React.Fragment, null);\n }\n const resolvedDir = cssDir ?? path.join(process.cwd(), \".next\", \"static\", \"css\", \"tw\");\n const manifestPath = path.join(resolvedDir, \"css-manifest.json\");\n let manifest = {};\n try {\n if (fs.existsSync(manifestPath)) {\n manifest = JSON.parse(fs.readFileSync(manifestPath, \"utf-8\"));\n } else {\n warnOnceDev(\n `TwCssInjector aktif tapi manifest gak ketemu di \"${manifestPath}\". CSS injection di-skip diam-diam \\u2014 biasanya ini berarti \"routeCss: true\" belum diset di withTailwindStyled(...) di next.config, atau dev/build server belum sempat generate manifest-nya. Cek konfigurasi sebelum lanjut.`\n );\n return React.createElement(React.Fragment, null);\n }\n } catch (err) {\n warnOnceDev(\n `TwCssInjector gagal parse manifest di \"${manifestPath}\": ${err instanceof Error ? err.message : String(err)}. CSS injection di-skip \\u2014 manifest mungkin korup atau lagi setengah ditulis saat dibaca.`\n );\n return React.createElement(React.Fragment, null);\n }\n const cssChunks = [];\n if (includeGlobal && manifest.routes?.[\"__global\"]) {\n const globalPath = path.join(resolvedDir, manifest.routes[\"__global\"]);\n const css = readFile(fs, globalPath);\n if (css) cssChunks.push(css);\n }\n const targetRoute = route ?? \"/\";\n if (manifest.routes?.[targetRoute]) {\n const routePath = path.join(resolvedDir, manifest.routes[targetRoute]);\n const css = readFile(fs, routePath);\n if (css) cssChunks.push(css);\n }\n if (cssChunks.length === 0) return React.createElement(React.Fragment, null);\n const combined = cssChunks.join(\"\\n\");\n const final = minify ? minifyCss(combined) : combined;\n return React.createElement(\"style\", {\n dangerouslySetInnerHTML: { __html: final },\n \"data-tw-route\": targetRoute,\n \"data-tw-injector\": \"true\"\n });\n}\nfunction useTwClasses(classes) {\n return classes;\n}\nconst warnedKeys = /* @__PURE__ */ new Set();\nfunction warnOnceDev(message) {\n if (process.env.NODE_ENV === \"production\") return;\n if (warnedKeys.has(message)) return;\n warnedKeys.add(message);\n console.warn(`[tailwind-styled-v4] ${message}`);\n}\nfunction readFile(fs, filepath) {\n try {\n if (fs.existsSync(filepath)) return fs.readFileSync(filepath, \"utf-8\");\n } catch {\n }\n return null;\n}\nfunction minifyCss(css) {\n return css.replace(/\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//g, \"\").replace(/\\s+/g, \" \").replace(/\\s*{\\s*/g, \"{\").replace(/\\s*}\\s*/g, \"}\").replace(/\\s*;\\s*/g, \";\").trim();\n}\nexport {\n TwCssInjector,\n useTwClasses\n};\n"],"mappings":";AAAA,OAAO,WAAW;AAClB,eAAe,cAAc,QAAQ,CAAC,GAAG;AACvC,QAAM,EAAE,OAAO,gBAAgB,MAAM,SAAS,MAAM,OAAO,IAAI;AAC/D,MAAI,KAAK;AACT,MAAI,OAAO;AACX,MAAI;AACF,SAAK,MAAM,OAAO,IAAS;AAC3B,WAAO,MAAM,OAAO,MAAW;AAAA,EACjC,QAAQ;AACN;AAAA,MACE;AAAA,IACF;AACA,WAAO,MAAM,cAAc,MAAM,UAAU,IAAI;AAAA,EACjD;AACA,QAAM,cAAc,UAAU,KAAK,KAAK,QAAQ,IAAI,GAAG,SAAS,UAAU,OAAO,IAAI;AACrF,QAAM,eAAe,KAAK,KAAK,aAAa,mBAAmB;AAC/D,MAAI,WAAW,CAAC;AAChB,MAAI;AACF,QAAI,GAAG,WAAW,YAAY,GAAG;AAC/B,iBAAW,KAAK,MAAM,GAAG,aAAa,cAAc,OAAO,CAAC;AAAA,IAC9D,OAAO;AACL;AAAA,QACE,oDAAoD,YAAY;AAAA,MAClE;AACA,aAAO,MAAM,cAAc,MAAM,UAAU,IAAI;AAAA,IACjD;AAAA,EACF,SAAS,KAAK;AACZ;AAAA,MACE,0CAA0C,YAAY,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC9G;AACA,WAAO,MAAM,cAAc,MAAM,UAAU,IAAI;AAAA,EACjD;AACA,QAAM,YAAY,CAAC;AACnB,MAAI,iBAAiB,SAAS,SAAS,UAAU,GAAG;AAClD,UAAM,aAAa,KAAK,KAAK,aAAa,SAAS,OAAO,UAAU,CAAC;AACrE,UAAM,MAAM,SAAS,IAAI,UAAU;AACnC,QAAI,IAAK,WAAU,KAAK,GAAG;AAAA,EAC7B;AACA,QAAM,cAAc,SAAS;AAC7B,MAAI,SAAS,SAAS,WAAW,GAAG;AAClC,UAAM,YAAY,KAAK,KAAK,aAAa,SAAS,OAAO,WAAW,CAAC;AACrE,UAAM,MAAM,SAAS,IAAI,SAAS;AAClC,QAAI,IAAK,WAAU,KAAK,GAAG;AAAA,EAC7B;AACA,MAAI,UAAU,WAAW,EAAG,QAAO,MAAM,cAAc,MAAM,UAAU,IAAI;AAC3E,QAAM,WAAW,UAAU,KAAK,IAAI;AACpC,QAAM,QAAQ,SAAS,UAAU,QAAQ,IAAI;AAC7C,SAAO,MAAM,cAAc,SAAS;AAAA,IAClC,yBAAyB,EAAE,QAAQ,MAAM;AAAA,IACzC,iBAAiB;AAAA,IACjB,oBAAoB;AAAA,EACtB,CAAC;AACH;AACA,SAAS,aAAa,SAAS;AAC7B,SAAO;AACT;AACA,IAAM,aAA6B,oBAAI,IAAI;AAC3C,SAAS,YAAY,SAAS;AAC5B,MAAI,QAAQ,IAAI,aAAa,aAAc;AAC3C,MAAI,WAAW,IAAI,OAAO,EAAG;AAC7B,aAAW,IAAI,OAAO;AACtB,UAAQ,KAAK,wBAAwB,OAAO,EAAE;AAChD;AACA,SAAS,SAAS,IAAI,UAAU;AAC9B,MAAI;AACF,QAAI,GAAG,WAAW,QAAQ,EAAG,QAAO,GAAG,aAAa,UAAU,OAAO;AAAA,EACvE,QAAQ;AAAA,EACR;AACA,SAAO;AACT;AACA,SAAS,UAAU,KAAK;AACtB,SAAO,IAAI,QAAQ,mCAAmC,EAAE,EAAE,QAAQ,QAAQ,GAAG,EAAE,QAAQ,YAAY,GAAG,EAAE,QAAQ,YAAY,GAAG,EAAE,QAAQ,YAAY,GAAG,EAAE,KAAK;AACjK;","names":[]}
|
package/dist/runtime.js
CHANGED
|
@@ -75,11 +75,18 @@ ${vars}
|
|
|
75
75
|
var createLiveTokenEngine = () => {
|
|
76
76
|
const state = {
|
|
77
77
|
currentTokens: {},
|
|
78
|
-
styleEl: null
|
|
78
|
+
styleEl: null,
|
|
79
|
+
// Belum boleh nyentuh live DOM sampai komponen pertama selesai mount.
|
|
80
|
+
// Ini yang nyegah hydration mismatch: tanpa flag ini, liveToken() yang
|
|
81
|
+
// dipanggil di module top-level akan langsung document.documentElement
|
|
82
|
+
// .style.setProperty(...) saat bundle client di-evaluasi — JAUH sebelum
|
|
83
|
+
// React selesai hydrate — sehingga <html> versi live DOM beda dengan
|
|
84
|
+
// <html> yang di-render server (yang gak pernah nyentuh `document`).
|
|
85
|
+
hydrated: false
|
|
79
86
|
};
|
|
80
87
|
const subscribers = /* @__PURE__ */ new Set();
|
|
81
88
|
const syncStyleEl = () => {
|
|
82
|
-
if (typeof document === "undefined") return;
|
|
89
|
+
if (!state.hydrated || typeof document === "undefined") return;
|
|
83
90
|
if (!state.styleEl) {
|
|
84
91
|
const styleEl = document.createElement("style");
|
|
85
92
|
styleEl.id = "tw-live-tokens";
|
|
@@ -100,7 +107,7 @@ var createLiveTokenEngine = () => {
|
|
|
100
107
|
};
|
|
101
108
|
const setToken2 = (name, value) => {
|
|
102
109
|
state.currentTokens = { ...state.currentTokens, [name]: value };
|
|
103
|
-
if (typeof document !== "undefined") {
|
|
110
|
+
if (state.hydrated && typeof document !== "undefined") {
|
|
104
111
|
document.documentElement.style.setProperty(tokenVar(name), value);
|
|
105
112
|
}
|
|
106
113
|
syncStyleEl();
|
|
@@ -108,7 +115,7 @@ var createLiveTokenEngine = () => {
|
|
|
108
115
|
};
|
|
109
116
|
const setTokens2 = (tokens) => {
|
|
110
117
|
state.currentTokens = { ...state.currentTokens, ...tokens };
|
|
111
|
-
if (typeof document !== "undefined") {
|
|
118
|
+
if (state.hydrated && typeof document !== "undefined") {
|
|
112
119
|
const root = document.documentElement;
|
|
113
120
|
for (const [name, value] of Object.entries(tokens)) {
|
|
114
121
|
root.style.setProperty(tokenVar(name), value);
|
|
@@ -118,7 +125,7 @@ var createLiveTokenEngine = () => {
|
|
|
118
125
|
notifySubscribers();
|
|
119
126
|
};
|
|
120
127
|
const applyTokenSet2 = (tokens) => {
|
|
121
|
-
if (typeof document !== "undefined") {
|
|
128
|
+
if (state.hydrated && typeof document !== "undefined") {
|
|
122
129
|
const root = document.documentElement;
|
|
123
130
|
for (const name of Object.keys(state.currentTokens)) {
|
|
124
131
|
if (!(name in tokens)) {
|
|
@@ -133,7 +140,20 @@ var createLiveTokenEngine = () => {
|
|
|
133
140
|
syncStyleEl();
|
|
134
141
|
notifySubscribers();
|
|
135
142
|
};
|
|
143
|
+
const markHydrated = () => {
|
|
144
|
+
if (state.hydrated || typeof document === "undefined") return;
|
|
145
|
+
state.hydrated = true;
|
|
146
|
+
const root = document.documentElement;
|
|
147
|
+
for (const [name, value] of Object.entries(state.currentTokens)) {
|
|
148
|
+
root.style.setProperty(tokenVar(name), value);
|
|
149
|
+
}
|
|
150
|
+
syncStyleEl();
|
|
151
|
+
};
|
|
152
|
+
if (typeof window !== "undefined") {
|
|
153
|
+
requestAnimationFrame(markHydrated);
|
|
154
|
+
}
|
|
136
155
|
return {
|
|
156
|
+
markHydrated,
|
|
137
157
|
liveToken(tokens) {
|
|
138
158
|
setTokens2(tokens);
|
|
139
159
|
const vars = {};
|
|
@@ -203,8 +223,9 @@ function generateTokenCssString() {
|
|
|
203
223
|
}
|
|
204
224
|
function createUseTokens() {
|
|
205
225
|
return function useTokens() {
|
|
206
|
-
const [tokens, setTokensState] = import_react.default.useState(
|
|
226
|
+
const [tokens, setTokensState] = import_react.default.useState({});
|
|
207
227
|
import_react.default.useEffect(() => {
|
|
228
|
+
engine.markHydrated();
|
|
208
229
|
setTokensState(engine.getTokens());
|
|
209
230
|
return engine.subscribe((nextTokens) => setTokensState(nextTokens));
|
|
210
231
|
}, []);
|