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
@@ -44,11 +44,6 @@ function isMetaEntity(entity) {
44
44
  function entityKey(entity) {
45
45
  return entity.kind === "route" ? entity.path : entity.id;
46
46
  }
47
- function sameRef(a, b) {
48
- if (a === b) return true;
49
- if (a === null || b === null) return false;
50
- return a.kind === b.kind && a.id === b.id;
51
- }
52
47
  var UnknownEntityKindError = class extends Error {
53
48
  kind;
54
49
  constructor(kind) {
@@ -113,13 +108,14 @@ function createRegistry() {
113
108
  };
114
109
  const getPatternsForKind = (kind) => {
115
110
  const cached = patternCache.get(kind);
116
- if (cached !== void 0)
117
- return cached;
111
+ if (cached !== void 0) return cached;
118
112
  const patterns = [];
119
113
  for (const [key, entity] of store[kind]) {
120
- if (key.endsWith("*")) {
114
+ if (key.includes("*")) {
115
+ const segments = key.split("*");
121
116
  patterns.push({
122
- prefix: key.slice(0, -1),
117
+ segments,
118
+ staticLength: segments.reduce((n, s) => n + s.length, 0),
123
119
  entity
124
120
  });
125
121
  }
@@ -130,13 +126,25 @@ function createRegistry() {
130
126
  );
131
127
  return patterns;
132
128
  };
129
+ const matchesSegments = (segments, id) => {
130
+ const first = segments[0];
131
+ const last = segments[segments.length - 1];
132
+ if (!id.startsWith(first)) return false;
133
+ let pos = first.length;
134
+ for (let i = 1; i < segments.length - 1; i++) {
135
+ const idx = id.indexOf(segments[i], pos);
136
+ if (idx === -1) return false;
137
+ pos = idx + segments[i].length;
138
+ }
139
+ return id.endsWith(last) && id.length - last.length >= pos;
140
+ };
133
141
  const matchPattern = (kind, id) => {
134
142
  assertEntityKind(kind);
135
143
  const patterns = getPatternsForKind(kind);
136
144
  if (patterns.length === 0) return void 0;
137
145
  let best;
138
146
  for (const entry of patterns) {
139
- if (id.startsWith(entry.prefix) && (best === void 0 || entry.prefix.length > best.prefix.length)) {
147
+ if (matchesSegments(entry.segments, id) && (best === void 0 || entry.staticLength > best.staticLength)) {
140
148
  best = entry;
141
149
  }
142
150
  }
@@ -318,8 +326,7 @@ var COMMAND_PALETTE_ENTRY = {
318
326
  function createModeStore(options) {
319
327
  const { nav, bindings } = options;
320
328
  const store = (0, import_vanilla.createStore)(() => ({
321
- mode: "idle",
322
- inspectorActive: false
329
+ mode: "idle"
323
330
  }));
324
331
  const transition = {
325
332
  openPalette() {
@@ -328,17 +335,17 @@ function createModeStore(options) {
328
335
  bindings?.destroyInspector?.();
329
336
  }
330
337
  nav.nav.reset([COMMAND_PALETTE_ENTRY]);
331
- store.setState({ mode: "palette", inspectorActive: false });
338
+ store.setState({ mode: "palette" });
332
339
  },
333
340
  openInspector() {
334
341
  bindings?.mountInspector?.();
335
342
  nav.nav.clear();
336
- store.setState({ mode: "inspecting", inspectorActive: true });
343
+ store.setState({ mode: "inspecting" });
337
344
  },
338
345
  closeInspector() {
339
346
  bindings?.destroyInspector?.();
340
347
  nav.nav.clear();
341
- store.setState({ mode: "idle", inspectorActive: false });
348
+ store.setState({ mode: "idle" });
342
349
  },
343
350
  toggleInspector() {
344
351
  if (store.getState().mode === "inspecting") {
@@ -353,7 +360,7 @@ function createModeStore(options) {
353
360
  bindings?.destroyInspector?.();
354
361
  }
355
362
  nav.nav.reset(initialStack);
356
- store.setState({ mode: "viewing", inspectorActive: false });
363
+ store.setState({ mode: "viewing" });
357
364
  },
358
365
  dismiss() {
359
366
  const prev = store.getState();
@@ -361,7 +368,7 @@ function createModeStore(options) {
361
368
  bindings?.destroyInspector?.();
362
369
  }
363
370
  nav.nav.clear();
364
- store.setState({ mode: "idle", inspectorActive: false });
371
+ store.setState({ mode: "idle" });
365
372
  },
366
373
  popOrTransition() {
367
374
  const { stack } = nav.getState();
@@ -369,12 +376,12 @@ function createModeStore(options) {
369
376
  nav.nav.pop();
370
377
  } else if (stack.length === 2 && stack[0]?.id === "command-palette") {
371
378
  nav.nav.reset([COMMAND_PALETTE_ENTRY]);
372
- store.setState({ mode: "palette", inspectorActive: false });
379
+ store.setState({ mode: "palette" });
373
380
  } else if (stack.length === 2) {
374
381
  nav.nav.pop();
375
382
  } else {
376
383
  nav.nav.clear();
377
- store.setState({ mode: "idle", inspectorActive: false });
384
+ store.setState({ mode: "idle" });
378
385
  }
379
386
  },
380
387
  pushView(entry) {
@@ -391,7 +398,7 @@ function createModeStore(options) {
391
398
  case "inspecting":
392
399
  bindings?.destroyInspector?.();
393
400
  nav.nav.reset([entry]);
394
- store.setState({ mode: "viewing", inspectorActive: false });
401
+ store.setState({ mode: "viewing" });
395
402
  break;
396
403
  case "palette":
397
404
  case "viewing":
@@ -426,14 +433,6 @@ function createNavigationStore() {
426
433
  store.setState({ stack: s.slice(0, -1) });
427
434
  }
428
435
  },
429
- replace(entry) {
430
- const s = store.getState().stack;
431
- if (s.length === 0) {
432
- store.setState({ stack: [entry] });
433
- } else {
434
- store.setState({ stack: [...s.slice(0, -1), entry] });
435
- }
436
- },
437
436
  clear() {
438
437
  store.setState({ stack: [] });
439
438
  },
@@ -448,15 +447,11 @@ function createNavigationStore() {
448
447
 
449
448
  // src/browser/session/store.ts
450
449
  var defaultSnapshot = {
451
- hover: null,
452
- selection: null,
453
450
  stack: [],
454
451
  pinnedHighlight: null,
455
- inspectorActive: false,
452
+ mode: "idle",
456
453
  theme: "auto",
457
- resolvedTheme: "light",
458
- ingestActive: false,
459
- user: null
454
+ resolvedTheme: "light"
460
455
  };
461
456
  function resolveTheme(preference, detect) {
462
457
  if (preference !== "auto") return preference;
@@ -506,7 +501,6 @@ function createSession(options = {}) {
506
501
  } else if (highlightMode === "transient") {
507
502
  onUpdateOverlay?.(hlCtx);
508
503
  }
509
- store.setState({ hover: ref });
510
504
  },
511
505
  unhover() {
512
506
  if (highlightMode === "transient") {
@@ -516,7 +510,6 @@ function createSession(options = {}) {
516
510
  hlCtx.color = null;
517
511
  onHideOverlay?.();
518
512
  }
519
- store.setState({ hover: null });
520
513
  },
521
514
  pin(ref) {
522
515
  const pinRef = ref ?? hlCtx.ref;
@@ -544,15 +537,11 @@ function createSession(options = {}) {
544
537
  };
545
538
  const store = (0, import_vanilla3.createStore)(() => ({
546
539
  ...defaultSnapshot,
547
- hover: overrides.hover ?? null,
548
- selection: overrides.selection ?? null,
549
540
  stack: [],
550
541
  pinnedHighlight: null,
551
- inspectorActive: false,
542
+ mode: "idle",
552
543
  theme: initialPref,
553
- resolvedTheme: initialResolved,
554
- ingestActive: overrides.ingestActive ?? false,
555
- user: overrides.user ?? null
544
+ resolvedTheme: initialResolved
556
545
  }));
557
546
  nav.subscribe(() => {
558
547
  const { stack } = nav.getState();
@@ -561,29 +550,21 @@ function createSession(options = {}) {
561
550
  }
562
551
  });
563
552
  modeStore.subscribe(() => {
564
- const { inspectorActive } = modeStore.getState();
565
- if (store.getState().inspectorActive !== inspectorActive) {
566
- store.setState({ inspectorActive });
553
+ const { mode } = modeStore.getState();
554
+ if (store.getState().mode !== mode) {
555
+ store.setState({ mode });
567
556
  }
568
557
  });
569
558
  const session = store;
570
559
  session.nav = nav;
571
560
  session.mode = modeStore;
572
561
  session.highlight = highlightActions;
573
- session.select = (ref) => {
574
- if (sameRef(store.getState().selection, ref)) return;
575
- store.setState({ selection: ref });
576
- };
577
562
  session.setTheme = (theme, resolved) => {
578
563
  const state = store.getState();
579
564
  const nextResolved = resolved ?? resolveTheme(theme, detectTheme);
580
565
  if (state.theme === theme && state.resolvedTheme === nextResolved) return;
581
566
  store.setState({ theme, resolvedTheme: nextResolved });
582
567
  };
583
- session.setIngest = (active) => {
584
- if (store.getState().ingestActive === active) return;
585
- store.setState({ ingestActive: active });
586
- };
587
568
  if (initialStack.length > 0) {
588
569
  modeStore.transition.openPalette();
589
570
  for (let i = 1; i < initialStack.length; i++) {
@@ -604,8 +585,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
604
585
  @layer theme, base, components, utilities;
605
586
  @layer theme {
606
587
  :root, :host {
607
- --font-sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
608
- Roboto, sans-serif;
609
588
  --color-red-400: oklch(70.4% 0.191 22.216);
610
589
  --color-red-500: oklch(63.7% 0.237 25.331);
611
590
  --color-red-700: oklch(50.5% 0.213 27.518);
@@ -658,7 +637,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
658
637
  --color-black: #000;
659
638
  --color-white: #fff;
660
639
  --spacing: 0.25rem;
661
- --container-sm: 24rem;
662
640
  --container-xl: 36rem;
663
641
  --text-xs: 0.75rem;
664
642
  --text-xs--line-height: calc(1 / 0.75);
@@ -666,28 +644,22 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
666
644
  --text-sm--line-height: calc(1.25 / 0.875);
667
645
  --text-base: 1rem;
668
646
  --text-base--line-height: calc(1.5 / 1);
669
- --text-xl: 1.25rem;
670
- --text-xl--line-height: calc(1.75 / 1.25);
671
647
  --font-weight-normal: 400;
672
648
  --font-weight-medium: 500;
673
649
  --font-weight-semibold: 600;
674
- --font-weight-bold: 700;
675
650
  --tracking-tight: -0.025em;
676
651
  --tracking-widest: 0.1em;
677
652
  --leading-relaxed: 1.625;
678
- --radius-md: calc(var(--radius) * 0.8);
679
653
  --radius-lg: var(--radius);
680
654
  --radius-xl: calc(var(--radius) * 1.4);
681
655
  --radius-2xl: calc(var(--radius) * 1.8);
682
656
  --ease-out: cubic-bezier(0, 0, 0.2, 1);
683
- --animate-spin: spin 1s linear infinite;
684
657
  --blur-sm: 8px;
685
658
  --default-transition-duration: 150ms;
686
659
  --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
687
660
  --default-font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
688
661
  Roboto, sans-serif;
689
662
  --default-mono-font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
690
- --color-muted: var(--muted);
691
663
  --color-border: var(--border);
692
664
  }
693
665
  }
@@ -855,17 +827,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
855
827
  .visible {
856
828
  visibility: visible;
857
829
  }
858
- .sr-only {
859
- position: absolute;
860
- width: 1px;
861
- height: 1px;
862
- padding: 0;
863
- margin: -1px;
864
- overflow: hidden;
865
- clip-path: inset(50%);
866
- white-space: nowrap;
867
- border-width: 0;
868
- }
869
830
  .absolute {
870
831
  position: absolute;
871
832
  }
@@ -887,33 +848,12 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
887
848
  .end {
888
849
  inset-inline-end: var(--spacing);
889
850
  }
890
- .-top-1 {
891
- top: calc(var(--spacing) * -1);
892
- }
893
- .-right-1 {
894
- right: calc(var(--spacing) * -1);
895
- }
896
- .right-0 {
897
- right: calc(var(--spacing) * 0);
898
- }
899
- .right-2 {
900
- right: calc(var(--spacing) * 2);
901
- }
902
- .bottom-full {
903
- bottom: 100%;
904
- }
905
- .bottom-px {
906
- bottom: 1px;
907
- }
908
851
  .z-1 {
909
852
  z-index: 1;
910
853
  }
911
854
  .z-10 {
912
855
  z-index: 10;
913
856
  }
914
- .z-\\[2147483647\\] {
915
- z-index: 2147483647;
916
- }
917
857
  .container {
918
858
  width: 100%;
919
859
  @media (width >= 40rem) {
@@ -941,21 +881,12 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
941
881
  .mx-2 {
942
882
  margin-inline: calc(var(--spacing) * 2);
943
883
  }
944
- .my-1 {
945
- margin-block: calc(var(--spacing) * 1);
946
- }
947
884
  .ms-auto {
948
885
  margin-inline-start: auto;
949
886
  }
950
887
  .mt-1 {
951
888
  margin-top: calc(var(--spacing) * 1);
952
889
  }
953
- .mb-2 {
954
- margin-bottom: calc(var(--spacing) * 2);
955
- }
956
- .mb-6 {
957
- margin-bottom: calc(var(--spacing) * 6);
958
- }
959
890
  .ml-auto {
960
891
  margin-left: auto;
961
892
  }
@@ -974,26 +905,12 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
974
905
  .inline {
975
906
  display: inline;
976
907
  }
977
- .inline-block {
978
- display: inline-block;
979
- }
980
908
  .inline-flex {
981
909
  display: inline-flex;
982
910
  }
983
- .list-item {
984
- display: list-item;
985
- }
986
911
  .table {
987
912
  display: table;
988
913
  }
989
- .size-2 {
990
- width: calc(var(--spacing) * 2);
991
- height: calc(var(--spacing) * 2);
992
- }
993
- .size-3 {
994
- width: calc(var(--spacing) * 3);
995
- height: calc(var(--spacing) * 3);
996
- }
997
914
  .size-3\\.5 {
998
915
  width: calc(var(--spacing) * 3.5);
999
916
  height: calc(var(--spacing) * 3.5);
@@ -1051,33 +968,15 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1051
968
  .h-\\[26rem\\] {
1052
969
  height: 26rem;
1053
970
  }
1054
- .h-auto {
1055
- height: auto;
1056
- }
1057
971
  .h-full {
1058
972
  height: 100%;
1059
973
  }
1060
- .h-px {
1061
- height: 1px;
1062
- }
1063
- .max-h-32 {
1064
- max-height: calc(var(--spacing) * 32);
1065
- }
1066
- .max-h-full {
1067
- max-height: 100%;
1068
- }
1069
974
  .min-h-0 {
1070
975
  min-height: calc(var(--spacing) * 0);
1071
976
  }
1072
- .min-h-7 {
1073
- min-height: calc(var(--spacing) * 7);
1074
- }
1075
977
  .min-h-8 {
1076
978
  min-height: calc(var(--spacing) * 8);
1077
979
  }
1078
- .min-h-20 {
1079
- min-height: calc(var(--spacing) * 20);
1080
- }
1081
980
  .w-3\\.5 {
1082
981
  width: calc(var(--spacing) * 3.5);
1083
982
  }
@@ -1087,30 +986,15 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1087
986
  .w-12 {
1088
987
  width: calc(var(--spacing) * 12);
1089
988
  }
1090
- .w-20 {
1091
- width: calc(var(--spacing) * 20);
1092
- }
1093
- .w-36 {
1094
- width: calc(var(--spacing) * 36);
1095
- }
1096
989
  .w-56 {
1097
990
  width: calc(var(--spacing) * 56);
1098
991
  }
1099
- .w-auto {
1100
- width: auto;
1101
- }
1102
992
  .w-full {
1103
993
  width: 100%;
1104
994
  }
1105
995
  .w-px {
1106
996
  width: 1px;
1107
997
  }
1108
- .max-w-full {
1109
- max-width: 100%;
1110
- }
1111
- .max-w-sm {
1112
- max-width: var(--container-sm);
1113
- }
1114
998
  .max-w-xl {
1115
999
  max-width: var(--container-xl);
1116
1000
  }
@@ -1138,44 +1022,9 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1138
1022
  .shrink-0 {
1139
1023
  flex-shrink: 0;
1140
1024
  }
1141
- .origin-bottom-left {
1142
- transform-origin: 0 100%;
1143
- }
1144
- .origin-bottom-right {
1145
- transform-origin: 100% 100%;
1146
- }
1147
- .-translate-x-0\\.5 {
1148
- --tw-translate-x: calc(var(--spacing) * -0.5);
1149
- translate: var(--tw-translate-x) var(--tw-translate-y);
1150
- }
1151
- .translate-x-0\\.5 {
1152
- --tw-translate-x: calc(var(--spacing) * 0.5);
1153
- translate: var(--tw-translate-x) var(--tw-translate-y);
1154
- }
1155
- .scale-84 {
1156
- --tw-scale-x: 84%;
1157
- --tw-scale-y: 84%;
1158
- --tw-scale-z: 84%;
1159
- scale: var(--tw-scale-x) var(--tw-scale-y);
1160
- }
1161
- .-rotate-10 {
1162
- rotate: calc(10deg * -1);
1163
- }
1164
- .rotate-10 {
1165
- rotate: 10deg;
1166
- }
1167
1025
  .transform {
1168
1026
  transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);
1169
1027
  }
1170
- .animate-skeleton {
1171
- animation: skeleton 2s -1s infinite linear;
1172
- }
1173
- .animate-spin {
1174
- animation: var(--animate-spin);
1175
- }
1176
- .cursor-default {
1177
- cursor: default;
1178
- }
1179
1028
  .cursor-pointer {
1180
1029
  cursor: pointer;
1181
1030
  }
@@ -1185,18 +1034,9 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1185
1034
  .scroll-py-2 {
1186
1035
  scroll-padding-block: calc(var(--spacing) * 2);
1187
1036
  }
1188
- .list-none {
1189
- list-style-type: none;
1190
- }
1191
- .appearance-none {
1192
- appearance: none;
1193
- }
1194
1037
  .flex-col {
1195
1038
  flex-direction: column;
1196
1039
  }
1197
- .flex-row {
1198
- flex-direction: row;
1199
- }
1200
1040
  .items-center {
1201
1041
  align-items: center;
1202
1042
  }
@@ -1209,15 +1049,9 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1209
1049
  .justify-center {
1210
1050
  justify-content: center;
1211
1051
  }
1212
- .justify-start {
1213
- justify-content: flex-start;
1214
- }
1215
1052
  .gap-0 {
1216
1053
  gap: calc(var(--spacing) * 0);
1217
1054
  }
1218
- .gap-0\\.5 {
1219
- gap: calc(var(--spacing) * 0.5);
1220
- }
1221
1055
  .gap-1 {
1222
1056
  gap: calc(var(--spacing) * 1);
1223
1057
  }
@@ -1230,15 +1064,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1230
1064
  .gap-3 {
1231
1065
  gap: calc(var(--spacing) * 3);
1232
1066
  }
1233
- .gap-4 {
1234
- gap: calc(var(--spacing) * 4);
1235
- }
1236
- .gap-6 {
1237
- gap: calc(var(--spacing) * 6);
1238
- }
1239
- .self-start {
1240
- align-self: flex-start;
1241
- }
1242
1067
  .truncate {
1243
1068
  overflow: hidden;
1244
1069
  text-overflow: ellipsis;
@@ -1336,21 +1161,12 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1336
1161
  background-color: color-mix(in oklab, var(--color-black) 32%, transparent);
1337
1162
  }
1338
1163
  }
1339
- .bg-black\\/80 {
1340
- background-color: color-mix(in srgb, #000 80%, transparent);
1341
- @supports (color: color-mix(in lab, red, red)) {
1342
- background-color: color-mix(in oklab, var(--color-black) 80%, transparent);
1343
- }
1344
- }
1345
1164
  .bg-blue-50 {
1346
1165
  background-color: var(--color-blue-50);
1347
1166
  }
1348
1167
  .bg-border {
1349
1168
  background-color: var(--border);
1350
1169
  }
1351
- .bg-card {
1352
- background-color: var(--card);
1353
- }
1354
1170
  .bg-cyan-50 {
1355
1171
  background-color: var(--color-cyan-50);
1356
1172
  }
@@ -1366,15 +1182,9 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1366
1182
  .bg-emerald-50 {
1367
1183
  background-color: var(--color-emerald-50);
1368
1184
  }
1369
- .bg-emerald-500 {
1370
- background-color: var(--color-emerald-500);
1371
- }
1372
1185
  .bg-fuchsia-50 {
1373
1186
  background-color: var(--color-fuchsia-50);
1374
1187
  }
1375
- .bg-info {
1376
- background-color: var(--info);
1377
- }
1378
1188
  .bg-info\\/10 {
1379
1189
  background-color: var(--info);
1380
1190
  @supports (color: color-mix(in lab, red, red)) {
@@ -1426,18 +1236,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1426
1236
  .bg-clip-padding {
1427
1237
  background-clip: padding-box;
1428
1238
  }
1429
- .bg-\\[right_0\\.5rem_center\\] {
1430
- background-position: right 0.5rem center;
1431
- }
1432
- .bg-no-repeat {
1433
- background-repeat: no-repeat;
1434
- }
1435
- .object-cover {
1436
- object-fit: cover;
1437
- }
1438
- .object-top {
1439
- object-position: top;
1440
- }
1441
1239
  .p-1 {
1442
1240
  padding: calc(var(--spacing) * 1);
1443
1241
  }
@@ -1450,12 +1248,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1450
1248
  .p-4 {
1451
1249
  padding: calc(var(--spacing) * 4);
1452
1250
  }
1453
- .p-6 {
1454
- padding: calc(var(--spacing) * 6);
1455
- }
1456
- .px-0 {
1457
- padding-inline: calc(var(--spacing) * 0);
1458
- }
1459
1251
  .px-1 {
1460
1252
  padding-inline: calc(var(--spacing) * 1);
1461
1253
  }
@@ -1477,27 +1269,15 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1477
1269
  .px-4 {
1478
1270
  padding-inline: calc(var(--spacing) * 4);
1479
1271
  }
1480
- .px-6 {
1481
- padding-inline: calc(var(--spacing) * 6);
1482
- }
1483
- .py-0 {
1484
- padding-block: calc(var(--spacing) * 0);
1485
- }
1486
1272
  .py-1 {
1487
1273
  padding-block: calc(var(--spacing) * 1);
1488
1274
  }
1489
1275
  .py-1\\.5 {
1490
1276
  padding-block: calc(var(--spacing) * 1.5);
1491
1277
  }
1492
- .py-2 {
1493
- padding-block: calc(var(--spacing) * 2);
1494
- }
1495
1278
  .py-4 {
1496
1279
  padding-block: calc(var(--spacing) * 4);
1497
1280
  }
1498
- .py-12 {
1499
- padding-block: calc(var(--spacing) * 12);
1500
- }
1501
1281
  .py-\\[max\\(1rem\\,4vh\\)\\] {
1502
1282
  padding-block: max(1rem, 4vh);
1503
1283
  }
@@ -1510,12 +1290,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1510
1290
  .pt-2 {
1511
1291
  padding-top: calc(var(--spacing) * 2);
1512
1292
  }
1513
- .pr-8 {
1514
- padding-right: calc(var(--spacing) * 8);
1515
- }
1516
- .pl-3 {
1517
- padding-left: calc(var(--spacing) * 3);
1518
- }
1519
1293
  .text-center {
1520
1294
  text-align: center;
1521
1295
  }
@@ -1533,18 +1307,10 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1533
1307
  font-size: var(--text-base);
1534
1308
  line-height: var(--tw-leading, var(--text-base--line-height));
1535
1309
  }
1536
- .text-base\\/4\\.5 {
1537
- font-size: var(--text-base);
1538
- line-height: calc(var(--spacing) * 4.5);
1539
- }
1540
1310
  .text-sm {
1541
1311
  font-size: var(--text-sm);
1542
1312
  line-height: var(--tw-leading, var(--text-sm--line-height));
1543
1313
  }
1544
- .text-xl {
1545
- font-size: var(--text-xl);
1546
- line-height: var(--tw-leading, var(--text-xl--line-height));
1547
- }
1548
1314
  .text-xs {
1549
1315
  font-size: var(--text-xs);
1550
1316
  line-height: var(--tw-leading, var(--text-xs--line-height));
@@ -1552,27 +1318,13 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1552
1318
  .text-\\[0\\.625rem\\] {
1553
1319
  font-size: 0.625rem;
1554
1320
  }
1555
- .text-\\[9px\\] {
1556
- font-size: 9px;
1557
- }
1558
- .text-\\[10px\\] {
1559
- font-size: 10px;
1560
- }
1561
1321
  .text-\\[11px\\] {
1562
1322
  font-size: 11px;
1563
1323
  }
1564
- .leading-none {
1565
- --tw-leading: 1;
1566
- line-height: 1;
1567
- }
1568
1324
  .leading-relaxed {
1569
1325
  --tw-leading: var(--leading-relaxed);
1570
1326
  line-height: var(--leading-relaxed);
1571
1327
  }
1572
- .font-bold {
1573
- --tw-font-weight: var(--font-weight-bold);
1574
- font-weight: var(--font-weight-bold);
1575
- }
1576
1328
  .font-medium {
1577
1329
  --tw-font-weight: var(--font-weight-medium);
1578
1330
  font-weight: var(--font-weight-medium);
@@ -1593,9 +1345,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1593
1345
  --tw-tracking: var(--tracking-widest);
1594
1346
  letter-spacing: var(--tracking-widest);
1595
1347
  }
1596
- .text-balance {
1597
- text-wrap: balance;
1598
- }
1599
1348
  .break-words {
1600
1349
  overflow-wrap: break-word;
1601
1350
  }
@@ -1620,9 +1369,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1620
1369
  .text-cyan-700 {
1621
1370
  color: var(--color-cyan-700);
1622
1371
  }
1623
- .text-destructive {
1624
- color: var(--destructive);
1625
- }
1626
1372
  .text-destructive-foreground {
1627
1373
  color: var(--destructive-foreground);
1628
1374
  }
@@ -1688,18 +1434,12 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1688
1434
  .line-through {
1689
1435
  text-decoration-line: line-through;
1690
1436
  }
1691
- .underline {
1692
- text-decoration-line: underline;
1693
- }
1694
1437
  .underline-offset-4 {
1695
1438
  text-underline-offset: 4px;
1696
1439
  }
1697
1440
  .accent-accent {
1698
1441
  accent-color: var(--accent);
1699
1442
  }
1700
- .accent-primary {
1701
- accent-color: var(--primary);
1702
- }
1703
1443
  .opacity-50 {
1704
1444
  opacity: 50%;
1705
1445
  }
@@ -1711,11 +1451,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1711
1451
  --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%));
1712
1452
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1713
1453
  }
1714
- .shadow-sm\\/5 {
1715
- --tw-shadow-alpha: 5%;
1716
- --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%));
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
1454
  .shadow-xs\\/5 {
1720
1455
  --tw-shadow-alpha: 5%;
1721
1456
  --tw-shadow: 0 1px 2px 0 var(--tw-shadow-color, oklab(from rgb(0 0 0 / 0.05) l a b / 5%));
@@ -1725,14 +1460,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1725
1460
  --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));
1726
1461
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1727
1462
  }
1728
- .shadow-lg {
1729
- --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));
1730
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1731
- }
1732
- .shadow-none {
1733
- --tw-shadow: 0 0 #0000;
1734
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1735
- }
1736
1463
  .shadow-xs {
1737
1464
  --tw-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));
1738
1465
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
@@ -1797,10 +1524,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1797
1524
  outline-style: var(--tw-outline-style);
1798
1525
  outline-width: 1px;
1799
1526
  }
1800
- .blur {
1801
- --tw-blur: blur(8px);
1802
- 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,);
1803
- }
1804
1527
  .filter {
1805
1528
  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,);
1806
1529
  }
@@ -1836,15 +1559,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1836
1559
  -webkit-user-select: none;
1837
1560
  user-select: none;
1838
1561
  }
1839
- .\\[--skeleton-highlight\\:--alpha\\(var\\(--color-white\\)\\/64\\%\\)\\] {
1840
- --skeleton-highlight: color-mix(in srgb, #fff 64%, transparent);
1841
- @supports (color: color-mix(in lab, red, red)) {
1842
- --skeleton-highlight: color-mix(in oklab, var(--color-white) 64%, transparent);
1843
- }
1844
- }
1845
- .\\[background\\:linear-gradient\\(120deg\\,transparent_40\\%\\,var\\(--skeleton-highlight\\)\\,transparent_60\\%\\)_var\\(--color-muted\\)_0_0\\/200\\%_100\\%_fixed\\] {
1846
- background: linear-gradient(120deg,transparent 40%,var(--skeleton-highlight),transparent 60%) var(--color-muted) 0 0/200% 100% fixed;
1847
- }
1848
1562
  .\\[clip-path\\:inset\\(0_1px\\)\\] {
1849
1563
  clip-path: inset(0 1px);
1850
1564
  }
@@ -1928,12 +1642,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1928
1642
  border-radius: calc(var(--radius-lg) - 1px);
1929
1643
  }
1930
1644
  }
1931
- .before\\:rounded-\\[calc\\(var\\(--radius-md\\)-1px\\)\\] {
1932
- &::before {
1933
- content: var(--tw-content);
1934
- border-radius: calc(var(--radius-md) - 1px);
1935
- }
1936
- }
1937
1645
  .before\\:rounded-\\[calc\\(var\\(--radius-xl\\)-1px\\)\\] {
1938
1646
  &::before {
1939
1647
  content: var(--tw-content);
@@ -1966,25 +1674,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1966
1674
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1967
1675
  }
1968
1676
  }
1969
- .focus-within\\:border-ring {
1970
- &:focus-within {
1971
- border-color: var(--ring);
1972
- }
1973
- }
1974
- .focus-within\\:ring-\\[3px\\] {
1975
- &:focus-within {
1976
- --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
1977
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1978
- }
1979
- }
1980
- .focus-within\\:ring-ring\\/30 {
1981
- &:focus-within {
1982
- --tw-ring-color: var(--ring);
1983
- @supports (color: color-mix(in lab, red, red)) {
1984
- --tw-ring-color: color-mix(in oklab, var(--ring) 30%, transparent);
1985
- }
1986
- }
1987
- }
1988
1677
  .hover\\:border-destructive\\/30 {
1989
1678
  &:hover {
1990
1679
  @media (hover: hover) {
@@ -2082,36 +1771,17 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2082
1771
  outline-style: none;
2083
1772
  }
2084
1773
  }
2085
- .focus-visible\\:border-ring {
2086
- &:focus-visible {
2087
- border-color: var(--ring);
2088
- }
2089
- }
2090
1774
  .focus-visible\\:ring-2 {
2091
1775
  &:focus-visible {
2092
1776
  --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
2093
1777
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2094
1778
  }
2095
1779
  }
2096
- .focus-visible\\:ring-\\[3px\\] {
2097
- &:focus-visible {
2098
- --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
2099
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2100
- }
2101
- }
2102
1780
  .focus-visible\\:ring-ring {
2103
1781
  &:focus-visible {
2104
1782
  --tw-ring-color: var(--ring);
2105
1783
  }
2106
1784
  }
2107
- .focus-visible\\:ring-ring\\/30 {
2108
- &:focus-visible {
2109
- --tw-ring-color: var(--ring);
2110
- @supports (color: color-mix(in lab, red, red)) {
2111
- --tw-ring-color: color-mix(in oklab, var(--ring) 30%, transparent);
2112
- }
2113
- }
2114
- }
2115
1785
  .focus-visible\\:ring-offset-1 {
2116
1786
  &:focus-visible {
2117
1787
  --tw-ring-offset-width: 1px;
@@ -2128,11 +1798,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2128
1798
  pointer-events: none;
2129
1799
  }
2130
1800
  }
2131
- .disabled\\:cursor-not-allowed {
2132
- &:disabled {
2133
- cursor: not-allowed;
2134
- }
2135
- }
2136
1801
  .disabled\\:opacity-50 {
2137
1802
  &:disabled {
2138
1803
  opacity: 50%;
@@ -2143,29 +1808,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2143
1808
  opacity: 60%;
2144
1809
  }
2145
1810
  }
2146
- .has-disabled\\:opacity-60 {
2147
- &:has(*:disabled) {
2148
- opacity: 60%;
2149
- }
2150
- }
2151
- .aria-invalid\\:border-destructive\\/40 {
2152
- &[aria-invalid="true"] {
2153
- border-color: var(--destructive);
2154
- @supports (color: color-mix(in lab, red, red)) {
2155
- border-color: color-mix(in oklab, var(--destructive) 40%, transparent);
2156
- }
2157
- }
2158
- }
2159
- .aria-invalid\\:focus-visible\\:ring-destructive\\/20 {
2160
- &[aria-invalid="true"] {
2161
- &:focus-visible {
2162
- --tw-ring-color: var(--destructive);
2163
- @supports (color: color-mix(in lab, red, red)) {
2164
- --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);
2165
- }
2166
- }
2167
- }
2168
- }
2169
1811
  .data-\\[disabled\\]\\:pointer-events-none {
2170
1812
  &[data-disabled] {
2171
1813
  pointer-events: none;
@@ -2202,12 +1844,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2202
1844
  line-height: var(--tw-leading, var(--text-sm--line-height));
2203
1845
  }
2204
1846
  }
2205
- .sm\\:text-sm\\/4 {
2206
- @media (width >= 40rem) {
2207
- font-size: var(--text-sm);
2208
- line-height: calc(var(--spacing) * 4);
2209
- }
2210
- }
2211
1847
  .dark\\:bg-amber-400\\/10 {
2212
1848
  &:is(.dark *, :host(.dark) *) {
2213
1849
  background-color: color-mix(in srgb, oklch(82.8% 0.189 84.429) 10%, transparent);
@@ -2421,14 +2057,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2421
2057
  }
2422
2058
  }
2423
2059
  }
2424
- .dark\\:\\[--skeleton-highlight\\:--alpha\\(var\\(--color-white\\)\\/4\\%\\)\\] {
2425
- &:is(.dark *, :host(.dark) *) {
2426
- --skeleton-highlight: color-mix(in srgb, #fff 4%, transparent);
2427
- @supports (color: color-mix(in lab, red, red)) {
2428
- --skeleton-highlight: color-mix(in oklab, var(--color-white) 4%, transparent);
2429
- }
2430
- }
2431
- }
2432
2060
  .dark\\:group-data-hover\\:bg-amber-400\\/20 {
2433
2061
  &:is(.dark *, :host(.dark) *) {
2434
2062
  &:is(:where(.group)[data-hover] *) {
@@ -2548,38 +2176,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2548
2176
  height: calc(var(--spacing) * 4);
2549
2177
  }
2550
2178
  }
2551
- .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4\\.5 {
2552
- & svg:not([class*='size-']) {
2553
- width: calc(var(--spacing) * 4.5);
2554
- height: calc(var(--spacing) * 4.5);
2555
- }
2556
- }
2557
- .\\[\\&\\>svg\\]\\:pointer-events-none {
2558
- &>svg {
2559
- pointer-events: none;
2560
- }
2561
- }
2562
- .\\[\\&\\>svg\\]\\:-mx-0\\.5 {
2563
- &>svg {
2564
- margin-inline: calc(var(--spacing) * -0.5);
2565
- }
2566
- }
2567
- .\\[\\&\\>svg\\]\\:shrink-0 {
2568
- &>svg {
2569
- flex-shrink: 0;
2570
- }
2571
- }
2572
- .\\[\\&\\>svg\\:not\\(\\[class\\*\\=\\'opacity-\\'\\]\\)\\]\\:opacity-80 {
2573
- &>svg:not([class*='opacity-']) {
2574
- opacity: 80%;
2575
- }
2576
- }
2577
- .\\[\\&\\>svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 {
2578
- &>svg:not([class*='size-']) {
2579
- width: calc(var(--spacing) * 4);
2580
- height: calc(var(--spacing) * 4);
2581
- }
2582
- }
2583
2179
  .\\[\\[data-kbd-nav\\]_\\&\\]\\:focus-within\\:bg-accent {
2584
2180
  [data-kbd-nav] & {
2585
2181
  &:focus-within {
@@ -2812,36 +2408,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2812
2408
  --warning: var(--color-amber-500);
2813
2409
  --warning-foreground: var(--color-amber-700);
2814
2410
  }
2815
- @property --tw-translate-x {
2816
- syntax: "*";
2817
- inherits: false;
2818
- initial-value: 0;
2819
- }
2820
- @property --tw-translate-y {
2821
- syntax: "*";
2822
- inherits: false;
2823
- initial-value: 0;
2824
- }
2825
- @property --tw-translate-z {
2826
- syntax: "*";
2827
- inherits: false;
2828
- initial-value: 0;
2829
- }
2830
- @property --tw-scale-x {
2831
- syntax: "*";
2832
- inherits: false;
2833
- initial-value: 1;
2834
- }
2835
- @property --tw-scale-y {
2836
- syntax: "*";
2837
- inherits: false;
2838
- initial-value: 1;
2839
- }
2840
- @property --tw-scale-z {
2841
- syntax: "*";
2842
- inherits: false;
2843
- initial-value: 1;
2844
- }
2845
2411
  @property --tw-rotate-x {
2846
2412
  syntax: "*";
2847
2413
  inherits: false;
@@ -3067,20 +2633,9 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
3067
2633
  initial-value: "";
3068
2634
  inherits: false;
3069
2635
  }
3070
- @keyframes spin {
3071
- to {
3072
- transform: rotate(360deg);
3073
- }
3074
- }
3075
2636
  @layer properties {
3076
2637
  @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {
3077
2638
  *, ::before, ::after, ::backdrop {
3078
- --tw-translate-x: 0;
3079
- --tw-translate-y: 0;
3080
- --tw-translate-z: 0;
3081
- --tw-scale-x: 1;
3082
- --tw-scale-y: 1;
3083
- --tw-scale-z: 1;
3084
2639
  --tw-rotate-x: initial;
3085
2640
  --tw-rotate-y: initial;
3086
2641
  --tw-rotate-z: initial;
@@ -3141,11 +2696,10 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
3141
2696
 
3142
2697
  // src/browser/surface/constants.ts
3143
2698
  var SURFACE_HOST_CLASS = "uidex-surface-host";
3144
- var SURFACE_CONTAINER_CLASS = "uidex-container";
3145
2699
  var Z_BASE = 2147483630;
3146
2700
  var Z_OVERLAY = 2147483635;
3147
2701
  var Z_CHROME = 2147483645;
3148
- var SURFACE_IGNORE_SELECTOR = `.${SURFACE_HOST_CLASS},.${SURFACE_CONTAINER_CLASS}`;
2702
+ var SURFACE_IGNORE_SELECTOR = `.${SURFACE_HOST_CLASS}`;
3149
2703
  var UIDEX_ATTR_TO_KIND = [
3150
2704
  ["data-uidex", "element"],
3151
2705
  ["data-uidex-region", "region"],
@@ -3432,7 +2986,6 @@ function createInspector(options) {
3432
2986
  e.preventDefault();
3433
2987
  e.stopPropagation();
3434
2988
  const match = stack[layerIndex];
3435
- session.select(match.ref);
3436
2989
  onSelect?.(match, { x: e.clientX, y: e.clientY });
3437
2990
  };
3438
2991
  const onContextMenu = (e) => {
@@ -3545,11 +3098,8 @@ function createMenuBar(options) {
3545
3098
  container,
3546
3099
  session,
3547
3100
  initialCorner = "bottom-right",
3548
- appTitle,
3549
- channel = null,
3550
- pinLayer: initialPinLayer = null
3101
+ appTitle
3551
3102
  } = options;
3552
- let activePinLayer = initialPinLayer;
3553
3103
  const root = el("div", {
3554
3104
  class: ROOT_CLASS,
3555
3105
  attrs: {
@@ -3614,162 +3164,6 @@ function createMenuBar(options) {
3614
3164
  inspectBtn.blur();
3615
3165
  });
3616
3166
  root.appendChild(inspectBtn);
3617
- const pinIcon = (0, import_lucide3.createElement)(import_lucide3.MapPin);
3618
- pinIcon.setAttribute("class", "size-3.5");
3619
- pinIcon.setAttribute("aria-hidden", "true");
3620
- const pinBtn = el(
3621
- "button",
3622
- {
3623
- class: BUTTON_CLASS,
3624
- attrs: {
3625
- type: "button",
3626
- "data-uidex-menubar-pins": "",
3627
- "aria-label": "Report pins"
3628
- }
3629
- },
3630
- pinIcon
3631
- );
3632
- const commitCycler = el("div", {
3633
- class: "relative z-1 inline-flex items-center gap-0.5",
3634
- attrs: { "data-uidex-menubar-commit-cycler": "" }
3635
- });
3636
- commitCycler.hidden = true;
3637
- const prevIcon = (0, import_lucide3.createElement)(import_lucide3.ChevronLeft);
3638
- prevIcon.setAttribute("class", "size-3");
3639
- prevIcon.setAttribute("aria-hidden", "true");
3640
- const prevBtn = el(
3641
- "button",
3642
- {
3643
- class: BUTTON_CLASS,
3644
- attrs: { type: "button", "aria-label": "Previous commit" },
3645
- style: { width: "18px", height: "18px" }
3646
- },
3647
- prevIcon
3648
- );
3649
- const commitLabel = el("span", {
3650
- class: "relative z-1 whitespace-nowrap px-1 text-[10px] font-mono text-muted-foreground",
3651
- attrs: { "data-uidex-menubar-commit-label": "" }
3652
- });
3653
- const nextIcon = (0, import_lucide3.createElement)(import_lucide3.ChevronRight);
3654
- nextIcon.setAttribute("class", "size-3");
3655
- nextIcon.setAttribute("aria-hidden", "true");
3656
- const nextBtn = el(
3657
- "button",
3658
- {
3659
- class: BUTTON_CLASS,
3660
- attrs: { type: "button", "aria-label": "Next commit" },
3661
- style: { width: "18px", height: "18px" }
3662
- },
3663
- nextIcon
3664
- );
3665
- commitCycler.appendChild(prevBtn);
3666
- commitCycler.appendChild(commitLabel);
3667
- commitCycler.appendChild(nextBtn);
3668
- const pinWrapper = el("div", {
3669
- class: "relative z-1 inline-flex items-center gap-0.5",
3670
- attrs: { "data-uidex-menubar-pin-wrapper": "" }
3671
- });
3672
- pinWrapper.hidden = true;
3673
- pinWrapper.appendChild(pinBtn);
3674
- pinWrapper.appendChild(commitCycler);
3675
- root.appendChild(pinWrapper);
3676
- const updatePinUI = () => {
3677
- if (!activePinLayer) {
3678
- pinWrapper.hidden = true;
3679
- return;
3680
- }
3681
- const pinsVisible = activePinLayer.visible;
3682
- const state = activePinLayer.filterState;
3683
- const hasCommits = state.commits.length > 0;
3684
- pinWrapper.hidden = false;
3685
- commitCycler.hidden = !pinsVisible || !hasCommits;
3686
- if (state.commitIndex === -1 || !state.commits[state.commitIndex]) {
3687
- commitLabel.textContent = `all (${state.commits.length})`;
3688
- } else {
3689
- const sha = state.commits[state.commitIndex] ?? "";
3690
- commitLabel.textContent = sha.slice(0, 7);
3691
- }
3692
- pinBtn.className = cn(BUTTON_CLASS, pinsVisible && BUTTON_ACTIVE_CLASS);
3693
- };
3694
- pinBtn.addEventListener("click", (e) => {
3695
- e.stopPropagation();
3696
- if (activePinLayer) {
3697
- activePinLayer.setVisible(!activePinLayer.visible);
3698
- }
3699
- });
3700
- prevBtn.addEventListener("click", (e) => {
3701
- e.stopPropagation();
3702
- activePinLayer?.prevCommit();
3703
- });
3704
- nextBtn.addEventListener("click", (e) => {
3705
- e.stopPropagation();
3706
- activePinLayer?.nextCommit();
3707
- });
3708
- let unsubscribePinFilter = activePinLayer?.onFilterChange(() => updatePinUI());
3709
- const presenceIcon = (0, import_lucide3.createElement)(import_lucide3.Users);
3710
- presenceIcon.setAttribute("class", "size-3.5");
3711
- presenceIcon.setAttribute("aria-hidden", "true");
3712
- const presenceBtn = el(
3713
- "button",
3714
- {
3715
- class: BUTTON_CLASS,
3716
- attrs: {
3717
- type: "button",
3718
- "data-uidex-menubar-presence": "",
3719
- "aria-label": "Online users"
3720
- }
3721
- },
3722
- presenceIcon
3723
- );
3724
- presenceBtn.hidden = true;
3725
- const presenceBadge = el("span", {
3726
- 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"
3727
- });
3728
- presenceBtn.appendChild(presenceBadge);
3729
- const presencePopover = el("div", {
3730
- 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"
3731
- });
3732
- presencePopover.hidden = true;
3733
- let presencePopoverVisible = false;
3734
- presenceBtn.addEventListener("click", (e) => {
3735
- e.stopPropagation();
3736
- presencePopoverVisible = !presencePopoverVisible;
3737
- presencePopover.hidden = !presencePopoverVisible;
3738
- });
3739
- const presenceWrapper = el("div", { class: "relative z-1 inline-flex" }, [
3740
- presenceBtn,
3741
- presencePopover
3742
- ]);
3743
- presenceWrapper.hidden = true;
3744
- root.appendChild(presenceWrapper);
3745
- let presenceUsers = [];
3746
- const updatePresenceUI = () => {
3747
- const localUserId = session.getState().user?.id ?? null;
3748
- const peers = localUserId ? presenceUsers.filter((u) => u.userId !== localUserId) : presenceUsers;
3749
- const count = peers.length;
3750
- presenceWrapper.hidden = count === 0;
3751
- presenceBadge.textContent = String(count);
3752
- presenceBtn.setAttribute(
3753
- "aria-label",
3754
- count === 1 ? "1 other user online" : `${count} other users online`
3755
- );
3756
- presencePopover.innerHTML = "";
3757
- for (const user of peers) {
3758
- const row = el("div", {
3759
- class: "flex items-center gap-2 rounded px-1.5 py-1"
3760
- });
3761
- const dot = el("span", {
3762
- class: "inline-block size-2 shrink-0 rounded-full bg-emerald-500"
3763
- });
3764
- const name = el("span", {
3765
- class: "truncate",
3766
- text: user.name || "Anonymous"
3767
- });
3768
- row.appendChild(dot);
3769
- row.appendChild(name);
3770
- presencePopover.appendChild(row);
3771
- }
3772
- };
3773
3167
  const paletteIcon = (0, import_lucide3.createElement)(import_lucide3.Command);
3774
3168
  paletteIcon.setAttribute("class", "size-3.5");
3775
3169
  paletteIcon.setAttribute("aria-hidden", "true");
@@ -3798,7 +3192,7 @@ function createMenuBar(options) {
3798
3192
  container.appendChild(root);
3799
3193
  const syncButtonStates = () => {
3800
3194
  const state = session.getState();
3801
- const inspectActive = state.inspectorActive;
3195
+ const inspectActive = state.mode === "inspecting";
3802
3196
  inspectBtn.setAttribute(
3803
3197
  "data-uidex-menubar-inspect-active",
3804
3198
  inspectActive ? "true" : "false"
@@ -3884,28 +3278,14 @@ function createMenuBar(options) {
3884
3278
  const vertical = y / (window.innerHeight || 1) < 0.5 ? "top" : "bottom";
3885
3279
  snapTo(`${vertical}-${horizontal}`);
3886
3280
  }
3887
- const unsubscribePresence = channel?.onPresence(
3888
- (users) => {
3889
- presenceUsers = users;
3890
- updatePresenceUI();
3891
- }
3892
- );
3893
3281
  return {
3894
3282
  destroy() {
3895
- unsubscribePinFilter?.();
3896
- unsubscribePresence?.();
3897
3283
  unsubscribeSession();
3898
3284
  root.removeEventListener("mousedown", onMouseDown);
3899
3285
  document.removeEventListener("mousemove", onMouseMove);
3900
3286
  document.removeEventListener("mouseup", onMouseUp);
3901
3287
  root.remove();
3902
3288
  },
3903
- setPinLayer(layer) {
3904
- unsubscribePinFilter?.();
3905
- activePinLayer = layer;
3906
- unsubscribePinFilter = layer.onFilterChange(() => updatePinUI());
3907
- updatePinUI();
3908
- },
3909
3289
  snapTo,
3910
3290
  snapToNearest,
3911
3291
  get corner() {
@@ -3917,6 +3297,49 @@ function createMenuBar(options) {
3917
3297
  };
3918
3298
  }
3919
3299
 
3300
+ // src/browser/internal/repositioner.ts
3301
+ function createRepositioner(onReflow) {
3302
+ let rafId = null;
3303
+ let attached = false;
3304
+ const schedule = () => {
3305
+ if (rafId !== null) return;
3306
+ rafId = typeof requestAnimationFrame === "function" ? requestAnimationFrame(() => {
3307
+ rafId = null;
3308
+ onReflow();
3309
+ }) : setTimeout(() => {
3310
+ rafId = null;
3311
+ onReflow();
3312
+ }, 0);
3313
+ };
3314
+ const cancel = () => {
3315
+ if (rafId === null) return;
3316
+ if (typeof cancelAnimationFrame === "function") cancelAnimationFrame(rafId);
3317
+ else clearTimeout(rafId);
3318
+ rafId = null;
3319
+ };
3320
+ const onScroll = () => schedule();
3321
+ const onResize = () => schedule();
3322
+ const attach = () => {
3323
+ if (attached) return;
3324
+ attached = true;
3325
+ window.addEventListener("resize", onResize);
3326
+ window.addEventListener("scroll", onScroll, {
3327
+ capture: true,
3328
+ passive: true
3329
+ });
3330
+ };
3331
+ const detach = () => {
3332
+ if (!attached) return;
3333
+ attached = false;
3334
+ window.removeEventListener("resize", onResize);
3335
+ window.removeEventListener("scroll", onScroll, {
3336
+ capture: true
3337
+ });
3338
+ cancel();
3339
+ };
3340
+ return { schedule, cancel, attach, detach };
3341
+ }
3342
+
3920
3343
  // src/browser/surface/overlay.ts
3921
3344
  var DEFAULT_COLOR = "#34d399";
3922
3345
  var DEFAULT_BORDER_WIDTH = 2;
@@ -3984,44 +3407,7 @@ function createOverlay(deps) {
3984
3407
  fillOpacity: DEFAULT_FILL_OPACITY,
3985
3408
  backdrop: false
3986
3409
  };
3987
- let rafId = null;
3988
- let attached = false;
3989
- const schedule = () => {
3990
- if (rafId !== null) return;
3991
- rafId = typeof requestAnimationFrame === "function" ? requestAnimationFrame(() => {
3992
- rafId = null;
3993
- updatePosition();
3994
- }) : setTimeout(() => {
3995
- rafId = null;
3996
- updatePosition();
3997
- }, 0);
3998
- };
3999
- const cancelSchedule = () => {
4000
- if (rafId === null) return;
4001
- if (typeof cancelAnimationFrame === "function") cancelAnimationFrame(rafId);
4002
- else clearTimeout(rafId);
4003
- rafId = null;
4004
- };
4005
- const onScroll = () => schedule();
4006
- const onResize = () => schedule();
4007
- const attach = () => {
4008
- if (attached) return;
4009
- attached = true;
4010
- window.addEventListener("resize", onResize);
4011
- window.addEventListener("scroll", onScroll, {
4012
- capture: true,
4013
- passive: true
4014
- });
4015
- };
4016
- const detach = () => {
4017
- if (!attached) return;
4018
- attached = false;
4019
- window.removeEventListener("resize", onResize);
4020
- window.removeEventListener("scroll", onScroll, {
4021
- capture: true
4022
- });
4023
- cancelSchedule();
4024
- };
3410
+ const repositioner = createRepositioner(() => updatePosition());
4025
3411
  function updatePosition() {
4026
3412
  if (!target) return;
4027
3413
  const rect = target.getBoundingClientRect();
@@ -4085,16 +3471,16 @@ function createOverlay(deps) {
4085
3471
  box.offsetHeight;
4086
3472
  }
4087
3473
  box.style.opacity = "1";
4088
- attach();
3474
+ repositioner.attach();
4089
3475
  },
4090
3476
  hide() {
4091
3477
  target = null;
4092
3478
  box.style.opacity = "0";
4093
3479
  backdrop.style.opacity = "0";
4094
- detach();
3480
+ repositioner.detach();
4095
3481
  },
4096
3482
  destroy() {
4097
- detach();
3483
+ repositioner.detach();
4098
3484
  box.remove();
4099
3485
  backdrop.remove();
4100
3486
  target = null;
@@ -4211,8 +3597,7 @@ function createSurfaceShell(options) {
4211
3597
  const overlay = createOverlay({ container: host.shadowRoot });
4212
3598
  cleanup.add(overlay);
4213
3599
  const tooltip = createCursorTooltip({
4214
- container: host.chromeEl,
4215
- session: options.session
3600
+ container: host.chromeEl
4216
3601
  });
4217
3602
  cleanup.add(tooltip);
4218
3603
  const afterHover = options.inspector?.onAfterHover;
@@ -4258,9 +3643,7 @@ function createSurfaceShell(options) {
4258
3643
  container: host.chromeEl,
4259
3644
  session: options.session,
4260
3645
  initialCorner: options.initialCorner,
4261
- appTitle: options.appTitle,
4262
- channel: options.channel ?? null,
4263
- pinLayer: options.pinLayer ?? null
3646
+ appTitle: options.appTitle
4264
3647
  });
4265
3648
  cleanup.add(menuBar);
4266
3649
  return {