uidex 0.6.0 → 0.8.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 (57) hide show
  1. package/README.md +3 -3
  2. package/dist/cli/cli.cjs +2502 -2253
  3. package/dist/cli/cli.cjs.map +1 -1
  4. package/dist/headless/index.cjs +86 -703
  5. package/dist/headless/index.cjs.map +1 -1
  6. package/dist/headless/index.d.cts +46 -22
  7. package/dist/headless/index.d.ts +46 -22
  8. package/dist/headless/index.js +86 -707
  9. package/dist/headless/index.js.map +1 -1
  10. package/dist/index.cjs +712 -4149
  11. package/dist/index.cjs.map +1 -1
  12. package/dist/index.d.cts +82 -366
  13. package/dist/index.d.ts +82 -366
  14. package/dist/index.js +708 -4156
  15. package/dist/index.js.map +1 -1
  16. package/dist/playwright/index.cjs +175 -0
  17. package/dist/playwright/index.cjs.map +1 -1
  18. package/dist/playwright/index.d.cts +2 -0
  19. package/dist/playwright/index.d.ts +2 -0
  20. package/dist/playwright/index.js +167 -0
  21. package/dist/playwright/index.js.map +1 -1
  22. package/dist/playwright/states-reporter.cjs +123 -0
  23. package/dist/playwright/states-reporter.cjs.map +1 -0
  24. package/dist/playwright/states-reporter.d.cts +46 -0
  25. package/dist/playwright/states-reporter.d.ts +46 -0
  26. package/dist/playwright/states-reporter.js +88 -0
  27. package/dist/playwright/states-reporter.js.map +1 -0
  28. package/dist/playwright/states.cjs +118 -0
  29. package/dist/playwright/states.cjs.map +1 -0
  30. package/dist/playwright/states.d.cts +120 -0
  31. package/dist/playwright/states.d.ts +120 -0
  32. package/dist/playwright/states.js +88 -0
  33. package/dist/playwright/states.js.map +1 -0
  34. package/dist/react/index.cjs +750 -4113
  35. package/dist/react/index.cjs.map +1 -1
  36. package/dist/react/index.d.cts +78 -278
  37. package/dist/react/index.d.ts +78 -278
  38. package/dist/react/index.js +748 -4135
  39. package/dist/react/index.js.map +1 -1
  40. package/dist/scan/index.cjs +2694 -1541
  41. package/dist/scan/index.cjs.map +1 -1
  42. package/dist/scan/index.d.cts +482 -19
  43. package/dist/scan/index.d.ts +482 -19
  44. package/dist/scan/index.js +2682 -1540
  45. package/dist/scan/index.js.map +1 -1
  46. package/package.json +14 -17
  47. package/templates/claude/SKILL.md +71 -0
  48. package/templates/claude/references/audit.md +43 -0
  49. package/templates/claude/{rules.md → references/conventions.md} +25 -28
  50. package/dist/cloud/index.cjs +0 -472
  51. package/dist/cloud/index.cjs.map +0 -1
  52. package/dist/cloud/index.d.cts +0 -82
  53. package/dist/cloud/index.d.ts +0 -82
  54. package/dist/cloud/index.js +0 -445
  55. package/dist/cloud/index.js.map +0 -1
  56. package/templates/claude/audit.md +0 -43
  57. /package/templates/claude/{api.md → references/api.md} +0 -0
@@ -18,11 +18,6 @@ function isMetaEntity(entity) {
18
18
  function entityKey(entity) {
19
19
  return entity.kind === "route" ? entity.path : entity.id;
20
20
  }
21
- function sameRef(a, b) {
22
- if (a === b) return true;
23
- if (a === null || b === null) return false;
24
- return a.kind === b.kind && a.id === b.id;
25
- }
26
21
  var UnknownEntityKindError = class extends Error {
27
22
  kind;
28
23
  constructor(kind) {
@@ -87,13 +82,14 @@ function createRegistry() {
87
82
  };
88
83
  const getPatternsForKind = (kind) => {
89
84
  const cached = patternCache.get(kind);
90
- if (cached !== void 0)
91
- return cached;
85
+ if (cached !== void 0) return cached;
92
86
  const patterns = [];
93
87
  for (const [key, entity] of store[kind]) {
94
- if (key.endsWith("*")) {
88
+ if (key.includes("*")) {
89
+ const segments = key.split("*");
95
90
  patterns.push({
96
- prefix: key.slice(0, -1),
91
+ segments,
92
+ staticLength: segments.reduce((n, s) => n + s.length, 0),
97
93
  entity
98
94
  });
99
95
  }
@@ -104,13 +100,25 @@ function createRegistry() {
104
100
  );
105
101
  return patterns;
106
102
  };
103
+ const matchesSegments = (segments, id) => {
104
+ const first = segments[0];
105
+ const last = segments[segments.length - 1];
106
+ if (!id.startsWith(first)) return false;
107
+ let pos = first.length;
108
+ for (let i = 1; i < segments.length - 1; i++) {
109
+ const idx = id.indexOf(segments[i], pos);
110
+ if (idx === -1) return false;
111
+ pos = idx + segments[i].length;
112
+ }
113
+ return id.endsWith(last) && id.length - last.length >= pos;
114
+ };
107
115
  const matchPattern = (kind, id) => {
108
116
  assertEntityKind(kind);
109
117
  const patterns = getPatternsForKind(kind);
110
118
  if (patterns.length === 0) return void 0;
111
119
  let best;
112
120
  for (const entry of patterns) {
113
- if (id.startsWith(entry.prefix) && (best === void 0 || entry.prefix.length > best.prefix.length)) {
121
+ if (matchesSegments(entry.segments, id) && (best === void 0 || entry.staticLength > best.staticLength)) {
114
122
  best = entry;
115
123
  }
116
124
  }
@@ -301,8 +309,7 @@ var COMMAND_PALETTE_ENTRY = {
301
309
  function createModeStore(options) {
302
310
  const { nav, bindings } = options;
303
311
  const store = createStore(() => ({
304
- mode: "idle",
305
- inspectorActive: false
312
+ mode: "idle"
306
313
  }));
307
314
  const transition = {
308
315
  openPalette() {
@@ -311,17 +318,17 @@ function createModeStore(options) {
311
318
  bindings?.destroyInspector?.();
312
319
  }
313
320
  nav.nav.reset([COMMAND_PALETTE_ENTRY]);
314
- store.setState({ mode: "palette", inspectorActive: false });
321
+ store.setState({ mode: "palette" });
315
322
  },
316
323
  openInspector() {
317
324
  bindings?.mountInspector?.();
318
325
  nav.nav.clear();
319
- store.setState({ mode: "inspecting", inspectorActive: true });
326
+ store.setState({ mode: "inspecting" });
320
327
  },
321
328
  closeInspector() {
322
329
  bindings?.destroyInspector?.();
323
330
  nav.nav.clear();
324
- store.setState({ mode: "idle", inspectorActive: false });
331
+ store.setState({ mode: "idle" });
325
332
  },
326
333
  toggleInspector() {
327
334
  if (store.getState().mode === "inspecting") {
@@ -336,7 +343,7 @@ function createModeStore(options) {
336
343
  bindings?.destroyInspector?.();
337
344
  }
338
345
  nav.nav.reset(initialStack);
339
- store.setState({ mode: "viewing", inspectorActive: false });
346
+ store.setState({ mode: "viewing" });
340
347
  },
341
348
  dismiss() {
342
349
  const prev = store.getState();
@@ -344,7 +351,7 @@ function createModeStore(options) {
344
351
  bindings?.destroyInspector?.();
345
352
  }
346
353
  nav.nav.clear();
347
- store.setState({ mode: "idle", inspectorActive: false });
354
+ store.setState({ mode: "idle" });
348
355
  },
349
356
  popOrTransition() {
350
357
  const { stack } = nav.getState();
@@ -352,12 +359,12 @@ function createModeStore(options) {
352
359
  nav.nav.pop();
353
360
  } else if (stack.length === 2 && stack[0]?.id === "command-palette") {
354
361
  nav.nav.reset([COMMAND_PALETTE_ENTRY]);
355
- store.setState({ mode: "palette", inspectorActive: false });
362
+ store.setState({ mode: "palette" });
356
363
  } else if (stack.length === 2) {
357
364
  nav.nav.pop();
358
365
  } else {
359
366
  nav.nav.clear();
360
- store.setState({ mode: "idle", inspectorActive: false });
367
+ store.setState({ mode: "idle" });
361
368
  }
362
369
  },
363
370
  pushView(entry) {
@@ -374,7 +381,7 @@ function createModeStore(options) {
374
381
  case "inspecting":
375
382
  bindings?.destroyInspector?.();
376
383
  nav.nav.reset([entry]);
377
- store.setState({ mode: "viewing", inspectorActive: false });
384
+ store.setState({ mode: "viewing" });
378
385
  break;
379
386
  case "palette":
380
387
  case "viewing":
@@ -409,14 +416,6 @@ function createNavigationStore() {
409
416
  store.setState({ stack: s.slice(0, -1) });
410
417
  }
411
418
  },
412
- replace(entry) {
413
- const s = store.getState().stack;
414
- if (s.length === 0) {
415
- store.setState({ stack: [entry] });
416
- } else {
417
- store.setState({ stack: [...s.slice(0, -1), entry] });
418
- }
419
- },
420
419
  clear() {
421
420
  store.setState({ stack: [] });
422
421
  },
@@ -431,15 +430,11 @@ function createNavigationStore() {
431
430
 
432
431
  // src/browser/session/store.ts
433
432
  var defaultSnapshot = {
434
- hover: null,
435
- selection: null,
436
433
  stack: [],
437
434
  pinnedHighlight: null,
438
- inspectorActive: false,
435
+ mode: "idle",
439
436
  theme: "auto",
440
- resolvedTheme: "light",
441
- ingestActive: false,
442
- user: null
437
+ resolvedTheme: "light"
443
438
  };
444
439
  function resolveTheme(preference, detect) {
445
440
  if (preference !== "auto") return preference;
@@ -489,7 +484,6 @@ function createSession(options = {}) {
489
484
  } else if (highlightMode === "transient") {
490
485
  onUpdateOverlay?.(hlCtx);
491
486
  }
492
- store.setState({ hover: ref });
493
487
  },
494
488
  unhover() {
495
489
  if (highlightMode === "transient") {
@@ -499,7 +493,6 @@ function createSession(options = {}) {
499
493
  hlCtx.color = null;
500
494
  onHideOverlay?.();
501
495
  }
502
- store.setState({ hover: null });
503
496
  },
504
497
  pin(ref) {
505
498
  const pinRef = ref ?? hlCtx.ref;
@@ -527,15 +520,11 @@ function createSession(options = {}) {
527
520
  };
528
521
  const store = createStore3(() => ({
529
522
  ...defaultSnapshot,
530
- hover: overrides.hover ?? null,
531
- selection: overrides.selection ?? null,
532
523
  stack: [],
533
524
  pinnedHighlight: null,
534
- inspectorActive: false,
525
+ mode: "idle",
535
526
  theme: initialPref,
536
- resolvedTheme: initialResolved,
537
- ingestActive: overrides.ingestActive ?? false,
538
- user: overrides.user ?? null
527
+ resolvedTheme: initialResolved
539
528
  }));
540
529
  nav.subscribe(() => {
541
530
  const { stack } = nav.getState();
@@ -544,29 +533,21 @@ function createSession(options = {}) {
544
533
  }
545
534
  });
546
535
  modeStore.subscribe(() => {
547
- const { inspectorActive } = modeStore.getState();
548
- if (store.getState().inspectorActive !== inspectorActive) {
549
- store.setState({ inspectorActive });
536
+ const { mode } = modeStore.getState();
537
+ if (store.getState().mode !== mode) {
538
+ store.setState({ mode });
550
539
  }
551
540
  });
552
541
  const session = store;
553
542
  session.nav = nav;
554
543
  session.mode = modeStore;
555
544
  session.highlight = highlightActions;
556
- session.select = (ref) => {
557
- if (sameRef(store.getState().selection, ref)) return;
558
- store.setState({ selection: ref });
559
- };
560
545
  session.setTheme = (theme, resolved) => {
561
546
  const state = store.getState();
562
547
  const nextResolved = resolved ?? resolveTheme(theme, detectTheme);
563
548
  if (state.theme === theme && state.resolvedTheme === nextResolved) return;
564
549
  store.setState({ theme, resolvedTheme: nextResolved });
565
550
  };
566
- session.setIngest = (active) => {
567
- if (store.getState().ingestActive === active) return;
568
- store.setState({ ingestActive: active });
569
- };
570
551
  if (initialStack.length > 0) {
571
552
  modeStore.transition.openPalette();
572
553
  for (let i = 1; i < initialStack.length; i++) {
@@ -587,8 +568,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
587
568
  @layer theme, base, components, utilities;
588
569
  @layer theme {
589
570
  :root, :host {
590
- --font-sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
591
- Roboto, sans-serif;
592
571
  --color-red-400: oklch(70.4% 0.191 22.216);
593
572
  --color-red-500: oklch(63.7% 0.237 25.331);
594
573
  --color-red-700: oklch(50.5% 0.213 27.518);
@@ -641,7 +620,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
641
620
  --color-black: #000;
642
621
  --color-white: #fff;
643
622
  --spacing: 0.25rem;
644
- --container-sm: 24rem;
645
623
  --container-xl: 36rem;
646
624
  --text-xs: 0.75rem;
647
625
  --text-xs--line-height: calc(1 / 0.75);
@@ -649,28 +627,22 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
649
627
  --text-sm--line-height: calc(1.25 / 0.875);
650
628
  --text-base: 1rem;
651
629
  --text-base--line-height: calc(1.5 / 1);
652
- --text-xl: 1.25rem;
653
- --text-xl--line-height: calc(1.75 / 1.25);
654
630
  --font-weight-normal: 400;
655
631
  --font-weight-medium: 500;
656
632
  --font-weight-semibold: 600;
657
- --font-weight-bold: 700;
658
633
  --tracking-tight: -0.025em;
659
634
  --tracking-widest: 0.1em;
660
635
  --leading-relaxed: 1.625;
661
- --radius-md: calc(var(--radius) * 0.8);
662
636
  --radius-lg: var(--radius);
663
637
  --radius-xl: calc(var(--radius) * 1.4);
664
638
  --radius-2xl: calc(var(--radius) * 1.8);
665
639
  --ease-out: cubic-bezier(0, 0, 0.2, 1);
666
- --animate-spin: spin 1s linear infinite;
667
640
  --blur-sm: 8px;
668
641
  --default-transition-duration: 150ms;
669
642
  --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
670
643
  --default-font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
671
644
  Roboto, sans-serif;
672
645
  --default-mono-font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
673
- --color-muted: var(--muted);
674
646
  --color-border: var(--border);
675
647
  }
676
648
  }
@@ -838,17 +810,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
838
810
  .visible {
839
811
  visibility: visible;
840
812
  }
841
- .sr-only {
842
- position: absolute;
843
- width: 1px;
844
- height: 1px;
845
- padding: 0;
846
- margin: -1px;
847
- overflow: hidden;
848
- clip-path: inset(50%);
849
- white-space: nowrap;
850
- border-width: 0;
851
- }
852
813
  .absolute {
853
814
  position: absolute;
854
815
  }
@@ -870,33 +831,12 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
870
831
  .end {
871
832
  inset-inline-end: var(--spacing);
872
833
  }
873
- .-top-1 {
874
- top: calc(var(--spacing) * -1);
875
- }
876
- .-right-1 {
877
- right: calc(var(--spacing) * -1);
878
- }
879
- .right-0 {
880
- right: calc(var(--spacing) * 0);
881
- }
882
- .right-2 {
883
- right: calc(var(--spacing) * 2);
884
- }
885
- .bottom-full {
886
- bottom: 100%;
887
- }
888
- .bottom-px {
889
- bottom: 1px;
890
- }
891
834
  .z-1 {
892
835
  z-index: 1;
893
836
  }
894
837
  .z-10 {
895
838
  z-index: 10;
896
839
  }
897
- .z-\\[2147483647\\] {
898
- z-index: 2147483647;
899
- }
900
840
  .container {
901
841
  width: 100%;
902
842
  @media (width >= 40rem) {
@@ -924,21 +864,12 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
924
864
  .mx-2 {
925
865
  margin-inline: calc(var(--spacing) * 2);
926
866
  }
927
- .my-1 {
928
- margin-block: calc(var(--spacing) * 1);
929
- }
930
867
  .ms-auto {
931
868
  margin-inline-start: auto;
932
869
  }
933
870
  .mt-1 {
934
871
  margin-top: calc(var(--spacing) * 1);
935
872
  }
936
- .mb-2 {
937
- margin-bottom: calc(var(--spacing) * 2);
938
- }
939
- .mb-6 {
940
- margin-bottom: calc(var(--spacing) * 6);
941
- }
942
873
  .ml-auto {
943
874
  margin-left: auto;
944
875
  }
@@ -957,26 +888,12 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
957
888
  .inline {
958
889
  display: inline;
959
890
  }
960
- .inline-block {
961
- display: inline-block;
962
- }
963
891
  .inline-flex {
964
892
  display: inline-flex;
965
893
  }
966
- .list-item {
967
- display: list-item;
968
- }
969
894
  .table {
970
895
  display: table;
971
896
  }
972
- .size-2 {
973
- width: calc(var(--spacing) * 2);
974
- height: calc(var(--spacing) * 2);
975
- }
976
- .size-3 {
977
- width: calc(var(--spacing) * 3);
978
- height: calc(var(--spacing) * 3);
979
- }
980
897
  .size-3\\.5 {
981
898
  width: calc(var(--spacing) * 3.5);
982
899
  height: calc(var(--spacing) * 3.5);
@@ -1034,33 +951,15 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1034
951
  .h-\\[26rem\\] {
1035
952
  height: 26rem;
1036
953
  }
1037
- .h-auto {
1038
- height: auto;
1039
- }
1040
954
  .h-full {
1041
955
  height: 100%;
1042
956
  }
1043
- .h-px {
1044
- height: 1px;
1045
- }
1046
- .max-h-32 {
1047
- max-height: calc(var(--spacing) * 32);
1048
- }
1049
- .max-h-full {
1050
- max-height: 100%;
1051
- }
1052
957
  .min-h-0 {
1053
958
  min-height: calc(var(--spacing) * 0);
1054
959
  }
1055
- .min-h-7 {
1056
- min-height: calc(var(--spacing) * 7);
1057
- }
1058
960
  .min-h-8 {
1059
961
  min-height: calc(var(--spacing) * 8);
1060
962
  }
1061
- .min-h-20 {
1062
- min-height: calc(var(--spacing) * 20);
1063
- }
1064
963
  .w-3\\.5 {
1065
964
  width: calc(var(--spacing) * 3.5);
1066
965
  }
@@ -1070,30 +969,15 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1070
969
  .w-12 {
1071
970
  width: calc(var(--spacing) * 12);
1072
971
  }
1073
- .w-20 {
1074
- width: calc(var(--spacing) * 20);
1075
- }
1076
- .w-36 {
1077
- width: calc(var(--spacing) * 36);
1078
- }
1079
972
  .w-56 {
1080
973
  width: calc(var(--spacing) * 56);
1081
974
  }
1082
- .w-auto {
1083
- width: auto;
1084
- }
1085
975
  .w-full {
1086
976
  width: 100%;
1087
977
  }
1088
978
  .w-px {
1089
979
  width: 1px;
1090
980
  }
1091
- .max-w-full {
1092
- max-width: 100%;
1093
- }
1094
- .max-w-sm {
1095
- max-width: var(--container-sm);
1096
- }
1097
981
  .max-w-xl {
1098
982
  max-width: var(--container-xl);
1099
983
  }
@@ -1121,44 +1005,9 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1121
1005
  .shrink-0 {
1122
1006
  flex-shrink: 0;
1123
1007
  }
1124
- .origin-bottom-left {
1125
- transform-origin: 0 100%;
1126
- }
1127
- .origin-bottom-right {
1128
- transform-origin: 100% 100%;
1129
- }
1130
- .-translate-x-0\\.5 {
1131
- --tw-translate-x: calc(var(--spacing) * -0.5);
1132
- translate: var(--tw-translate-x) var(--tw-translate-y);
1133
- }
1134
- .translate-x-0\\.5 {
1135
- --tw-translate-x: calc(var(--spacing) * 0.5);
1136
- translate: var(--tw-translate-x) var(--tw-translate-y);
1137
- }
1138
- .scale-84 {
1139
- --tw-scale-x: 84%;
1140
- --tw-scale-y: 84%;
1141
- --tw-scale-z: 84%;
1142
- scale: var(--tw-scale-x) var(--tw-scale-y);
1143
- }
1144
- .-rotate-10 {
1145
- rotate: calc(10deg * -1);
1146
- }
1147
- .rotate-10 {
1148
- rotate: 10deg;
1149
- }
1150
1008
  .transform {
1151
1009
  transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);
1152
1010
  }
1153
- .animate-skeleton {
1154
- animation: skeleton 2s -1s infinite linear;
1155
- }
1156
- .animate-spin {
1157
- animation: var(--animate-spin);
1158
- }
1159
- .cursor-default {
1160
- cursor: default;
1161
- }
1162
1011
  .cursor-pointer {
1163
1012
  cursor: pointer;
1164
1013
  }
@@ -1168,18 +1017,9 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1168
1017
  .scroll-py-2 {
1169
1018
  scroll-padding-block: calc(var(--spacing) * 2);
1170
1019
  }
1171
- .list-none {
1172
- list-style-type: none;
1173
- }
1174
- .appearance-none {
1175
- appearance: none;
1176
- }
1177
1020
  .flex-col {
1178
1021
  flex-direction: column;
1179
1022
  }
1180
- .flex-row {
1181
- flex-direction: row;
1182
- }
1183
1023
  .items-center {
1184
1024
  align-items: center;
1185
1025
  }
@@ -1192,15 +1032,9 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1192
1032
  .justify-center {
1193
1033
  justify-content: center;
1194
1034
  }
1195
- .justify-start {
1196
- justify-content: flex-start;
1197
- }
1198
1035
  .gap-0 {
1199
1036
  gap: calc(var(--spacing) * 0);
1200
1037
  }
1201
- .gap-0\\.5 {
1202
- gap: calc(var(--spacing) * 0.5);
1203
- }
1204
1038
  .gap-1 {
1205
1039
  gap: calc(var(--spacing) * 1);
1206
1040
  }
@@ -1213,15 +1047,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1213
1047
  .gap-3 {
1214
1048
  gap: calc(var(--spacing) * 3);
1215
1049
  }
1216
- .gap-4 {
1217
- gap: calc(var(--spacing) * 4);
1218
- }
1219
- .gap-6 {
1220
- gap: calc(var(--spacing) * 6);
1221
- }
1222
- .self-start {
1223
- align-self: flex-start;
1224
- }
1225
1050
  .truncate {
1226
1051
  overflow: hidden;
1227
1052
  text-overflow: ellipsis;
@@ -1319,21 +1144,12 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1319
1144
  background-color: color-mix(in oklab, var(--color-black) 32%, transparent);
1320
1145
  }
1321
1146
  }
1322
- .bg-black\\/80 {
1323
- background-color: color-mix(in srgb, #000 80%, transparent);
1324
- @supports (color: color-mix(in lab, red, red)) {
1325
- background-color: color-mix(in oklab, var(--color-black) 80%, transparent);
1326
- }
1327
- }
1328
1147
  .bg-blue-50 {
1329
1148
  background-color: var(--color-blue-50);
1330
1149
  }
1331
1150
  .bg-border {
1332
1151
  background-color: var(--border);
1333
1152
  }
1334
- .bg-card {
1335
- background-color: var(--card);
1336
- }
1337
1153
  .bg-cyan-50 {
1338
1154
  background-color: var(--color-cyan-50);
1339
1155
  }
@@ -1349,15 +1165,9 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1349
1165
  .bg-emerald-50 {
1350
1166
  background-color: var(--color-emerald-50);
1351
1167
  }
1352
- .bg-emerald-500 {
1353
- background-color: var(--color-emerald-500);
1354
- }
1355
1168
  .bg-fuchsia-50 {
1356
1169
  background-color: var(--color-fuchsia-50);
1357
1170
  }
1358
- .bg-info {
1359
- background-color: var(--info);
1360
- }
1361
1171
  .bg-info\\/10 {
1362
1172
  background-color: var(--info);
1363
1173
  @supports (color: color-mix(in lab, red, red)) {
@@ -1409,18 +1219,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1409
1219
  .bg-clip-padding {
1410
1220
  background-clip: padding-box;
1411
1221
  }
1412
- .bg-\\[right_0\\.5rem_center\\] {
1413
- background-position: right 0.5rem center;
1414
- }
1415
- .bg-no-repeat {
1416
- background-repeat: no-repeat;
1417
- }
1418
- .object-cover {
1419
- object-fit: cover;
1420
- }
1421
- .object-top {
1422
- object-position: top;
1423
- }
1424
1222
  .p-1 {
1425
1223
  padding: calc(var(--spacing) * 1);
1426
1224
  }
@@ -1433,12 +1231,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1433
1231
  .p-4 {
1434
1232
  padding: calc(var(--spacing) * 4);
1435
1233
  }
1436
- .p-6 {
1437
- padding: calc(var(--spacing) * 6);
1438
- }
1439
- .px-0 {
1440
- padding-inline: calc(var(--spacing) * 0);
1441
- }
1442
1234
  .px-1 {
1443
1235
  padding-inline: calc(var(--spacing) * 1);
1444
1236
  }
@@ -1460,27 +1252,15 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1460
1252
  .px-4 {
1461
1253
  padding-inline: calc(var(--spacing) * 4);
1462
1254
  }
1463
- .px-6 {
1464
- padding-inline: calc(var(--spacing) * 6);
1465
- }
1466
- .py-0 {
1467
- padding-block: calc(var(--spacing) * 0);
1468
- }
1469
1255
  .py-1 {
1470
1256
  padding-block: calc(var(--spacing) * 1);
1471
1257
  }
1472
1258
  .py-1\\.5 {
1473
1259
  padding-block: calc(var(--spacing) * 1.5);
1474
1260
  }
1475
- .py-2 {
1476
- padding-block: calc(var(--spacing) * 2);
1477
- }
1478
1261
  .py-4 {
1479
1262
  padding-block: calc(var(--spacing) * 4);
1480
1263
  }
1481
- .py-12 {
1482
- padding-block: calc(var(--spacing) * 12);
1483
- }
1484
1264
  .py-\\[max\\(1rem\\,4vh\\)\\] {
1485
1265
  padding-block: max(1rem, 4vh);
1486
1266
  }
@@ -1493,12 +1273,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1493
1273
  .pt-2 {
1494
1274
  padding-top: calc(var(--spacing) * 2);
1495
1275
  }
1496
- .pr-8 {
1497
- padding-right: calc(var(--spacing) * 8);
1498
- }
1499
- .pl-3 {
1500
- padding-left: calc(var(--spacing) * 3);
1501
- }
1502
1276
  .text-center {
1503
1277
  text-align: center;
1504
1278
  }
@@ -1516,18 +1290,10 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1516
1290
  font-size: var(--text-base);
1517
1291
  line-height: var(--tw-leading, var(--text-base--line-height));
1518
1292
  }
1519
- .text-base\\/4\\.5 {
1520
- font-size: var(--text-base);
1521
- line-height: calc(var(--spacing) * 4.5);
1522
- }
1523
1293
  .text-sm {
1524
1294
  font-size: var(--text-sm);
1525
1295
  line-height: var(--tw-leading, var(--text-sm--line-height));
1526
1296
  }
1527
- .text-xl {
1528
- font-size: var(--text-xl);
1529
- line-height: var(--tw-leading, var(--text-xl--line-height));
1530
- }
1531
1297
  .text-xs {
1532
1298
  font-size: var(--text-xs);
1533
1299
  line-height: var(--tw-leading, var(--text-xs--line-height));
@@ -1535,27 +1301,13 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1535
1301
  .text-\\[0\\.625rem\\] {
1536
1302
  font-size: 0.625rem;
1537
1303
  }
1538
- .text-\\[9px\\] {
1539
- font-size: 9px;
1540
- }
1541
- .text-\\[10px\\] {
1542
- font-size: 10px;
1543
- }
1544
1304
  .text-\\[11px\\] {
1545
1305
  font-size: 11px;
1546
1306
  }
1547
- .leading-none {
1548
- --tw-leading: 1;
1549
- line-height: 1;
1550
- }
1551
1307
  .leading-relaxed {
1552
1308
  --tw-leading: var(--leading-relaxed);
1553
1309
  line-height: var(--leading-relaxed);
1554
1310
  }
1555
- .font-bold {
1556
- --tw-font-weight: var(--font-weight-bold);
1557
- font-weight: var(--font-weight-bold);
1558
- }
1559
1311
  .font-medium {
1560
1312
  --tw-font-weight: var(--font-weight-medium);
1561
1313
  font-weight: var(--font-weight-medium);
@@ -1576,9 +1328,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1576
1328
  --tw-tracking: var(--tracking-widest);
1577
1329
  letter-spacing: var(--tracking-widest);
1578
1330
  }
1579
- .text-balance {
1580
- text-wrap: balance;
1581
- }
1582
1331
  .break-words {
1583
1332
  overflow-wrap: break-word;
1584
1333
  }
@@ -1603,9 +1352,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1603
1352
  .text-cyan-700 {
1604
1353
  color: var(--color-cyan-700);
1605
1354
  }
1606
- .text-destructive {
1607
- color: var(--destructive);
1608
- }
1609
1355
  .text-destructive-foreground {
1610
1356
  color: var(--destructive-foreground);
1611
1357
  }
@@ -1671,18 +1417,12 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1671
1417
  .line-through {
1672
1418
  text-decoration-line: line-through;
1673
1419
  }
1674
- .underline {
1675
- text-decoration-line: underline;
1676
- }
1677
1420
  .underline-offset-4 {
1678
1421
  text-underline-offset: 4px;
1679
1422
  }
1680
1423
  .accent-accent {
1681
1424
  accent-color: var(--accent);
1682
1425
  }
1683
- .accent-primary {
1684
- accent-color: var(--primary);
1685
- }
1686
1426
  .opacity-50 {
1687
1427
  opacity: 50%;
1688
1428
  }
@@ -1694,11 +1434,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1694
1434
  --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, oklab(from rgb(0 0 0 / 0.1) l a b / 5%)), 0 4px 6px -4px var(--tw-shadow-color, oklab(from rgb(0 0 0 / 0.1) l a b / 5%));
1695
1435
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1696
1436
  }
1697
- .shadow-sm\\/5 {
1698
- --tw-shadow-alpha: 5%;
1699
- --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, oklab(from rgb(0 0 0 / 0.1) l a b / 5%)), 0 1px 2px -1px var(--tw-shadow-color, oklab(from rgb(0 0 0 / 0.1) l a b / 5%));
1700
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1701
- }
1702
1437
  .shadow-xs\\/5 {
1703
1438
  --tw-shadow-alpha: 5%;
1704
1439
  --tw-shadow: 0 1px 2px 0 var(--tw-shadow-color, oklab(from rgb(0 0 0 / 0.05) l a b / 5%));
@@ -1708,14 +1443,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1708
1443
  --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
1709
1444
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1710
1445
  }
1711
- .shadow-lg {
1712
- --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
1713
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1714
- }
1715
- .shadow-none {
1716
- --tw-shadow: 0 0 #0000;
1717
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1718
- }
1719
1446
  .shadow-xs {
1720
1447
  --tw-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));
1721
1448
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
@@ -1780,10 +1507,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1780
1507
  outline-style: var(--tw-outline-style);
1781
1508
  outline-width: 1px;
1782
1509
  }
1783
- .blur {
1784
- --tw-blur: blur(8px);
1785
- filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
1786
- }
1787
1510
  .filter {
1788
1511
  filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
1789
1512
  }
@@ -1819,15 +1542,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1819
1542
  -webkit-user-select: none;
1820
1543
  user-select: none;
1821
1544
  }
1822
- .\\[--skeleton-highlight\\:--alpha\\(var\\(--color-white\\)\\/64\\%\\)\\] {
1823
- --skeleton-highlight: color-mix(in srgb, #fff 64%, transparent);
1824
- @supports (color: color-mix(in lab, red, red)) {
1825
- --skeleton-highlight: color-mix(in oklab, var(--color-white) 64%, transparent);
1826
- }
1827
- }
1828
- .\\[background\\:linear-gradient\\(120deg\\,transparent_40\\%\\,var\\(--skeleton-highlight\\)\\,transparent_60\\%\\)_var\\(--color-muted\\)_0_0\\/200\\%_100\\%_fixed\\] {
1829
- background: linear-gradient(120deg,transparent 40%,var(--skeleton-highlight),transparent 60%) var(--color-muted) 0 0/200% 100% fixed;
1830
- }
1831
1545
  .\\[clip-path\\:inset\\(0_1px\\)\\] {
1832
1546
  clip-path: inset(0 1px);
1833
1547
  }
@@ -1911,12 +1625,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1911
1625
  border-radius: calc(var(--radius-lg) - 1px);
1912
1626
  }
1913
1627
  }
1914
- .before\\:rounded-\\[calc\\(var\\(--radius-md\\)-1px\\)\\] {
1915
- &::before {
1916
- content: var(--tw-content);
1917
- border-radius: calc(var(--radius-md) - 1px);
1918
- }
1919
- }
1920
1628
  .before\\:rounded-\\[calc\\(var\\(--radius-xl\\)-1px\\)\\] {
1921
1629
  &::before {
1922
1630
  content: var(--tw-content);
@@ -1949,25 +1657,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1949
1657
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1950
1658
  }
1951
1659
  }
1952
- .focus-within\\:border-ring {
1953
- &:focus-within {
1954
- border-color: var(--ring);
1955
- }
1956
- }
1957
- .focus-within\\:ring-\\[3px\\] {
1958
- &:focus-within {
1959
- --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
1960
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1961
- }
1962
- }
1963
- .focus-within\\:ring-ring\\/30 {
1964
- &:focus-within {
1965
- --tw-ring-color: var(--ring);
1966
- @supports (color: color-mix(in lab, red, red)) {
1967
- --tw-ring-color: color-mix(in oklab, var(--ring) 30%, transparent);
1968
- }
1969
- }
1970
- }
1971
1660
  .hover\\:border-destructive\\/30 {
1972
1661
  &:hover {
1973
1662
  @media (hover: hover) {
@@ -2065,36 +1754,17 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2065
1754
  outline-style: none;
2066
1755
  }
2067
1756
  }
2068
- .focus-visible\\:border-ring {
2069
- &:focus-visible {
2070
- border-color: var(--ring);
2071
- }
2072
- }
2073
1757
  .focus-visible\\:ring-2 {
2074
1758
  &:focus-visible {
2075
1759
  --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
2076
1760
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2077
1761
  }
2078
1762
  }
2079
- .focus-visible\\:ring-\\[3px\\] {
2080
- &:focus-visible {
2081
- --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
2082
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2083
- }
2084
- }
2085
1763
  .focus-visible\\:ring-ring {
2086
1764
  &:focus-visible {
2087
1765
  --tw-ring-color: var(--ring);
2088
1766
  }
2089
1767
  }
2090
- .focus-visible\\:ring-ring\\/30 {
2091
- &:focus-visible {
2092
- --tw-ring-color: var(--ring);
2093
- @supports (color: color-mix(in lab, red, red)) {
2094
- --tw-ring-color: color-mix(in oklab, var(--ring) 30%, transparent);
2095
- }
2096
- }
2097
- }
2098
1768
  .focus-visible\\:ring-offset-1 {
2099
1769
  &:focus-visible {
2100
1770
  --tw-ring-offset-width: 1px;
@@ -2111,11 +1781,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2111
1781
  pointer-events: none;
2112
1782
  }
2113
1783
  }
2114
- .disabled\\:cursor-not-allowed {
2115
- &:disabled {
2116
- cursor: not-allowed;
2117
- }
2118
- }
2119
1784
  .disabled\\:opacity-50 {
2120
1785
  &:disabled {
2121
1786
  opacity: 50%;
@@ -2126,29 +1791,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2126
1791
  opacity: 60%;
2127
1792
  }
2128
1793
  }
2129
- .has-disabled\\:opacity-60 {
2130
- &:has(*:disabled) {
2131
- opacity: 60%;
2132
- }
2133
- }
2134
- .aria-invalid\\:border-destructive\\/40 {
2135
- &[aria-invalid="true"] {
2136
- border-color: var(--destructive);
2137
- @supports (color: color-mix(in lab, red, red)) {
2138
- border-color: color-mix(in oklab, var(--destructive) 40%, transparent);
2139
- }
2140
- }
2141
- }
2142
- .aria-invalid\\:focus-visible\\:ring-destructive\\/20 {
2143
- &[aria-invalid="true"] {
2144
- &:focus-visible {
2145
- --tw-ring-color: var(--destructive);
2146
- @supports (color: color-mix(in lab, red, red)) {
2147
- --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);
2148
- }
2149
- }
2150
- }
2151
- }
2152
1794
  .data-\\[disabled\\]\\:pointer-events-none {
2153
1795
  &[data-disabled] {
2154
1796
  pointer-events: none;
@@ -2185,12 +1827,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2185
1827
  line-height: var(--tw-leading, var(--text-sm--line-height));
2186
1828
  }
2187
1829
  }
2188
- .sm\\:text-sm\\/4 {
2189
- @media (width >= 40rem) {
2190
- font-size: var(--text-sm);
2191
- line-height: calc(var(--spacing) * 4);
2192
- }
2193
- }
2194
1830
  .dark\\:bg-amber-400\\/10 {
2195
1831
  &:is(.dark *, :host(.dark) *) {
2196
1832
  background-color: color-mix(in srgb, oklch(82.8% 0.189 84.429) 10%, transparent);
@@ -2404,14 +2040,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2404
2040
  }
2405
2041
  }
2406
2042
  }
2407
- .dark\\:\\[--skeleton-highlight\\:--alpha\\(var\\(--color-white\\)\\/4\\%\\)\\] {
2408
- &:is(.dark *, :host(.dark) *) {
2409
- --skeleton-highlight: color-mix(in srgb, #fff 4%, transparent);
2410
- @supports (color: color-mix(in lab, red, red)) {
2411
- --skeleton-highlight: color-mix(in oklab, var(--color-white) 4%, transparent);
2412
- }
2413
- }
2414
- }
2415
2043
  .dark\\:group-data-hover\\:bg-amber-400\\/20 {
2416
2044
  &:is(.dark *, :host(.dark) *) {
2417
2045
  &:is(:where(.group)[data-hover] *) {
@@ -2531,38 +2159,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2531
2159
  height: calc(var(--spacing) * 4);
2532
2160
  }
2533
2161
  }
2534
- .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4\\.5 {
2535
- & svg:not([class*='size-']) {
2536
- width: calc(var(--spacing) * 4.5);
2537
- height: calc(var(--spacing) * 4.5);
2538
- }
2539
- }
2540
- .\\[\\&\\>svg\\]\\:pointer-events-none {
2541
- &>svg {
2542
- pointer-events: none;
2543
- }
2544
- }
2545
- .\\[\\&\\>svg\\]\\:-mx-0\\.5 {
2546
- &>svg {
2547
- margin-inline: calc(var(--spacing) * -0.5);
2548
- }
2549
- }
2550
- .\\[\\&\\>svg\\]\\:shrink-0 {
2551
- &>svg {
2552
- flex-shrink: 0;
2553
- }
2554
- }
2555
- .\\[\\&\\>svg\\:not\\(\\[class\\*\\=\\'opacity-\\'\\]\\)\\]\\:opacity-80 {
2556
- &>svg:not([class*='opacity-']) {
2557
- opacity: 80%;
2558
- }
2559
- }
2560
- .\\[\\&\\>svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 {
2561
- &>svg:not([class*='size-']) {
2562
- width: calc(var(--spacing) * 4);
2563
- height: calc(var(--spacing) * 4);
2564
- }
2565
- }
2566
2162
  .\\[\\[data-kbd-nav\\]_\\&\\]\\:focus-within\\:bg-accent {
2567
2163
  [data-kbd-nav] & {
2568
2164
  &:focus-within {
@@ -2795,36 +2391,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2795
2391
  --warning: var(--color-amber-500);
2796
2392
  --warning-foreground: var(--color-amber-700);
2797
2393
  }
2798
- @property --tw-translate-x {
2799
- syntax: "*";
2800
- inherits: false;
2801
- initial-value: 0;
2802
- }
2803
- @property --tw-translate-y {
2804
- syntax: "*";
2805
- inherits: false;
2806
- initial-value: 0;
2807
- }
2808
- @property --tw-translate-z {
2809
- syntax: "*";
2810
- inherits: false;
2811
- initial-value: 0;
2812
- }
2813
- @property --tw-scale-x {
2814
- syntax: "*";
2815
- inherits: false;
2816
- initial-value: 1;
2817
- }
2818
- @property --tw-scale-y {
2819
- syntax: "*";
2820
- inherits: false;
2821
- initial-value: 1;
2822
- }
2823
- @property --tw-scale-z {
2824
- syntax: "*";
2825
- inherits: false;
2826
- initial-value: 1;
2827
- }
2828
2394
  @property --tw-rotate-x {
2829
2395
  syntax: "*";
2830
2396
  inherits: false;
@@ -3050,20 +2616,9 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
3050
2616
  initial-value: "";
3051
2617
  inherits: false;
3052
2618
  }
3053
- @keyframes spin {
3054
- to {
3055
- transform: rotate(360deg);
3056
- }
3057
- }
3058
2619
  @layer properties {
3059
2620
  @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {
3060
2621
  *, ::before, ::after, ::backdrop {
3061
- --tw-translate-x: 0;
3062
- --tw-translate-y: 0;
3063
- --tw-translate-z: 0;
3064
- --tw-scale-x: 1;
3065
- --tw-scale-y: 1;
3066
- --tw-scale-z: 1;
3067
2622
  --tw-rotate-x: initial;
3068
2623
  --tw-rotate-y: initial;
3069
2624
  --tw-rotate-z: initial;
@@ -3124,11 +2679,10 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
3124
2679
 
3125
2680
  // src/browser/surface/constants.ts
3126
2681
  var SURFACE_HOST_CLASS = "uidex-surface-host";
3127
- var SURFACE_CONTAINER_CLASS = "uidex-container";
3128
2682
  var Z_BASE = 2147483630;
3129
2683
  var Z_OVERLAY = 2147483635;
3130
2684
  var Z_CHROME = 2147483645;
3131
- var SURFACE_IGNORE_SELECTOR = `.${SURFACE_HOST_CLASS},.${SURFACE_CONTAINER_CLASS}`;
2685
+ var SURFACE_IGNORE_SELECTOR = `.${SURFACE_HOST_CLASS}`;
3132
2686
  var UIDEX_ATTR_TO_KIND = [
3133
2687
  ["data-uidex", "element"],
3134
2688
  ["data-uidex-region", "region"],
@@ -3415,7 +2969,6 @@ function createInspector(options) {
3415
2969
  e.preventDefault();
3416
2970
  e.stopPropagation();
3417
2971
  const match = stack[layerIndex];
3418
- session.select(match.ref);
3419
2972
  onSelect?.(match, { x: e.clientX, y: e.clientY });
3420
2973
  };
3421
2974
  const onContextMenu = (e) => {
@@ -3464,13 +3017,9 @@ function createInspector(options) {
3464
3017
 
3465
3018
  // src/browser/surface/menu-bar.ts
3466
3019
  import {
3467
- ChevronLeft,
3468
- ChevronRight,
3469
3020
  Command,
3470
3021
  Highlighter,
3471
- MapPin,
3472
3022
  MousePointerClick as MousePointerClick2,
3473
- Users,
3474
3023
  createElement as createLucideElement2
3475
3024
  } from "lucide";
3476
3025
 
@@ -3537,11 +3086,8 @@ function createMenuBar(options) {
3537
3086
  container,
3538
3087
  session,
3539
3088
  initialCorner = "bottom-right",
3540
- appTitle,
3541
- channel = null,
3542
- pinLayer: initialPinLayer = null
3089
+ appTitle
3543
3090
  } = options;
3544
- let activePinLayer = initialPinLayer;
3545
3091
  const root = el("div", {
3546
3092
  class: ROOT_CLASS,
3547
3093
  attrs: {
@@ -3606,162 +3152,6 @@ function createMenuBar(options) {
3606
3152
  inspectBtn.blur();
3607
3153
  });
3608
3154
  root.appendChild(inspectBtn);
3609
- const pinIcon = createLucideElement2(MapPin);
3610
- pinIcon.setAttribute("class", "size-3.5");
3611
- pinIcon.setAttribute("aria-hidden", "true");
3612
- const pinBtn = el(
3613
- "button",
3614
- {
3615
- class: BUTTON_CLASS,
3616
- attrs: {
3617
- type: "button",
3618
- "data-uidex-menubar-pins": "",
3619
- "aria-label": "Report pins"
3620
- }
3621
- },
3622
- pinIcon
3623
- );
3624
- const commitCycler = el("div", {
3625
- class: "relative z-1 inline-flex items-center gap-0.5",
3626
- attrs: { "data-uidex-menubar-commit-cycler": "" }
3627
- });
3628
- commitCycler.hidden = true;
3629
- const prevIcon = createLucideElement2(ChevronLeft);
3630
- prevIcon.setAttribute("class", "size-3");
3631
- prevIcon.setAttribute("aria-hidden", "true");
3632
- const prevBtn = el(
3633
- "button",
3634
- {
3635
- class: BUTTON_CLASS,
3636
- attrs: { type: "button", "aria-label": "Previous commit" },
3637
- style: { width: "18px", height: "18px" }
3638
- },
3639
- prevIcon
3640
- );
3641
- const commitLabel = el("span", {
3642
- class: "relative z-1 whitespace-nowrap px-1 text-[10px] font-mono text-muted-foreground",
3643
- attrs: { "data-uidex-menubar-commit-label": "" }
3644
- });
3645
- const nextIcon = createLucideElement2(ChevronRight);
3646
- nextIcon.setAttribute("class", "size-3");
3647
- nextIcon.setAttribute("aria-hidden", "true");
3648
- const nextBtn = el(
3649
- "button",
3650
- {
3651
- class: BUTTON_CLASS,
3652
- attrs: { type: "button", "aria-label": "Next commit" },
3653
- style: { width: "18px", height: "18px" }
3654
- },
3655
- nextIcon
3656
- );
3657
- commitCycler.appendChild(prevBtn);
3658
- commitCycler.appendChild(commitLabel);
3659
- commitCycler.appendChild(nextBtn);
3660
- const pinWrapper = el("div", {
3661
- class: "relative z-1 inline-flex items-center gap-0.5",
3662
- attrs: { "data-uidex-menubar-pin-wrapper": "" }
3663
- });
3664
- pinWrapper.hidden = true;
3665
- pinWrapper.appendChild(pinBtn);
3666
- pinWrapper.appendChild(commitCycler);
3667
- root.appendChild(pinWrapper);
3668
- const updatePinUI = () => {
3669
- if (!activePinLayer) {
3670
- pinWrapper.hidden = true;
3671
- return;
3672
- }
3673
- const pinsVisible = activePinLayer.visible;
3674
- const state = activePinLayer.filterState;
3675
- const hasCommits = state.commits.length > 0;
3676
- pinWrapper.hidden = false;
3677
- commitCycler.hidden = !pinsVisible || !hasCommits;
3678
- if (state.commitIndex === -1 || !state.commits[state.commitIndex]) {
3679
- commitLabel.textContent = `all (${state.commits.length})`;
3680
- } else {
3681
- const sha = state.commits[state.commitIndex] ?? "";
3682
- commitLabel.textContent = sha.slice(0, 7);
3683
- }
3684
- pinBtn.className = cn(BUTTON_CLASS, pinsVisible && BUTTON_ACTIVE_CLASS);
3685
- };
3686
- pinBtn.addEventListener("click", (e) => {
3687
- e.stopPropagation();
3688
- if (activePinLayer) {
3689
- activePinLayer.setVisible(!activePinLayer.visible);
3690
- }
3691
- });
3692
- prevBtn.addEventListener("click", (e) => {
3693
- e.stopPropagation();
3694
- activePinLayer?.prevCommit();
3695
- });
3696
- nextBtn.addEventListener("click", (e) => {
3697
- e.stopPropagation();
3698
- activePinLayer?.nextCommit();
3699
- });
3700
- let unsubscribePinFilter = activePinLayer?.onFilterChange(() => updatePinUI());
3701
- const presenceIcon = createLucideElement2(Users);
3702
- presenceIcon.setAttribute("class", "size-3.5");
3703
- presenceIcon.setAttribute("aria-hidden", "true");
3704
- const presenceBtn = el(
3705
- "button",
3706
- {
3707
- class: BUTTON_CLASS,
3708
- attrs: {
3709
- type: "button",
3710
- "data-uidex-menubar-presence": "",
3711
- "aria-label": "Online users"
3712
- }
3713
- },
3714
- presenceIcon
3715
- );
3716
- presenceBtn.hidden = true;
3717
- const presenceBadge = el("span", {
3718
- class: "absolute -top-1 -right-1 z-1 inline-flex size-3.5 items-center justify-center rounded-full bg-info text-[9px] font-bold leading-none text-info-foreground"
3719
- });
3720
- presenceBtn.appendChild(presenceBadge);
3721
- const presencePopover = el("div", {
3722
- class: "absolute bottom-full mb-2 right-0 min-w-32 rounded-lg border border-border bg-popover p-2 text-xs text-popover-foreground shadow-lg"
3723
- });
3724
- presencePopover.hidden = true;
3725
- let presencePopoverVisible = false;
3726
- presenceBtn.addEventListener("click", (e) => {
3727
- e.stopPropagation();
3728
- presencePopoverVisible = !presencePopoverVisible;
3729
- presencePopover.hidden = !presencePopoverVisible;
3730
- });
3731
- const presenceWrapper = el("div", { class: "relative z-1 inline-flex" }, [
3732
- presenceBtn,
3733
- presencePopover
3734
- ]);
3735
- presenceWrapper.hidden = true;
3736
- root.appendChild(presenceWrapper);
3737
- let presenceUsers = [];
3738
- const updatePresenceUI = () => {
3739
- const localUserId = session.getState().user?.id ?? null;
3740
- const peers = localUserId ? presenceUsers.filter((u) => u.userId !== localUserId) : presenceUsers;
3741
- const count = peers.length;
3742
- presenceWrapper.hidden = count === 0;
3743
- presenceBadge.textContent = String(count);
3744
- presenceBtn.setAttribute(
3745
- "aria-label",
3746
- count === 1 ? "1 other user online" : `${count} other users online`
3747
- );
3748
- presencePopover.innerHTML = "";
3749
- for (const user of peers) {
3750
- const row = el("div", {
3751
- class: "flex items-center gap-2 rounded px-1.5 py-1"
3752
- });
3753
- const dot = el("span", {
3754
- class: "inline-block size-2 shrink-0 rounded-full bg-emerald-500"
3755
- });
3756
- const name = el("span", {
3757
- class: "truncate",
3758
- text: user.name || "Anonymous"
3759
- });
3760
- row.appendChild(dot);
3761
- row.appendChild(name);
3762
- presencePopover.appendChild(row);
3763
- }
3764
- };
3765
3155
  const paletteIcon = createLucideElement2(Command);
3766
3156
  paletteIcon.setAttribute("class", "size-3.5");
3767
3157
  paletteIcon.setAttribute("aria-hidden", "true");
@@ -3790,7 +3180,7 @@ function createMenuBar(options) {
3790
3180
  container.appendChild(root);
3791
3181
  const syncButtonStates = () => {
3792
3182
  const state = session.getState();
3793
- const inspectActive = state.inspectorActive;
3183
+ const inspectActive = state.mode === "inspecting";
3794
3184
  inspectBtn.setAttribute(
3795
3185
  "data-uidex-menubar-inspect-active",
3796
3186
  inspectActive ? "true" : "false"
@@ -3876,28 +3266,14 @@ function createMenuBar(options) {
3876
3266
  const vertical = y / (window.innerHeight || 1) < 0.5 ? "top" : "bottom";
3877
3267
  snapTo(`${vertical}-${horizontal}`);
3878
3268
  }
3879
- const unsubscribePresence = channel?.onPresence(
3880
- (users) => {
3881
- presenceUsers = users;
3882
- updatePresenceUI();
3883
- }
3884
- );
3885
3269
  return {
3886
3270
  destroy() {
3887
- unsubscribePinFilter?.();
3888
- unsubscribePresence?.();
3889
3271
  unsubscribeSession();
3890
3272
  root.removeEventListener("mousedown", onMouseDown);
3891
3273
  document.removeEventListener("mousemove", onMouseMove);
3892
3274
  document.removeEventListener("mouseup", onMouseUp);
3893
3275
  root.remove();
3894
3276
  },
3895
- setPinLayer(layer) {
3896
- unsubscribePinFilter?.();
3897
- activePinLayer = layer;
3898
- unsubscribePinFilter = layer.onFilterChange(() => updatePinUI());
3899
- updatePinUI();
3900
- },
3901
3277
  snapTo,
3902
3278
  snapToNearest,
3903
3279
  get corner() {
@@ -3909,6 +3285,49 @@ function createMenuBar(options) {
3909
3285
  };
3910
3286
  }
3911
3287
 
3288
+ // src/browser/internal/repositioner.ts
3289
+ function createRepositioner(onReflow) {
3290
+ let rafId = null;
3291
+ let attached = false;
3292
+ const schedule = () => {
3293
+ if (rafId !== null) return;
3294
+ rafId = typeof requestAnimationFrame === "function" ? requestAnimationFrame(() => {
3295
+ rafId = null;
3296
+ onReflow();
3297
+ }) : setTimeout(() => {
3298
+ rafId = null;
3299
+ onReflow();
3300
+ }, 0);
3301
+ };
3302
+ const cancel = () => {
3303
+ if (rafId === null) return;
3304
+ if (typeof cancelAnimationFrame === "function") cancelAnimationFrame(rafId);
3305
+ else clearTimeout(rafId);
3306
+ rafId = null;
3307
+ };
3308
+ const onScroll = () => schedule();
3309
+ const onResize = () => schedule();
3310
+ const attach = () => {
3311
+ if (attached) return;
3312
+ attached = true;
3313
+ window.addEventListener("resize", onResize);
3314
+ window.addEventListener("scroll", onScroll, {
3315
+ capture: true,
3316
+ passive: true
3317
+ });
3318
+ };
3319
+ const detach = () => {
3320
+ if (!attached) return;
3321
+ attached = false;
3322
+ window.removeEventListener("resize", onResize);
3323
+ window.removeEventListener("scroll", onScroll, {
3324
+ capture: true
3325
+ });
3326
+ cancel();
3327
+ };
3328
+ return { schedule, cancel, attach, detach };
3329
+ }
3330
+
3912
3331
  // src/browser/surface/overlay.ts
3913
3332
  var DEFAULT_COLOR = "#34d399";
3914
3333
  var DEFAULT_BORDER_WIDTH = 2;
@@ -3976,44 +3395,7 @@ function createOverlay(deps) {
3976
3395
  fillOpacity: DEFAULT_FILL_OPACITY,
3977
3396
  backdrop: false
3978
3397
  };
3979
- let rafId = null;
3980
- let attached = false;
3981
- const schedule = () => {
3982
- if (rafId !== null) return;
3983
- rafId = typeof requestAnimationFrame === "function" ? requestAnimationFrame(() => {
3984
- rafId = null;
3985
- updatePosition();
3986
- }) : setTimeout(() => {
3987
- rafId = null;
3988
- updatePosition();
3989
- }, 0);
3990
- };
3991
- const cancelSchedule = () => {
3992
- if (rafId === null) return;
3993
- if (typeof cancelAnimationFrame === "function") cancelAnimationFrame(rafId);
3994
- else clearTimeout(rafId);
3995
- rafId = null;
3996
- };
3997
- const onScroll = () => schedule();
3998
- const onResize = () => schedule();
3999
- const attach = () => {
4000
- if (attached) return;
4001
- attached = true;
4002
- window.addEventListener("resize", onResize);
4003
- window.addEventListener("scroll", onScroll, {
4004
- capture: true,
4005
- passive: true
4006
- });
4007
- };
4008
- const detach = () => {
4009
- if (!attached) return;
4010
- attached = false;
4011
- window.removeEventListener("resize", onResize);
4012
- window.removeEventListener("scroll", onScroll, {
4013
- capture: true
4014
- });
4015
- cancelSchedule();
4016
- };
3398
+ const repositioner = createRepositioner(() => updatePosition());
4017
3399
  function updatePosition() {
4018
3400
  if (!target) return;
4019
3401
  const rect = target.getBoundingClientRect();
@@ -4077,16 +3459,16 @@ function createOverlay(deps) {
4077
3459
  box.offsetHeight;
4078
3460
  }
4079
3461
  box.style.opacity = "1";
4080
- attach();
3462
+ repositioner.attach();
4081
3463
  },
4082
3464
  hide() {
4083
3465
  target = null;
4084
3466
  box.style.opacity = "0";
4085
3467
  backdrop.style.opacity = "0";
4086
- detach();
3468
+ repositioner.detach();
4087
3469
  },
4088
3470
  destroy() {
4089
- detach();
3471
+ repositioner.detach();
4090
3472
  box.remove();
4091
3473
  backdrop.remove();
4092
3474
  target = null;
@@ -4203,8 +3585,7 @@ function createSurfaceShell(options) {
4203
3585
  const overlay = createOverlay({ container: host.shadowRoot });
4204
3586
  cleanup.add(overlay);
4205
3587
  const tooltip = createCursorTooltip({
4206
- container: host.chromeEl,
4207
- session: options.session
3588
+ container: host.chromeEl
4208
3589
  });
4209
3590
  cleanup.add(tooltip);
4210
3591
  const afterHover = options.inspector?.onAfterHover;
@@ -4250,9 +3631,7 @@ function createSurfaceShell(options) {
4250
3631
  container: host.chromeEl,
4251
3632
  session: options.session,
4252
3633
  initialCorner: options.initialCorner,
4253
- appTitle: options.appTitle,
4254
- channel: options.channel ?? null,
4255
- pinLayer: options.pinLayer ?? null
3634
+ appTitle: options.appTitle
4256
3635
  });
4257
3636
  cleanup.add(menuBar);
4258
3637
  return {