tailwind-styled-v4 4.0.0 → 5.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.
- package/dist/animate.cjs +754 -235
- package/dist/animate.cjs.map +1 -1
- package/dist/animate.d.cts +55 -99
- package/dist/animate.d.ts +55 -99
- package/dist/animate.js +742 -235
- package/dist/animate.js.map +1 -1
- package/dist/chunk-VZEJV27B.js +11 -0
- package/dist/chunk-VZEJV27B.js.map +1 -0
- package/dist/chunk-Y5D3E72P.cjs +13 -0
- package/dist/chunk-Y5D3E72P.cjs.map +1 -0
- package/dist/css.cjs +61 -11
- package/dist/css.cjs.map +1 -1
- package/dist/css.d.cts +3 -18
- package/dist/css.d.ts +3 -18
- package/dist/css.js +61 -11
- package/dist/css.js.map +1 -1
- package/dist/devtools.cjs +200 -88
- package/dist/devtools.cjs.map +1 -1
- package/dist/devtools.js +200 -88
- package/dist/devtools.js.map +1 -1
- package/dist/index.cjs +430 -135
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +74 -3
- package/dist/index.d.ts +74 -3
- package/dist/index.js +415 -132
- package/dist/index.js.map +1 -1
- package/dist/next.cjs +118 -138
- package/dist/next.cjs.map +1 -1
- package/dist/next.d.cts +28 -19
- package/dist/next.d.ts +28 -19
- package/dist/next.js +111 -131
- package/dist/next.js.map +1 -1
- package/dist/preset.cjs +312 -18
- package/dist/preset.cjs.map +1 -1
- package/dist/preset.d.cts +29 -2
- package/dist/preset.d.ts +29 -2
- package/dist/preset.js +311 -19
- package/dist/preset.js.map +1 -1
- package/dist/turbopackLoader.cjs +24 -2676
- package/dist/turbopackLoader.cjs.map +1 -1
- package/dist/turbopackLoader.d.cts +3 -13
- package/dist/turbopackLoader.d.ts +3 -13
- package/dist/turbopackLoader.js +24 -2670
- package/dist/turbopackLoader.js.map +1 -1
- package/dist/vite.cjs +90 -57
- package/dist/vite.cjs.map +1 -1
- package/dist/vite.d.cts +35 -6
- package/dist/vite.d.ts +35 -6
- package/dist/vite.js +90 -58
- package/dist/vite.js.map +1 -1
- package/dist/webpackLoader.cjs +27 -2646
- package/dist/webpackLoader.cjs.map +1 -1
- package/dist/webpackLoader.d.cts +3 -10
- package/dist/webpackLoader.d.ts +3 -10
- package/dist/webpackLoader.js +27 -2640
- package/dist/webpackLoader.js.map +1 -1
- package/package.json +31 -28
- package/dist/astTransform-ua-eapqs.d.cts +0 -41
- package/dist/astTransform-ua-eapqs.d.ts +0 -41
- package/dist/compiler.cjs +0 -3594
- package/dist/compiler.cjs.map +0 -1
- package/dist/compiler.d.cts +0 -716
- package/dist/compiler.d.ts +0 -716
- package/dist/compiler.js +0 -3535
- package/dist/compiler.js.map +0 -1
- package/dist/plugins.cjs +0 -396
- package/dist/plugins.cjs.map +0 -1
- package/dist/plugins.d.cts +0 -231
- package/dist/plugins.d.ts +0 -231
- package/dist/plugins.js +0 -381
- package/dist/plugins.js.map +0 -1
- package/dist/theme.cjs +0 -154
- package/dist/theme.cjs.map +0 -1
- package/dist/theme.d.cts +0 -181
- package/dist/theme.d.ts +0 -181
- package/dist/theme.js +0 -148
- package/dist/theme.js.map +0 -1
package/dist/devtools.js
CHANGED
|
@@ -1,25 +1,7 @@
|
|
|
1
|
+
import './chunk-VZEJV27B.js';
|
|
1
2
|
import React, { useState, useRef, useEffect, useCallback } from 'react';
|
|
2
3
|
|
|
3
4
|
/* tailwind-styled-v4 v4 | MIT | https://github.com/dictionar32/tailwind-styled-v4 */
|
|
4
|
-
var __defProp = Object.defineProperty;
|
|
5
|
-
var __defProps = Object.defineProperties;
|
|
6
|
-
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
7
|
-
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
8
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
-
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
10
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
11
|
-
var __spreadValues = (a, b) => {
|
|
12
|
-
for (var prop in b || (b = {}))
|
|
13
|
-
if (__hasOwnProp.call(b, prop))
|
|
14
|
-
__defNormalProp(a, prop, b[prop]);
|
|
15
|
-
if (__getOwnPropSymbols)
|
|
16
|
-
for (var prop of __getOwnPropSymbols(b)) {
|
|
17
|
-
if (__propIsEnum.call(b, prop))
|
|
18
|
-
__defNormalProp(a, prop, b[prop]);
|
|
19
|
-
}
|
|
20
|
-
return a;
|
|
21
|
-
};
|
|
22
|
-
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
23
5
|
function parseDataTw(dataTw) {
|
|
24
6
|
if (!dataTw) return { name: "Unknown", classes: [] };
|
|
25
7
|
const colonIdx = dataTw.indexOf(":");
|
|
@@ -32,15 +14,14 @@ function parseVariantAttr(v) {
|
|
|
32
14
|
if (!v) return {};
|
|
33
15
|
try {
|
|
34
16
|
return JSON.parse(v);
|
|
35
|
-
} catch
|
|
17
|
+
} catch {
|
|
36
18
|
return {};
|
|
37
19
|
}
|
|
38
20
|
}
|
|
39
21
|
function findNearestTwElement(el) {
|
|
40
|
-
var _a;
|
|
41
22
|
let cur = el;
|
|
42
23
|
while (cur) {
|
|
43
|
-
if (
|
|
24
|
+
if (cur.dataset?.tw) return cur;
|
|
44
25
|
cur = cur.parentElement;
|
|
45
26
|
}
|
|
46
27
|
return null;
|
|
@@ -119,8 +100,8 @@ function InspectorPanel({
|
|
|
119
100
|
([k, v]) => React.createElement(
|
|
120
101
|
"div",
|
|
121
102
|
{ key: k, style: S.row },
|
|
122
|
-
React.createElement("code", { style:
|
|
123
|
-
React.createElement("span", { style:
|
|
103
|
+
React.createElement("code", { style: { ...S.varKey, color: "#f59e0b" } }, `data-${k}`),
|
|
104
|
+
React.createElement("span", { style: { ...S.varValue, color: "#34d399" } }, `"${v}"`)
|
|
124
105
|
)
|
|
125
106
|
)
|
|
126
107
|
),
|
|
@@ -137,10 +118,11 @@ function InspectorPanel({
|
|
|
137
118
|
"code",
|
|
138
119
|
{
|
|
139
120
|
key: s,
|
|
140
|
-
style:
|
|
121
|
+
style: {
|
|
122
|
+
...S.classChip,
|
|
141
123
|
background: inspected.activeStates[s] === "true" ? "#065f46" : "#18181b",
|
|
142
124
|
borderColor: inspected.activeStates[s] === "true" ? "#34d399" : "#27272a"
|
|
143
|
-
}
|
|
125
|
+
}
|
|
144
126
|
},
|
|
145
127
|
s
|
|
146
128
|
)
|
|
@@ -158,7 +140,7 @@ function InspectorPanel({
|
|
|
158
140
|
inspected.containerBps.map(
|
|
159
141
|
(bp) => React.createElement(
|
|
160
142
|
"code",
|
|
161
|
-
{ key: bp, style:
|
|
143
|
+
{ key: bp, style: { ...S.classChip, color: "#818cf8" } },
|
|
162
144
|
bp
|
|
163
145
|
)
|
|
164
146
|
)
|
|
@@ -187,8 +169,7 @@ function InspectorPanel({
|
|
|
187
169
|
{
|
|
188
170
|
style: S.copyBtn,
|
|
189
171
|
onClick: () => {
|
|
190
|
-
|
|
191
|
-
(_a = navigator.clipboard) == null ? void 0 : _a.writeText(
|
|
172
|
+
navigator.clipboard?.writeText(
|
|
192
173
|
JSON.stringify(
|
|
193
174
|
{
|
|
194
175
|
component: inspected.componentName,
|
|
@@ -257,21 +238,22 @@ function StatePanel() {
|
|
|
257
238
|
entry.states.map(
|
|
258
239
|
(s) => React.createElement(
|
|
259
240
|
"code",
|
|
260
|
-
{ key: s, style:
|
|
241
|
+
{ key: s, style: { ...S.classChip, color: "#f59e0b" } },
|
|
261
242
|
`data-${s}`
|
|
262
243
|
)
|
|
263
244
|
)
|
|
264
245
|
),
|
|
265
246
|
React.createElement(
|
|
266
247
|
"div",
|
|
267
|
-
{ style:
|
|
248
|
+
{ style: { ...S.row, marginTop: "4px" } },
|
|
268
249
|
React.createElement(
|
|
269
250
|
"span",
|
|
270
251
|
{
|
|
271
|
-
style:
|
|
252
|
+
style: {
|
|
253
|
+
...S.sectionTitle,
|
|
272
254
|
marginBottom: 0,
|
|
273
255
|
color: entry.cssInjected ? "#34d399" : "#ef4444"
|
|
274
|
-
}
|
|
256
|
+
}
|
|
275
257
|
},
|
|
276
258
|
entry.cssInjected ? "\u25CF CSS injected" : "\u25CB CSS pending"
|
|
277
259
|
)
|
|
@@ -336,7 +318,7 @@ function ContainerPanel() {
|
|
|
336
318
|
entry.breakpoints.map(
|
|
337
319
|
(bp, i) => React.createElement(
|
|
338
320
|
"div",
|
|
339
|
-
{ key: i, style:
|
|
321
|
+
{ key: i, style: { ...S.row, marginBottom: "2px" } },
|
|
340
322
|
React.createElement(
|
|
341
323
|
"code",
|
|
342
324
|
{ style: { color: "#818cf8", fontSize: "11px" } },
|
|
@@ -360,7 +342,7 @@ function TokensPanel() {
|
|
|
360
342
|
const engine = window.__TW_TOKEN_ENGINE__;
|
|
361
343
|
if (!engine) return;
|
|
362
344
|
setTokens_(engine.getTokens());
|
|
363
|
-
const unsub = engine.subscribe((t) => setTokens_(
|
|
345
|
+
const unsub = engine.subscribe((t) => setTokens_({ ...t }));
|
|
364
346
|
return unsub;
|
|
365
347
|
}, []);
|
|
366
348
|
const entries = Object.entries(tokens);
|
|
@@ -382,14 +364,14 @@ function TokensPanel() {
|
|
|
382
364
|
{ style: S.scrollArea },
|
|
383
365
|
React.createElement(
|
|
384
366
|
"div",
|
|
385
|
-
{ style:
|
|
367
|
+
{ style: { ...S.sectionTitle, padding: "8px 12px 4px", color: "#52525b" } },
|
|
386
368
|
"Click color to edit \xB7 Changes apply instantly"
|
|
387
369
|
),
|
|
388
370
|
entries.map(([name, value]) => {
|
|
389
371
|
const isColor = value.startsWith("#") || value.startsWith("rgb") || value.startsWith("hsl");
|
|
390
372
|
return React.createElement(
|
|
391
373
|
"div",
|
|
392
|
-
{ key: name, style:
|
|
374
|
+
{ key: name, style: { ...S.row, padding: "6px 12px", borderBottom: "1px solid #18181b" } },
|
|
393
375
|
React.createElement(
|
|
394
376
|
"div",
|
|
395
377
|
{ style: { display: "flex", alignItems: "center", gap: "8px" } },
|
|
@@ -444,16 +426,35 @@ function TokensPanel() {
|
|
|
444
426
|
function AnalyzerPanel() {
|
|
445
427
|
const [scanning, setScanning] = useState(false);
|
|
446
428
|
const [results, setResults] = useState(null);
|
|
429
|
+
const [engineMetrics, setEngineMetrics] = useState(null);
|
|
430
|
+
const [metricsFetching, setMetricsFetching] = useState(false);
|
|
431
|
+
const [metricsError, setMetricsError] = useState(null);
|
|
432
|
+
const loadEngineMetrics = useCallback(async () => {
|
|
433
|
+
setMetricsFetching(true);
|
|
434
|
+
setMetricsError(null);
|
|
435
|
+
try {
|
|
436
|
+
const res = await fetch("http://localhost:3000/metrics", { signal: AbortSignal.timeout(2e3) });
|
|
437
|
+
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
|
438
|
+
const data = await res.json();
|
|
439
|
+
setEngineMetrics(data);
|
|
440
|
+
} catch (e) {
|
|
441
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
442
|
+
setMetricsError(
|
|
443
|
+
msg.includes("Failed to fetch") || msg.includes("NetworkError") ? "Dashboard tidak berjalan. Jalankan: tw dashboard" : msg
|
|
444
|
+
);
|
|
445
|
+
setEngineMetrics(null);
|
|
446
|
+
} finally {
|
|
447
|
+
setMetricsFetching(false);
|
|
448
|
+
}
|
|
449
|
+
}, []);
|
|
447
450
|
const runScan = useCallback(() => {
|
|
448
451
|
setScanning(true);
|
|
449
452
|
setTimeout(() => {
|
|
450
|
-
var _a, _b, _c, _d;
|
|
451
453
|
const twEls = document.querySelectorAll("[data-tw]");
|
|
452
454
|
const classMap = /* @__PURE__ */ new Map();
|
|
453
455
|
for (const el of twEls) {
|
|
454
456
|
const { name, classes } = (() => {
|
|
455
|
-
|
|
456
|
-
const dTw = (_a2 = el.dataset.tw) != null ? _a2 : null;
|
|
457
|
+
const dTw = el.dataset.tw ?? null;
|
|
457
458
|
if (!dTw) return { name: "?", classes: [] };
|
|
458
459
|
const ci = dTw.indexOf(":");
|
|
459
460
|
return {
|
|
@@ -471,9 +472,9 @@ function AnalyzerPanel() {
|
|
|
471
472
|
const tokenEngine = window.__TW_TOKEN_ENGINE__;
|
|
472
473
|
setResults({
|
|
473
474
|
duplicates,
|
|
474
|
-
stateCount:
|
|
475
|
-
containerCount:
|
|
476
|
-
tokenCount: Object.keys(
|
|
475
|
+
stateCount: stateReg?.size ?? 0,
|
|
476
|
+
containerCount: containerReg?.size ?? 0,
|
|
477
|
+
tokenCount: Object.keys(tokenEngine?.getTokens?.() ?? {}).length
|
|
477
478
|
});
|
|
478
479
|
setScanning(false);
|
|
479
480
|
}, 100);
|
|
@@ -484,19 +485,131 @@ function AnalyzerPanel() {
|
|
|
484
485
|
React.createElement(
|
|
485
486
|
"div",
|
|
486
487
|
{ style: { padding: "10px 12px" } },
|
|
488
|
+
// ── DOM Scan ──────────────────────────────────────────────────────────
|
|
487
489
|
React.createElement(
|
|
488
490
|
"button",
|
|
489
491
|
{
|
|
490
|
-
style:
|
|
492
|
+
style: { ...S.copyBtn, borderTop: "none", color: "#60a5fa", fontWeight: "600" },
|
|
491
493
|
onClick: runScan,
|
|
492
494
|
disabled: scanning
|
|
493
495
|
},
|
|
494
496
|
scanning ? "Scanning DOM..." : "\u25B6 Run DOM Scan"
|
|
495
497
|
),
|
|
498
|
+
// ── Engine Metrics (dari dashboard) ───────────────────────────────────
|
|
499
|
+
React.createElement(
|
|
500
|
+
"div",
|
|
501
|
+
{ style: { ...S.section, marginTop: "8px" } },
|
|
502
|
+
React.createElement(
|
|
503
|
+
"div",
|
|
504
|
+
{ style: { ...S.sectionTitle, marginBottom: "6px" } },
|
|
505
|
+
"\u26A1 Engine Metrics"
|
|
506
|
+
),
|
|
507
|
+
engineMetrics ? React.createElement(
|
|
508
|
+
"div",
|
|
509
|
+
null,
|
|
510
|
+
React.createElement(
|
|
511
|
+
"div",
|
|
512
|
+
{ style: S.row },
|
|
513
|
+
React.createElement("span", { style: S.varKey }, "Build"),
|
|
514
|
+
React.createElement(
|
|
515
|
+
"span",
|
|
516
|
+
{ style: { ...S.varValue, color: "#34d399" } },
|
|
517
|
+
engineMetrics.buildMs != null ? `${engineMetrics.buildMs}ms` : "\u2014"
|
|
518
|
+
)
|
|
519
|
+
),
|
|
520
|
+
React.createElement(
|
|
521
|
+
"div",
|
|
522
|
+
{ style: S.row },
|
|
523
|
+
React.createElement("span", { style: S.varKey }, "Classes"),
|
|
524
|
+
React.createElement(
|
|
525
|
+
"span",
|
|
526
|
+
{ style: { ...S.varValue, color: "#34d399" } },
|
|
527
|
+
String(engineMetrics.classCount ?? "\u2014")
|
|
528
|
+
)
|
|
529
|
+
),
|
|
530
|
+
React.createElement(
|
|
531
|
+
"div",
|
|
532
|
+
{ style: S.row },
|
|
533
|
+
React.createElement("span", { style: S.varKey }, "Files"),
|
|
534
|
+
React.createElement(
|
|
535
|
+
"span",
|
|
536
|
+
{ style: { ...S.varValue, color: "#34d399" } },
|
|
537
|
+
String(engineMetrics.fileCount ?? "\u2014")
|
|
538
|
+
)
|
|
539
|
+
),
|
|
540
|
+
React.createElement(
|
|
541
|
+
"div",
|
|
542
|
+
{ style: S.row },
|
|
543
|
+
React.createElement("span", { style: S.varKey }, "Mode"),
|
|
544
|
+
React.createElement(
|
|
545
|
+
"span",
|
|
546
|
+
{ style: { color: "#a1a1aa", fontSize: "11px" } },
|
|
547
|
+
String(engineMetrics.mode ?? "\u2014")
|
|
548
|
+
)
|
|
549
|
+
),
|
|
550
|
+
React.createElement(
|
|
551
|
+
"button",
|
|
552
|
+
{
|
|
553
|
+
style: {
|
|
554
|
+
...S.copyBtn,
|
|
555
|
+
borderTop: "none",
|
|
556
|
+
color: "#52525b",
|
|
557
|
+
fontSize: "10px",
|
|
558
|
+
padding: "4px 0"
|
|
559
|
+
},
|
|
560
|
+
onClick: loadEngineMetrics,
|
|
561
|
+
disabled: metricsFetching
|
|
562
|
+
},
|
|
563
|
+
"\u21BB Refresh"
|
|
564
|
+
)
|
|
565
|
+
) : metricsError ? React.createElement(
|
|
566
|
+
"div",
|
|
567
|
+
null,
|
|
568
|
+
React.createElement(
|
|
569
|
+
"div",
|
|
570
|
+
{ style: { color: "#f87171", fontSize: "11px", marginBottom: "6px" } },
|
|
571
|
+
metricsError
|
|
572
|
+
),
|
|
573
|
+
React.createElement(
|
|
574
|
+
"button",
|
|
575
|
+
{
|
|
576
|
+
style: { ...S.copyBtn, borderTop: "none", color: "#34d399", fontWeight: "600" },
|
|
577
|
+
onClick: loadEngineMetrics,
|
|
578
|
+
disabled: metricsFetching
|
|
579
|
+
},
|
|
580
|
+
metricsFetching ? "Connecting..." : "\u21BB Retry"
|
|
581
|
+
)
|
|
582
|
+
) : React.createElement(
|
|
583
|
+
"div",
|
|
584
|
+
null,
|
|
585
|
+
React.createElement(
|
|
586
|
+
"div",
|
|
587
|
+
{
|
|
588
|
+
style: { color: "#71717a", fontSize: "11px", lineHeight: 1.6, marginBottom: "6px" }
|
|
589
|
+
},
|
|
590
|
+
"Rust analyzer hanya tersedia via CLI atau dashboard.",
|
|
591
|
+
React.createElement("br", null),
|
|
592
|
+
React.createElement(
|
|
593
|
+
"code",
|
|
594
|
+
{ style: { color: "#52525b", fontSize: "10px" } },
|
|
595
|
+
"tw analyze . | tw dashboard"
|
|
596
|
+
)
|
|
597
|
+
),
|
|
598
|
+
React.createElement(
|
|
599
|
+
"button",
|
|
600
|
+
{
|
|
601
|
+
style: { ...S.copyBtn, borderTop: "none", color: "#34d399", fontWeight: "600" },
|
|
602
|
+
onClick: loadEngineMetrics,
|
|
603
|
+
disabled: metricsFetching
|
|
604
|
+
},
|
|
605
|
+
metricsFetching ? "Connecting..." : "\u26A1 Load from Dashboard"
|
|
606
|
+
)
|
|
607
|
+
)
|
|
608
|
+
),
|
|
609
|
+
// ── DOM Scan Results ──────────────────────────────────────────────────
|
|
496
610
|
results && React.createElement(
|
|
497
611
|
"div",
|
|
498
612
|
null,
|
|
499
|
-
// Summary
|
|
500
613
|
React.createElement(
|
|
501
614
|
"div",
|
|
502
615
|
{ style: S.section },
|
|
@@ -520,7 +633,6 @@ function AnalyzerPanel() {
|
|
|
520
633
|
React.createElement("span", { style: S.varValue }, String(results.tokenCount))
|
|
521
634
|
)
|
|
522
635
|
),
|
|
523
|
-
// Duplicates
|
|
524
636
|
results.duplicates.length > 0 ? React.createElement(
|
|
525
637
|
"div",
|
|
526
638
|
{ style: S.section },
|
|
@@ -547,7 +659,7 @@ function AnalyzerPanel() {
|
|
|
547
659
|
)
|
|
548
660
|
)
|
|
549
661
|
)
|
|
550
|
-
) :
|
|
662
|
+
) : React.createElement(
|
|
551
663
|
"div",
|
|
552
664
|
{ style: S.section },
|
|
553
665
|
React.createElement(
|
|
@@ -575,56 +687,52 @@ function TwDevTools() {
|
|
|
575
687
|
const onKey = (e) => {
|
|
576
688
|
if (e.ctrlKey && e.shiftKey && e.key === "D") {
|
|
577
689
|
e.preventDefault();
|
|
578
|
-
setState((s) =>
|
|
690
|
+
setState((s) => ({ ...s, open: !s.open, inspected: null }));
|
|
579
691
|
}
|
|
580
692
|
if (e.key === "Escape")
|
|
581
|
-
setState((s) =>
|
|
582
|
-
if (e.key === "1") setState((s) => s.open ?
|
|
583
|
-
if (e.key === "2") setState((s) => s.open ?
|
|
584
|
-
if (e.key === "3") setState((s) => s.open ?
|
|
585
|
-
if (e.key === "4") setState((s) => s.open ?
|
|
586
|
-
if (e.key === "5") setState((s) => s.open ?
|
|
693
|
+
setState((s) => ({ ...s, open: false, pinned: false, inspected: null }));
|
|
694
|
+
if (e.key === "1") setState((s) => s.open ? { ...s, panel: "inspector" } : s);
|
|
695
|
+
if (e.key === "2") setState((s) => s.open ? { ...s, panel: "state" } : s);
|
|
696
|
+
if (e.key === "3") setState((s) => s.open ? { ...s, panel: "container" } : s);
|
|
697
|
+
if (e.key === "4") setState((s) => s.open ? { ...s, panel: "tokens" } : s);
|
|
698
|
+
if (e.key === "5") setState((s) => s.open ? { ...s, panel: "analyzer" } : s);
|
|
587
699
|
};
|
|
588
700
|
window.addEventListener("keydown", onKey);
|
|
589
701
|
return () => window.removeEventListener("keydown", onKey);
|
|
590
702
|
}, []);
|
|
591
703
|
const onMouseMove = useCallback(
|
|
592
704
|
(e) => {
|
|
593
|
-
var _a;
|
|
594
705
|
if (!isInspecting || state.pinned) return;
|
|
595
706
|
const twEl = findNearestTwElement(e.target);
|
|
596
707
|
if (!twEl) {
|
|
597
|
-
setState((s) =>
|
|
708
|
+
setState((s) => ({ ...s, inspected: null, position: { x: e.clientX, y: e.clientY } }));
|
|
598
709
|
return;
|
|
599
710
|
}
|
|
600
|
-
const { name, classes } = parseDataTw(
|
|
601
|
-
setState((s) => {
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
});
|
|
618
|
-
});
|
|
711
|
+
const { name, classes } = parseDataTw(twEl.dataset.tw ?? null);
|
|
712
|
+
setState((s) => ({
|
|
713
|
+
...s,
|
|
714
|
+
position: { x: e.clientX, y: e.clientY },
|
|
715
|
+
inspected: {
|
|
716
|
+
componentName: name,
|
|
717
|
+
element: twEl,
|
|
718
|
+
rect: twEl.getBoundingClientRect(),
|
|
719
|
+
twClasses: classes,
|
|
720
|
+
variantProps: parseVariantAttr(twEl.dataset.twVariants ?? null),
|
|
721
|
+
atomicMap: getAtomicMap(classes),
|
|
722
|
+
rawClassName: twEl.className,
|
|
723
|
+
stateNames: getStateNames(twEl),
|
|
724
|
+
activeStates: getActiveStates(twEl),
|
|
725
|
+
containerBps: getContainerBps(twEl)
|
|
726
|
+
}
|
|
727
|
+
}));
|
|
619
728
|
},
|
|
620
729
|
[isInspecting, state.pinned]
|
|
621
730
|
);
|
|
622
731
|
const onClick = useCallback(
|
|
623
732
|
(e) => {
|
|
624
|
-
var _a;
|
|
625
733
|
if (!isInspecting) return;
|
|
626
|
-
if (
|
|
627
|
-
setState((s) =>
|
|
734
|
+
if (overlayRef.current?.contains(e.target)) return;
|
|
735
|
+
setState((s) => ({ ...s, pinned: !s.pinned && !!s.inspected }));
|
|
628
736
|
},
|
|
629
737
|
[isInspecting]
|
|
630
738
|
);
|
|
@@ -641,7 +749,7 @@ function TwDevTools() {
|
|
|
641
749
|
return React.createElement(
|
|
642
750
|
"button",
|
|
643
751
|
{
|
|
644
|
-
onClick: () => setState((s) =>
|
|
752
|
+
onClick: () => setState((s) => ({ ...s, open: true })),
|
|
645
753
|
style: S.toggleBtn,
|
|
646
754
|
title: "tailwind-styled-v4 DevTools (Ctrl+Shift+D)"
|
|
647
755
|
},
|
|
@@ -660,12 +768,13 @@ function TwDevTools() {
|
|
|
660
768
|
{ style: S.root },
|
|
661
769
|
// ── Element highlight (inspector only) ──────────────────────────────
|
|
662
770
|
isInspecting && state.inspected && React.createElement("div", {
|
|
663
|
-
style:
|
|
771
|
+
style: {
|
|
772
|
+
...S.highlight,
|
|
664
773
|
top: state.inspected.rect.top + window.scrollY,
|
|
665
774
|
left: state.inspected.rect.left + window.scrollX,
|
|
666
775
|
width: state.inspected.rect.width,
|
|
667
776
|
height: state.inspected.rect.height
|
|
668
|
-
}
|
|
777
|
+
}
|
|
669
778
|
}),
|
|
670
779
|
// ── Component name label ────────────────────────────────────────────
|
|
671
780
|
isInspecting && state.inspected && React.createElement(
|
|
@@ -692,15 +801,17 @@ function TwDevTools() {
|
|
|
692
801
|
"div",
|
|
693
802
|
{
|
|
694
803
|
ref: overlayRef,
|
|
695
|
-
style: state.panel === "inspector" && state.inspected ?
|
|
804
|
+
style: state.panel === "inspector" && state.inspected ? {
|
|
805
|
+
...S.panel,
|
|
696
806
|
top: Math.min(state.position.y + 16, window.innerHeight - 460),
|
|
697
807
|
left: Math.min(state.position.x + 16, window.innerWidth - 320)
|
|
698
|
-
}
|
|
808
|
+
} : {
|
|
809
|
+
...S.panel,
|
|
699
810
|
top: "auto",
|
|
700
811
|
bottom: "40px",
|
|
701
812
|
right: "12px",
|
|
702
813
|
left: "auto"
|
|
703
|
-
}
|
|
814
|
+
}
|
|
704
815
|
},
|
|
705
816
|
// Header
|
|
706
817
|
React.createElement(
|
|
@@ -719,7 +830,7 @@ function TwDevTools() {
|
|
|
719
830
|
"button",
|
|
720
831
|
{
|
|
721
832
|
style: S.closeBtn,
|
|
722
|
-
onClick: () => setState((s) =>
|
|
833
|
+
onClick: () => setState((s) => ({ ...s, open: false, pinned: false, inspected: null }))
|
|
723
834
|
},
|
|
724
835
|
"\u2715"
|
|
725
836
|
)
|
|
@@ -734,12 +845,13 @@ function TwDevTools() {
|
|
|
734
845
|
"button",
|
|
735
846
|
{
|
|
736
847
|
key: p.id,
|
|
737
|
-
style:
|
|
848
|
+
style: {
|
|
849
|
+
...S.tab,
|
|
738
850
|
background: state.panel === p.id ? "#18181b" : "none",
|
|
739
851
|
color: state.panel === p.id ? "#e4e4e7" : "#52525b",
|
|
740
852
|
borderBottom: state.panel === p.id ? "2px solid #3b82f6" : "2px solid transparent"
|
|
741
|
-
}
|
|
742
|
-
onClick: () => setState((s) =>
|
|
853
|
+
},
|
|
854
|
+
onClick: () => setState((s) => ({ ...s, panel: p.id })),
|
|
743
855
|
title: `${p.label} (${PANELS.findIndex((x) => x.id === p.id) + 1})`
|
|
744
856
|
},
|
|
745
857
|
`${p.icon} ${p.label}`
|