tailwind-styled-v4 4.0.0 → 5.0.1

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.
Files changed (194) hide show
  1. package/CHANGELOG.md +398 -0
  2. package/LICENSE +21 -0
  3. package/README.md +532 -0
  4. package/dist/analyzer.d.mts +114 -0
  5. package/dist/analyzer.d.ts +114 -0
  6. package/dist/analyzer.js +1555 -0
  7. package/dist/analyzer.js.map +1 -0
  8. package/dist/analyzer.mjs +1544 -0
  9. package/dist/analyzer.mjs.map +1 -0
  10. package/dist/animate.d.mts +46 -0
  11. package/dist/animate.d.ts +41 -112
  12. package/dist/animate.js +792 -235
  13. package/dist/animate.js.map +1 -1
  14. package/dist/animate.mjs +782 -0
  15. package/dist/animate.mjs.map +1 -0
  16. package/dist/atomic.d.mts +18 -0
  17. package/dist/atomic.d.ts +18 -0
  18. package/dist/atomic.js +191 -0
  19. package/dist/atomic.js.map +1 -0
  20. package/dist/atomic.mjs +185 -0
  21. package/dist/atomic.mjs.map +1 -0
  22. package/dist/cli.d.mts +1 -0
  23. package/dist/cli.d.ts +1 -0
  24. package/dist/cli.js +6063 -0
  25. package/dist/cli.js.map +1 -0
  26. package/dist/cli.mjs +6053 -0
  27. package/dist/cli.mjs.map +1 -0
  28. package/dist/{compiler.d.cts → compiler.d.mts} +503 -210
  29. package/dist/compiler.d.ts +503 -210
  30. package/dist/compiler.js +1549 -566
  31. package/dist/compiler.js.map +1 -1
  32. package/dist/{compiler.cjs → compiler.mjs} +1476 -627
  33. package/dist/compiler.mjs.map +1 -0
  34. package/dist/dashboard.d.mts +272 -0
  35. package/dist/dashboard.d.ts +272 -0
  36. package/dist/dashboard.js +249 -0
  37. package/dist/dashboard.js.map +1 -0
  38. package/dist/dashboard.mjs +239 -0
  39. package/dist/dashboard.mjs.map +1 -0
  40. package/dist/devtools.js +336 -211
  41. package/dist/devtools.js.map +1 -1
  42. package/dist/{devtools.cjs → devtools.mjs} +331 -220
  43. package/dist/devtools.mjs.map +1 -0
  44. package/dist/engine.d.mts +84 -0
  45. package/dist/engine.d.ts +84 -0
  46. package/dist/engine.js +3014 -0
  47. package/dist/engine.js.map +1 -0
  48. package/dist/engine.mjs +3005 -0
  49. package/dist/engine.mjs.map +1 -0
  50. package/dist/{index.d.cts → index.d.mts} +75 -4
  51. package/dist/index.d.ts +75 -4
  52. package/dist/index.js +1341 -149
  53. package/dist/index.js.map +1 -1
  54. package/dist/index.mjs +2162 -0
  55. package/dist/index.mjs.map +1 -0
  56. package/dist/liveTokenEngine-DYN3Zale.d.mts +34 -0
  57. package/dist/liveTokenEngine-DYN3Zale.d.ts +34 -0
  58. package/dist/next.d.mts +55 -0
  59. package/dist/next.d.ts +30 -20
  60. package/dist/next.js +6947 -149
  61. package/dist/next.js.map +1 -1
  62. package/dist/next.mjs +7050 -0
  63. package/dist/next.mjs.map +1 -0
  64. package/dist/plugin.d.mts +90 -0
  65. package/dist/plugin.d.ts +90 -0
  66. package/dist/plugin.js +185 -0
  67. package/dist/plugin.js.map +1 -0
  68. package/dist/plugin.mjs +174 -0
  69. package/dist/plugin.mjs.map +1 -0
  70. package/dist/pluginRegistry.d.mts +83 -0
  71. package/dist/pluginRegistry.d.ts +83 -0
  72. package/dist/pluginRegistry.js +303 -0
  73. package/dist/pluginRegistry.js.map +1 -0
  74. package/dist/pluginRegistry.mjs +298 -0
  75. package/dist/pluginRegistry.mjs.map +1 -0
  76. package/dist/{preset.d.cts → preset.d.mts} +29 -2
  77. package/dist/preset.d.ts +29 -2
  78. package/dist/preset.js +318 -21
  79. package/dist/preset.js.map +1 -1
  80. package/dist/preset.mjs +414 -0
  81. package/dist/preset.mjs.map +1 -0
  82. package/dist/rspack.d.mts +33 -0
  83. package/dist/rspack.d.ts +33 -0
  84. package/dist/rspack.js +55 -0
  85. package/dist/rspack.js.map +1 -0
  86. package/dist/rspack.mjs +45 -0
  87. package/dist/rspack.mjs.map +1 -0
  88. package/dist/runtime.d.mts +62 -0
  89. package/dist/runtime.d.ts +62 -0
  90. package/dist/runtime.js +207 -0
  91. package/dist/runtime.js.map +1 -0
  92. package/dist/runtime.mjs +188 -0
  93. package/dist/runtime.mjs.map +1 -0
  94. package/dist/runtimeCss.d.mts +65 -0
  95. package/dist/runtimeCss.d.ts +65 -0
  96. package/dist/runtimeCss.js +188 -0
  97. package/dist/runtimeCss.js.map +1 -0
  98. package/dist/runtimeCss.mjs +173 -0
  99. package/dist/runtimeCss.mjs.map +1 -0
  100. package/dist/scanner.d.mts +25 -0
  101. package/dist/scanner.d.ts +25 -0
  102. package/dist/scanner.js +717 -0
  103. package/dist/scanner.js.map +1 -0
  104. package/dist/scanner.mjs +703 -0
  105. package/dist/scanner.mjs.map +1 -0
  106. package/dist/shared.d.mts +85 -0
  107. package/dist/shared.d.ts +85 -0
  108. package/dist/shared.js +255 -0
  109. package/dist/shared.js.map +1 -0
  110. package/dist/shared.mjs +233 -0
  111. package/dist/shared.mjs.map +1 -0
  112. package/dist/storybookAddon.d.mts +108 -0
  113. package/dist/storybookAddon.d.ts +108 -0
  114. package/dist/storybookAddon.js +95 -0
  115. package/dist/storybookAddon.js.map +1 -0
  116. package/dist/storybookAddon.mjs +88 -0
  117. package/dist/storybookAddon.mjs.map +1 -0
  118. package/dist/svelte.d.mts +114 -0
  119. package/dist/svelte.d.ts +114 -0
  120. package/dist/svelte.js +67 -0
  121. package/dist/svelte.js.map +1 -0
  122. package/dist/svelte.mjs +59 -0
  123. package/dist/svelte.mjs.map +1 -0
  124. package/dist/testing.d.mts +185 -0
  125. package/dist/testing.d.ts +185 -0
  126. package/dist/testing.js +173 -0
  127. package/dist/testing.js.map +1 -0
  128. package/dist/testing.mjs +158 -0
  129. package/dist/testing.mjs.map +1 -0
  130. package/dist/{theme.d.cts → theme.d.mts} +18 -11
  131. package/dist/theme.d.ts +18 -11
  132. package/dist/theme.js +205 -19
  133. package/dist/theme.js.map +1 -1
  134. package/dist/theme.mjs +311 -0
  135. package/dist/theme.mjs.map +1 -0
  136. package/dist/types-DXr2PmGP.d.mts +31 -0
  137. package/dist/types-DXr2PmGP.d.ts +31 -0
  138. package/dist/vite.d.mts +51 -0
  139. package/dist/vite.d.ts +35 -6
  140. package/dist/vite.js +4254 -57
  141. package/dist/vite.js.map +1 -1
  142. package/dist/vite.mjs +4281 -0
  143. package/dist/vite.mjs.map +1 -0
  144. package/dist/vue.d.mts +89 -0
  145. package/dist/vue.d.ts +89 -0
  146. package/dist/vue.js +104 -0
  147. package/dist/vue.js.map +1 -0
  148. package/dist/vue.mjs +96 -0
  149. package/dist/vue.mjs.map +1 -0
  150. package/package.json +173 -67
  151. package/dist/animate.cjs +0 -252
  152. package/dist/animate.cjs.map +0 -1
  153. package/dist/animate.d.cts +0 -117
  154. package/dist/astTransform-ua-eapqs.d.cts +0 -41
  155. package/dist/astTransform-ua-eapqs.d.ts +0 -41
  156. package/dist/compiler.cjs.map +0 -1
  157. package/dist/css.cjs +0 -71
  158. package/dist/css.cjs.map +0 -1
  159. package/dist/css.d.cts +0 -45
  160. package/dist/css.d.ts +0 -45
  161. package/dist/css.js +0 -62
  162. package/dist/css.js.map +0 -1
  163. package/dist/devtools.cjs.map +0 -1
  164. package/dist/index.cjs +0 -1058
  165. package/dist/index.cjs.map +0 -1
  166. package/dist/next.cjs +0 -268
  167. package/dist/next.cjs.map +0 -1
  168. package/dist/next.d.cts +0 -45
  169. package/dist/plugins.cjs +0 -396
  170. package/dist/plugins.cjs.map +0 -1
  171. package/dist/plugins.d.cts +0 -231
  172. package/dist/plugins.d.ts +0 -231
  173. package/dist/plugins.js +0 -381
  174. package/dist/plugins.js.map +0 -1
  175. package/dist/preset.cjs +0 -129
  176. package/dist/preset.cjs.map +0 -1
  177. package/dist/theme.cjs +0 -154
  178. package/dist/theme.cjs.map +0 -1
  179. package/dist/turbopackLoader.cjs +0 -2689
  180. package/dist/turbopackLoader.cjs.map +0 -1
  181. package/dist/turbopackLoader.d.cts +0 -22
  182. package/dist/turbopackLoader.d.ts +0 -22
  183. package/dist/turbopackLoader.js +0 -2681
  184. package/dist/turbopackLoader.js.map +0 -1
  185. package/dist/vite.cjs +0 -105
  186. package/dist/vite.cjs.map +0 -1
  187. package/dist/vite.d.cts +0 -22
  188. package/dist/webpackLoader.cjs +0 -2670
  189. package/dist/webpackLoader.cjs.map +0 -1
  190. package/dist/webpackLoader.d.cts +0 -24
  191. package/dist/webpackLoader.d.ts +0 -24
  192. package/dist/webpackLoader.js +0 -2662
  193. package/dist/webpackLoader.js.map +0 -1
  194. /package/dist/{devtools.d.cts → devtools.d.mts} +0 -0
@@ -1,31 +1,6 @@
1
- 'use strict';
1
+ import React, { useState, useRef, useEffect, useCallback } from 'react';
2
2
 
3
- var React = require('react');
4
-
5
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
6
-
7
- var React__default = /*#__PURE__*/_interopDefault(React);
8
-
9
- /* tailwind-styled-v4 v4 | MIT | https://github.com/dictionar32/tailwind-styled-v4 */
10
- var __defProp = Object.defineProperty;
11
- var __defProps = Object.defineProperties;
12
- var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
13
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
14
- var __hasOwnProp = Object.prototype.hasOwnProperty;
15
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
16
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
17
- var __spreadValues = (a, b) => {
18
- for (var prop in b || (b = {}))
19
- if (__hasOwnProp.call(b, prop))
20
- __defNormalProp(a, prop, b[prop]);
21
- if (__getOwnPropSymbols)
22
- for (var prop of __getOwnPropSymbols(b)) {
23
- if (__propIsEnum.call(b, prop))
24
- __defNormalProp(a, prop, b[prop]);
25
- }
26
- return a;
27
- };
28
- var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
3
+ /* tailwind-styled-v4 v5.0.1 | MIT | https://github.com/dictionar32/tailwind-styled-v4 */
29
4
  function parseDataTw(dataTw) {
30
5
  if (!dataTw) return { name: "Unknown", classes: [] };
31
6
  const colonIdx = dataTw.indexOf(":");
@@ -38,15 +13,14 @@ function parseVariantAttr(v) {
38
13
  if (!v) return {};
39
14
  try {
40
15
  return JSON.parse(v);
41
- } catch (e) {
16
+ } catch {
42
17
  return {};
43
18
  }
44
19
  }
45
20
  function findNearestTwElement(el) {
46
- var _a;
47
21
  let cur = el;
48
22
  while (cur) {
49
- if ((_a = cur.dataset) == null ? void 0 : _a.tw) return cur;
23
+ if (cur.dataset?.tw) return cur;
50
24
  cur = cur.parentElement;
51
25
  }
52
26
  return null;
@@ -93,60 +67,61 @@ function InspectorPanel({
93
67
  pinned: _pinned
94
68
  }) {
95
69
  if (!inspected) {
96
- return React__default.default.createElement(
70
+ return React.createElement(
97
71
  "div",
98
72
  { style: S.emptyPanel },
99
- React__default.default.createElement("span", { style: { opacity: 0.4 } }, "Hover an element to inspect")
73
+ React.createElement("span", { style: { opacity: 0.4 } }, "Hover an element to inspect")
100
74
  );
101
75
  }
102
- return React__default.default.createElement(
76
+ return React.createElement(
103
77
  "div",
104
78
  { style: S.scrollArea },
105
79
  // Variant props
106
- Object.keys(inspected.variantProps).length > 0 && React__default.default.createElement(
80
+ Object.keys(inspected.variantProps).length > 0 && React.createElement(
107
81
  "div",
108
82
  { style: S.section },
109
- React__default.default.createElement("div", { style: S.sectionTitle }, "Variants"),
83
+ React.createElement("div", { style: S.sectionTitle }, "Variants"),
110
84
  Object.entries(inspected.variantProps).map(
111
- ([k, v]) => React__default.default.createElement(
85
+ ([k, v]) => React.createElement(
112
86
  "div",
113
87
  { key: k, style: S.row },
114
- React__default.default.createElement("span", { style: S.varKey }, k),
115
- React__default.default.createElement("span", { style: S.varValue }, `"${v}"`)
88
+ React.createElement("span", { style: S.varKey }, k),
89
+ React.createElement("span", { style: S.varValue }, `"${v}"`)
116
90
  )
117
91
  )
118
92
  ),
119
93
  // Active states
120
- Object.keys(inspected.activeStates).length > 0 && React__default.default.createElement(
94
+ Object.keys(inspected.activeStates).length > 0 && React.createElement(
121
95
  "div",
122
96
  { style: S.section },
123
- React__default.default.createElement("div", { style: S.sectionTitle }, "Active Data Attrs"),
97
+ React.createElement("div", { style: S.sectionTitle }, "Active Data Attrs"),
124
98
  Object.entries(inspected.activeStates).map(
125
- ([k, v]) => React__default.default.createElement(
99
+ ([k, v]) => React.createElement(
126
100
  "div",
127
101
  { key: k, style: S.row },
128
- React__default.default.createElement("code", { style: __spreadProps(__spreadValues({}, S.varKey), { color: "#f59e0b" }) }, `data-${k}`),
129
- React__default.default.createElement("span", { style: __spreadProps(__spreadValues({}, S.varValue), { color: "#34d399" }) }, `"${v}"`)
102
+ React.createElement("code", { style: { ...S.varKey, color: "#f59e0b" } }, `data-${k}`),
103
+ React.createElement("span", { style: { ...S.varValue, color: "#34d399" } }, `"${v}"`)
130
104
  )
131
105
  )
132
106
  ),
133
107
  // State names
134
- inspected.stateNames.length > 0 && React__default.default.createElement(
108
+ inspected.stateNames.length > 0 && React.createElement(
135
109
  "div",
136
110
  { style: S.section },
137
- React__default.default.createElement("div", { style: S.sectionTitle }, "Reactive States"),
138
- React__default.default.createElement(
111
+ React.createElement("div", { style: S.sectionTitle }, "Reactive States"),
112
+ React.createElement(
139
113
  "div",
140
114
  { style: S.classGrid },
141
115
  inspected.stateNames.map(
142
- (s) => React__default.default.createElement(
116
+ (s) => React.createElement(
143
117
  "code",
144
118
  {
145
119
  key: s,
146
- style: __spreadProps(__spreadValues({}, S.classChip), {
120
+ style: {
121
+ ...S.classChip,
147
122
  background: inspected.activeStates[s] === "true" ? "#065f46" : "#18181b",
148
123
  borderColor: inspected.activeStates[s] === "true" ? "#34d399" : "#27272a"
149
- })
124
+ }
150
125
  },
151
126
  s
152
127
  )
@@ -154,32 +129,32 @@ function InspectorPanel({
154
129
  )
155
130
  ),
156
131
  // Container breakpoints
157
- inspected.containerBps.length > 0 && React__default.default.createElement(
132
+ inspected.containerBps.length > 0 && React.createElement(
158
133
  "div",
159
134
  { style: S.section },
160
- React__default.default.createElement("div", { style: S.sectionTitle }, "Container Breakpoints"),
161
- React__default.default.createElement(
135
+ React.createElement("div", { style: S.sectionTitle }, "Container Breakpoints"),
136
+ React.createElement(
162
137
  "div",
163
138
  { style: S.classGrid },
164
139
  inspected.containerBps.map(
165
- (bp) => React__default.default.createElement(
140
+ (bp) => React.createElement(
166
141
  "code",
167
- { key: bp, style: __spreadProps(__spreadValues({}, S.classChip), { color: "#818cf8" }) },
142
+ { key: bp, style: { ...S.classChip, color: "#818cf8" } },
168
143
  bp
169
144
  )
170
145
  )
171
146
  )
172
147
  ),
173
148
  // Tailwind classes
174
- inspected.twClasses.length > 0 && React__default.default.createElement(
149
+ inspected.twClasses.length > 0 && React.createElement(
175
150
  "div",
176
151
  { style: S.section },
177
- React__default.default.createElement("div", { style: S.sectionTitle }, "Classes"),
178
- React__default.default.createElement(
152
+ React.createElement("div", { style: S.sectionTitle }, "Classes"),
153
+ React.createElement(
179
154
  "div",
180
155
  { style: S.classGrid },
181
156
  inspected.twClasses.map(
182
- (cls) => React__default.default.createElement(
157
+ (cls) => React.createElement(
183
158
  "code",
184
159
  { key: cls, style: S.classChip, title: inspected.atomicMap[cls] },
185
160
  cls
@@ -188,13 +163,12 @@ function InspectorPanel({
188
163
  )
189
164
  ),
190
165
  // Copy
191
- React__default.default.createElement(
166
+ React.createElement(
192
167
  "button",
193
168
  {
194
169
  style: S.copyBtn,
195
170
  onClick: () => {
196
- var _a;
197
- (_a = navigator.clipboard) == null ? void 0 : _a.writeText(
171
+ navigator.clipboard?.writeText(
198
172
  JSON.stringify(
199
173
  {
200
174
  component: inspected.componentName,
@@ -213,8 +187,8 @@ function InspectorPanel({
213
187
  );
214
188
  }
215
189
  function StatePanel() {
216
- const [entries, setEntries] = React.useState([]);
217
- React.useEffect(() => {
190
+ const [entries, setEntries] = useState([]);
191
+ useEffect(() => {
218
192
  const refresh = () => {
219
193
  const reg = window.__TW_STATE_REGISTRY__;
220
194
  setEntries(reg ? Array.from(reg.values()) : []);
@@ -224,60 +198,61 @@ function StatePanel() {
224
198
  return () => clearInterval(interval);
225
199
  }, []);
226
200
  if (entries.length === 0) {
227
- return React__default.default.createElement(
201
+ return React.createElement(
228
202
  "div",
229
203
  { style: S.emptyPanel },
230
- React__default.default.createElement(
204
+ React.createElement(
231
205
  "span",
232
206
  { style: { opacity: 0.4 } },
233
207
  "No state-enabled components found."
234
208
  ),
235
- React__default.default.createElement("br", null),
236
- React__default.default.createElement(
209
+ React.createElement("br", null),
210
+ React.createElement(
237
211
  "span",
238
212
  { style: { opacity: 0.3, fontSize: "11px" } },
239
213
  'Use tw.button({ state: { active: "..." } }) to register.'
240
214
  )
241
215
  );
242
216
  }
243
- return React__default.default.createElement(
217
+ return React.createElement(
244
218
  "div",
245
219
  { style: S.scrollArea },
246
220
  entries.map(
247
- (entry) => React__default.default.createElement(
221
+ (entry) => React.createElement(
248
222
  "div",
249
223
  { key: entry.id, style: S.section },
250
- React__default.default.createElement(
224
+ React.createElement(
251
225
  "div",
252
226
  { style: S.sectionTitle },
253
- React__default.default.createElement("span", { style: { color: "#60a5fa" } }, entry.tag.toUpperCase()),
254
- React__default.default.createElement(
227
+ React.createElement("span", { style: { color: "#60a5fa" } }, entry.tag.toUpperCase()),
228
+ React.createElement(
255
229
  "span",
256
230
  { style: { marginLeft: "8px", color: "#52525b", fontSize: "10px" } },
257
231
  entry.id
258
232
  )
259
233
  ),
260
- React__default.default.createElement(
234
+ React.createElement(
261
235
  "div",
262
236
  { style: S.classGrid },
263
237
  entry.states.map(
264
- (s) => React__default.default.createElement(
238
+ (s) => React.createElement(
265
239
  "code",
266
- { key: s, style: __spreadProps(__spreadValues({}, S.classChip), { color: "#f59e0b" }) },
240
+ { key: s, style: { ...S.classChip, color: "#f59e0b" } },
267
241
  `data-${s}`
268
242
  )
269
243
  )
270
244
  ),
271
- React__default.default.createElement(
245
+ React.createElement(
272
246
  "div",
273
- { style: __spreadProps(__spreadValues({}, S.row), { marginTop: "4px" }) },
274
- React__default.default.createElement(
247
+ { style: { ...S.row, marginTop: "4px" } },
248
+ React.createElement(
275
249
  "span",
276
250
  {
277
- style: __spreadProps(__spreadValues({}, S.sectionTitle), {
251
+ style: {
252
+ ...S.sectionTitle,
278
253
  marginBottom: 0,
279
254
  color: entry.cssInjected ? "#34d399" : "#ef4444"
280
- })
255
+ }
281
256
  },
282
257
  entry.cssInjected ? "\u25CF CSS injected" : "\u25CB CSS pending"
283
258
  )
@@ -287,8 +262,8 @@ function StatePanel() {
287
262
  );
288
263
  }
289
264
  function ContainerPanel() {
290
- const [entries, setEntries] = React.useState([]);
291
- React.useEffect(() => {
265
+ const [entries, setEntries] = useState([]);
266
+ useEffect(() => {
292
267
  const refresh = () => {
293
268
  const reg = window.__TW_CONTAINER_REGISTRY__;
294
269
  setEntries(reg ? Array.from(reg.values()) : []);
@@ -298,57 +273,57 @@ function ContainerPanel() {
298
273
  return () => clearInterval(interval);
299
274
  }, []);
300
275
  if (entries.length === 0) {
301
- return React__default.default.createElement(
276
+ return React.createElement(
302
277
  "div",
303
278
  { style: S.emptyPanel },
304
- React__default.default.createElement(
279
+ React.createElement(
305
280
  "span",
306
281
  { style: { opacity: 0.4 } },
307
282
  "No container query components found."
308
283
  ),
309
- React__default.default.createElement("br", null),
310
- React__default.default.createElement(
284
+ React.createElement("br", null),
285
+ React.createElement(
311
286
  "span",
312
287
  { style: { opacity: 0.3, fontSize: "11px" } },
313
288
  'Use tw.div({ container: { md: "flex-row" } }) to register.'
314
289
  )
315
290
  );
316
291
  }
317
- return React__default.default.createElement(
292
+ return React.createElement(
318
293
  "div",
319
294
  { style: S.scrollArea },
320
295
  entries.map(
321
- (entry) => React__default.default.createElement(
296
+ (entry) => React.createElement(
322
297
  "div",
323
298
  { key: entry.id, style: S.section },
324
- React__default.default.createElement(
299
+ React.createElement(
325
300
  "div",
326
301
  { style: S.sectionTitle },
327
- React__default.default.createElement("span", { style: { color: "#60a5fa" } }, entry.tag.toUpperCase()),
328
- entry.containerName && React__default.default.createElement(
302
+ React.createElement("span", { style: { color: "#60a5fa" } }, entry.tag.toUpperCase()),
303
+ entry.containerName && React.createElement(
329
304
  "span",
330
305
  { style: { marginLeft: "6px", color: "#818cf8" } },
331
306
  `[${entry.containerName}]`
332
307
  ),
333
- React__default.default.createElement(
308
+ React.createElement(
334
309
  "span",
335
310
  { style: { marginLeft: "8px", color: "#52525b", fontSize: "10px" } },
336
311
  entry.id
337
312
  )
338
313
  ),
339
- React__default.default.createElement(
314
+ React.createElement(
340
315
  "div",
341
316
  null,
342
317
  entry.breakpoints.map(
343
- (bp, i) => React__default.default.createElement(
318
+ (bp, i) => React.createElement(
344
319
  "div",
345
- { key: i, style: __spreadProps(__spreadValues({}, S.row), { marginBottom: "2px" }) },
346
- React__default.default.createElement(
320
+ { key: i, style: { ...S.row, marginBottom: "2px" } },
321
+ React.createElement(
347
322
  "code",
348
323
  { style: { color: "#818cf8", fontSize: "11px" } },
349
324
  `\u2265 ${bp.minWidth}`
350
325
  ),
351
- React__default.default.createElement(
326
+ React.createElement(
352
327
  "span",
353
328
  { style: { color: "#6b7280", fontSize: "11px" } },
354
329
  bp.classes
@@ -361,45 +336,45 @@ function ContainerPanel() {
361
336
  );
362
337
  }
363
338
  function TokensPanel() {
364
- const [tokens, setTokens_] = React.useState({});
365
- React.useEffect(() => {
339
+ const [tokens, setTokens_] = useState({});
340
+ useEffect(() => {
366
341
  const engine = window.__TW_TOKEN_ENGINE__;
367
342
  if (!engine) return;
368
343
  setTokens_(engine.getTokens());
369
- const unsub = engine.subscribe((t) => setTokens_(__spreadValues({}, t)));
344
+ const unsub = engine.subscribe((t) => setTokens_({ ...t }));
370
345
  return unsub;
371
346
  }, []);
372
347
  const entries = Object.entries(tokens);
373
348
  if (entries.length === 0) {
374
- return React__default.default.createElement(
349
+ return React.createElement(
375
350
  "div",
376
351
  { style: S.emptyPanel },
377
- React__default.default.createElement("span", { style: { opacity: 0.4 } }, "No live tokens registered."),
378
- React__default.default.createElement("br", null),
379
- React__default.default.createElement(
352
+ React.createElement("span", { style: { opacity: 0.4 } }, "No live tokens registered."),
353
+ React.createElement("br", null),
354
+ React.createElement(
380
355
  "span",
381
356
  { style: { opacity: 0.3, fontSize: "11px" } },
382
357
  'Use liveToken({ primary: "#3b82f6" }) to register tokens.'
383
358
  )
384
359
  );
385
360
  }
386
- return React__default.default.createElement(
361
+ return React.createElement(
387
362
  "div",
388
363
  { style: S.scrollArea },
389
- React__default.default.createElement(
364
+ React.createElement(
390
365
  "div",
391
- { style: __spreadProps(__spreadValues({}, S.sectionTitle), { padding: "8px 12px 4px", color: "#52525b" }) },
366
+ { style: { ...S.sectionTitle, padding: "8px 12px 4px", color: "#52525b" } },
392
367
  "Click color to edit \xB7 Changes apply instantly"
393
368
  ),
394
369
  entries.map(([name, value]) => {
395
370
  const isColor = value.startsWith("#") || value.startsWith("rgb") || value.startsWith("hsl");
396
- return React__default.default.createElement(
371
+ return React.createElement(
397
372
  "div",
398
- { key: name, style: __spreadProps(__spreadValues({}, S.row), { padding: "6px 12px", borderBottom: "1px solid #18181b" }) },
399
- React__default.default.createElement(
373
+ { key: name, style: { ...S.row, padding: "6px 12px", borderBottom: "1px solid #18181b" } },
374
+ React.createElement(
400
375
  "div",
401
376
  { style: { display: "flex", alignItems: "center", gap: "8px" } },
402
- isColor && React__default.default.createElement("div", {
377
+ isColor && React.createElement("div", {
403
378
  style: {
404
379
  width: "16px",
405
380
  height: "16px",
@@ -409,9 +384,9 @@ function TokensPanel() {
409
384
  flexShrink: 0
410
385
  }
411
386
  }),
412
- React__default.default.createElement("span", { style: { color: "#a1a1aa", fontSize: "12px" } }, name)
387
+ React.createElement("span", { style: { color: "#a1a1aa", fontSize: "12px" } }, name)
413
388
  ),
414
- isColor ? React__default.default.createElement("input", {
389
+ isColor ? React.createElement("input", {
415
390
  type: "color",
416
391
  defaultValue: value.startsWith("#") ? value : "#000000",
417
392
  style: {
@@ -425,7 +400,7 @@ function TokensPanel() {
425
400
  const engine = window.__TW_TOKEN_ENGINE__;
426
401
  if (engine) engine.setToken(name, e.target.value);
427
402
  }
428
- }) : React__default.default.createElement("input", {
403
+ }) : React.createElement("input", {
429
404
  type: "text",
430
405
  defaultValue: value,
431
406
  style: {
@@ -448,18 +423,39 @@ function TokensPanel() {
448
423
  );
449
424
  }
450
425
  function AnalyzerPanel() {
451
- const [scanning, setScanning] = React.useState(false);
452
- const [results, setResults] = React.useState(null);
453
- const runScan = React.useCallback(() => {
426
+ const [scanning, setScanning] = useState(false);
427
+ const [results, setResults] = useState(null);
428
+ const [engineMetrics, setEngineMetrics] = useState(null);
429
+ const [metricsFetching, setMetricsFetching] = useState(false);
430
+ const [metricsError, setMetricsError] = useState(null);
431
+ const loadEngineMetrics = useCallback(async () => {
432
+ setMetricsFetching(true);
433
+ setMetricsError(null);
434
+ try {
435
+ const res = await fetch("http://localhost:3000/metrics", {
436
+ signal: AbortSignal.timeout(2e3)
437
+ });
438
+ if (!res.ok) throw new Error(`HTTP ${res.status}`);
439
+ const data = await res.json();
440
+ setEngineMetrics(data);
441
+ } catch (e) {
442
+ const msg = e instanceof Error ? e.message : String(e);
443
+ setMetricsError(
444
+ msg.includes("Failed to fetch") || msg.includes("NetworkError") ? "Dashboard tidak berjalan. Jalankan: tw dashboard" : msg
445
+ );
446
+ setEngineMetrics(null);
447
+ } finally {
448
+ setMetricsFetching(false);
449
+ }
450
+ }, []);
451
+ const runScan = useCallback(() => {
454
452
  setScanning(true);
455
453
  setTimeout(() => {
456
- var _a, _b, _c, _d;
457
454
  const twEls = document.querySelectorAll("[data-tw]");
458
455
  const classMap = /* @__PURE__ */ new Map();
459
456
  for (const el of twEls) {
460
457
  const { name, classes } = (() => {
461
- var _a2;
462
- const dTw = (_a2 = el.dataset.tw) != null ? _a2 : null;
458
+ const dTw = el.dataset.tw ?? null;
463
459
  if (!dTw) return { name: "?", classes: [] };
464
460
  const ci = dTw.indexOf(":");
465
461
  return {
@@ -477,70 +473,186 @@ function AnalyzerPanel() {
477
473
  const tokenEngine = window.__TW_TOKEN_ENGINE__;
478
474
  setResults({
479
475
  duplicates,
480
- stateCount: (_a = stateReg == null ? void 0 : stateReg.size) != null ? _a : 0,
481
- containerCount: (_b = containerReg == null ? void 0 : containerReg.size) != null ? _b : 0,
482
- tokenCount: Object.keys((_d = (_c = tokenEngine == null ? void 0 : tokenEngine.getTokens) == null ? void 0 : _c.call(tokenEngine)) != null ? _d : {}).length
476
+ stateCount: stateReg?.size ?? 0,
477
+ containerCount: containerReg?.size ?? 0,
478
+ tokenCount: Object.keys(tokenEngine?.getTokens?.() ?? {}).length
483
479
  });
484
480
  setScanning(false);
485
481
  }, 100);
486
482
  }, []);
487
- return React__default.default.createElement(
483
+ return React.createElement(
488
484
  "div",
489
485
  { style: S.scrollArea },
490
- React__default.default.createElement(
486
+ React.createElement(
491
487
  "div",
492
488
  { style: { padding: "10px 12px" } },
493
- React__default.default.createElement(
489
+ // ── DOM Scan ──────────────────────────────────────────────────────────
490
+ React.createElement(
494
491
  "button",
495
492
  {
496
- style: __spreadProps(__spreadValues({}, S.copyBtn), { borderTop: "none", color: "#60a5fa", fontWeight: "600" }),
493
+ style: { ...S.copyBtn, borderTop: "none", color: "#60a5fa", fontWeight: "600" },
497
494
  onClick: runScan,
498
495
  disabled: scanning
499
496
  },
500
497
  scanning ? "Scanning DOM..." : "\u25B6 Run DOM Scan"
501
498
  ),
502
- results && React__default.default.createElement(
499
+ // ── Engine Metrics (dari dashboard) ───────────────────────────────────
500
+ React.createElement(
501
+ "div",
502
+ { style: { ...S.section, marginTop: "8px" } },
503
+ React.createElement(
504
+ "div",
505
+ { style: { ...S.sectionTitle, marginBottom: "6px" } },
506
+ "\u26A1 Engine Metrics"
507
+ ),
508
+ engineMetrics ? React.createElement(
509
+ "div",
510
+ null,
511
+ React.createElement(
512
+ "div",
513
+ { style: S.row },
514
+ React.createElement("span", { style: S.varKey }, "Build"),
515
+ React.createElement(
516
+ "span",
517
+ { style: { ...S.varValue, color: "#34d399" } },
518
+ engineMetrics.buildMs != null ? `${engineMetrics.buildMs}ms` : "\u2014"
519
+ )
520
+ ),
521
+ React.createElement(
522
+ "div",
523
+ { style: S.row },
524
+ React.createElement("span", { style: S.varKey }, "Classes"),
525
+ React.createElement(
526
+ "span",
527
+ { style: { ...S.varValue, color: "#34d399" } },
528
+ String(engineMetrics.classCount ?? "\u2014")
529
+ )
530
+ ),
531
+ React.createElement(
532
+ "div",
533
+ { style: S.row },
534
+ React.createElement("span", { style: S.varKey }, "Files"),
535
+ React.createElement(
536
+ "span",
537
+ { style: { ...S.varValue, color: "#34d399" } },
538
+ String(engineMetrics.fileCount ?? "\u2014")
539
+ )
540
+ ),
541
+ React.createElement(
542
+ "div",
543
+ { style: S.row },
544
+ React.createElement("span", { style: S.varKey }, "Mode"),
545
+ React.createElement(
546
+ "span",
547
+ { style: { color: "#a1a1aa", fontSize: "11px" } },
548
+ String(engineMetrics.mode ?? "\u2014")
549
+ )
550
+ ),
551
+ React.createElement(
552
+ "button",
553
+ {
554
+ style: {
555
+ ...S.copyBtn,
556
+ borderTop: "none",
557
+ color: "#52525b",
558
+ fontSize: "10px",
559
+ padding: "4px 0"
560
+ },
561
+ onClick: loadEngineMetrics,
562
+ disabled: metricsFetching
563
+ },
564
+ "\u21BB Refresh"
565
+ )
566
+ ) : metricsError ? React.createElement(
567
+ "div",
568
+ null,
569
+ React.createElement(
570
+ "div",
571
+ { style: { color: "#f87171", fontSize: "11px", marginBottom: "6px" } },
572
+ metricsError
573
+ ),
574
+ React.createElement(
575
+ "button",
576
+ {
577
+ style: { ...S.copyBtn, borderTop: "none", color: "#34d399", fontWeight: "600" },
578
+ onClick: loadEngineMetrics,
579
+ disabled: metricsFetching
580
+ },
581
+ metricsFetching ? "Connecting..." : "\u21BB Retry"
582
+ )
583
+ ) : React.createElement(
584
+ "div",
585
+ null,
586
+ React.createElement(
587
+ "div",
588
+ {
589
+ style: {
590
+ color: "#71717a",
591
+ fontSize: "11px",
592
+ lineHeight: 1.6,
593
+ marginBottom: "6px"
594
+ }
595
+ },
596
+ "Rust analyzer hanya tersedia via CLI atau dashboard.",
597
+ React.createElement("br", null),
598
+ React.createElement(
599
+ "code",
600
+ { style: { color: "#52525b", fontSize: "10px" } },
601
+ "tw analyze . | tw dashboard"
602
+ )
603
+ ),
604
+ React.createElement(
605
+ "button",
606
+ {
607
+ style: { ...S.copyBtn, borderTop: "none", color: "#34d399", fontWeight: "600" },
608
+ onClick: loadEngineMetrics,
609
+ disabled: metricsFetching
610
+ },
611
+ metricsFetching ? "Connecting..." : "\u26A1 Load from Dashboard"
612
+ )
613
+ )
614
+ ),
615
+ // ── DOM Scan Results ──────────────────────────────────────────────────
616
+ results && React.createElement(
503
617
  "div",
504
618
  null,
505
- // Summary
506
- React__default.default.createElement(
619
+ React.createElement(
507
620
  "div",
508
621
  { style: S.section },
509
- React__default.default.createElement("div", { style: S.sectionTitle }, "Summary"),
510
- React__default.default.createElement(
622
+ React.createElement("div", { style: S.sectionTitle }, "Summary"),
623
+ React.createElement(
511
624
  "div",
512
625
  { style: S.row },
513
- React__default.default.createElement("span", { style: S.varKey }, "State components"),
514
- React__default.default.createElement("span", { style: S.varValue }, String(results.stateCount))
626
+ React.createElement("span", { style: S.varKey }, "State components"),
627
+ React.createElement("span", { style: S.varValue }, String(results.stateCount))
515
628
  ),
516
- React__default.default.createElement(
629
+ React.createElement(
517
630
  "div",
518
631
  { style: S.row },
519
- React__default.default.createElement("span", { style: S.varKey }, "Container components"),
520
- React__default.default.createElement("span", { style: S.varValue }, String(results.containerCount))
632
+ React.createElement("span", { style: S.varKey }, "Container components"),
633
+ React.createElement("span", { style: S.varValue }, String(results.containerCount))
521
634
  ),
522
- React__default.default.createElement(
635
+ React.createElement(
523
636
  "div",
524
637
  { style: S.row },
525
- React__default.default.createElement("span", { style: S.varKey }, "Live tokens"),
526
- React__default.default.createElement("span", { style: S.varValue }, String(results.tokenCount))
638
+ React.createElement("span", { style: S.varKey }, "Live tokens"),
639
+ React.createElement("span", { style: S.varValue }, String(results.tokenCount))
527
640
  )
528
641
  ),
529
- // Duplicates
530
- results.duplicates.length > 0 ? React__default.default.createElement(
642
+ results.duplicates.length > 0 ? React.createElement(
531
643
  "div",
532
644
  { style: S.section },
533
- React__default.default.createElement("div", { style: S.sectionTitle }, "Duplicate Class Sets"),
645
+ React.createElement("div", { style: S.sectionTitle }, "Duplicate Class Sets"),
534
646
  results.duplicates.map(
535
- (d, i) => React__default.default.createElement(
647
+ (d, i) => React.createElement(
536
648
  "div",
537
649
  { key: i, style: { marginBottom: "8px" } },
538
- React__default.default.createElement(
650
+ React.createElement(
539
651
  "div",
540
652
  { style: { color: "#f59e0b", fontSize: "11px", marginBottom: "2px" } },
541
653
  d.names.join(", ")
542
654
  ),
543
- React__default.default.createElement(
655
+ React.createElement(
544
656
  "code",
545
657
  {
546
658
  style: {
@@ -553,10 +665,10 @@ function AnalyzerPanel() {
553
665
  )
554
666
  )
555
667
  )
556
- ) : results && React__default.default.createElement(
668
+ ) : React.createElement(
557
669
  "div",
558
670
  { style: S.section },
559
- React__default.default.createElement(
671
+ React.createElement(
560
672
  "span",
561
673
  { style: { color: "#34d399", fontSize: "12px" } },
562
674
  "\u2713 No duplicate class sets in current DOM"
@@ -568,73 +680,69 @@ function AnalyzerPanel() {
568
680
  }
569
681
  function TwDevTools() {
570
682
  if (process.env.NODE_ENV === "production") return null;
571
- const [state, setState] = React.useState({
683
+ const [state, setState] = useState({
572
684
  open: false,
573
685
  panel: "inspector",
574
686
  pinned: false,
575
687
  inspected: null,
576
688
  position: { x: 0, y: 0 }
577
689
  });
578
- const overlayRef = React.useRef(null);
690
+ const overlayRef = useRef(null);
579
691
  const isInspecting = state.open && state.panel === "inspector";
580
- React.useEffect(() => {
692
+ useEffect(() => {
581
693
  const onKey = (e) => {
582
694
  if (e.ctrlKey && e.shiftKey && e.key === "D") {
583
695
  e.preventDefault();
584
- setState((s) => __spreadProps(__spreadValues({}, s), { open: !s.open, inspected: null }));
696
+ setState((s) => ({ ...s, open: !s.open, inspected: null }));
585
697
  }
586
698
  if (e.key === "Escape")
587
- setState((s) => __spreadProps(__spreadValues({}, s), { open: false, pinned: false, inspected: null }));
588
- if (e.key === "1") setState((s) => s.open ? __spreadProps(__spreadValues({}, s), { panel: "inspector" }) : s);
589
- if (e.key === "2") setState((s) => s.open ? __spreadProps(__spreadValues({}, s), { panel: "state" }) : s);
590
- if (e.key === "3") setState((s) => s.open ? __spreadProps(__spreadValues({}, s), { panel: "container" }) : s);
591
- if (e.key === "4") setState((s) => s.open ? __spreadProps(__spreadValues({}, s), { panel: "tokens" }) : s);
592
- if (e.key === "5") setState((s) => s.open ? __spreadProps(__spreadValues({}, s), { panel: "analyzer" }) : s);
699
+ setState((s) => ({ ...s, open: false, pinned: false, inspected: null }));
700
+ if (e.key === "1") setState((s) => s.open ? { ...s, panel: "inspector" } : s);
701
+ if (e.key === "2") setState((s) => s.open ? { ...s, panel: "state" } : s);
702
+ if (e.key === "3") setState((s) => s.open ? { ...s, panel: "container" } : s);
703
+ if (e.key === "4") setState((s) => s.open ? { ...s, panel: "tokens" } : s);
704
+ if (e.key === "5") setState((s) => s.open ? { ...s, panel: "analyzer" } : s);
593
705
  };
594
706
  window.addEventListener("keydown", onKey);
595
707
  return () => window.removeEventListener("keydown", onKey);
596
708
  }, []);
597
- const onMouseMove = React.useCallback(
709
+ const onMouseMove = useCallback(
598
710
  (e) => {
599
- var _a;
600
711
  if (!isInspecting || state.pinned) return;
601
712
  const twEl = findNearestTwElement(e.target);
602
713
  if (!twEl) {
603
- setState((s) => __spreadProps(__spreadValues({}, s), { inspected: null, position: { x: e.clientX, y: e.clientY } }));
714
+ setState((s) => ({ ...s, inspected: null, position: { x: e.clientX, y: e.clientY } }));
604
715
  return;
605
716
  }
606
- const { name, classes } = parseDataTw((_a = twEl.dataset.tw) != null ? _a : null);
607
- setState((s) => {
608
- var _a2;
609
- return __spreadProps(__spreadValues({}, s), {
610
- position: { x: e.clientX, y: e.clientY },
611
- inspected: {
612
- componentName: name,
613
- element: twEl,
614
- rect: twEl.getBoundingClientRect(),
615
- twClasses: classes,
616
- variantProps: parseVariantAttr((_a2 = twEl.dataset.twVariants) != null ? _a2 : null),
617
- atomicMap: getAtomicMap(classes),
618
- rawClassName: twEl.className,
619
- stateNames: getStateNames(twEl),
620
- activeStates: getActiveStates(twEl),
621
- containerBps: getContainerBps(twEl)
622
- }
623
- });
624
- });
717
+ const { name, classes } = parseDataTw(twEl.dataset.tw ?? null);
718
+ setState((s) => ({
719
+ ...s,
720
+ position: { x: e.clientX, y: e.clientY },
721
+ inspected: {
722
+ componentName: name,
723
+ element: twEl,
724
+ rect: twEl.getBoundingClientRect(),
725
+ twClasses: classes,
726
+ variantProps: parseVariantAttr(twEl.dataset.twVariants ?? null),
727
+ atomicMap: getAtomicMap(classes),
728
+ rawClassName: twEl.className,
729
+ stateNames: getStateNames(twEl),
730
+ activeStates: getActiveStates(twEl),
731
+ containerBps: getContainerBps(twEl)
732
+ }
733
+ }));
625
734
  },
626
735
  [isInspecting, state.pinned]
627
736
  );
628
- const onClick = React.useCallback(
737
+ const onClick = useCallback(
629
738
  (e) => {
630
- var _a;
631
739
  if (!isInspecting) return;
632
- if ((_a = overlayRef.current) == null ? void 0 : _a.contains(e.target)) return;
633
- setState((s) => __spreadProps(__spreadValues({}, s), { pinned: !s.pinned && !!s.inspected }));
740
+ if (overlayRef.current?.contains(e.target)) return;
741
+ setState((s) => ({ ...s, pinned: !s.pinned && !!s.inspected }));
634
742
  },
635
743
  [isInspecting]
636
744
  );
637
- React.useEffect(() => {
745
+ useEffect(() => {
638
746
  if (!isInspecting) return;
639
747
  window.addEventListener("mousemove", onMouseMove);
640
748
  window.addEventListener("click", onClick);
@@ -644,10 +752,10 @@ function TwDevTools() {
644
752
  };
645
753
  }, [isInspecting, onMouseMove, onClick]);
646
754
  if (!state.open) {
647
- return React__default.default.createElement(
755
+ return React.createElement(
648
756
  "button",
649
757
  {
650
- onClick: () => setState((s) => __spreadProps(__spreadValues({}, s), { open: true })),
758
+ onClick: () => setState((s) => ({ ...s, open: true })),
651
759
  style: S.toggleBtn,
652
760
  title: "tailwind-styled-v4 DevTools (Ctrl+Shift+D)"
653
761
  },
@@ -661,20 +769,21 @@ function TwDevTools() {
661
769
  { id: "tokens", label: "Tokens", icon: "\u{1F3A8}" },
662
770
  { id: "analyzer", label: "Analyzer", icon: "\u{1F4CA}" }
663
771
  ];
664
- return React__default.default.createElement(
772
+ return React.createElement(
665
773
  "div",
666
774
  { style: S.root },
667
775
  // ── Element highlight (inspector only) ──────────────────────────────
668
- isInspecting && state.inspected && React__default.default.createElement("div", {
669
- style: __spreadProps(__spreadValues({}, S.highlight), {
776
+ isInspecting && state.inspected && React.createElement("div", {
777
+ style: {
778
+ ...S.highlight,
670
779
  top: state.inspected.rect.top + window.scrollY,
671
780
  left: state.inspected.rect.left + window.scrollX,
672
781
  width: state.inspected.rect.width,
673
782
  height: state.inspected.rect.height
674
- })
783
+ }
675
784
  }),
676
785
  // ── Component name label ────────────────────────────────────────────
677
- isInspecting && state.inspected && React__default.default.createElement(
786
+ isInspecting && state.inspected && React.createElement(
678
787
  "div",
679
788
  {
680
789
  style: {
@@ -694,58 +803,61 @@ function TwDevTools() {
694
803
  state.inspected.componentName
695
804
  ),
696
805
  // ── Main DevTools panel ─────────────────────────────────────────────
697
- React__default.default.createElement(
806
+ React.createElement(
698
807
  "div",
699
808
  {
700
809
  ref: overlayRef,
701
- style: state.panel === "inspector" && state.inspected ? __spreadProps(__spreadValues({}, S.panel), {
810
+ style: state.panel === "inspector" && state.inspected ? {
811
+ ...S.panel,
702
812
  top: Math.min(state.position.y + 16, window.innerHeight - 460),
703
813
  left: Math.min(state.position.x + 16, window.innerWidth - 320)
704
- }) : __spreadProps(__spreadValues({}, S.panel), {
814
+ } : {
815
+ ...S.panel,
705
816
  top: "auto",
706
817
  bottom: "40px",
707
818
  right: "12px",
708
819
  left: "auto"
709
- })
820
+ }
710
821
  },
711
822
  // Header
712
- React__default.default.createElement(
823
+ React.createElement(
713
824
  "div",
714
825
  { style: S.header },
715
- React__default.default.createElement(
826
+ React.createElement(
716
827
  "span",
717
828
  { style: S.componentName },
718
829
  state.inspected && state.panel === "inspector" ? state.inspected.componentName : "tailwind-styled-v4"
719
830
  ),
720
- React__default.default.createElement(
831
+ React.createElement(
721
832
  "div",
722
833
  { style: S.headerActions },
723
- state.pinned && React__default.default.createElement("span", { style: S.pinBadge }, "\u{1F4CC}"),
724
- React__default.default.createElement(
834
+ state.pinned && React.createElement("span", { style: S.pinBadge }, "\u{1F4CC}"),
835
+ React.createElement(
725
836
  "button",
726
837
  {
727
838
  style: S.closeBtn,
728
- onClick: () => setState((s) => __spreadProps(__spreadValues({}, s), { open: false, pinned: false, inspected: null }))
839
+ onClick: () => setState((s) => ({ ...s, open: false, pinned: false, inspected: null }))
729
840
  },
730
841
  "\u2715"
731
842
  )
732
843
  )
733
844
  ),
734
845
  // Tab bar
735
- React__default.default.createElement(
846
+ React.createElement(
736
847
  "div",
737
848
  { style: S.tabBar },
738
849
  PANELS.map(
739
- (p) => React__default.default.createElement(
850
+ (p) => React.createElement(
740
851
  "button",
741
852
  {
742
853
  key: p.id,
743
- style: __spreadProps(__spreadValues({}, S.tab), {
854
+ style: {
855
+ ...S.tab,
744
856
  background: state.panel === p.id ? "#18181b" : "none",
745
857
  color: state.panel === p.id ? "#e4e4e7" : "#52525b",
746
858
  borderBottom: state.panel === p.id ? "2px solid #3b82f6" : "2px solid transparent"
747
- }),
748
- onClick: () => setState((s) => __spreadProps(__spreadValues({}, s), { panel: p.id })),
859
+ },
860
+ onClick: () => setState((s) => ({ ...s, panel: p.id })),
749
861
  title: `${p.label} (${PANELS.findIndex((x) => x.id === p.id) + 1})`
750
862
  },
751
863
  `${p.icon} ${p.label}`
@@ -753,22 +865,22 @@ function TwDevTools() {
753
865
  )
754
866
  ),
755
867
  // Panel content
756
- state.panel === "inspector" && React__default.default.createElement(InspectorPanel, {
868
+ state.panel === "inspector" && React.createElement(InspectorPanel, {
757
869
  inspected: state.inspected,
758
870
  position: state.position,
759
871
  pinned: state.pinned
760
872
  }),
761
- state.panel === "state" && React__default.default.createElement(StatePanel, null),
762
- state.panel === "container" && React__default.default.createElement(ContainerPanel, null),
763
- state.panel === "tokens" && React__default.default.createElement(TokensPanel, null),
764
- state.panel === "analyzer" && React__default.default.createElement(AnalyzerPanel, null)
873
+ state.panel === "state" && React.createElement(StatePanel, null),
874
+ state.panel === "container" && React.createElement(ContainerPanel, null),
875
+ state.panel === "tokens" && React.createElement(TokensPanel, null),
876
+ state.panel === "analyzer" && React.createElement(AnalyzerPanel, null)
765
877
  ),
766
878
  // ── Status bar ──────────────────────────────────────────────────────
767
- React__default.default.createElement(
879
+ React.createElement(
768
880
  "div",
769
881
  { style: S.statusBar },
770
- React__default.default.createElement("span", null, "\u{1F3A8} tailwind-styled-v4 DevTools"),
771
- React__default.default.createElement(
882
+ React.createElement("span", null, "\u{1F3A8} tailwind-styled-v4 DevTools"),
883
+ React.createElement(
772
884
  "span",
773
885
  { style: { opacity: 0.6, fontSize: "10px" } },
774
886
  state.pinned ? "Click to unpin" : isInspecting ? "Hover to inspect \xB7 Click to pin \xB7 1-5 switch panel \xB7 Esc close" : "Ctrl+Shift+D close \xB7 1-5 switch panel"
@@ -950,10 +1062,9 @@ var S = {
950
1062
  };
951
1063
  function DevToolsProvider() {
952
1064
  if (process.env.NODE_ENV === "production") return null;
953
- return React__default.default.createElement(TwDevTools);
1065
+ return React.createElement(TwDevTools);
954
1066
  }
955
1067
 
956
- exports.DevToolsProvider = DevToolsProvider;
957
- exports.TwDevTools = TwDevTools;
958
- //# sourceMappingURL=devtools.cjs.map
959
- //# sourceMappingURL=devtools.cjs.map
1068
+ export { DevToolsProvider, TwDevTools };
1069
+ //# sourceMappingURL=devtools.mjs.map
1070
+ //# sourceMappingURL=devtools.mjs.map