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.
Files changed (77) hide show
  1. package/dist/animate.cjs +754 -235
  2. package/dist/animate.cjs.map +1 -1
  3. package/dist/animate.d.cts +55 -99
  4. package/dist/animate.d.ts +55 -99
  5. package/dist/animate.js +742 -235
  6. package/dist/animate.js.map +1 -1
  7. package/dist/chunk-VZEJV27B.js +11 -0
  8. package/dist/chunk-VZEJV27B.js.map +1 -0
  9. package/dist/chunk-Y5D3E72P.cjs +13 -0
  10. package/dist/chunk-Y5D3E72P.cjs.map +1 -0
  11. package/dist/css.cjs +61 -11
  12. package/dist/css.cjs.map +1 -1
  13. package/dist/css.d.cts +3 -18
  14. package/dist/css.d.ts +3 -18
  15. package/dist/css.js +61 -11
  16. package/dist/css.js.map +1 -1
  17. package/dist/devtools.cjs +200 -88
  18. package/dist/devtools.cjs.map +1 -1
  19. package/dist/devtools.js +200 -88
  20. package/dist/devtools.js.map +1 -1
  21. package/dist/index.cjs +430 -135
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.d.cts +74 -3
  24. package/dist/index.d.ts +74 -3
  25. package/dist/index.js +415 -132
  26. package/dist/index.js.map +1 -1
  27. package/dist/next.cjs +118 -138
  28. package/dist/next.cjs.map +1 -1
  29. package/dist/next.d.cts +28 -19
  30. package/dist/next.d.ts +28 -19
  31. package/dist/next.js +111 -131
  32. package/dist/next.js.map +1 -1
  33. package/dist/preset.cjs +312 -18
  34. package/dist/preset.cjs.map +1 -1
  35. package/dist/preset.d.cts +29 -2
  36. package/dist/preset.d.ts +29 -2
  37. package/dist/preset.js +311 -19
  38. package/dist/preset.js.map +1 -1
  39. package/dist/turbopackLoader.cjs +24 -2676
  40. package/dist/turbopackLoader.cjs.map +1 -1
  41. package/dist/turbopackLoader.d.cts +3 -13
  42. package/dist/turbopackLoader.d.ts +3 -13
  43. package/dist/turbopackLoader.js +24 -2670
  44. package/dist/turbopackLoader.js.map +1 -1
  45. package/dist/vite.cjs +90 -57
  46. package/dist/vite.cjs.map +1 -1
  47. package/dist/vite.d.cts +35 -6
  48. package/dist/vite.d.ts +35 -6
  49. package/dist/vite.js +90 -58
  50. package/dist/vite.js.map +1 -1
  51. package/dist/webpackLoader.cjs +27 -2646
  52. package/dist/webpackLoader.cjs.map +1 -1
  53. package/dist/webpackLoader.d.cts +3 -10
  54. package/dist/webpackLoader.d.ts +3 -10
  55. package/dist/webpackLoader.js +27 -2640
  56. package/dist/webpackLoader.js.map +1 -1
  57. package/package.json +31 -28
  58. package/dist/astTransform-ua-eapqs.d.cts +0 -41
  59. package/dist/astTransform-ua-eapqs.d.ts +0 -41
  60. package/dist/compiler.cjs +0 -3594
  61. package/dist/compiler.cjs.map +0 -1
  62. package/dist/compiler.d.cts +0 -716
  63. package/dist/compiler.d.ts +0 -716
  64. package/dist/compiler.js +0 -3535
  65. package/dist/compiler.js.map +0 -1
  66. package/dist/plugins.cjs +0 -396
  67. package/dist/plugins.cjs.map +0 -1
  68. package/dist/plugins.d.cts +0 -231
  69. package/dist/plugins.d.ts +0 -231
  70. package/dist/plugins.js +0 -381
  71. package/dist/plugins.js.map +0 -1
  72. package/dist/theme.cjs +0 -154
  73. package/dist/theme.cjs.map +0 -1
  74. package/dist/theme.d.cts +0 -181
  75. package/dist/theme.d.ts +0 -181
  76. package/dist/theme.js +0 -148
  77. 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 (e) {
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 ((_a = cur.dataset) == null ? void 0 : _a.tw) return cur;
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: __spreadProps(__spreadValues({}, S.varKey), { color: "#f59e0b" }) }, `data-${k}`),
123
- React.createElement("span", { style: __spreadProps(__spreadValues({}, S.varValue), { color: "#34d399" }) }, `"${v}"`)
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: __spreadProps(__spreadValues({}, S.classChip), {
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: __spreadProps(__spreadValues({}, S.classChip), { color: "#818cf8" }) },
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
- var _a;
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: __spreadProps(__spreadValues({}, S.classChip), { color: "#f59e0b" }) },
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: __spreadProps(__spreadValues({}, S.row), { marginTop: "4px" }) },
248
+ { style: { ...S.row, marginTop: "4px" } },
268
249
  React.createElement(
269
250
  "span",
270
251
  {
271
- style: __spreadProps(__spreadValues({}, S.sectionTitle), {
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: __spreadProps(__spreadValues({}, S.row), { marginBottom: "2px" }) },
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_(__spreadValues({}, t)));
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: __spreadProps(__spreadValues({}, S.sectionTitle), { padding: "8px 12px 4px", color: "#52525b" }) },
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: __spreadProps(__spreadValues({}, S.row), { padding: "6px 12px", borderBottom: "1px solid #18181b" }) },
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
- var _a2;
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: (_a = stateReg == null ? void 0 : stateReg.size) != null ? _a : 0,
475
- containerCount: (_b = containerReg == null ? void 0 : containerReg.size) != null ? _b : 0,
476
- tokenCount: Object.keys((_d = (_c = tokenEngine == null ? void 0 : tokenEngine.getTokens) == null ? void 0 : _c.call(tokenEngine)) != null ? _d : {}).length
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: __spreadProps(__spreadValues({}, S.copyBtn), { borderTop: "none", color: "#60a5fa", fontWeight: "600" }),
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
- ) : results && React.createElement(
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) => __spreadProps(__spreadValues({}, s), { open: !s.open, inspected: null }));
690
+ setState((s) => ({ ...s, open: !s.open, inspected: null }));
579
691
  }
580
692
  if (e.key === "Escape")
581
- setState((s) => __spreadProps(__spreadValues({}, s), { open: false, pinned: false, inspected: null }));
582
- if (e.key === "1") setState((s) => s.open ? __spreadProps(__spreadValues({}, s), { panel: "inspector" }) : s);
583
- if (e.key === "2") setState((s) => s.open ? __spreadProps(__spreadValues({}, s), { panel: "state" }) : s);
584
- if (e.key === "3") setState((s) => s.open ? __spreadProps(__spreadValues({}, s), { panel: "container" }) : s);
585
- if (e.key === "4") setState((s) => s.open ? __spreadProps(__spreadValues({}, s), { panel: "tokens" }) : s);
586
- if (e.key === "5") setState((s) => s.open ? __spreadProps(__spreadValues({}, s), { panel: "analyzer" }) : s);
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) => __spreadProps(__spreadValues({}, s), { inspected: null, position: { x: e.clientX, y: e.clientY } }));
708
+ setState((s) => ({ ...s, inspected: null, position: { x: e.clientX, y: e.clientY } }));
598
709
  return;
599
710
  }
600
- const { name, classes } = parseDataTw((_a = twEl.dataset.tw) != null ? _a : null);
601
- setState((s) => {
602
- var _a2;
603
- return __spreadProps(__spreadValues({}, s), {
604
- position: { x: e.clientX, y: e.clientY },
605
- inspected: {
606
- componentName: name,
607
- element: twEl,
608
- rect: twEl.getBoundingClientRect(),
609
- twClasses: classes,
610
- variantProps: parseVariantAttr((_a2 = twEl.dataset.twVariants) != null ? _a2 : null),
611
- atomicMap: getAtomicMap(classes),
612
- rawClassName: twEl.className,
613
- stateNames: getStateNames(twEl),
614
- activeStates: getActiveStates(twEl),
615
- containerBps: getContainerBps(twEl)
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 ((_a = overlayRef.current) == null ? void 0 : _a.contains(e.target)) return;
627
- setState((s) => __spreadProps(__spreadValues({}, s), { pinned: !s.pinned && !!s.inspected }));
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) => __spreadProps(__spreadValues({}, s), { open: true })),
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: __spreadProps(__spreadValues({}, S.highlight), {
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 ? __spreadProps(__spreadValues({}, S.panel), {
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
- }) : __spreadProps(__spreadValues({}, S.panel), {
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) => __spreadProps(__spreadValues({}, s), { open: false, pinned: false, inspected: null }))
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: __spreadProps(__spreadValues({}, S.tab), {
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) => __spreadProps(__spreadValues({}, s), { panel: p.id })),
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}`