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.
@@ -1,2 +1 @@
1
- export { batchedInject, flushBatchedCss, getBatchedCssStats, isInjected, resetBatchedCss, syncInject } from '@tailwind-styled/runtime-css/client';
2
- export { useTwClasses } from '@tailwind-styled/runtime-css/server';
1
+ export { TwCssInjector, useTwClasses } from '@tailwind-styled/runtime-css/server';
@@ -1,2 +1 @@
1
- export { batchedInject, flushBatchedCss, getBatchedCssStats, isInjected, resetBatchedCss, syncInject } from '@tailwind-styled/runtime-css/client';
2
- export { useTwClasses } from '@tailwind-styled/runtime-css/server';
1
+ export { TwCssInjector, useTwClasses } from '@tailwind-styled/runtime-css/server';
@@ -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
- batchedInject: () => batchedInject,
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/batchedInjector.js
45
- var injected = /* @__PURE__ */ new Set();
46
- var pending = [];
47
- var _state = {
48
- rafHandle: null,
49
- styleEl: null
50
- };
51
- function getStyleElement() {
52
- if (_state.styleEl && document.head.contains(_state.styleEl)) return _state.styleEl;
53
- _state.styleEl = document.createElement("style");
54
- _state.styleEl.id = "__tw-runtime-css";
55
- _state.styleEl.setAttribute("data-tw-batched", "true");
56
- document.head.appendChild(_state.styleEl);
57
- return _state.styleEl;
58
- }
59
- function insertRuleToSheet(cssRule) {
60
- const trimmed = cssRule.trim();
61
- if (!trimmed) return;
62
- const el = getStyleElement();
63
- const sheet = el.sheet;
64
- if (sheet) {
65
- try {
66
- sheet.insertRule(trimmed, sheet.cssRules.length);
67
- return;
68
- } catch {
69
- if (process.env.NODE_ENV === "development") {
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
- el.textContent = (el.textContent ?? "") + `
75
- ${trimmed}`;
76
- }
77
- function batchedInject(cssRule) {
78
- if (typeof window === "undefined") return;
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
- function flushBatchedCss() {
87
- _state.rafHandle = null;
88
- if (pending.length === 0 || typeof document === "undefined") return;
89
- const rules = pending.splice(0);
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 syncInject(cssRule) {
95
- if (typeof document === "undefined") return;
96
- if (!cssRule || injected.has(cssRule)) return;
97
- injected.add(cssRule);
98
- insertRuleToSheet(cssRule);
92
+ function useTwClasses(classes) {
93
+ return classes;
99
94
  }
100
- function isInjected(cssRule) {
101
- return injected.has(cssRule);
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 resetBatchedCss() {
104
- injected.clear();
105
- pending.length = 0;
106
- if (_state.rafHandle !== null) {
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 getBatchedCssStats() {
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
- batchedInject,
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 */
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/umbrella/runtime-css.ts","../packages/domain/runtime-css/dist/batchedInjector.js","../packages/domain/runtime-css/dist/CssInjector.js"],"sourcesContent":["// runtime-css client utilities (batchedInjector) safe to bundle with \"use client\"\n// TwCssInjector (Server Component) is intentionally NOT re-exported here because\n// it is an async RSC and must NOT be in a \"use client\" bundle.\n// Import it directly: import { TwCssInjector } from \"tailwind-styled-v4/runtime-css/server\"\nexport {\n batchedInject,\n flushBatchedCss,\n getBatchedCssStats,\n isInjected,\n resetBatchedCss,\n syncInject,\n} from \"@tailwind-styled/runtime-css/client\"\nexport { useTwClasses } from \"@tailwind-styled/runtime-css/server\"\n","\"use client\";\nconst injected = /* @__PURE__ */ new Set();\nconst pending = [];\nconst _state = {\n rafHandle: null,\n styleEl: null\n};\nfunction getStyleElement() {\n if (_state.styleEl && document.head.contains(_state.styleEl)) return _state.styleEl;\n _state.styleEl = document.createElement(\"style\");\n _state.styleEl.id = \"__tw-runtime-css\";\n _state.styleEl.setAttribute(\"data-tw-batched\", \"true\");\n document.head.appendChild(_state.styleEl);\n return _state.styleEl;\n}\nfunction insertRuleToSheet(cssRule) {\n const trimmed = cssRule.trim();\n if (!trimmed) return;\n const el = getStyleElement();\n const sheet = el.sheet;\n if (sheet) {\n try {\n sheet.insertRule(trimmed, sheet.cssRules.length);\n return;\n } catch {\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[tw] insertRule failed, falling back to textContent append for rule:\", trimmed.slice(0, 80));\n }\n }\n }\n el.textContent = (el.textContent ?? \"\") + `\n${trimmed}`;\n}\nfunction batchedInject(cssRule) {\n if (typeof window === \"undefined\") return;\n if (!cssRule || injected.has(cssRule)) return;\n injected.add(cssRule);\n pending.push(cssRule);\n if (_state.rafHandle === null) {\n _state.rafHandle = requestAnimationFrame(flushBatchedCss);\n }\n}\nfunction flushBatchedCss() {\n _state.rafHandle = null;\n if (pending.length === 0 || typeof document === \"undefined\") return;\n const rules = pending.splice(0);\n for (const rule of rules) {\n insertRuleToSheet(rule);\n }\n}\nfunction syncInject(cssRule) {\n if (typeof document === \"undefined\") return;\n if (!cssRule || injected.has(cssRule)) return;\n injected.add(cssRule);\n insertRuleToSheet(cssRule);\n}\nfunction isInjected(cssRule) {\n return injected.has(cssRule);\n}\nfunction resetBatchedCss() {\n injected.clear();\n pending.length = 0;\n if (_state.rafHandle !== null) {\n cancelAnimationFrame(_state.rafHandle);\n _state.rafHandle = null;\n }\n if (typeof document !== \"undefined\" && _state.styleEl && document.head.contains(_state.styleEl)) {\n document.head.removeChild(_state.styleEl);\n _state.styleEl = null;\n } else {\n _state.styleEl = null;\n }\n}\nfunction getBatchedCssStats() {\n return {\n totalInjected: injected.size,\n pendingCount: pending.length,\n hasBatchScheduled: _state.rafHandle !== null\n };\n}\nexport {\n batchedInject,\n flushBatchedCss,\n getBatchedCssStats,\n isInjected,\n resetBatchedCss,\n syncInject\n};\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 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 }\n } catch {\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}\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;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCA,IAAM,WAA2B,oBAAI,IAAI;AACzC,IAAM,UAAU,CAAC;AACjB,IAAM,SAAS;AAAA,EACb,WAAW;AAAA,EACX,SAAS;AACX;AACA,SAAS,kBAAkB;AACzB,MAAI,OAAO,WAAW,SAAS,KAAK,SAAS,OAAO,OAAO,EAAG,QAAO,OAAO;AAC5E,SAAO,UAAU,SAAS,cAAc,OAAO;AAC/C,SAAO,QAAQ,KAAK;AACpB,SAAO,QAAQ,aAAa,mBAAmB,MAAM;AACrD,WAAS,KAAK,YAAY,OAAO,OAAO;AACxC,SAAO,OAAO;AAChB;AACA,SAAS,kBAAkB,SAAS;AAClC,QAAM,UAAU,QAAQ,KAAK;AAC7B,MAAI,CAAC,QAAS;AACd,QAAM,KAAK,gBAAgB;AAC3B,QAAM,QAAQ,GAAG;AACjB,MAAI,OAAO;AACT,QAAI;AACF,YAAM,WAAW,SAAS,MAAM,SAAS,MAAM;AAC/C;AAAA,IACF,QAAQ;AACN,UAAI,QAAQ,IAAI,aAAa,eAAe;AAC1C,gBAAQ,KAAK,wEAAwE,QAAQ,MAAM,GAAG,EAAE,CAAC;AAAA,MAC3G;AAAA,IACF;AAAA,EACF;AACA,KAAG,eAAe,GAAG,eAAe,MAAM;AAAA,EAC1C,OAAO;AACT;AACA,SAAS,cAAc,SAAS;AAC9B,MAAI,OAAO,WAAW,YAAa;AACnC,MAAI,CAAC,WAAW,SAAS,IAAI,OAAO,EAAG;AACvC,WAAS,IAAI,OAAO;AACpB,UAAQ,KAAK,OAAO;AACpB,MAAI,OAAO,cAAc,MAAM;AAC7B,WAAO,YAAY,sBAAsB,eAAe;AAAA,EAC1D;AACF;AACA,SAAS,kBAAkB;AACzB,SAAO,YAAY;AACnB,MAAI,QAAQ,WAAW,KAAK,OAAO,aAAa,YAAa;AAC7D,QAAM,QAAQ,QAAQ,OAAO,CAAC;AAC9B,aAAW,QAAQ,OAAO;AACxB,sBAAkB,IAAI;AAAA,EACxB;AACF;AACA,SAAS,WAAW,SAAS;AAC3B,MAAI,OAAO,aAAa,YAAa;AACrC,MAAI,CAAC,WAAW,SAAS,IAAI,OAAO,EAAG;AACvC,WAAS,IAAI,OAAO;AACpB,oBAAkB,OAAO;AAC3B;AACA,SAAS,WAAW,SAAS;AAC3B,SAAO,SAAS,IAAI,OAAO;AAC7B;AACA,SAAS,kBAAkB;AACzB,WAAS,MAAM;AACf,UAAQ,SAAS;AACjB,MAAI,OAAO,cAAc,MAAM;AAC7B,yBAAqB,OAAO,SAAS;AACrC,WAAO,YAAY;AAAA,EACrB;AACA,MAAI,OAAO,aAAa,eAAe,OAAO,WAAW,SAAS,KAAK,SAAS,OAAO,OAAO,GAAG;AAC/F,aAAS,KAAK,YAAY,OAAO,OAAO;AACxC,WAAO,UAAU;AAAA,EACnB,OAAO;AACL,WAAO,UAAU;AAAA,EACnB;AACF;AACA,SAAS,qBAAqB;AAC5B,SAAO;AAAA,IACL,eAAe,SAAS;AAAA,IACxB,cAAc,QAAQ;AAAA,IACtB,mBAAmB,OAAO,cAAc;AAAA,EAC1C;AACF;;;AC/EA,mBAAkB;AA0ClB,SAAS,aAAa,SAAS;AAC7B,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../src/umbrella/runtime-css.ts","../packages/domain/runtime-css/dist/CssInjector.js"],"sourcesContent":["// Server-safe entryhanya 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"]}
@@ -1,97 +1,79 @@
1
- "use client";
2
- // packages/domain/runtime-css/dist/batchedInjector.js
3
- var injected = /* @__PURE__ */ new Set();
4
- var pending = [];
5
- var _state = {
6
- rafHandle: null,
7
- styleEl: null
8
- };
9
- function getStyleElement() {
10
- if (_state.styleEl && document.head.contains(_state.styleEl)) return _state.styleEl;
11
- _state.styleEl = document.createElement("style");
12
- _state.styleEl.id = "__tw-runtime-css";
13
- _state.styleEl.setAttribute("data-tw-batched", "true");
14
- document.head.appendChild(_state.styleEl);
15
- return _state.styleEl;
16
- }
17
- function insertRuleToSheet(cssRule) {
18
- const trimmed = cssRule.trim();
19
- if (!trimmed) return;
20
- const el = getStyleElement();
21
- const sheet = el.sheet;
22
- if (sheet) {
23
- try {
24
- sheet.insertRule(trimmed, sheet.cssRules.length);
25
- return;
26
- } catch {
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
- el.textContent = (el.textContent ?? "") + `
33
- ${trimmed}`;
34
- }
35
- function batchedInject(cssRule) {
36
- if (typeof window === "undefined") return;
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
- function flushBatchedCss() {
45
- _state.rafHandle = null;
46
- if (pending.length === 0 || typeof document === "undefined") return;
47
- const rules = pending.splice(0);
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 syncInject(cssRule) {
53
- if (typeof document === "undefined") return;
54
- if (!cssRule || injected.has(cssRule)) return;
55
- injected.add(cssRule);
56
- insertRuleToSheet(cssRule);
55
+ function useTwClasses(classes) {
56
+ return classes;
57
57
  }
58
- function isInjected(cssRule) {
59
- return injected.has(cssRule);
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 resetBatchedCss() {
62
- injected.clear();
63
- pending.length = 0;
64
- if (_state.rafHandle !== null) {
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 getBatchedCssStats() {
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
- batchedInject,
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 */
@@ -1 +1 @@
1
- {"version":3,"sources":["../packages/domain/runtime-css/dist/batchedInjector.js","../packages/domain/runtime-css/dist/CssInjector.js"],"sourcesContent":["\"use client\";\nconst injected = /* @__PURE__ */ new Set();\nconst pending = [];\nconst _state = {\n rafHandle: null,\n styleEl: null\n};\nfunction getStyleElement() {\n if (_state.styleEl && document.head.contains(_state.styleEl)) return _state.styleEl;\n _state.styleEl = document.createElement(\"style\");\n _state.styleEl.id = \"__tw-runtime-css\";\n _state.styleEl.setAttribute(\"data-tw-batched\", \"true\");\n document.head.appendChild(_state.styleEl);\n return _state.styleEl;\n}\nfunction insertRuleToSheet(cssRule) {\n const trimmed = cssRule.trim();\n if (!trimmed) return;\n const el = getStyleElement();\n const sheet = el.sheet;\n if (sheet) {\n try {\n sheet.insertRule(trimmed, sheet.cssRules.length);\n return;\n } catch {\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[tw] insertRule failed, falling back to textContent append for rule:\", trimmed.slice(0, 80));\n }\n }\n }\n el.textContent = (el.textContent ?? \"\") + `\n${trimmed}`;\n}\nfunction batchedInject(cssRule) {\n if (typeof window === \"undefined\") return;\n if (!cssRule || injected.has(cssRule)) return;\n injected.add(cssRule);\n pending.push(cssRule);\n if (_state.rafHandle === null) {\n _state.rafHandle = requestAnimationFrame(flushBatchedCss);\n }\n}\nfunction flushBatchedCss() {\n _state.rafHandle = null;\n if (pending.length === 0 || typeof document === \"undefined\") return;\n const rules = pending.splice(0);\n for (const rule of rules) {\n insertRuleToSheet(rule);\n }\n}\nfunction syncInject(cssRule) {\n if (typeof document === \"undefined\") return;\n if (!cssRule || injected.has(cssRule)) return;\n injected.add(cssRule);\n insertRuleToSheet(cssRule);\n}\nfunction isInjected(cssRule) {\n return injected.has(cssRule);\n}\nfunction resetBatchedCss() {\n injected.clear();\n pending.length = 0;\n if (_state.rafHandle !== null) {\n cancelAnimationFrame(_state.rafHandle);\n _state.rafHandle = null;\n }\n if (typeof document !== \"undefined\" && _state.styleEl && document.head.contains(_state.styleEl)) {\n document.head.removeChild(_state.styleEl);\n _state.styleEl = null;\n } else {\n _state.styleEl = null;\n }\n}\nfunction getBatchedCssStats() {\n return {\n totalInjected: injected.size,\n pendingCount: pending.length,\n hasBatchScheduled: _state.rafHandle !== null\n };\n}\nexport {\n batchedInject,\n flushBatchedCss,\n getBatchedCssStats,\n isInjected,\n resetBatchedCss,\n syncInject\n};\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 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 }\n } catch {\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}\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":";AACA,IAAM,WAA2B,oBAAI,IAAI;AACzC,IAAM,UAAU,CAAC;AACjB,IAAM,SAAS;AAAA,EACb,WAAW;AAAA,EACX,SAAS;AACX;AACA,SAAS,kBAAkB;AACzB,MAAI,OAAO,WAAW,SAAS,KAAK,SAAS,OAAO,OAAO,EAAG,QAAO,OAAO;AAC5E,SAAO,UAAU,SAAS,cAAc,OAAO;AAC/C,SAAO,QAAQ,KAAK;AACpB,SAAO,QAAQ,aAAa,mBAAmB,MAAM;AACrD,WAAS,KAAK,YAAY,OAAO,OAAO;AACxC,SAAO,OAAO;AAChB;AACA,SAAS,kBAAkB,SAAS;AAClC,QAAM,UAAU,QAAQ,KAAK;AAC7B,MAAI,CAAC,QAAS;AACd,QAAM,KAAK,gBAAgB;AAC3B,QAAM,QAAQ,GAAG;AACjB,MAAI,OAAO;AACT,QAAI;AACF,YAAM,WAAW,SAAS,MAAM,SAAS,MAAM;AAC/C;AAAA,IACF,QAAQ;AACN,UAAI,QAAQ,IAAI,aAAa,eAAe;AAC1C,gBAAQ,KAAK,wEAAwE,QAAQ,MAAM,GAAG,EAAE,CAAC;AAAA,MAC3G;AAAA,IACF;AAAA,EACF;AACA,KAAG,eAAe,GAAG,eAAe,MAAM;AAAA,EAC1C,OAAO;AACT;AACA,SAAS,cAAc,SAAS;AAC9B,MAAI,OAAO,WAAW,YAAa;AACnC,MAAI,CAAC,WAAW,SAAS,IAAI,OAAO,EAAG;AACvC,WAAS,IAAI,OAAO;AACpB,UAAQ,KAAK,OAAO;AACpB,MAAI,OAAO,cAAc,MAAM;AAC7B,WAAO,YAAY,sBAAsB,eAAe;AAAA,EAC1D;AACF;AACA,SAAS,kBAAkB;AACzB,SAAO,YAAY;AACnB,MAAI,QAAQ,WAAW,KAAK,OAAO,aAAa,YAAa;AAC7D,QAAM,QAAQ,QAAQ,OAAO,CAAC;AAC9B,aAAW,QAAQ,OAAO;AACxB,sBAAkB,IAAI;AAAA,EACxB;AACF;AACA,SAAS,WAAW,SAAS;AAC3B,MAAI,OAAO,aAAa,YAAa;AACrC,MAAI,CAAC,WAAW,SAAS,IAAI,OAAO,EAAG;AACvC,WAAS,IAAI,OAAO;AACpB,oBAAkB,OAAO;AAC3B;AACA,SAAS,WAAW,SAAS;AAC3B,SAAO,SAAS,IAAI,OAAO;AAC7B;AACA,SAAS,kBAAkB;AACzB,WAAS,MAAM;AACf,UAAQ,SAAS;AACjB,MAAI,OAAO,cAAc,MAAM;AAC7B,yBAAqB,OAAO,SAAS;AACrC,WAAO,YAAY;AAAA,EACrB;AACA,MAAI,OAAO,aAAa,eAAe,OAAO,WAAW,SAAS,KAAK,SAAS,OAAO,OAAO,GAAG;AAC/F,aAAS,KAAK,YAAY,OAAO,OAAO;AACxC,WAAO,UAAU;AAAA,EACnB,OAAO;AACL,WAAO,UAAU;AAAA,EACnB;AACF;AACA,SAAS,qBAAqB;AAC5B,SAAO;AAAA,IACL,eAAe,SAAS;AAAA,IACxB,cAAc,QAAQ;AAAA,IACtB,mBAAmB,OAAO,cAAc;AAAA,EAC1C;AACF;;;AC/EA,OAAO,WAAW;AA0ClB,SAAS,aAAa,SAAS;AAC7B,SAAO;AACT;","names":[]}
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(engine.getTokens());
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
  }, []);