tailwind-styled-v4 1.0.1 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/dist/animate.cjs +252 -0
  2. package/dist/animate.cjs.map +1 -0
  3. package/dist/animate.d.cts +117 -0
  4. package/dist/animate.d.ts +117 -0
  5. package/dist/animate.js +245 -0
  6. package/dist/animate.js.map +1 -0
  7. package/dist/astTransform-ua-eapqs.d.cts +41 -0
  8. package/dist/astTransform-ua-eapqs.d.ts +41 -0
  9. package/dist/compiler.cjs +3594 -0
  10. package/dist/compiler.cjs.map +1 -0
  11. package/dist/compiler.d.cts +716 -0
  12. package/dist/compiler.d.ts +716 -0
  13. package/dist/compiler.js +3535 -0
  14. package/dist/compiler.js.map +1 -0
  15. package/dist/css.cjs +71 -0
  16. package/dist/css.cjs.map +1 -0
  17. package/dist/css.d.cts +45 -0
  18. package/dist/css.d.ts +45 -0
  19. package/dist/css.js +62 -0
  20. package/dist/css.js.map +1 -0
  21. package/dist/devtools.cjs +959 -0
  22. package/dist/devtools.cjs.map +1 -0
  23. package/dist/devtools.d.cts +22 -0
  24. package/dist/devtools.d.ts +22 -0
  25. package/dist/devtools.js +952 -0
  26. package/dist/devtools.js.map +1 -0
  27. package/dist/index.cjs +1058 -0
  28. package/dist/index.cjs.map +1 -0
  29. package/dist/index.d.cts +584 -0
  30. package/dist/index.d.ts +449 -980
  31. package/dist/index.js +1021 -3
  32. package/dist/index.js.map +1 -1
  33. package/dist/next.cjs +268 -0
  34. package/dist/next.cjs.map +1 -0
  35. package/dist/next.d.cts +45 -0
  36. package/dist/next.d.ts +45 -0
  37. package/dist/next.js +261 -0
  38. package/dist/next.js.map +1 -0
  39. package/dist/plugins.cjs +396 -0
  40. package/dist/plugins.cjs.map +1 -0
  41. package/dist/plugins.d.cts +231 -0
  42. package/dist/plugins.d.ts +231 -0
  43. package/dist/plugins.js +381 -0
  44. package/dist/plugins.js.map +1 -0
  45. package/dist/preset.cjs +129 -0
  46. package/dist/preset.cjs.map +1 -0
  47. package/dist/preset.d.cts +249 -0
  48. package/dist/preset.d.ts +249 -0
  49. package/dist/preset.js +124 -0
  50. package/dist/preset.js.map +1 -0
  51. package/dist/theme.cjs +154 -0
  52. package/dist/theme.cjs.map +1 -0
  53. package/dist/theme.d.cts +181 -0
  54. package/dist/theme.d.ts +181 -0
  55. package/dist/theme.js +148 -0
  56. package/dist/theme.js.map +1 -0
  57. package/dist/turbopackLoader.cjs +2689 -0
  58. package/dist/turbopackLoader.cjs.map +1 -0
  59. package/dist/turbopackLoader.d.cts +22 -0
  60. package/dist/turbopackLoader.d.ts +22 -0
  61. package/dist/turbopackLoader.js +2681 -0
  62. package/dist/turbopackLoader.js.map +1 -0
  63. package/dist/vite.cjs +105 -0
  64. package/dist/vite.cjs.map +1 -0
  65. package/dist/vite.d.cts +22 -0
  66. package/dist/vite.d.ts +22 -0
  67. package/dist/vite.js +96 -0
  68. package/dist/vite.js.map +1 -0
  69. package/dist/webpackLoader.cjs +2670 -0
  70. package/dist/webpackLoader.cjs.map +1 -0
  71. package/dist/webpackLoader.d.cts +24 -0
  72. package/dist/webpackLoader.d.ts +24 -0
  73. package/dist/webpackLoader.js +2662 -0
  74. package/dist/webpackLoader.js.map +1 -0
  75. package/package.json +62 -32
  76. package/CHANGELOG.md +0 -75
  77. package/LICENSE +0 -21
  78. package/README.md +0 -608
  79. package/dist/cli/init.js +0 -208
  80. package/dist/compiler/index.d.mts +0 -214
  81. package/dist/compiler/index.d.ts +0 -214
  82. package/dist/compiler/index.js +0 -546
  83. package/dist/compiler/index.js.map +0 -1
  84. package/dist/compiler/index.mjs +0 -504
  85. package/dist/compiler/index.mjs.map +0 -1
  86. package/dist/index.d.mts +0 -1115
  87. package/dist/index.mjs +0 -4
  88. package/dist/index.mjs.map +0 -1
  89. package/dist/turbopack-loader.js +0 -232
  90. package/dist/webpack-loader.js +0 -213
@@ -0,0 +1,959 @@
1
+ 'use strict';
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));
29
+ function parseDataTw(dataTw) {
30
+ if (!dataTw) return { name: "Unknown", classes: [] };
31
+ const colonIdx = dataTw.indexOf(":");
32
+ if (colonIdx === -1) return { name: dataTw, classes: [] };
33
+ const name = dataTw.slice(0, colonIdx);
34
+ const classes = dataTw.slice(colonIdx + 1).split(/\s+/).filter(Boolean);
35
+ return { name, classes };
36
+ }
37
+ function parseVariantAttr(v) {
38
+ if (!v) return {};
39
+ try {
40
+ return JSON.parse(v);
41
+ } catch (e) {
42
+ return {};
43
+ }
44
+ }
45
+ function findNearestTwElement(el) {
46
+ var _a;
47
+ let cur = el;
48
+ while (cur) {
49
+ if ((_a = cur.dataset) == null ? void 0 : _a.tw) return cur;
50
+ cur = cur.parentElement;
51
+ }
52
+ return null;
53
+ }
54
+ function getAtomicMap(classes) {
55
+ const registry = window.__TW_REGISTRY__;
56
+ if (!registry) return {};
57
+ const map = {};
58
+ for (const cls of classes) {
59
+ if (registry[cls]) map[cls] = registry[cls];
60
+ }
61
+ return map;
62
+ }
63
+ function getActiveStates(el) {
64
+ const states = {};
65
+ for (const attr of el.attributes) {
66
+ if (attr.name.startsWith("data-")) {
67
+ states[attr.name.replace("data-", "")] = attr.value;
68
+ }
69
+ }
70
+ return states;
71
+ }
72
+ function getStateNames(el) {
73
+ const registry = window.__TW_STATE_REGISTRY__;
74
+ if (!registry) return [];
75
+ for (const [id, entry] of registry) {
76
+ if (el.classList.contains(id)) return entry.states;
77
+ }
78
+ return [];
79
+ }
80
+ function getContainerBps(el) {
81
+ const registry = window.__TW_CONTAINER_REGISTRY__;
82
+ if (!registry) return [];
83
+ for (const [id, entry] of registry) {
84
+ if (el.classList.contains(id)) {
85
+ return entry.breakpoints.map((bp) => bp.minWidth);
86
+ }
87
+ }
88
+ return [];
89
+ }
90
+ function InspectorPanel({
91
+ inspected,
92
+ position: _position,
93
+ pinned: _pinned
94
+ }) {
95
+ if (!inspected) {
96
+ return React__default.default.createElement(
97
+ "div",
98
+ { style: S.emptyPanel },
99
+ React__default.default.createElement("span", { style: { opacity: 0.4 } }, "Hover an element to inspect")
100
+ );
101
+ }
102
+ return React__default.default.createElement(
103
+ "div",
104
+ { style: S.scrollArea },
105
+ // Variant props
106
+ Object.keys(inspected.variantProps).length > 0 && React__default.default.createElement(
107
+ "div",
108
+ { style: S.section },
109
+ React__default.default.createElement("div", { style: S.sectionTitle }, "Variants"),
110
+ Object.entries(inspected.variantProps).map(
111
+ ([k, v]) => React__default.default.createElement(
112
+ "div",
113
+ { 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}"`)
116
+ )
117
+ )
118
+ ),
119
+ // Active states
120
+ Object.keys(inspected.activeStates).length > 0 && React__default.default.createElement(
121
+ "div",
122
+ { style: S.section },
123
+ React__default.default.createElement("div", { style: S.sectionTitle }, "Active Data Attrs"),
124
+ Object.entries(inspected.activeStates).map(
125
+ ([k, v]) => React__default.default.createElement(
126
+ "div",
127
+ { 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}"`)
130
+ )
131
+ )
132
+ ),
133
+ // State names
134
+ inspected.stateNames.length > 0 && React__default.default.createElement(
135
+ "div",
136
+ { style: S.section },
137
+ React__default.default.createElement("div", { style: S.sectionTitle }, "Reactive States"),
138
+ React__default.default.createElement(
139
+ "div",
140
+ { style: S.classGrid },
141
+ inspected.stateNames.map(
142
+ (s) => React__default.default.createElement(
143
+ "code",
144
+ {
145
+ key: s,
146
+ style: __spreadProps(__spreadValues({}, S.classChip), {
147
+ background: inspected.activeStates[s] === "true" ? "#065f46" : "#18181b",
148
+ borderColor: inspected.activeStates[s] === "true" ? "#34d399" : "#27272a"
149
+ })
150
+ },
151
+ s
152
+ )
153
+ )
154
+ )
155
+ ),
156
+ // Container breakpoints
157
+ inspected.containerBps.length > 0 && React__default.default.createElement(
158
+ "div",
159
+ { style: S.section },
160
+ React__default.default.createElement("div", { style: S.sectionTitle }, "Container Breakpoints"),
161
+ React__default.default.createElement(
162
+ "div",
163
+ { style: S.classGrid },
164
+ inspected.containerBps.map(
165
+ (bp) => React__default.default.createElement(
166
+ "code",
167
+ { key: bp, style: __spreadProps(__spreadValues({}, S.classChip), { color: "#818cf8" }) },
168
+ bp
169
+ )
170
+ )
171
+ )
172
+ ),
173
+ // Tailwind classes
174
+ inspected.twClasses.length > 0 && React__default.default.createElement(
175
+ "div",
176
+ { style: S.section },
177
+ React__default.default.createElement("div", { style: S.sectionTitle }, "Classes"),
178
+ React__default.default.createElement(
179
+ "div",
180
+ { style: S.classGrid },
181
+ inspected.twClasses.map(
182
+ (cls) => React__default.default.createElement(
183
+ "code",
184
+ { key: cls, style: S.classChip, title: inspected.atomicMap[cls] },
185
+ cls
186
+ )
187
+ )
188
+ )
189
+ ),
190
+ // Copy
191
+ React__default.default.createElement(
192
+ "button",
193
+ {
194
+ style: S.copyBtn,
195
+ onClick: () => {
196
+ var _a;
197
+ (_a = navigator.clipboard) == null ? void 0 : _a.writeText(
198
+ JSON.stringify(
199
+ {
200
+ component: inspected.componentName,
201
+ variants: inspected.variantProps,
202
+ states: inspected.activeStates,
203
+ classes: inspected.twClasses
204
+ },
205
+ null,
206
+ 2
207
+ )
208
+ );
209
+ }
210
+ },
211
+ "Copy to clipboard"
212
+ )
213
+ );
214
+ }
215
+ function StatePanel() {
216
+ const [entries, setEntries] = React.useState([]);
217
+ React.useEffect(() => {
218
+ const refresh = () => {
219
+ const reg = window.__TW_STATE_REGISTRY__;
220
+ setEntries(reg ? Array.from(reg.values()) : []);
221
+ };
222
+ refresh();
223
+ const interval = setInterval(refresh, 1e3);
224
+ return () => clearInterval(interval);
225
+ }, []);
226
+ if (entries.length === 0) {
227
+ return React__default.default.createElement(
228
+ "div",
229
+ { style: S.emptyPanel },
230
+ React__default.default.createElement(
231
+ "span",
232
+ { style: { opacity: 0.4 } },
233
+ "No state-enabled components found."
234
+ ),
235
+ React__default.default.createElement("br", null),
236
+ React__default.default.createElement(
237
+ "span",
238
+ { style: { opacity: 0.3, fontSize: "11px" } },
239
+ 'Use tw.button({ state: { active: "..." } }) to register.'
240
+ )
241
+ );
242
+ }
243
+ return React__default.default.createElement(
244
+ "div",
245
+ { style: S.scrollArea },
246
+ entries.map(
247
+ (entry) => React__default.default.createElement(
248
+ "div",
249
+ { key: entry.id, style: S.section },
250
+ React__default.default.createElement(
251
+ "div",
252
+ { style: S.sectionTitle },
253
+ React__default.default.createElement("span", { style: { color: "#60a5fa" } }, entry.tag.toUpperCase()),
254
+ React__default.default.createElement(
255
+ "span",
256
+ { style: { marginLeft: "8px", color: "#52525b", fontSize: "10px" } },
257
+ entry.id
258
+ )
259
+ ),
260
+ React__default.default.createElement(
261
+ "div",
262
+ { style: S.classGrid },
263
+ entry.states.map(
264
+ (s) => React__default.default.createElement(
265
+ "code",
266
+ { key: s, style: __spreadProps(__spreadValues({}, S.classChip), { color: "#f59e0b" }) },
267
+ `data-${s}`
268
+ )
269
+ )
270
+ ),
271
+ React__default.default.createElement(
272
+ "div",
273
+ { style: __spreadProps(__spreadValues({}, S.row), { marginTop: "4px" }) },
274
+ React__default.default.createElement(
275
+ "span",
276
+ {
277
+ style: __spreadProps(__spreadValues({}, S.sectionTitle), {
278
+ marginBottom: 0,
279
+ color: entry.cssInjected ? "#34d399" : "#ef4444"
280
+ })
281
+ },
282
+ entry.cssInjected ? "\u25CF CSS injected" : "\u25CB CSS pending"
283
+ )
284
+ )
285
+ )
286
+ )
287
+ );
288
+ }
289
+ function ContainerPanel() {
290
+ const [entries, setEntries] = React.useState([]);
291
+ React.useEffect(() => {
292
+ const refresh = () => {
293
+ const reg = window.__TW_CONTAINER_REGISTRY__;
294
+ setEntries(reg ? Array.from(reg.values()) : []);
295
+ };
296
+ refresh();
297
+ const interval = setInterval(refresh, 1e3);
298
+ return () => clearInterval(interval);
299
+ }, []);
300
+ if (entries.length === 0) {
301
+ return React__default.default.createElement(
302
+ "div",
303
+ { style: S.emptyPanel },
304
+ React__default.default.createElement(
305
+ "span",
306
+ { style: { opacity: 0.4 } },
307
+ "No container query components found."
308
+ ),
309
+ React__default.default.createElement("br", null),
310
+ React__default.default.createElement(
311
+ "span",
312
+ { style: { opacity: 0.3, fontSize: "11px" } },
313
+ 'Use tw.div({ container: { md: "flex-row" } }) to register.'
314
+ )
315
+ );
316
+ }
317
+ return React__default.default.createElement(
318
+ "div",
319
+ { style: S.scrollArea },
320
+ entries.map(
321
+ (entry) => React__default.default.createElement(
322
+ "div",
323
+ { key: entry.id, style: S.section },
324
+ React__default.default.createElement(
325
+ "div",
326
+ { style: S.sectionTitle },
327
+ React__default.default.createElement("span", { style: { color: "#60a5fa" } }, entry.tag.toUpperCase()),
328
+ entry.containerName && React__default.default.createElement(
329
+ "span",
330
+ { style: { marginLeft: "6px", color: "#818cf8" } },
331
+ `[${entry.containerName}]`
332
+ ),
333
+ React__default.default.createElement(
334
+ "span",
335
+ { style: { marginLeft: "8px", color: "#52525b", fontSize: "10px" } },
336
+ entry.id
337
+ )
338
+ ),
339
+ React__default.default.createElement(
340
+ "div",
341
+ null,
342
+ entry.breakpoints.map(
343
+ (bp, i) => React__default.default.createElement(
344
+ "div",
345
+ { key: i, style: __spreadProps(__spreadValues({}, S.row), { marginBottom: "2px" }) },
346
+ React__default.default.createElement(
347
+ "code",
348
+ { style: { color: "#818cf8", fontSize: "11px" } },
349
+ `\u2265 ${bp.minWidth}`
350
+ ),
351
+ React__default.default.createElement(
352
+ "span",
353
+ { style: { color: "#6b7280", fontSize: "11px" } },
354
+ bp.classes
355
+ )
356
+ )
357
+ )
358
+ )
359
+ )
360
+ )
361
+ );
362
+ }
363
+ function TokensPanel() {
364
+ const [tokens, setTokens_] = React.useState({});
365
+ React.useEffect(() => {
366
+ const engine = window.__TW_TOKEN_ENGINE__;
367
+ if (!engine) return;
368
+ setTokens_(engine.getTokens());
369
+ const unsub = engine.subscribe((t) => setTokens_(__spreadValues({}, t)));
370
+ return unsub;
371
+ }, []);
372
+ const entries = Object.entries(tokens);
373
+ if (entries.length === 0) {
374
+ return React__default.default.createElement(
375
+ "div",
376
+ { 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(
380
+ "span",
381
+ { style: { opacity: 0.3, fontSize: "11px" } },
382
+ 'Use liveToken({ primary: "#3b82f6" }) to register tokens.'
383
+ )
384
+ );
385
+ }
386
+ return React__default.default.createElement(
387
+ "div",
388
+ { style: S.scrollArea },
389
+ React__default.default.createElement(
390
+ "div",
391
+ { style: __spreadProps(__spreadValues({}, S.sectionTitle), { padding: "8px 12px 4px", color: "#52525b" }) },
392
+ "Click color to edit \xB7 Changes apply instantly"
393
+ ),
394
+ entries.map(([name, value]) => {
395
+ const isColor = value.startsWith("#") || value.startsWith("rgb") || value.startsWith("hsl");
396
+ return React__default.default.createElement(
397
+ "div",
398
+ { key: name, style: __spreadProps(__spreadValues({}, S.row), { padding: "6px 12px", borderBottom: "1px solid #18181b" }) },
399
+ React__default.default.createElement(
400
+ "div",
401
+ { style: { display: "flex", alignItems: "center", gap: "8px" } },
402
+ isColor && React__default.default.createElement("div", {
403
+ style: {
404
+ width: "16px",
405
+ height: "16px",
406
+ borderRadius: "3px",
407
+ background: value,
408
+ border: "1px solid #27272a",
409
+ flexShrink: 0
410
+ }
411
+ }),
412
+ React__default.default.createElement("span", { style: { color: "#a1a1aa", fontSize: "12px" } }, name)
413
+ ),
414
+ isColor ? React__default.default.createElement("input", {
415
+ type: "color",
416
+ defaultValue: value.startsWith("#") ? value : "#000000",
417
+ style: {
418
+ width: "52px",
419
+ height: "22px",
420
+ border: "none",
421
+ background: "none",
422
+ cursor: "pointer"
423
+ },
424
+ onChange: (e) => {
425
+ const engine = window.__TW_TOKEN_ENGINE__;
426
+ if (engine) engine.setToken(name, e.target.value);
427
+ }
428
+ }) : React__default.default.createElement("input", {
429
+ type: "text",
430
+ defaultValue: value,
431
+ style: {
432
+ background: "#18181b",
433
+ border: "1px solid #27272a",
434
+ borderRadius: "3px",
435
+ color: "#e4e4e7",
436
+ fontSize: "11px",
437
+ padding: "2px 6px",
438
+ width: "100px",
439
+ fontFamily: "monospace"
440
+ },
441
+ onBlur: (e) => {
442
+ const engine = window.__TW_TOKEN_ENGINE__;
443
+ if (engine) engine.setToken(name, e.target.value);
444
+ }
445
+ })
446
+ );
447
+ })
448
+ );
449
+ }
450
+ function AnalyzerPanel() {
451
+ const [scanning, setScanning] = React.useState(false);
452
+ const [results, setResults] = React.useState(null);
453
+ const runScan = React.useCallback(() => {
454
+ setScanning(true);
455
+ setTimeout(() => {
456
+ var _a, _b, _c, _d;
457
+ const twEls = document.querySelectorAll("[data-tw]");
458
+ const classMap = /* @__PURE__ */ new Map();
459
+ for (const el of twEls) {
460
+ const { name, classes } = (() => {
461
+ var _a2;
462
+ const dTw = (_a2 = el.dataset.tw) != null ? _a2 : null;
463
+ if (!dTw) return { name: "?", classes: [] };
464
+ const ci = dTw.indexOf(":");
465
+ return {
466
+ name: ci >= 0 ? dTw.slice(0, ci) : dTw,
467
+ classes: ci >= 0 ? dTw.slice(ci + 1).split(/\s+/).filter(Boolean) : []
468
+ };
469
+ })();
470
+ const key = classes.sort().join(" ");
471
+ if (!classMap.has(key)) classMap.set(key, []);
472
+ classMap.get(key).push(name);
473
+ }
474
+ const duplicates = Array.from(classMap.entries()).filter(([, names]) => names.length > 1).map(([pattern, names]) => ({ pattern, count: names.length, names })).sort((a, b) => b.count - a.count).slice(0, 10);
475
+ const stateReg = window.__TW_STATE_REGISTRY__;
476
+ const containerReg = window.__TW_CONTAINER_REGISTRY__;
477
+ const tokenEngine = window.__TW_TOKEN_ENGINE__;
478
+ setResults({
479
+ 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
483
+ });
484
+ setScanning(false);
485
+ }, 100);
486
+ }, []);
487
+ return React__default.default.createElement(
488
+ "div",
489
+ { style: S.scrollArea },
490
+ React__default.default.createElement(
491
+ "div",
492
+ { style: { padding: "10px 12px" } },
493
+ React__default.default.createElement(
494
+ "button",
495
+ {
496
+ style: __spreadProps(__spreadValues({}, S.copyBtn), { borderTop: "none", color: "#60a5fa", fontWeight: "600" }),
497
+ onClick: runScan,
498
+ disabled: scanning
499
+ },
500
+ scanning ? "Scanning DOM..." : "\u25B6 Run DOM Scan"
501
+ ),
502
+ results && React__default.default.createElement(
503
+ "div",
504
+ null,
505
+ // Summary
506
+ React__default.default.createElement(
507
+ "div",
508
+ { style: S.section },
509
+ React__default.default.createElement("div", { style: S.sectionTitle }, "Summary"),
510
+ React__default.default.createElement(
511
+ "div",
512
+ { 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))
515
+ ),
516
+ React__default.default.createElement(
517
+ "div",
518
+ { 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))
521
+ ),
522
+ React__default.default.createElement(
523
+ "div",
524
+ { 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))
527
+ )
528
+ ),
529
+ // Duplicates
530
+ results.duplicates.length > 0 ? React__default.default.createElement(
531
+ "div",
532
+ { style: S.section },
533
+ React__default.default.createElement("div", { style: S.sectionTitle }, "Duplicate Class Sets"),
534
+ results.duplicates.map(
535
+ (d, i) => React__default.default.createElement(
536
+ "div",
537
+ { key: i, style: { marginBottom: "8px" } },
538
+ React__default.default.createElement(
539
+ "div",
540
+ { style: { color: "#f59e0b", fontSize: "11px", marginBottom: "2px" } },
541
+ d.names.join(", ")
542
+ ),
543
+ React__default.default.createElement(
544
+ "code",
545
+ {
546
+ style: {
547
+ color: "#52525b",
548
+ fontSize: "10px",
549
+ wordBreak: "break-all"
550
+ }
551
+ },
552
+ d.pattern.split(" ").slice(0, 8).join(" ") + (d.pattern.split(" ").length > 8 ? "..." : "")
553
+ )
554
+ )
555
+ )
556
+ ) : results && React__default.default.createElement(
557
+ "div",
558
+ { style: S.section },
559
+ React__default.default.createElement(
560
+ "span",
561
+ { style: { color: "#34d399", fontSize: "12px" } },
562
+ "\u2713 No duplicate class sets in current DOM"
563
+ )
564
+ )
565
+ )
566
+ )
567
+ );
568
+ }
569
+ function TwDevTools() {
570
+ if (process.env.NODE_ENV === "production") return null;
571
+ const [state, setState] = React.useState({
572
+ open: false,
573
+ panel: "inspector",
574
+ pinned: false,
575
+ inspected: null,
576
+ position: { x: 0, y: 0 }
577
+ });
578
+ const overlayRef = React.useRef(null);
579
+ const isInspecting = state.open && state.panel === "inspector";
580
+ React.useEffect(() => {
581
+ const onKey = (e) => {
582
+ if (e.ctrlKey && e.shiftKey && e.key === "D") {
583
+ e.preventDefault();
584
+ setState((s) => __spreadProps(__spreadValues({}, s), { open: !s.open, inspected: null }));
585
+ }
586
+ 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);
593
+ };
594
+ window.addEventListener("keydown", onKey);
595
+ return () => window.removeEventListener("keydown", onKey);
596
+ }, []);
597
+ const onMouseMove = React.useCallback(
598
+ (e) => {
599
+ var _a;
600
+ if (!isInspecting || state.pinned) return;
601
+ const twEl = findNearestTwElement(e.target);
602
+ if (!twEl) {
603
+ setState((s) => __spreadProps(__spreadValues({}, s), { inspected: null, position: { x: e.clientX, y: e.clientY } }));
604
+ return;
605
+ }
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
+ });
625
+ },
626
+ [isInspecting, state.pinned]
627
+ );
628
+ const onClick = React.useCallback(
629
+ (e) => {
630
+ var _a;
631
+ 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 }));
634
+ },
635
+ [isInspecting]
636
+ );
637
+ React.useEffect(() => {
638
+ if (!isInspecting) return;
639
+ window.addEventListener("mousemove", onMouseMove);
640
+ window.addEventListener("click", onClick);
641
+ return () => {
642
+ window.removeEventListener("mousemove", onMouseMove);
643
+ window.removeEventListener("click", onClick);
644
+ };
645
+ }, [isInspecting, onMouseMove, onClick]);
646
+ if (!state.open) {
647
+ return React__default.default.createElement(
648
+ "button",
649
+ {
650
+ onClick: () => setState((s) => __spreadProps(__spreadValues({}, s), { open: true })),
651
+ style: S.toggleBtn,
652
+ title: "tailwind-styled-v4 DevTools (Ctrl+Shift+D)"
653
+ },
654
+ "\u{1F3A8}"
655
+ );
656
+ }
657
+ const PANELS = [
658
+ { id: "inspector", label: "Inspector", icon: "\u{1F50D}" },
659
+ { id: "state", label: "State", icon: "\u26A1" },
660
+ { id: "container", label: "Container", icon: "\u{1F4E6}" },
661
+ { id: "tokens", label: "Tokens", icon: "\u{1F3A8}" },
662
+ { id: "analyzer", label: "Analyzer", icon: "\u{1F4CA}" }
663
+ ];
664
+ return React__default.default.createElement(
665
+ "div",
666
+ { style: S.root },
667
+ // ── Element highlight (inspector only) ──────────────────────────────
668
+ isInspecting && state.inspected && React__default.default.createElement("div", {
669
+ style: __spreadProps(__spreadValues({}, S.highlight), {
670
+ top: state.inspected.rect.top + window.scrollY,
671
+ left: state.inspected.rect.left + window.scrollX,
672
+ width: state.inspected.rect.width,
673
+ height: state.inspected.rect.height
674
+ })
675
+ }),
676
+ // ── Component name label ────────────────────────────────────────────
677
+ isInspecting && state.inspected && React__default.default.createElement(
678
+ "div",
679
+ {
680
+ style: {
681
+ position: "absolute",
682
+ top: state.inspected.rect.top + window.scrollY - 22,
683
+ left: state.inspected.rect.left + window.scrollX,
684
+ background: "#1e3a5f",
685
+ color: "#93c5fd",
686
+ fontSize: "11px",
687
+ padding: "2px 6px",
688
+ borderRadius: "3px 3px 0 0",
689
+ pointerEvents: "none",
690
+ zIndex: 2147483646,
691
+ fontFamily: "monospace"
692
+ }
693
+ },
694
+ state.inspected.componentName
695
+ ),
696
+ // ── Main DevTools panel ─────────────────────────────────────────────
697
+ React__default.default.createElement(
698
+ "div",
699
+ {
700
+ ref: overlayRef,
701
+ style: state.panel === "inspector" && state.inspected ? __spreadProps(__spreadValues({}, S.panel), {
702
+ top: Math.min(state.position.y + 16, window.innerHeight - 460),
703
+ left: Math.min(state.position.x + 16, window.innerWidth - 320)
704
+ }) : __spreadProps(__spreadValues({}, S.panel), {
705
+ top: "auto",
706
+ bottom: "40px",
707
+ right: "12px",
708
+ left: "auto"
709
+ })
710
+ },
711
+ // Header
712
+ React__default.default.createElement(
713
+ "div",
714
+ { style: S.header },
715
+ React__default.default.createElement(
716
+ "span",
717
+ { style: S.componentName },
718
+ state.inspected && state.panel === "inspector" ? state.inspected.componentName : "tailwind-styled-v4"
719
+ ),
720
+ React__default.default.createElement(
721
+ "div",
722
+ { style: S.headerActions },
723
+ state.pinned && React__default.default.createElement("span", { style: S.pinBadge }, "\u{1F4CC}"),
724
+ React__default.default.createElement(
725
+ "button",
726
+ {
727
+ style: S.closeBtn,
728
+ onClick: () => setState((s) => __spreadProps(__spreadValues({}, s), { open: false, pinned: false, inspected: null }))
729
+ },
730
+ "\u2715"
731
+ )
732
+ )
733
+ ),
734
+ // Tab bar
735
+ React__default.default.createElement(
736
+ "div",
737
+ { style: S.tabBar },
738
+ PANELS.map(
739
+ (p) => React__default.default.createElement(
740
+ "button",
741
+ {
742
+ key: p.id,
743
+ style: __spreadProps(__spreadValues({}, S.tab), {
744
+ background: state.panel === p.id ? "#18181b" : "none",
745
+ color: state.panel === p.id ? "#e4e4e7" : "#52525b",
746
+ borderBottom: state.panel === p.id ? "2px solid #3b82f6" : "2px solid transparent"
747
+ }),
748
+ onClick: () => setState((s) => __spreadProps(__spreadValues({}, s), { panel: p.id })),
749
+ title: `${p.label} (${PANELS.findIndex((x) => x.id === p.id) + 1})`
750
+ },
751
+ `${p.icon} ${p.label}`
752
+ )
753
+ )
754
+ ),
755
+ // Panel content
756
+ state.panel === "inspector" && React__default.default.createElement(InspectorPanel, {
757
+ inspected: state.inspected,
758
+ position: state.position,
759
+ pinned: state.pinned
760
+ }),
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)
765
+ ),
766
+ // ── Status bar ──────────────────────────────────────────────────────
767
+ React__default.default.createElement(
768
+ "div",
769
+ { style: S.statusBar },
770
+ React__default.default.createElement("span", null, "\u{1F3A8} tailwind-styled-v4 DevTools"),
771
+ React__default.default.createElement(
772
+ "span",
773
+ { style: { opacity: 0.6, fontSize: "10px" } },
774
+ 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"
775
+ )
776
+ )
777
+ );
778
+ }
779
+ var S = {
780
+ root: {
781
+ position: "fixed",
782
+ inset: 0,
783
+ zIndex: 2147483647,
784
+ pointerEvents: "none",
785
+ fontFamily: "ui-monospace, 'JetBrains Mono', monospace",
786
+ fontSize: "12px"
787
+ },
788
+ highlight: {
789
+ position: "absolute",
790
+ borderRadius: "3px",
791
+ outline: "2px solid #3b82f6",
792
+ outlineOffset: "1px",
793
+ background: "rgba(59,130,246,0.08)",
794
+ pointerEvents: "none",
795
+ transition: "all 0.1s ease",
796
+ zIndex: 2147483646
797
+ },
798
+ panel: {
799
+ position: "fixed",
800
+ width: 320,
801
+ maxHeight: 480,
802
+ background: "#0f0f0f",
803
+ border: "1px solid #27272a",
804
+ borderRadius: "10px",
805
+ boxShadow: "0 8px 32px rgba(0,0,0,0.8)",
806
+ pointerEvents: "all",
807
+ zIndex: 2147483647,
808
+ userSelect: "text",
809
+ display: "flex",
810
+ flexDirection: "column"
811
+ },
812
+ header: {
813
+ display: "flex",
814
+ alignItems: "center",
815
+ justifyContent: "space-between",
816
+ padding: "8px 12px 6px",
817
+ borderBottom: "1px solid #1f1f1f",
818
+ flexShrink: 0
819
+ },
820
+ tabBar: {
821
+ display: "flex",
822
+ borderBottom: "1px solid #18181b",
823
+ flexShrink: 0,
824
+ overflowX: "auto"
825
+ },
826
+ tab: {
827
+ background: "none",
828
+ border: "none",
829
+ cursor: "pointer",
830
+ fontSize: "10px",
831
+ padding: "5px 8px",
832
+ whiteSpace: "nowrap",
833
+ fontFamily: "inherit",
834
+ transition: "color 0.1s",
835
+ pointerEvents: "all"
836
+ },
837
+ scrollArea: {
838
+ overflowY: "auto",
839
+ flex: 1
840
+ },
841
+ emptyPanel: {
842
+ padding: "24px 12px",
843
+ color: "#71717a",
844
+ fontSize: "12px",
845
+ textAlign: "center",
846
+ lineHeight: 1.6
847
+ },
848
+ componentName: {
849
+ color: "#60a5fa",
850
+ fontWeight: "bold",
851
+ fontSize: "13px"
852
+ },
853
+ headerActions: {
854
+ display: "flex",
855
+ alignItems: "center",
856
+ gap: "6px"
857
+ },
858
+ pinBadge: { color: "#fbbf24", fontSize: "10px" },
859
+ closeBtn: {
860
+ background: "none",
861
+ border: "none",
862
+ color: "#71717a",
863
+ cursor: "pointer",
864
+ fontSize: "14px",
865
+ lineHeight: 1,
866
+ padding: "2px 4px",
867
+ pointerEvents: "all"
868
+ },
869
+ section: {
870
+ padding: "8px 12px",
871
+ borderBottom: "1px solid #18181b"
872
+ },
873
+ sectionTitle: {
874
+ color: "#52525b",
875
+ fontSize: "10px",
876
+ textTransform: "uppercase",
877
+ letterSpacing: "0.08em",
878
+ marginBottom: "6px"
879
+ },
880
+ row: {
881
+ display: "flex",
882
+ justifyContent: "space-between",
883
+ alignItems: "center",
884
+ marginBottom: "3px"
885
+ },
886
+ varKey: { color: "#a1a1aa" },
887
+ varValue: { color: "#34d399", fontWeight: "bold" },
888
+ classGrid: {
889
+ display: "flex",
890
+ flexWrap: "wrap",
891
+ gap: "4px"
892
+ },
893
+ classChip: {
894
+ background: "#18181b",
895
+ border: "1px solid #27272a",
896
+ borderRadius: "4px",
897
+ padding: "2px 6px",
898
+ color: "#e4e4e7",
899
+ cursor: "default",
900
+ fontSize: "11px"
901
+ },
902
+ copyBtn: {
903
+ display: "block",
904
+ width: "100%",
905
+ background: "none",
906
+ border: "none",
907
+ borderTop: "1px solid #18181b",
908
+ color: "#52525b",
909
+ cursor: "pointer",
910
+ padding: "8px 12px",
911
+ textAlign: "left",
912
+ fontSize: "11px",
913
+ pointerEvents: "all",
914
+ fontFamily: "inherit"
915
+ },
916
+ statusBar: {
917
+ position: "fixed",
918
+ bottom: 0,
919
+ left: 0,
920
+ right: 0,
921
+ background: "#1e3a5f",
922
+ color: "#93c5fd",
923
+ fontSize: "11px",
924
+ padding: "4px 12px",
925
+ display: "flex",
926
+ justifyContent: "space-between",
927
+ alignItems: "center",
928
+ pointerEvents: "all",
929
+ zIndex: 2147483647
930
+ },
931
+ toggleBtn: {
932
+ position: "fixed",
933
+ bottom: 12,
934
+ right: 12,
935
+ width: 36,
936
+ height: 36,
937
+ borderRadius: "50%",
938
+ background: "#1e3a5f",
939
+ border: "1px solid #3b82f6",
940
+ color: "white",
941
+ cursor: "pointer",
942
+ fontSize: "16px",
943
+ display: "flex",
944
+ alignItems: "center",
945
+ justifyContent: "center",
946
+ zIndex: 2147483647,
947
+ boxShadow: "0 2px 8px rgba(0,0,0,0.4)",
948
+ pointerEvents: "all"
949
+ }
950
+ };
951
+ function DevToolsProvider() {
952
+ if (process.env.NODE_ENV === "production") return null;
953
+ return React__default.default.createElement(TwDevTools);
954
+ }
955
+
956
+ exports.DevToolsProvider = DevToolsProvider;
957
+ exports.TwDevTools = TwDevTools;
958
+ //# sourceMappingURL=devtools.cjs.map
959
+ //# sourceMappingURL=devtools.cjs.map