uidex 0.3.0 → 0.5.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 (44) hide show
  1. package/dist/cli/cli.cjs +1116 -112
  2. package/dist/cli/cli.cjs.map +1 -1
  3. package/dist/cloud/index.cjs +395 -72
  4. package/dist/cloud/index.cjs.map +1 -1
  5. package/dist/cloud/index.d.cts +60 -86
  6. package/dist/cloud/index.d.ts +60 -86
  7. package/dist/cloud/index.js +396 -71
  8. package/dist/cloud/index.js.map +1 -1
  9. package/dist/headless/index.cjs +1505 -791
  10. package/dist/headless/index.cjs.map +1 -1
  11. package/dist/headless/index.d.cts +83 -75
  12. package/dist/headless/index.d.ts +83 -75
  13. package/dist/headless/index.js +1514 -791
  14. package/dist/headless/index.js.map +1 -1
  15. package/dist/index.cjs +6281 -3190
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/index.d.cts +337 -229
  18. package/dist/index.d.ts +337 -229
  19. package/dist/index.js +6362 -3231
  20. package/dist/index.js.map +1 -1
  21. package/dist/playwright/index.cjs +4 -4
  22. package/dist/playwright/index.cjs.map +1 -1
  23. package/dist/playwright/index.js +3 -3
  24. package/dist/playwright/index.js.map +1 -1
  25. package/dist/playwright/reporter.cjs +3 -3
  26. package/dist/playwright/reporter.cjs.map +1 -1
  27. package/dist/playwright/reporter.js +3 -3
  28. package/dist/playwright/reporter.js.map +1 -1
  29. package/dist/react/index.cjs +6291 -3206
  30. package/dist/react/index.cjs.map +1 -1
  31. package/dist/react/index.d.cts +239 -186
  32. package/dist/react/index.d.ts +239 -186
  33. package/dist/react/index.js +6338 -3208
  34. package/dist/react/index.js.map +1 -1
  35. package/dist/scan/index.cjs +212 -82
  36. package/dist/scan/index.cjs.map +1 -1
  37. package/dist/scan/index.d.cts +31 -0
  38. package/dist/scan/index.d.ts +31 -0
  39. package/dist/scan/index.js +211 -81
  40. package/dist/scan/index.js.map +1 -1
  41. package/package.json +10 -8
  42. package/templates/claude/api.md +110 -0
  43. package/templates/claude/audit.md +8 -2
  44. package/templates/claude/rules.md +15 -0
@@ -1,4 +1,4 @@
1
- // src/entities/types.ts
1
+ // src/shared/entities/types.ts
2
2
  var ENTITY_KINDS = [
3
3
  "route",
4
4
  "page",
@@ -36,7 +36,7 @@ function assertEntityKind(kind) {
36
36
  if (!KIND_SET.has(kind)) throw new UnknownEntityKindError(kind);
37
37
  }
38
38
 
39
- // src/entities/registry.ts
39
+ // src/shared/entities/registry.ts
40
40
  function emptyStore() {
41
41
  return {
42
42
  route: /* @__PURE__ */ new Map(),
@@ -118,10 +118,33 @@ function createRegistry() {
118
118
  return ids.has(entity.id);
119
119
  });
120
120
  };
121
- return { add, get, list, query, byScope, touchedBy };
121
+ const reports = /* @__PURE__ */ new Map();
122
+ const reportsCbs = /* @__PURE__ */ new Set();
123
+ const setReports = (kind, id, records) => {
124
+ reports.set(`${kind}:${id}`, records);
125
+ for (const cb of reportsCbs) cb();
126
+ };
127
+ const getReports = (kind, id) => reports.get(`${kind}:${id}`) ?? [];
128
+ const listReportKeys = () => Array.from(reports.keys());
129
+ const onReportsChange = (cb) => {
130
+ reportsCbs.add(cb);
131
+ return () => reportsCbs.delete(cb);
132
+ };
133
+ return {
134
+ add,
135
+ get,
136
+ list,
137
+ query,
138
+ byScope,
139
+ touchedBy,
140
+ setReports,
141
+ getReports,
142
+ listReportKeys,
143
+ onReportsChange
144
+ };
122
145
  }
123
146
 
124
- // src/entities/style.ts
147
+ // src/shared/entities/style.ts
125
148
  import {
126
149
  Circle,
127
150
  FileText,
@@ -135,63 +158,63 @@ import {
135
158
  var KIND_STYLE = {
136
159
  route: {
137
160
  icon: RouteIcon,
138
- tone: "text-blue-700 dark:text-blue-300",
139
- chip: "bg-blue-400/20 text-blue-700 group-data-hover:bg-blue-400/30 dark:bg-blue-400/10 dark:text-blue-300 dark:group-data-hover:bg-blue-400/15",
161
+ tone: "text-blue-700 dark:text-blue-400",
162
+ chip: "bg-blue-50 text-blue-700 inset-ring inset-ring-blue-700/10 group-data-hover:bg-blue-100 dark:bg-blue-400/10 dark:text-blue-400 dark:inset-ring-blue-400/30 dark:group-data-hover:bg-blue-400/20",
140
163
  color: "#60a5fa",
141
164
  label: "Route"
142
165
  },
143
166
  page: {
144
167
  icon: FileText,
145
- tone: "text-emerald-700 dark:text-emerald-300",
146
- chip: "bg-emerald-400/20 text-emerald-700 group-data-hover:bg-emerald-400/30 dark:bg-emerald-400/10 dark:text-emerald-300 dark:group-data-hover:bg-emerald-400/15",
168
+ tone: "text-emerald-700 dark:text-emerald-400",
169
+ chip: "bg-emerald-50 text-emerald-700 inset-ring inset-ring-emerald-600/20 group-data-hover:bg-emerald-100 dark:bg-emerald-400/10 dark:text-emerald-400 dark:inset-ring-emerald-500/20 dark:group-data-hover:bg-emerald-400/20",
147
170
  color: "#34d399",
148
171
  label: "Page"
149
172
  },
150
173
  feature: {
151
174
  icon: Sparkles,
152
- tone: "text-amber-700 dark:text-amber-300",
153
- chip: "bg-amber-400/20 text-amber-700 group-data-hover:bg-amber-400/30 dark:bg-amber-400/10 dark:text-amber-300 dark:group-data-hover:bg-amber-400/15",
175
+ tone: "text-amber-700 dark:text-amber-500",
176
+ chip: "bg-amber-50 text-amber-800 inset-ring inset-ring-amber-600/20 group-data-hover:bg-amber-100 dark:bg-amber-400/10 dark:text-amber-500 dark:inset-ring-amber-400/20 dark:group-data-hover:bg-amber-400/20",
154
177
  color: "#fbbf24",
155
178
  label: "Feature"
156
179
  },
157
180
  widget: {
158
181
  icon: LayoutGrid,
159
- tone: "text-violet-700 dark:text-violet-300",
160
- chip: "bg-violet-400/20 text-violet-700 group-data-hover:bg-violet-400/30 dark:bg-violet-400/10 dark:text-violet-300 dark:group-data-hover:bg-violet-400/15",
182
+ tone: "text-violet-700 dark:text-violet-400",
183
+ chip: "bg-violet-50 text-violet-700 inset-ring inset-ring-violet-700/10 group-data-hover:bg-violet-100 dark:bg-violet-400/10 dark:text-violet-400 dark:inset-ring-violet-400/30 dark:group-data-hover:bg-violet-400/20",
161
184
  color: "#a78bfa",
162
185
  label: "Widget"
163
186
  },
164
187
  region: {
165
188
  icon: LayoutPanelTop,
166
- tone: "text-cyan-700 dark:text-cyan-300",
167
- chip: "bg-cyan-400/20 text-cyan-700 group-data-hover:bg-cyan-400/30 dark:bg-cyan-400/10 dark:text-cyan-300 dark:group-data-hover:bg-cyan-400/15",
189
+ tone: "text-cyan-700 dark:text-cyan-400",
190
+ chip: "bg-cyan-50 text-cyan-700 inset-ring inset-ring-cyan-700/10 group-data-hover:bg-cyan-100 dark:bg-cyan-400/10 dark:text-cyan-400 dark:inset-ring-cyan-400/30 dark:group-data-hover:bg-cyan-400/20",
168
191
  color: "#22d3ee",
169
192
  label: "Region"
170
193
  },
171
194
  element: {
172
195
  icon: MousePointerClick,
173
- tone: "text-rose-700 dark:text-rose-300",
174
- chip: "bg-rose-400/20 text-rose-700 group-data-hover:bg-rose-400/30 dark:bg-rose-400/10 dark:text-rose-300 dark:group-data-hover:bg-rose-400/15",
196
+ tone: "text-rose-700 dark:text-rose-400",
197
+ chip: "bg-rose-50 text-rose-700 inset-ring inset-ring-rose-600/10 group-data-hover:bg-rose-100 dark:bg-rose-400/10 dark:text-rose-400 dark:inset-ring-rose-400/20 dark:group-data-hover:bg-rose-400/20",
175
198
  color: "#fb7185",
176
199
  label: "Element"
177
200
  },
178
201
  primitive: {
179
202
  icon: Circle,
180
- tone: "text-slate-700 dark:text-slate-300",
181
- chip: "bg-slate-400/20 text-slate-700 group-data-hover:bg-slate-400/30 dark:bg-slate-400/10 dark:text-slate-300 dark:group-data-hover:bg-slate-400/15",
203
+ tone: "text-slate-600 dark:text-slate-400",
204
+ chip: "bg-slate-50 text-slate-600 inset-ring inset-ring-slate-500/10 group-data-hover:bg-slate-100 dark:bg-slate-400/10 dark:text-slate-400 dark:inset-ring-slate-400/20 dark:group-data-hover:bg-slate-400/20",
182
205
  color: "#94a3b8",
183
206
  label: "Primitive"
184
207
  },
185
208
  flow: {
186
209
  icon: Workflow,
187
- tone: "text-fuchsia-700 dark:text-fuchsia-300",
188
- chip: "bg-fuchsia-400/20 text-fuchsia-700 group-data-hover:bg-fuchsia-400/30 dark:bg-fuchsia-400/10 dark:text-fuchsia-300 dark:group-data-hover:bg-fuchsia-400/15",
210
+ tone: "text-fuchsia-700 dark:text-fuchsia-400",
211
+ chip: "bg-fuchsia-50 text-fuchsia-700 inset-ring inset-ring-fuchsia-700/10 group-data-hover:bg-fuchsia-100 dark:bg-fuchsia-400/10 dark:text-fuchsia-400 dark:inset-ring-fuchsia-400/20 dark:group-data-hover:bg-fuchsia-400/20",
189
212
  color: "#e879f9",
190
213
  label: "Flow"
191
214
  }
192
215
  };
193
216
 
194
- // src/entities/display-name.ts
217
+ // src/shared/entities/display-name.ts
195
218
  function prettify(id) {
196
219
  const parts = id.split(/[-_]+/).filter(Boolean);
197
220
  const words = parts.flatMap((part) => part.split(/(?=[A-Z])/).filter(Boolean));
@@ -209,7 +232,7 @@ function displayName(entity, node) {
209
232
  return prettify(entity.id);
210
233
  }
211
234
 
212
- // src/internal/cleanup.ts
235
+ // src/browser/internal/cleanup.ts
213
236
  function createCleanupStack() {
214
237
  const stack = [];
215
238
  return {
@@ -231,293 +254,147 @@ function createCleanupStack() {
231
254
  };
232
255
  }
233
256
 
234
- // src/session/store.ts
235
- import { createActor } from "xstate";
236
- import { createStore } from "zustand/vanilla";
257
+ // src/browser/session/store.ts
258
+ import { createStore as createStore3 } from "zustand/vanilla";
237
259
 
238
- // src/flows/highlight.ts
239
- import { assign, setup } from "xstate";
240
- var initialContext = {
241
- ref: null,
242
- element: null,
243
- pinnedRef: null,
244
- color: null
260
+ // src/browser/session/mode.ts
261
+ import { createStore } from "zustand/vanilla";
262
+ var COMMAND_PALETTE_ENTRY = {
263
+ id: "command-palette",
264
+ ref: null
245
265
  };
246
- var highlightMachine = setup({
247
- types: {},
248
- actions: {
249
- showOverlay: () => {
266
+ function createModeStore(options) {
267
+ const { nav, bindings } = options;
268
+ const store = createStore(() => ({
269
+ mode: "idle",
270
+ inspectorActive: false
271
+ }));
272
+ const transition = {
273
+ openPalette() {
274
+ const prev = store.getState();
275
+ if (prev.mode === "inspecting") {
276
+ bindings?.destroyInspector?.();
277
+ }
278
+ nav.nav.reset([COMMAND_PALETTE_ENTRY]);
279
+ store.setState({ mode: "palette", inspectorActive: false });
250
280
  },
251
- hideOverlay: () => {
281
+ openInspector() {
282
+ bindings?.mountInspector?.();
283
+ nav.nav.clear();
284
+ store.setState({ mode: "inspecting", inspectorActive: true });
252
285
  },
253
- updateOverlay: () => {
254
- }
255
- }
256
- }).createMachine({
257
- id: "highlight",
258
- initial: "none",
259
- context: initialContext,
260
- states: {
261
- none: {
262
- entry: [
263
- assign({
264
- ref: null,
265
- element: null,
266
- pinnedRef: null,
267
- color: null
268
- }),
269
- { type: "hideOverlay" }
270
- ],
271
- on: {
272
- HOVER: {
273
- target: "transient",
274
- actions: assign(({ event }) => ({
275
- ref: event.ref,
276
- element: event.element,
277
- color: event.color ?? null
278
- }))
279
- },
280
- PIN: {
281
- target: "pinned",
282
- actions: assign(({ context, event }) => ({
283
- ref: event.ref ?? context.ref,
284
- pinnedRef: event.ref ?? context.ref
285
- }))
286
- }
287
- }
286
+ closeInspector() {
287
+ bindings?.destroyInspector?.();
288
+ nav.nav.clear();
289
+ store.setState({ mode: "idle", inspectorActive: false });
288
290
  },
289
- transient: {
290
- entry: { type: "showOverlay" },
291
- on: {
292
- HOVER: {
293
- actions: [
294
- assign(({ event }) => ({
295
- ref: event.ref,
296
- element: event.element,
297
- color: event.color ?? null
298
- })),
299
- { type: "updateOverlay" }
300
- ]
301
- },
302
- UNHOVER: { target: "none" },
303
- PIN: {
304
- target: "pinned",
305
- actions: assign(({ context, event }) => ({
306
- pinnedRef: event.ref ?? context.ref
307
- }))
308
- }
291
+ toggleInspector() {
292
+ if (store.getState().mode === "inspecting") {
293
+ transition.closeInspector();
294
+ } else {
295
+ transition.openInspector();
309
296
  }
310
297
  },
311
- pinned: {
312
- entry: { type: "showOverlay" },
313
- on: {
314
- UNPIN: { target: "none" }
298
+ enterViewing(initialStack) {
299
+ const prev = store.getState();
300
+ if (prev.mode === "inspecting") {
301
+ bindings?.destroyInspector?.();
315
302
  }
316
- }
317
- }
318
- });
319
-
320
- // src/flows/surface.ts
321
- import { assign as assign2, forwardTo, sendTo, setup as setup2 } from "xstate";
322
- var initialContext2 = {
323
- stack: [],
324
- hover: null,
325
- selection: null,
326
- pinnedHighlight: null,
327
- theme: "auto",
328
- resolvedTheme: "light",
329
- ingestActive: false
330
- };
331
- var surfaceMachine = setup2({
332
- types: {},
333
- actors: {
334
- highlight: highlightMachine
335
- },
336
- actions: {
337
- mountInspector: () => {
303
+ nav.nav.reset(initialStack);
304
+ store.setState({ mode: "viewing", inspectorActive: false });
338
305
  },
339
- destroyInspector: () => {
306
+ dismiss() {
307
+ const prev = store.getState();
308
+ if (prev.mode === "inspecting") {
309
+ bindings?.destroyInspector?.();
310
+ }
311
+ nav.nav.clear();
312
+ store.setState({ mode: "idle", inspectorActive: false });
340
313
  },
341
- openActionsPopup: () => {
314
+ popOrTransition() {
315
+ const { stack } = nav.getState();
316
+ if (stack.length > 2) {
317
+ nav.nav.pop();
318
+ } else if (stack.length === 2 && stack[0]?.id === "command-palette") {
319
+ nav.nav.reset([COMMAND_PALETTE_ENTRY]);
320
+ store.setState({ mode: "palette", inspectorActive: false });
321
+ } else if (stack.length === 2) {
322
+ nav.nav.pop();
323
+ } else {
324
+ nav.nav.clear();
325
+ store.setState({ mode: "idle", inspectorActive: false });
326
+ }
342
327
  },
343
- closePopup: () => {
328
+ pushView(entry) {
329
+ const { mode } = store.getState();
330
+ const { stack } = nav.getState();
331
+ if (entry.id === "command-palette" && stack.length === 0) {
332
+ transition.openPalette();
333
+ return;
334
+ }
335
+ switch (mode) {
336
+ case "idle":
337
+ transition.enterViewing([entry]);
338
+ break;
339
+ case "inspecting":
340
+ bindings?.destroyInspector?.();
341
+ nav.nav.reset([entry]);
342
+ store.setState({ mode: "viewing", inspectorActive: false });
343
+ break;
344
+ case "palette":
345
+ case "viewing":
346
+ nav.nav.push(entry);
347
+ if (mode === "palette") {
348
+ store.setState({ mode: "viewing" });
349
+ }
350
+ break;
351
+ }
344
352
  }
345
- },
346
- guards: {
347
- hasPinnedHighlight: ({ context }) => context.pinnedHighlight !== null,
348
- hasActions: () => false,
349
- popupOpen: () => false,
350
- stackDeeperThanTwo: ({ context }) => context.stack.length > 2,
351
- stackEqualsTwo: ({ context }) => context.stack.length === 2,
352
- stackEqualsOne: ({ context }) => context.stack.length === 1,
353
- paletteAtBottomDepthTwo: ({ context }) => context.stack.length === 2 && context.stack[0]?.id === "command-palette"
354
- }
355
- }).createMachine({
356
- id: "surface",
357
- initial: "idle",
358
- context: ({ input }) => ({
359
- ...initialContext2,
360
- ...input ?? {}
361
- }),
362
- invoke: {
363
- id: "highlight",
364
- src: "highlight"
365
- },
366
- on: {
367
- HOVER: {
368
- actions: [
369
- assign2(({ event }) => ({ hover: event.ref })),
370
- forwardTo("highlight")
371
- ]
372
- },
373
- UNHOVER: {
374
- actions: [assign2({ hover: null }), forwardTo("highlight")]
375
- },
376
- PIN: {
377
- actions: [
378
- assign2(({ context, event }) => ({
379
- pinnedHighlight: event.ref ?? context.hover
380
- })),
381
- forwardTo("highlight")
382
- ]
383
- },
384
- UNPIN: {
385
- actions: [assign2({ pinnedHighlight: null }), forwardTo("highlight")]
386
- },
387
- SET_SELECTION: {
388
- actions: assign2(({ event }) => ({ selection: event.ref }))
389
- },
390
- SET_THEME: {
391
- actions: assign2(({ event }) => ({
392
- theme: event.theme,
393
- resolvedTheme: event.resolvedTheme
394
- }))
353
+ };
354
+ const modeStore = store;
355
+ modeStore.transition = transition;
356
+ return modeStore;
357
+ }
358
+
359
+ // src/browser/session/navigation.ts
360
+ import { createStore as createStore2 } from "zustand/vanilla";
361
+ function createNavigationStore() {
362
+ const store = createStore2(() => ({
363
+ stack: []
364
+ }));
365
+ const nav = {
366
+ push(entry) {
367
+ store.setState({ stack: [...store.getState().stack, entry] });
395
368
  },
396
- SET_INGEST: {
397
- actions: assign2(({ event }) => ({ ingestActive: event.active }))
398
- }
399
- },
400
- states: {
401
- idle: {
402
- entry: assign2({ stack: [] }),
403
- on: {
404
- TOGGLE_INSPECTOR: { target: "inspecting" },
405
- OPEN_PALETTE: { target: "palette" },
406
- PUSH_VIEW: {
407
- target: "viewing",
408
- actions: assign2(({ event }) => ({ stack: [event.entry] }))
409
- },
410
- ESC: {
411
- guard: "hasPinnedHighlight",
412
- actions: [
413
- assign2({ pinnedHighlight: null }),
414
- sendTo("highlight", { type: "UNPIN" })
415
- ]
416
- }
369
+ pop() {
370
+ const s = store.getState().stack;
371
+ if (s.length <= 1) {
372
+ store.setState({ stack: [] });
373
+ } else {
374
+ store.setState({ stack: s.slice(0, -1) });
417
375
  }
418
376
  },
419
- inspecting: {
420
- entry: { type: "mountInspector" },
421
- exit: { type: "destroyInspector" },
422
- on: {
423
- SELECT: {
424
- target: "viewing",
425
- actions: assign2(({ context, event }) => ({
426
- selection: event.ref,
427
- stack: [...context.stack, event.entry]
428
- }))
429
- },
430
- PUSH_VIEW: {
431
- target: "viewing",
432
- actions: assign2(({ event }) => ({ stack: [event.entry] }))
433
- },
434
- TOGGLE_INSPECTOR: { target: "idle" },
435
- OPEN_PALETTE: { target: "palette" },
436
- ESC: { target: "idle" }
377
+ replace(entry) {
378
+ const s = store.getState().stack;
379
+ if (s.length === 0) {
380
+ store.setState({ stack: [entry] });
381
+ } else {
382
+ store.setState({ stack: [...s.slice(0, -1), entry] });
437
383
  }
438
384
  },
439
- palette: {
440
- entry: assign2({ stack: [{ id: "command-palette", ref: null }] }),
441
- on: {
442
- PUSH_VIEW: {
443
- target: "viewing",
444
- actions: assign2(({ context, event }) => ({
445
- stack: [...context.stack, event.entry]
446
- }))
447
- },
448
- CLOSE: { target: "idle" },
449
- ESC: { target: "idle" },
450
- CMD_K: [
451
- {
452
- guard: "hasActions",
453
- actions: { type: "openActionsPopup" }
454
- },
455
- { target: "idle" }
456
- ]
457
- }
385
+ clear() {
386
+ store.setState({ stack: [] });
458
387
  },
459
- viewing: {
460
- on: {
461
- PUSH_VIEW: {
462
- actions: assign2(({ context, event }) => ({
463
- stack: [...context.stack, event.entry]
464
- }))
465
- },
466
- POP_VIEW: [
467
- {
468
- guard: "stackDeeperThanTwo",
469
- actions: assign2(({ context }) => ({
470
- stack: context.stack.slice(0, -1)
471
- }))
472
- },
473
- {
474
- guard: "paletteAtBottomDepthTwo",
475
- target: "palette"
476
- },
477
- {
478
- guard: "stackEqualsTwo",
479
- actions: assign2(({ context }) => ({
480
- stack: context.stack.slice(0, -1)
481
- }))
482
- },
483
- {
484
- guard: "stackEqualsOne",
485
- target: "idle"
486
- }
487
- ],
488
- CLOSE: { target: "idle" },
489
- ESC: [
490
- {
491
- guard: "popupOpen",
492
- actions: { type: "closePopup" }
493
- },
494
- {
495
- guard: "stackDeeperThanTwo",
496
- actions: assign2(({ context }) => ({
497
- stack: context.stack.slice(0, -1)
498
- }))
499
- },
500
- {
501
- guard: "paletteAtBottomDepthTwo",
502
- target: "palette"
503
- },
504
- {
505
- guard: "stackEqualsTwo",
506
- actions: assign2(({ context }) => ({
507
- stack: context.stack.slice(0, -1)
508
- }))
509
- },
510
- {
511
- guard: "stackEqualsOne",
512
- target: "idle"
513
- }
514
- ]
515
- }
388
+ reset(stack) {
389
+ store.setState({ stack });
516
390
  }
517
- }
518
- });
391
+ };
392
+ const navStore = store;
393
+ navStore.nav = nav;
394
+ return navStore;
395
+ }
519
396
 
520
- // src/session/store.ts
397
+ // src/browser/session/store.ts
521
398
  var defaultSnapshot = {
522
399
  hover: null,
523
400
  selection: null,
@@ -526,7 +403,8 @@ var defaultSnapshot = {
526
403
  inspectorActive: false,
527
404
  theme: "auto",
528
405
  resolvedTheme: "light",
529
- ingestActive: false
406
+ ingestActive: false,
407
+ user: null
530
408
  };
531
409
  function resolveTheme(preference, detect) {
532
410
  if (preference !== "auto") return preference;
@@ -537,197 +415,188 @@ function resolveTheme(preference, detect) {
537
415
  }
538
416
  return "light";
539
417
  }
540
- function projectFromActor(actor) {
541
- const sn = actor.getSnapshot();
542
- const child = sn.children.highlight;
543
- const childSnapshot = child?.getSnapshot();
544
- const pinned = childSnapshot && childSnapshot.value === "pinned" ? childSnapshot.context.pinnedRef : null;
545
- return {
546
- hover: sn.context.hover,
547
- selection: sn.context.selection,
548
- stack: sn.context.stack,
549
- pinnedHighlight: pinned,
550
- inspectorActive: sn.matches("inspecting"),
551
- theme: sn.context.theme,
552
- resolvedTheme: sn.context.resolvedTheme,
553
- ingestActive: sn.context.ingestActive
554
- };
555
- }
556
418
  function createSession(options = {}) {
557
- const { detectTheme, bindings, ...overrides } = options;
419
+ const {
420
+ detectTheme,
421
+ onMountInspector,
422
+ onDestroyInspector,
423
+ onShowOverlay,
424
+ onHideOverlay,
425
+ onUpdateOverlay,
426
+ ...overrides
427
+ } = options;
558
428
  const initialPref = overrides.theme ?? defaultSnapshot.theme;
559
429
  const initialResolved = overrides.resolvedTheme ?? resolveTheme(initialPref, detectTheme);
560
430
  const initialStack = overrides.stack ?? [];
561
- const input = {
431
+ const nav = createNavigationStore();
432
+ const modeStore = createModeStore({
433
+ nav,
434
+ bindings: {
435
+ mountInspector: onMountInspector,
436
+ destroyInspector: onDestroyInspector
437
+ }
438
+ });
439
+ let highlightMode = "none";
440
+ const hlCtx = {
441
+ ref: null,
442
+ element: null,
443
+ pinnedRef: null,
444
+ color: null
445
+ };
446
+ const highlightActions = {
447
+ hover(ref, element, color) {
448
+ hlCtx.ref = ref;
449
+ hlCtx.element = element ?? null;
450
+ hlCtx.color = color ?? null;
451
+ if (highlightMode === "none") {
452
+ highlightMode = "transient";
453
+ onShowOverlay?.(hlCtx);
454
+ } else if (highlightMode === "transient") {
455
+ onUpdateOverlay?.(hlCtx);
456
+ }
457
+ store.setState({ hover: ref });
458
+ },
459
+ unhover() {
460
+ if (highlightMode === "transient") {
461
+ highlightMode = "none";
462
+ hlCtx.ref = null;
463
+ hlCtx.element = null;
464
+ hlCtx.color = null;
465
+ onHideOverlay?.();
466
+ }
467
+ store.setState({ hover: null });
468
+ },
469
+ pin(ref) {
470
+ const pinRef = ref ?? hlCtx.ref;
471
+ hlCtx.pinnedRef = pinRef;
472
+ if (highlightMode === "none") {
473
+ hlCtx.ref = pinRef;
474
+ }
475
+ if (highlightMode !== "pinned") {
476
+ highlightMode = "pinned";
477
+ onShowOverlay?.(hlCtx);
478
+ }
479
+ store.setState({ pinnedHighlight: hlCtx.pinnedRef });
480
+ },
481
+ unpin() {
482
+ if (highlightMode === "pinned") {
483
+ highlightMode = "none";
484
+ hlCtx.ref = null;
485
+ hlCtx.element = null;
486
+ hlCtx.pinnedRef = null;
487
+ hlCtx.color = null;
488
+ onHideOverlay?.();
489
+ }
490
+ store.setState({ pinnedHighlight: null });
491
+ }
492
+ };
493
+ const store = createStore3(() => ({
494
+ ...defaultSnapshot,
562
495
  hover: overrides.hover ?? null,
563
496
  selection: overrides.selection ?? null,
497
+ stack: [],
564
498
  pinnedHighlight: null,
499
+ inspectorActive: false,
565
500
  theme: initialPref,
566
501
  resolvedTheme: initialResolved,
567
- ingestActive: overrides.ingestActive ?? false
568
- };
569
- const providedHighlight = highlightMachine.provide({
570
- actions: {
571
- showOverlay: ({ context }) => bindings?.highlight?.showOverlay?.(context),
572
- hideOverlay: () => bindings?.highlight?.hideOverlay?.(),
573
- updateOverlay: ({ context }) => bindings?.highlight?.updateOverlay?.(context)
502
+ ingestActive: overrides.ingestActive ?? false,
503
+ user: overrides.user ?? null
504
+ }));
505
+ nav.subscribe(() => {
506
+ const { stack } = nav.getState();
507
+ if (store.getState().stack !== stack) {
508
+ store.setState({ stack });
574
509
  }
575
510
  });
576
- const providedSurface = surfaceMachine.provide({
577
- actions: {
578
- mountInspector: () => bindings?.surface?.mountInspector?.(),
579
- destroyInspector: () => bindings?.surface?.destroyInspector?.(),
580
- openActionsPopup: () => bindings?.surface?.openActionsPopup?.(),
581
- closePopup: () => bindings?.surface?.closePopup?.()
582
- },
583
- actors: {
584
- highlight: providedHighlight
511
+ modeStore.subscribe(() => {
512
+ const { inspectorActive } = modeStore.getState();
513
+ if (store.getState().inspectorActive !== inspectorActive) {
514
+ store.setState({ inspectorActive });
585
515
  }
586
516
  });
587
- const actor = createActor(providedSurface, { input });
588
- actor.start();
517
+ const session = store;
518
+ session.nav = nav;
519
+ session.mode = modeStore;
520
+ session.highlight = highlightActions;
521
+ session.select = (ref) => {
522
+ if (sameRef(store.getState().selection, ref)) return;
523
+ store.setState({ selection: ref });
524
+ };
525
+ session.setTheme = (theme, resolved) => {
526
+ const state = store.getState();
527
+ const nextResolved = resolved ?? resolveTheme(theme, detectTheme);
528
+ if (state.theme === theme && state.resolvedTheme === nextResolved) return;
529
+ store.setState({ theme, resolvedTheme: nextResolved });
530
+ };
531
+ session.setIngest = (active) => {
532
+ if (store.getState().ingestActive === active) return;
533
+ store.setState({ ingestActive: active });
534
+ };
589
535
  if (initialStack.length > 0) {
590
- actor.send({ type: "OPEN_PALETTE" });
536
+ modeStore.transition.openPalette();
591
537
  for (let i = 1; i < initialStack.length; i++) {
592
- actor.send({ type: "PUSH_VIEW", entry: initialStack[i] });
538
+ modeStore.transition.pushView(initialStack[i]);
593
539
  }
594
540
  } else if (overrides.inspectorActive) {
595
- actor.send({ type: "TOGGLE_INSPECTOR" });
541
+ modeStore.transition.openInspector();
596
542
  }
597
543
  if (overrides.pinnedHighlight) {
598
- actor.send({ type: "PIN", ref: overrides.pinnedHighlight });
599
- }
600
- const store = createStore((_set, get) => ({
601
- ...projectFromActor(actor),
602
- actions: {
603
- hover(ref) {
604
- if (sameRef(get().hover, ref)) return;
605
- if (ref === null) {
606
- actor.send({ type: "UNHOVER" });
607
- } else {
608
- actor.send({ type: "HOVER", ref, element: null });
609
- }
610
- },
611
- select(ref) {
612
- if (sameRef(get().selection, ref)) return;
613
- actor.send({ type: "SET_SELECTION", ref });
614
- },
615
- pushStack(entry) {
616
- if (entry.id === "command-palette" && get().stack.length === 0) {
617
- actor.send({ type: "OPEN_PALETTE" });
618
- } else {
619
- actor.send({ type: "PUSH_VIEW", entry });
620
- }
621
- },
622
- popStack() {
623
- const sn = actor.getSnapshot();
624
- if (sn.matches("palette")) {
625
- actor.send({ type: "ESC" });
626
- } else if (sn.matches("viewing")) {
627
- actor.send({ type: "POP_VIEW" });
628
- }
629
- },
630
- clearStack() {
631
- if (get().stack.length === 0) return;
632
- actor.send({ type: "CLOSE" });
633
- },
634
- openView(id, ref) {
635
- const resolvedRef = ref === void 0 ? get().selection : ref;
636
- get().actions.pushStack({ id, ref: resolvedRef });
637
- },
638
- closeView() {
639
- get().actions.clearStack();
640
- },
641
- setInspectorActive(active) {
642
- if (get().inspectorActive === active) return;
643
- actor.send({ type: "TOGGLE_INSPECTOR" });
644
- },
645
- toggleInspector() {
646
- actor.send({ type: "TOGGLE_INSPECTOR" });
647
- },
648
- pinHighlight(ref) {
649
- if (sameRef(get().pinnedHighlight, ref)) return;
650
- actor.send({ type: "PIN", ref });
651
- },
652
- clearPinnedHighlight() {
653
- if (get().pinnedHighlight === null) return;
654
- actor.send({ type: "UNPIN" });
655
- },
656
- setTheme(theme, resolved) {
657
- const state = get();
658
- const nextResolved = resolved ?? resolveTheme(theme, detectTheme);
659
- if (state.theme === theme && state.resolvedTheme === nextResolved)
660
- return;
661
- actor.send({ type: "SET_THEME", theme, resolvedTheme: nextResolved });
662
- },
663
- setIngest(active) {
664
- if (get().ingestActive === active) return;
665
- actor.send({ type: "SET_INGEST", active });
666
- }
667
- }
668
- }));
669
- const projectAndSet = () => {
670
- const next = projectFromActor(actor);
671
- const prev = store.getState();
672
- const updates = {};
673
- if (!sameRef(prev.hover, next.hover)) updates.hover = next.hover;
674
- if (!sameRef(prev.selection, next.selection))
675
- updates.selection = next.selection;
676
- if (prev.stack !== next.stack) updates.stack = next.stack;
677
- if (!sameRef(prev.pinnedHighlight, next.pinnedHighlight))
678
- updates.pinnedHighlight = next.pinnedHighlight;
679
- if (prev.inspectorActive !== next.inspectorActive)
680
- updates.inspectorActive = next.inspectorActive;
681
- if (prev.theme !== next.theme) updates.theme = next.theme;
682
- if (prev.resolvedTheme !== next.resolvedTheme)
683
- updates.resolvedTheme = next.resolvedTheme;
684
- if (prev.ingestActive !== next.ingestActive)
685
- updates.ingestActive = next.ingestActive;
686
- if (Object.keys(updates).length === 0) return;
687
- store.setState(updates);
688
- };
689
- actor.subscribe(projectAndSet);
690
- const session = store;
691
- session.send = (event) => actor.send(event);
544
+ highlightActions.pin(overrides.pinnedHighlight);
545
+ }
692
546
  return session;
693
547
  }
694
548
 
695
- // src/styles/tailwind.built.css
549
+ // src/browser/styles/tailwind.built.css
696
550
  var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */
697
551
  @layer properties;
698
552
  @layer theme, base, components, utilities;
699
553
  @layer theme {
700
554
  :root, :host {
555
+ --font-sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
556
+ Roboto, sans-serif;
701
557
  --color-red-400: oklch(70.4% 0.191 22.216);
702
558
  --color-red-500: oklch(63.7% 0.237 25.331);
703
559
  --color-red-700: oklch(50.5% 0.213 27.518);
704
- --color-amber-300: oklch(87.9% 0.169 91.605);
560
+ --color-amber-50: oklch(98.7% 0.022 95.277);
561
+ --color-amber-100: oklch(96.2% 0.059 95.617);
705
562
  --color-amber-400: oklch(82.8% 0.189 84.429);
706
563
  --color-amber-500: oklch(76.9% 0.188 70.08);
564
+ --color-amber-600: oklch(66.6% 0.179 58.318);
707
565
  --color-amber-700: oklch(55.5% 0.163 48.998);
708
- --color-emerald-300: oklch(84.5% 0.143 164.978);
566
+ --color-amber-800: oklch(47.3% 0.137 46.201);
567
+ --color-emerald-50: oklch(97.9% 0.021 166.113);
568
+ --color-emerald-100: oklch(95% 0.052 163.051);
709
569
  --color-emerald-400: oklch(76.5% 0.177 163.223);
710
570
  --color-emerald-500: oklch(69.6% 0.17 162.48);
571
+ --color-emerald-600: oklch(59.6% 0.145 163.225);
711
572
  --color-emerald-700: oklch(50.8% 0.118 165.612);
712
- --color-cyan-300: oklch(86.5% 0.127 207.078);
573
+ --color-cyan-50: oklch(98.4% 0.019 200.873);
574
+ --color-cyan-100: oklch(95.6% 0.045 203.388);
713
575
  --color-cyan-400: oklch(78.9% 0.154 211.53);
714
576
  --color-cyan-700: oklch(52% 0.105 223.128);
715
- --color-blue-300: oklch(80.9% 0.105 251.813);
577
+ --color-blue-50: oklch(97% 0.014 254.604);
578
+ --color-blue-100: oklch(93.2% 0.032 255.585);
716
579
  --color-blue-400: oklch(70.7% 0.165 254.624);
717
580
  --color-blue-500: oklch(62.3% 0.214 259.815);
718
581
  --color-blue-700: oklch(48.8% 0.243 264.376);
719
- --color-violet-300: oklch(81.1% 0.111 293.571);
582
+ --color-violet-50: oklch(96.9% 0.016 293.756);
583
+ --color-violet-100: oklch(94.3% 0.029 294.588);
720
584
  --color-violet-400: oklch(70.2% 0.183 293.541);
721
585
  --color-violet-700: oklch(49.1% 0.27 292.581);
722
- --color-fuchsia-300: oklch(83.3% 0.145 321.434);
586
+ --color-fuchsia-50: oklch(97.7% 0.017 320.058);
587
+ --color-fuchsia-100: oklch(95.2% 0.037 318.852);
723
588
  --color-fuchsia-400: oklch(74% 0.238 322.16);
724
589
  --color-fuchsia-700: oklch(51.8% 0.253 323.949);
725
- --color-rose-300: oklch(81% 0.117 11.638);
590
+ --color-rose-50: oklch(96.9% 0.015 12.422);
591
+ --color-rose-100: oklch(94.1% 0.03 12.58);
726
592
  --color-rose-400: oklch(71.2% 0.194 13.428);
593
+ --color-rose-600: oklch(58.6% 0.253 17.585);
727
594
  --color-rose-700: oklch(51.4% 0.222 16.935);
728
- --color-slate-300: oklch(86.9% 0.022 252.894);
595
+ --color-slate-50: oklch(98.4% 0.003 247.858);
596
+ --color-slate-100: oklch(96.8% 0.007 247.896);
729
597
  --color-slate-400: oklch(70.4% 0.04 256.788);
730
- --color-slate-700: oklch(37.2% 0.044 257.287);
598
+ --color-slate-500: oklch(55.4% 0.046 257.417);
599
+ --color-slate-600: oklch(44.6% 0.043 257.281);
731
600
  --color-neutral-50: oklch(98.5% 0 0);
732
601
  --color-neutral-100: oklch(97% 0 0);
733
602
  --color-neutral-400: oklch(70.8% 0 0);
@@ -737,6 +606,7 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
737
606
  --color-black: #000;
738
607
  --color-white: #fff;
739
608
  --spacing: 0.25rem;
609
+ --container-sm: 24rem;
740
610
  --container-xl: 36rem;
741
611
  --text-xs: 0.75rem;
742
612
  --text-xs--line-height: calc(1 / 0.75);
@@ -744,20 +614,28 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
744
614
  --text-sm--line-height: calc(1.25 / 0.875);
745
615
  --text-base: 1rem;
746
616
  --text-base--line-height: calc(1.5 / 1);
617
+ --text-xl: 1.25rem;
618
+ --text-xl--line-height: calc(1.75 / 1.25);
747
619
  --font-weight-normal: 400;
748
620
  --font-weight-medium: 500;
749
621
  --font-weight-semibold: 600;
622
+ --font-weight-bold: 700;
623
+ --tracking-tight: -0.025em;
750
624
  --tracking-widest: 0.1em;
751
625
  --leading-relaxed: 1.625;
626
+ --radius-md: calc(var(--radius) * 0.8);
627
+ --radius-lg: var(--radius);
752
628
  --radius-xl: calc(var(--radius) * 1.4);
753
629
  --radius-2xl: calc(var(--radius) * 1.8);
754
630
  --ease-out: cubic-bezier(0, 0, 0.2, 1);
631
+ --animate-spin: spin 1s linear infinite;
755
632
  --blur-sm: 8px;
756
633
  --default-transition-duration: 150ms;
757
634
  --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
758
635
  --default-font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
759
636
  Roboto, sans-serif;
760
637
  --default-mono-font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
638
+ --color-muted: var(--muted);
761
639
  --color-border: var(--border);
762
640
  }
763
641
  }
@@ -913,6 +791,12 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
913
791
  .pointer-events-none {
914
792
  pointer-events: none;
915
793
  }
794
+ .\\!visible {
795
+ visibility: visible !important;
796
+ }
797
+ .collapse {
798
+ visibility: collapse;
799
+ }
916
800
  .invisible {
917
801
  visibility: hidden;
918
802
  }
@@ -948,18 +832,33 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
948
832
  .end {
949
833
  inset-inline-end: var(--spacing);
950
834
  }
835
+ .-top-1 {
836
+ top: calc(var(--spacing) * -1);
837
+ }
838
+ .-right-1 {
839
+ right: calc(var(--spacing) * -1);
840
+ }
841
+ .right-0 {
842
+ right: calc(var(--spacing) * 0);
843
+ }
951
844
  .right-2 {
952
845
  right: calc(var(--spacing) * 2);
953
846
  }
954
- .right-3 {
955
- right: calc(var(--spacing) * 3);
847
+ .bottom-full {
848
+ bottom: 100%;
849
+ }
850
+ .bottom-px {
851
+ bottom: 1px;
956
852
  }
957
- .bottom-12 {
958
- bottom: calc(var(--spacing) * 12);
853
+ .z-1 {
854
+ z-index: 1;
959
855
  }
960
856
  .z-10 {
961
857
  z-index: 10;
962
858
  }
859
+ .z-\\[2147483647\\] {
860
+ z-index: 2147483647;
861
+ }
963
862
  .container {
964
863
  width: 100%;
965
864
  @media (width >= 40rem) {
@@ -996,6 +895,12 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
996
895
  .mt-1 {
997
896
  margin-top: calc(var(--spacing) * 1);
998
897
  }
898
+ .mb-2 {
899
+ margin-bottom: calc(var(--spacing) * 2);
900
+ }
901
+ .mb-6 {
902
+ margin-bottom: calc(var(--spacing) * 6);
903
+ }
999
904
  .ml-auto {
1000
905
  margin-left: auto;
1001
906
  }
@@ -1026,6 +931,14 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1026
931
  .table {
1027
932
  display: table;
1028
933
  }
934
+ .size-2 {
935
+ width: calc(var(--spacing) * 2);
936
+ height: calc(var(--spacing) * 2);
937
+ }
938
+ .size-3 {
939
+ width: calc(var(--spacing) * 3);
940
+ height: calc(var(--spacing) * 3);
941
+ }
1029
942
  .size-3\\.5 {
1030
943
  width: calc(var(--spacing) * 3.5);
1031
944
  height: calc(var(--spacing) * 3.5);
@@ -1092,6 +1005,12 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1092
1005
  .h-px {
1093
1006
  height: 1px;
1094
1007
  }
1008
+ .max-h-32 {
1009
+ max-height: calc(var(--spacing) * 32);
1010
+ }
1011
+ .max-h-full {
1012
+ max-height: 100%;
1013
+ }
1095
1014
  .min-h-0 {
1096
1015
  min-height: calc(var(--spacing) * 0);
1097
1016
  }
@@ -1110,6 +1029,12 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1110
1029
  .w-4 {
1111
1030
  width: calc(var(--spacing) * 4);
1112
1031
  }
1032
+ .w-20 {
1033
+ width: calc(var(--spacing) * 20);
1034
+ }
1035
+ .w-36 {
1036
+ width: calc(var(--spacing) * 36);
1037
+ }
1113
1038
  .w-56 {
1114
1039
  width: calc(var(--spacing) * 56);
1115
1040
  }
@@ -1122,6 +1047,12 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1122
1047
  .w-px {
1123
1048
  width: 1px;
1124
1049
  }
1050
+ .max-w-full {
1051
+ max-width: 100%;
1052
+ }
1053
+ .max-w-sm {
1054
+ max-width: var(--container-sm);
1055
+ }
1125
1056
  .max-w-xl {
1126
1057
  max-width: var(--container-xl);
1127
1058
  }
@@ -1149,9 +1080,41 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1149
1080
  .shrink-0 {
1150
1081
  flex-shrink: 0;
1151
1082
  }
1083
+ .origin-bottom-left {
1084
+ transform-origin: 0 100%;
1085
+ }
1086
+ .origin-bottom-right {
1087
+ transform-origin: 100% 100%;
1088
+ }
1089
+ .-translate-x-0\\.5 {
1090
+ --tw-translate-x: calc(var(--spacing) * -0.5);
1091
+ translate: var(--tw-translate-x) var(--tw-translate-y);
1092
+ }
1093
+ .translate-x-0\\.5 {
1094
+ --tw-translate-x: calc(var(--spacing) * 0.5);
1095
+ translate: var(--tw-translate-x) var(--tw-translate-y);
1096
+ }
1097
+ .scale-84 {
1098
+ --tw-scale-x: 84%;
1099
+ --tw-scale-y: 84%;
1100
+ --tw-scale-z: 84%;
1101
+ scale: var(--tw-scale-x) var(--tw-scale-y);
1102
+ }
1103
+ .-rotate-10 {
1104
+ rotate: calc(10deg * -1);
1105
+ }
1106
+ .rotate-10 {
1107
+ rotate: 10deg;
1108
+ }
1152
1109
  .transform {
1153
1110
  transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);
1154
1111
  }
1112
+ .animate-skeleton {
1113
+ animation: skeleton 2s -1s infinite linear;
1114
+ }
1115
+ .animate-spin {
1116
+ animation: var(--animate-spin);
1117
+ }
1155
1118
  .cursor-default {
1156
1119
  cursor: default;
1157
1120
  }
@@ -1176,9 +1139,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1176
1139
  .flex-row {
1177
1140
  flex-direction: row;
1178
1141
  }
1179
- .flex-wrap {
1180
- flex-wrap: wrap;
1181
- }
1182
1142
  .items-center {
1183
1143
  align-items: center;
1184
1144
  }
@@ -1197,6 +1157,9 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1197
1157
  .gap-0 {
1198
1158
  gap: calc(var(--spacing) * 0);
1199
1159
  }
1160
+ .gap-0\\.5 {
1161
+ gap: calc(var(--spacing) * 0.5);
1162
+ }
1200
1163
  .gap-1 {
1201
1164
  gap: calc(var(--spacing) * 1);
1202
1165
  }
@@ -1212,6 +1175,9 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1212
1175
  .gap-4 {
1213
1176
  gap: calc(var(--spacing) * 4);
1214
1177
  }
1178
+ .gap-6 {
1179
+ gap: calc(var(--spacing) * 6);
1180
+ }
1215
1181
  .self-start {
1216
1182
  align-self: flex-start;
1217
1183
  }
@@ -1232,6 +1198,9 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1232
1198
  .rounded-\\[0\\.25rem\\] {
1233
1199
  border-radius: 0.25rem;
1234
1200
  }
1201
+ .rounded-full {
1202
+ border-radius: calc(infinity * 1px);
1203
+ }
1235
1204
  .rounded-lg {
1236
1205
  border-radius: var(--radius);
1237
1206
  }
@@ -1241,6 +1210,9 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1241
1210
  .rounded-sm {
1242
1211
  border-radius: calc(var(--radius) * 0.6);
1243
1212
  }
1213
+ .rounded-xl {
1214
+ border-radius: calc(var(--radius) * 1.4);
1215
+ }
1244
1216
  .rounded-t-xl {
1245
1217
  border-top-left-radius: calc(var(--radius) * 1.4);
1246
1218
  border-top-right-radius: calc(var(--radius) * 1.4);
@@ -1261,12 +1233,24 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1261
1233
  border-bottom-style: var(--tw-border-style);
1262
1234
  border-bottom-width: 0px;
1263
1235
  }
1236
+ .border-amber-500\\/40 {
1237
+ border-color: color-mix(in srgb, oklch(76.9% 0.188 70.08) 40%, transparent);
1238
+ @supports (color: color-mix(in lab, red, red)) {
1239
+ border-color: color-mix(in oklab, var(--color-amber-500) 40%, transparent);
1240
+ }
1241
+ }
1264
1242
  .border-border {
1265
1243
  border-color: var(--border);
1266
1244
  }
1267
1245
  .border-destructive {
1268
1246
  border-color: var(--destructive);
1269
1247
  }
1248
+ .border-info\\/40 {
1249
+ border-color: var(--info);
1250
+ @supports (color: color-mix(in lab, red, red)) {
1251
+ border-color: color-mix(in oklab, var(--info) 40%, transparent);
1252
+ }
1253
+ }
1270
1254
  .border-input {
1271
1255
  border-color: var(--input);
1272
1256
  }
@@ -1276,10 +1260,13 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1276
1260
  .border-transparent {
1277
1261
  border-color: transparent;
1278
1262
  }
1279
- .bg-amber-400\\/20 {
1280
- background-color: color-mix(in srgb, oklch(82.8% 0.189 84.429) 20%, transparent);
1263
+ .bg-amber-50 {
1264
+ background-color: var(--color-amber-50);
1265
+ }
1266
+ .bg-amber-500\\/15 {
1267
+ background-color: color-mix(in srgb, oklch(76.9% 0.188 70.08) 15%, transparent);
1281
1268
  @supports (color: color-mix(in lab, red, red)) {
1282
- background-color: color-mix(in oklab, var(--color-amber-400) 20%, transparent);
1269
+ background-color: color-mix(in oklab, var(--color-amber-500) 15%, transparent);
1283
1270
  }
1284
1271
  }
1285
1272
  .bg-background {
@@ -1291,20 +1278,23 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1291
1278
  background-color: color-mix(in oklab, var(--color-black) 32%, transparent);
1292
1279
  }
1293
1280
  }
1294
- .bg-blue-400\\/20 {
1295
- background-color: color-mix(in srgb, oklch(70.7% 0.165 254.624) 20%, transparent);
1281
+ .bg-black\\/80 {
1282
+ background-color: color-mix(in srgb, #000 80%, transparent);
1296
1283
  @supports (color: color-mix(in lab, red, red)) {
1297
- background-color: color-mix(in oklab, var(--color-blue-400) 20%, transparent);
1284
+ background-color: color-mix(in oklab, var(--color-black) 80%, transparent);
1298
1285
  }
1299
1286
  }
1287
+ .bg-blue-50 {
1288
+ background-color: var(--color-blue-50);
1289
+ }
1300
1290
  .bg-border {
1301
1291
  background-color: var(--border);
1302
1292
  }
1303
- .bg-cyan-400\\/20 {
1304
- background-color: color-mix(in srgb, oklch(78.9% 0.154 211.53) 20%, transparent);
1305
- @supports (color: color-mix(in lab, red, red)) {
1306
- background-color: color-mix(in oklab, var(--color-cyan-400) 20%, transparent);
1307
- }
1293
+ .bg-card {
1294
+ background-color: var(--card);
1295
+ }
1296
+ .bg-cyan-50 {
1297
+ background-color: var(--color-cyan-50);
1308
1298
  }
1309
1299
  .bg-destructive {
1310
1300
  background-color: var(--destructive);
@@ -1315,17 +1305,17 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1315
1305
  background-color: color-mix(in oklab, var(--destructive) 10%, transparent);
1316
1306
  }
1317
1307
  }
1318
- .bg-emerald-400\\/20 {
1319
- background-color: color-mix(in srgb, oklch(76.5% 0.177 163.223) 20%, transparent);
1320
- @supports (color: color-mix(in lab, red, red)) {
1321
- background-color: color-mix(in oklab, var(--color-emerald-400) 20%, transparent);
1322
- }
1308
+ .bg-emerald-50 {
1309
+ background-color: var(--color-emerald-50);
1323
1310
  }
1324
- .bg-fuchsia-400\\/20 {
1325
- background-color: color-mix(in srgb, oklch(74% 0.238 322.16) 20%, transparent);
1326
- @supports (color: color-mix(in lab, red, red)) {
1327
- background-color: color-mix(in oklab, var(--color-fuchsia-400) 20%, transparent);
1328
- }
1311
+ .bg-emerald-500 {
1312
+ background-color: var(--color-emerald-500);
1313
+ }
1314
+ .bg-fuchsia-50 {
1315
+ background-color: var(--color-fuchsia-50);
1316
+ }
1317
+ .bg-info {
1318
+ background-color: var(--info);
1329
1319
  }
1330
1320
  .bg-info\\/10 {
1331
1321
  background-color: var(--info);
@@ -1333,6 +1323,12 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1333
1323
  background-color: color-mix(in oklab, var(--info) 10%, transparent);
1334
1324
  }
1335
1325
  }
1326
+ .bg-info\\/15 {
1327
+ background-color: var(--info);
1328
+ @supports (color: color-mix(in lab, red, red)) {
1329
+ background-color: color-mix(in oklab, var(--info) 15%, transparent);
1330
+ }
1331
+ }
1336
1332
  .bg-muted {
1337
1333
  background-color: var(--muted);
1338
1334
  }
@@ -1342,20 +1338,14 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1342
1338
  .bg-primary {
1343
1339
  background-color: var(--primary);
1344
1340
  }
1345
- .bg-rose-400\\/20 {
1346
- background-color: color-mix(in srgb, oklch(71.2% 0.194 13.428) 20%, transparent);
1347
- @supports (color: color-mix(in lab, red, red)) {
1348
- background-color: color-mix(in oklab, var(--color-rose-400) 20%, transparent);
1349
- }
1341
+ .bg-rose-50 {
1342
+ background-color: var(--color-rose-50);
1350
1343
  }
1351
1344
  .bg-secondary {
1352
1345
  background-color: var(--secondary);
1353
1346
  }
1354
- .bg-slate-400\\/20 {
1355
- background-color: color-mix(in srgb, oklch(70.4% 0.04 256.788) 20%, transparent);
1356
- @supports (color: color-mix(in lab, red, red)) {
1357
- background-color: color-mix(in oklab, var(--color-slate-400) 20%, transparent);
1358
- }
1347
+ .bg-slate-50 {
1348
+ background-color: var(--color-slate-50);
1359
1349
  }
1360
1350
  .bg-success\\/10 {
1361
1351
  background-color: var(--success);
@@ -1366,11 +1356,8 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1366
1356
  .bg-transparent {
1367
1357
  background-color: transparent;
1368
1358
  }
1369
- .bg-violet-400\\/20 {
1370
- background-color: color-mix(in srgb, oklch(70.2% 0.183 293.541) 20%, transparent);
1371
- @supports (color: color-mix(in lab, red, red)) {
1372
- background-color: color-mix(in oklab, var(--color-violet-400) 20%, transparent);
1373
- }
1359
+ .bg-violet-50 {
1360
+ background-color: var(--color-violet-50);
1374
1361
  }
1375
1362
  .bg-warning\\/10 {
1376
1363
  background-color: var(--warning);
@@ -1387,15 +1374,27 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1387
1374
  .bg-no-repeat {
1388
1375
  background-repeat: no-repeat;
1389
1376
  }
1377
+ .object-cover {
1378
+ object-fit: cover;
1379
+ }
1380
+ .object-top {
1381
+ object-position: top;
1382
+ }
1390
1383
  .p-1 {
1391
1384
  padding: calc(var(--spacing) * 1);
1392
1385
  }
1386
+ .p-1\\.5 {
1387
+ padding: calc(var(--spacing) * 1.5);
1388
+ }
1393
1389
  .p-2 {
1394
1390
  padding: calc(var(--spacing) * 2);
1395
1391
  }
1396
1392
  .p-4 {
1397
1393
  padding: calc(var(--spacing) * 4);
1398
1394
  }
1395
+ .p-6 {
1396
+ padding: calc(var(--spacing) * 6);
1397
+ }
1399
1398
  .px-0 {
1400
1399
  padding-inline: calc(var(--spacing) * 0);
1401
1400
  }
@@ -1420,8 +1419,8 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1420
1419
  .px-4 {
1421
1420
  padding-inline: calc(var(--spacing) * 4);
1422
1421
  }
1423
- .px-5 {
1424
- padding-inline: calc(var(--spacing) * 5);
1422
+ .px-6 {
1423
+ padding-inline: calc(var(--spacing) * 6);
1425
1424
  }
1426
1425
  .py-0 {
1427
1426
  padding-block: calc(var(--spacing) * 0);
@@ -1435,12 +1434,12 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1435
1434
  .py-2 {
1436
1435
  padding-block: calc(var(--spacing) * 2);
1437
1436
  }
1438
- .py-3 {
1439
- padding-block: calc(var(--spacing) * 3);
1440
- }
1441
1437
  .py-4 {
1442
1438
  padding-block: calc(var(--spacing) * 4);
1443
1439
  }
1440
+ .py-12 {
1441
+ padding-block: calc(var(--spacing) * 12);
1442
+ }
1444
1443
  .py-\\[max\\(1rem\\,4vh\\)\\] {
1445
1444
  padding-block: max(1rem, 4vh);
1446
1445
  }
@@ -1450,6 +1449,9 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1450
1449
  .pe-3 {
1451
1450
  padding-inline-end: calc(var(--spacing) * 3);
1452
1451
  }
1452
+ .pt-2 {
1453
+ padding-top: calc(var(--spacing) * 2);
1454
+ }
1453
1455
  .pr-8 {
1454
1456
  padding-right: calc(var(--spacing) * 8);
1455
1457
  }
@@ -1481,6 +1483,10 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1481
1483
  font-size: var(--text-sm);
1482
1484
  line-height: var(--tw-leading, var(--text-sm--line-height));
1483
1485
  }
1486
+ .text-xl {
1487
+ font-size: var(--text-xl);
1488
+ line-height: var(--tw-leading, var(--text-xl--line-height));
1489
+ }
1484
1490
  .text-xs {
1485
1491
  font-size: var(--text-xs);
1486
1492
  line-height: var(--tw-leading, var(--text-xs--line-height));
@@ -1488,10 +1494,27 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1488
1494
  .text-\\[0\\.625rem\\] {
1489
1495
  font-size: 0.625rem;
1490
1496
  }
1497
+ .text-\\[9px\\] {
1498
+ font-size: 9px;
1499
+ }
1500
+ .text-\\[10px\\] {
1501
+ font-size: 10px;
1502
+ }
1503
+ .text-\\[11px\\] {
1504
+ font-size: 11px;
1505
+ }
1506
+ .leading-none {
1507
+ --tw-leading: 1;
1508
+ line-height: 1;
1509
+ }
1491
1510
  .leading-relaxed {
1492
1511
  --tw-leading: var(--leading-relaxed);
1493
1512
  line-height: var(--leading-relaxed);
1494
1513
  }
1514
+ .font-bold {
1515
+ --tw-font-weight: var(--font-weight-bold);
1516
+ font-weight: var(--font-weight-bold);
1517
+ }
1495
1518
  .font-medium {
1496
1519
  --tw-font-weight: var(--font-weight-medium);
1497
1520
  font-weight: var(--font-weight-medium);
@@ -1504,10 +1527,17 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1504
1527
  --tw-font-weight: var(--font-weight-semibold);
1505
1528
  font-weight: var(--font-weight-semibold);
1506
1529
  }
1530
+ .tracking-tight {
1531
+ --tw-tracking: var(--tracking-tight);
1532
+ letter-spacing: var(--tracking-tight);
1533
+ }
1507
1534
  .tracking-widest {
1508
1535
  --tw-tracking: var(--tracking-widest);
1509
1536
  letter-spacing: var(--tracking-widest);
1510
1537
  }
1538
+ .text-balance {
1539
+ text-wrap: balance;
1540
+ }
1511
1541
  .break-words {
1512
1542
  overflow-wrap: break-word;
1513
1543
  }
@@ -1517,15 +1547,24 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1517
1547
  .whitespace-nowrap {
1518
1548
  white-space: nowrap;
1519
1549
  }
1550
+ .text-amber-600 {
1551
+ color: var(--color-amber-600);
1552
+ }
1520
1553
  .text-amber-700 {
1521
1554
  color: var(--color-amber-700);
1522
1555
  }
1556
+ .text-amber-800 {
1557
+ color: var(--color-amber-800);
1558
+ }
1523
1559
  .text-blue-700 {
1524
1560
  color: var(--color-blue-700);
1525
1561
  }
1526
1562
  .text-cyan-700 {
1527
1563
  color: var(--color-cyan-700);
1528
1564
  }
1565
+ .text-destructive {
1566
+ color: var(--destructive);
1567
+ }
1529
1568
  .text-destructive-foreground {
1530
1569
  color: var(--destructive-foreground);
1531
1570
  }
@@ -1562,8 +1601,8 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1562
1601
  .text-secondary-foreground {
1563
1602
  color: var(--secondary-foreground);
1564
1603
  }
1565
- .text-slate-700 {
1566
- color: var(--color-slate-700);
1604
+ .text-slate-600 {
1605
+ color: var(--color-slate-600);
1567
1606
  }
1568
1607
  .text-success-foreground {
1569
1608
  color: var(--success-foreground);
@@ -1580,6 +1619,14 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1580
1619
  .lowercase {
1581
1620
  text-transform: lowercase;
1582
1621
  }
1622
+ .ordinal {
1623
+ --tw-ordinal: ordinal;
1624
+ font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);
1625
+ }
1626
+ .tabular-nums {
1627
+ --tw-numeric-spacing: tabular-nums;
1628
+ font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);
1629
+ }
1583
1630
  .line-through {
1584
1631
  text-decoration-line: line-through;
1585
1632
  }
@@ -1595,6 +1642,9 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1595
1642
  .accent-primary {
1596
1643
  accent-color: var(--primary);
1597
1644
  }
1645
+ .opacity-50 {
1646
+ opacity: 50%;
1647
+ }
1598
1648
  .opacity-80 {
1599
1649
  opacity: 80%;
1600
1650
  }
@@ -1603,6 +1653,11 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1603
1653
  --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%));
1604
1654
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1605
1655
  }
1656
+ .shadow-sm\\/5 {
1657
+ --tw-shadow-alpha: 5%;
1658
+ --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%));
1659
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1660
+ }
1606
1661
  .shadow-xs\\/5 {
1607
1662
  --tw-shadow-alpha: 5%;
1608
1663
  --tw-shadow: 0 1px 2px 0 var(--tw-shadow-color, oklab(from rgb(0 0 0 / 0.05) l a b / 5%));
@@ -1628,6 +1683,58 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1628
1683
  --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
1629
1684
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1630
1685
  }
1686
+ .inset-ring {
1687
+ --tw-inset-ring-shadow: inset 0 0 0 1px var(--tw-inset-ring-color, currentcolor);
1688
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1689
+ }
1690
+ .inset-ring-amber-600\\/20 {
1691
+ --tw-inset-ring-color: color-mix(in srgb, oklch(66.6% 0.179 58.318) 20%, transparent);
1692
+ @supports (color: color-mix(in lab, red, red)) {
1693
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-amber-600) 20%, transparent);
1694
+ }
1695
+ }
1696
+ .inset-ring-blue-700\\/10 {
1697
+ --tw-inset-ring-color: color-mix(in srgb, oklch(48.8% 0.243 264.376) 10%, transparent);
1698
+ @supports (color: color-mix(in lab, red, red)) {
1699
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-blue-700) 10%, transparent);
1700
+ }
1701
+ }
1702
+ .inset-ring-cyan-700\\/10 {
1703
+ --tw-inset-ring-color: color-mix(in srgb, oklch(52% 0.105 223.128) 10%, transparent);
1704
+ @supports (color: color-mix(in lab, red, red)) {
1705
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-cyan-700) 10%, transparent);
1706
+ }
1707
+ }
1708
+ .inset-ring-emerald-600\\/20 {
1709
+ --tw-inset-ring-color: color-mix(in srgb, oklch(59.6% 0.145 163.225) 20%, transparent);
1710
+ @supports (color: color-mix(in lab, red, red)) {
1711
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-emerald-600) 20%, transparent);
1712
+ }
1713
+ }
1714
+ .inset-ring-fuchsia-700\\/10 {
1715
+ --tw-inset-ring-color: color-mix(in srgb, oklch(51.8% 0.253 323.949) 10%, transparent);
1716
+ @supports (color: color-mix(in lab, red, red)) {
1717
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-fuchsia-700) 10%, transparent);
1718
+ }
1719
+ }
1720
+ .inset-ring-rose-600\\/10 {
1721
+ --tw-inset-ring-color: color-mix(in srgb, oklch(58.6% 0.253 17.585) 10%, transparent);
1722
+ @supports (color: color-mix(in lab, red, red)) {
1723
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-rose-600) 10%, transparent);
1724
+ }
1725
+ }
1726
+ .inset-ring-slate-500\\/10 {
1727
+ --tw-inset-ring-color: color-mix(in srgb, oklch(55.4% 0.046 257.417) 10%, transparent);
1728
+ @supports (color: color-mix(in lab, red, red)) {
1729
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-slate-500) 10%, transparent);
1730
+ }
1731
+ }
1732
+ .inset-ring-violet-700\\/10 {
1733
+ --tw-inset-ring-color: color-mix(in srgb, oklch(49.1% 0.27 292.581) 10%, transparent);
1734
+ @supports (color: color-mix(in lab, red, red)) {
1735
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-violet-700) 10%, transparent);
1736
+ }
1737
+ }
1631
1738
  .outline {
1632
1739
  outline-style: var(--tw-outline-style);
1633
1740
  outline-width: 1px;
@@ -1671,76 +1778,61 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1671
1778
  -webkit-user-select: none;
1672
1779
  user-select: none;
1673
1780
  }
1781
+ .\\[--skeleton-highlight\\:--alpha\\(var\\(--color-white\\)\\/64\\%\\)\\] {
1782
+ --skeleton-highlight: color-mix(in srgb, #fff 64%, transparent);
1783
+ @supports (color: color-mix(in lab, red, red)) {
1784
+ --skeleton-highlight: color-mix(in oklab, var(--color-white) 64%, transparent);
1785
+ }
1786
+ }
1787
+ .\\[background\\:linear-gradient\\(120deg\\,transparent_40\\%\\,var\\(--skeleton-highlight\\)\\,transparent_60\\%\\)_var\\(--color-muted\\)_0_0\\/200\\%_100\\%_fixed\\] {
1788
+ background: linear-gradient(120deg,transparent 40%,var(--skeleton-highlight),transparent 60%) var(--color-muted) 0 0/200% 100% fixed;
1789
+ }
1674
1790
  .\\[clip-path\\:inset\\(0_1px\\)\\] {
1675
1791
  clip-path: inset(0 1px);
1676
1792
  }
1677
1793
  .not-dark\\:bg-clip-padding {
1678
- &:not(*:is(.dark *)) {
1794
+ &:not(*:is(.dark *, :host(.dark) *)) {
1679
1795
  background-clip: padding-box;
1680
1796
  }
1681
1797
  }
1682
- .group-data-hover\\:bg-amber-400\\/30 {
1798
+ .group-data-hover\\:bg-amber-100 {
1683
1799
  &:is(:where(.group)[data-hover] *) {
1684
- background-color: color-mix(in srgb, oklch(82.8% 0.189 84.429) 30%, transparent);
1685
- @supports (color: color-mix(in lab, red, red)) {
1686
- background-color: color-mix(in oklab, var(--color-amber-400) 30%, transparent);
1687
- }
1800
+ background-color: var(--color-amber-100);
1688
1801
  }
1689
1802
  }
1690
- .group-data-hover\\:bg-blue-400\\/30 {
1803
+ .group-data-hover\\:bg-blue-100 {
1691
1804
  &:is(:where(.group)[data-hover] *) {
1692
- background-color: color-mix(in srgb, oklch(70.7% 0.165 254.624) 30%, transparent);
1693
- @supports (color: color-mix(in lab, red, red)) {
1694
- background-color: color-mix(in oklab, var(--color-blue-400) 30%, transparent);
1695
- }
1805
+ background-color: var(--color-blue-100);
1696
1806
  }
1697
1807
  }
1698
- .group-data-hover\\:bg-cyan-400\\/30 {
1808
+ .group-data-hover\\:bg-cyan-100 {
1699
1809
  &:is(:where(.group)[data-hover] *) {
1700
- background-color: color-mix(in srgb, oklch(78.9% 0.154 211.53) 30%, transparent);
1701
- @supports (color: color-mix(in lab, red, red)) {
1702
- background-color: color-mix(in oklab, var(--color-cyan-400) 30%, transparent);
1703
- }
1810
+ background-color: var(--color-cyan-100);
1704
1811
  }
1705
1812
  }
1706
- .group-data-hover\\:bg-emerald-400\\/30 {
1813
+ .group-data-hover\\:bg-emerald-100 {
1707
1814
  &:is(:where(.group)[data-hover] *) {
1708
- background-color: color-mix(in srgb, oklch(76.5% 0.177 163.223) 30%, transparent);
1709
- @supports (color: color-mix(in lab, red, red)) {
1710
- background-color: color-mix(in oklab, var(--color-emerald-400) 30%, transparent);
1711
- }
1815
+ background-color: var(--color-emerald-100);
1712
1816
  }
1713
1817
  }
1714
- .group-data-hover\\:bg-fuchsia-400\\/30 {
1818
+ .group-data-hover\\:bg-fuchsia-100 {
1715
1819
  &:is(:where(.group)[data-hover] *) {
1716
- background-color: color-mix(in srgb, oklch(74% 0.238 322.16) 30%, transparent);
1717
- @supports (color: color-mix(in lab, red, red)) {
1718
- background-color: color-mix(in oklab, var(--color-fuchsia-400) 30%, transparent);
1719
- }
1820
+ background-color: var(--color-fuchsia-100);
1720
1821
  }
1721
1822
  }
1722
- .group-data-hover\\:bg-rose-400\\/30 {
1823
+ .group-data-hover\\:bg-rose-100 {
1723
1824
  &:is(:where(.group)[data-hover] *) {
1724
- background-color: color-mix(in srgb, oklch(71.2% 0.194 13.428) 30%, transparent);
1725
- @supports (color: color-mix(in lab, red, red)) {
1726
- background-color: color-mix(in oklab, var(--color-rose-400) 30%, transparent);
1727
- }
1825
+ background-color: var(--color-rose-100);
1728
1826
  }
1729
1827
  }
1730
- .group-data-hover\\:bg-slate-400\\/30 {
1828
+ .group-data-hover\\:bg-slate-100 {
1731
1829
  &:is(:where(.group)[data-hover] *) {
1732
- background-color: color-mix(in srgb, oklch(70.4% 0.04 256.788) 30%, transparent);
1733
- @supports (color: color-mix(in lab, red, red)) {
1734
- background-color: color-mix(in oklab, var(--color-slate-400) 30%, transparent);
1735
- }
1830
+ background-color: var(--color-slate-100);
1736
1831
  }
1737
1832
  }
1738
- .group-data-hover\\:bg-violet-400\\/30 {
1833
+ .group-data-hover\\:bg-violet-100 {
1739
1834
  &:is(:where(.group)[data-hover] *) {
1740
- background-color: color-mix(in srgb, oklch(70.2% 0.183 293.541) 30%, transparent);
1741
- @supports (color: color-mix(in lab, red, red)) {
1742
- background-color: color-mix(in oklab, var(--color-violet-400) 30%, transparent);
1743
- }
1835
+ background-color: var(--color-violet-100);
1744
1836
  }
1745
1837
  }
1746
1838
  .placeholder\\:text-muted-foreground {
@@ -1772,6 +1864,24 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1772
1864
  border-radius: calc(var(--radius-2xl) - 1px);
1773
1865
  }
1774
1866
  }
1867
+ .before\\:rounded-\\[calc\\(var\\(--radius-lg\\)-1px\\)\\] {
1868
+ &::before {
1869
+ content: var(--tw-content);
1870
+ border-radius: calc(var(--radius-lg) - 1px);
1871
+ }
1872
+ }
1873
+ .before\\:rounded-\\[calc\\(var\\(--radius-md\\)-1px\\)\\] {
1874
+ &::before {
1875
+ content: var(--tw-content);
1876
+ border-radius: calc(var(--radius-md) - 1px);
1877
+ }
1878
+ }
1879
+ .before\\:rounded-\\[calc\\(var\\(--radius-xl\\)-1px\\)\\] {
1880
+ &::before {
1881
+ content: var(--tw-content);
1882
+ border-radius: calc(var(--radius-xl) - 1px);
1883
+ }
1884
+ }
1775
1885
  .before\\:rounded-t-\\[calc\\(var\\(--radius-xl\\)-1px\\)\\] {
1776
1886
  &::before {
1777
1887
  content: var(--tw-content);
@@ -1803,16 +1913,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1803
1913
  border-color: var(--ring);
1804
1914
  }
1805
1915
  }
1806
- .focus-within\\:bg-accent {
1807
- &:focus-within {
1808
- background-color: var(--accent);
1809
- }
1810
- }
1811
- .focus-within\\:text-accent-foreground {
1812
- &:focus-within {
1813
- color: var(--accent-foreground);
1814
- }
1815
- }
1816
1916
  .focus-within\\:ring-\\[3px\\] {
1817
1917
  &:focus-within {
1818
1918
  --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
@@ -1844,6 +1944,16 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1844
1944
  }
1845
1945
  }
1846
1946
  }
1947
+ .hover\\:bg-amber-500\\/20 {
1948
+ &:hover {
1949
+ @media (hover: hover) {
1950
+ background-color: color-mix(in srgb, oklch(76.9% 0.188 70.08) 20%, transparent);
1951
+ @supports (color: color-mix(in lab, red, red)) {
1952
+ background-color: color-mix(in oklab, var(--color-amber-500) 20%, transparent);
1953
+ }
1954
+ }
1955
+ }
1956
+ }
1847
1957
  .hover\\:bg-destructive\\/5 {
1848
1958
  &:hover {
1849
1959
  @media (hover: hover) {
@@ -1864,6 +1974,16 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1864
1974
  }
1865
1975
  }
1866
1976
  }
1977
+ .hover\\:bg-info\\/20 {
1978
+ &:hover {
1979
+ @media (hover: hover) {
1980
+ background-color: var(--info);
1981
+ @supports (color: color-mix(in lab, red, red)) {
1982
+ background-color: color-mix(in oklab, var(--info) 20%, transparent);
1983
+ }
1984
+ }
1985
+ }
1986
+ }
1867
1987
  .hover\\:bg-primary\\/90 {
1868
1988
  &:hover {
1869
1989
  @media (hover: hover) {
@@ -1898,16 +2018,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1898
2018
  }
1899
2019
  }
1900
2020
  }
1901
- .focus\\:bg-accent {
1902
- &:focus {
1903
- background-color: var(--accent);
1904
- }
1905
- }
1906
- .focus\\:text-accent-foreground {
1907
- &:focus {
1908
- color: var(--accent-foreground);
1909
- }
1910
- }
1911
2021
  .focus\\:outline-none {
1912
2022
  &:focus {
1913
2023
  --tw-outline-style: none;
@@ -1965,6 +2075,11 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1965
2075
  cursor: not-allowed;
1966
2076
  }
1967
2077
  }
2078
+ .disabled\\:opacity-50 {
2079
+ &:disabled {
2080
+ opacity: 50%;
2081
+ }
2082
+ }
1968
2083
  .disabled\\:opacity-60 {
1969
2084
  &:disabled {
1970
2085
  opacity: 60%;
@@ -1998,11 +2113,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1998
2113
  pointer-events: none;
1999
2114
  }
2000
2115
  }
2001
- .data-\\[disabled\\]\\:opacity-60 {
2002
- &[data-disabled] {
2003
- opacity: 60%;
2004
- }
2005
- }
2006
2116
  .data-\\[disabled\\]\\:opacity-64 {
2007
2117
  &[data-disabled] {
2008
2118
  opacity: 64%;
@@ -2041,7 +2151,7 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2041
2151
  }
2042
2152
  }
2043
2153
  .dark\\:bg-amber-400\\/10 {
2044
- &:is(.dark *) {
2154
+ &:is(.dark *, :host(.dark) *) {
2045
2155
  background-color: color-mix(in srgb, oklch(82.8% 0.189 84.429) 10%, transparent);
2046
2156
  @supports (color: color-mix(in lab, red, red)) {
2047
2157
  background-color: color-mix(in oklab, var(--color-amber-400) 10%, transparent);
@@ -2049,7 +2159,7 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2049
2159
  }
2050
2160
  }
2051
2161
  .dark\\:bg-blue-400\\/10 {
2052
- &:is(.dark *) {
2162
+ &:is(.dark *, :host(.dark) *) {
2053
2163
  background-color: color-mix(in srgb, oklch(70.7% 0.165 254.624) 10%, transparent);
2054
2164
  @supports (color: color-mix(in lab, red, red)) {
2055
2165
  background-color: color-mix(in oklab, var(--color-blue-400) 10%, transparent);
@@ -2057,7 +2167,7 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2057
2167
  }
2058
2168
  }
2059
2169
  .dark\\:bg-cyan-400\\/10 {
2060
- &:is(.dark *) {
2170
+ &:is(.dark *, :host(.dark) *) {
2061
2171
  background-color: color-mix(in srgb, oklch(78.9% 0.154 211.53) 10%, transparent);
2062
2172
  @supports (color: color-mix(in lab, red, red)) {
2063
2173
  background-color: color-mix(in oklab, var(--color-cyan-400) 10%, transparent);
@@ -2065,7 +2175,7 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2065
2175
  }
2066
2176
  }
2067
2177
  .dark\\:bg-destructive\\/20 {
2068
- &:is(.dark *) {
2178
+ &:is(.dark *, :host(.dark) *) {
2069
2179
  background-color: var(--destructive);
2070
2180
  @supports (color: color-mix(in lab, red, red)) {
2071
2181
  background-color: color-mix(in oklab, var(--destructive) 20%, transparent);
@@ -2073,7 +2183,7 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2073
2183
  }
2074
2184
  }
2075
2185
  .dark\\:bg-emerald-400\\/10 {
2076
- &:is(.dark *) {
2186
+ &:is(.dark *, :host(.dark) *) {
2077
2187
  background-color: color-mix(in srgb, oklch(76.5% 0.177 163.223) 10%, transparent);
2078
2188
  @supports (color: color-mix(in lab, red, red)) {
2079
2189
  background-color: color-mix(in oklab, var(--color-emerald-400) 10%, transparent);
@@ -2081,7 +2191,7 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2081
2191
  }
2082
2192
  }
2083
2193
  .dark\\:bg-fuchsia-400\\/10 {
2084
- &:is(.dark *) {
2194
+ &:is(.dark *, :host(.dark) *) {
2085
2195
  background-color: color-mix(in srgb, oklch(74% 0.238 322.16) 10%, transparent);
2086
2196
  @supports (color: color-mix(in lab, red, red)) {
2087
2197
  background-color: color-mix(in oklab, var(--color-fuchsia-400) 10%, transparent);
@@ -2089,7 +2199,7 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2089
2199
  }
2090
2200
  }
2091
2201
  .dark\\:bg-info\\/20 {
2092
- &:is(.dark *) {
2202
+ &:is(.dark *, :host(.dark) *) {
2093
2203
  background-color: var(--info);
2094
2204
  @supports (color: color-mix(in lab, red, red)) {
2095
2205
  background-color: color-mix(in oklab, var(--info) 20%, transparent);
@@ -2097,7 +2207,7 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2097
2207
  }
2098
2208
  }
2099
2209
  .dark\\:bg-input\\/30 {
2100
- &:is(.dark *) {
2210
+ &:is(.dark *, :host(.dark) *) {
2101
2211
  background-color: var(--input);
2102
2212
  @supports (color: color-mix(in lab, red, red)) {
2103
2213
  background-color: color-mix(in oklab, var(--input) 30%, transparent);
@@ -2105,7 +2215,7 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2105
2215
  }
2106
2216
  }
2107
2217
  .dark\\:bg-rose-400\\/10 {
2108
- &:is(.dark *) {
2218
+ &:is(.dark *, :host(.dark) *) {
2109
2219
  background-color: color-mix(in srgb, oklch(71.2% 0.194 13.428) 10%, transparent);
2110
2220
  @supports (color: color-mix(in lab, red, red)) {
2111
2221
  background-color: color-mix(in oklab, var(--color-rose-400) 10%, transparent);
@@ -2113,7 +2223,7 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2113
2223
  }
2114
2224
  }
2115
2225
  .dark\\:bg-slate-400\\/10 {
2116
- &:is(.dark *) {
2226
+ &:is(.dark *, :host(.dark) *) {
2117
2227
  background-color: color-mix(in srgb, oklch(70.4% 0.04 256.788) 10%, transparent);
2118
2228
  @supports (color: color-mix(in lab, red, red)) {
2119
2229
  background-color: color-mix(in oklab, var(--color-slate-400) 10%, transparent);
@@ -2121,7 +2231,7 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2121
2231
  }
2122
2232
  }
2123
2233
  .dark\\:bg-success\\/20 {
2124
- &:is(.dark *) {
2234
+ &:is(.dark *, :host(.dark) *) {
2125
2235
  background-color: var(--success);
2126
2236
  @supports (color: color-mix(in lab, red, red)) {
2127
2237
  background-color: color-mix(in oklab, var(--success) 20%, transparent);
@@ -2129,7 +2239,7 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2129
2239
  }
2130
2240
  }
2131
2241
  .dark\\:bg-violet-400\\/10 {
2132
- &:is(.dark *) {
2242
+ &:is(.dark *, :host(.dark) *) {
2133
2243
  background-color: color-mix(in srgb, oklch(70.2% 0.183 293.541) 10%, transparent);
2134
2244
  @supports (color: color-mix(in lab, red, red)) {
2135
2245
  background-color: color-mix(in oklab, var(--color-violet-400) 10%, transparent);
@@ -2137,135 +2247,212 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2137
2247
  }
2138
2248
  }
2139
2249
  .dark\\:bg-warning\\/20 {
2140
- &:is(.dark *) {
2250
+ &:is(.dark *, :host(.dark) *) {
2141
2251
  background-color: var(--warning);
2142
2252
  @supports (color: color-mix(in lab, red, red)) {
2143
2253
  background-color: color-mix(in oklab, var(--warning) 20%, transparent);
2144
2254
  }
2145
2255
  }
2146
2256
  }
2147
- .dark\\:text-amber-300 {
2148
- &:is(.dark *) {
2149
- color: var(--color-amber-300);
2257
+ .dark\\:text-amber-400 {
2258
+ &:is(.dark *, :host(.dark) *) {
2259
+ color: var(--color-amber-400);
2150
2260
  }
2151
2261
  }
2152
- .dark\\:text-blue-300 {
2153
- &:is(.dark *) {
2154
- color: var(--color-blue-300);
2262
+ .dark\\:text-amber-500 {
2263
+ &:is(.dark *, :host(.dark) *) {
2264
+ color: var(--color-amber-500);
2155
2265
  }
2156
2266
  }
2157
- .dark\\:text-cyan-300 {
2158
- &:is(.dark *) {
2159
- color: var(--color-cyan-300);
2267
+ .dark\\:text-blue-400 {
2268
+ &:is(.dark *, :host(.dark) *) {
2269
+ color: var(--color-blue-400);
2160
2270
  }
2161
2271
  }
2162
- .dark\\:text-emerald-300 {
2163
- &:is(.dark *) {
2164
- color: var(--color-emerald-300);
2272
+ .dark\\:text-cyan-400 {
2273
+ &:is(.dark *, :host(.dark) *) {
2274
+ color: var(--color-cyan-400);
2165
2275
  }
2166
2276
  }
2167
- .dark\\:text-fuchsia-300 {
2168
- &:is(.dark *) {
2169
- color: var(--color-fuchsia-300);
2277
+ .dark\\:text-emerald-400 {
2278
+ &:is(.dark *, :host(.dark) *) {
2279
+ color: var(--color-emerald-400);
2280
+ }
2281
+ }
2282
+ .dark\\:text-fuchsia-400 {
2283
+ &:is(.dark *, :host(.dark) *) {
2284
+ color: var(--color-fuchsia-400);
2285
+ }
2286
+ }
2287
+ .dark\\:text-rose-400 {
2288
+ &:is(.dark *, :host(.dark) *) {
2289
+ color: var(--color-rose-400);
2290
+ }
2291
+ }
2292
+ .dark\\:text-slate-400 {
2293
+ &:is(.dark *, :host(.dark) *) {
2294
+ color: var(--color-slate-400);
2295
+ }
2296
+ }
2297
+ .dark\\:text-violet-400 {
2298
+ &:is(.dark *, :host(.dark) *) {
2299
+ color: var(--color-violet-400);
2300
+ }
2301
+ }
2302
+ .dark\\:inset-ring-amber-400\\/20 {
2303
+ &:is(.dark *, :host(.dark) *) {
2304
+ --tw-inset-ring-color: color-mix(in srgb, oklch(82.8% 0.189 84.429) 20%, transparent);
2305
+ @supports (color: color-mix(in lab, red, red)) {
2306
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-amber-400) 20%, transparent);
2307
+ }
2308
+ }
2309
+ }
2310
+ .dark\\:inset-ring-blue-400\\/30 {
2311
+ &:is(.dark *, :host(.dark) *) {
2312
+ --tw-inset-ring-color: color-mix(in srgb, oklch(70.7% 0.165 254.624) 30%, transparent);
2313
+ @supports (color: color-mix(in lab, red, red)) {
2314
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-blue-400) 30%, transparent);
2315
+ }
2316
+ }
2317
+ }
2318
+ .dark\\:inset-ring-cyan-400\\/30 {
2319
+ &:is(.dark *, :host(.dark) *) {
2320
+ --tw-inset-ring-color: color-mix(in srgb, oklch(78.9% 0.154 211.53) 30%, transparent);
2321
+ @supports (color: color-mix(in lab, red, red)) {
2322
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-cyan-400) 30%, transparent);
2323
+ }
2324
+ }
2325
+ }
2326
+ .dark\\:inset-ring-emerald-500\\/20 {
2327
+ &:is(.dark *, :host(.dark) *) {
2328
+ --tw-inset-ring-color: color-mix(in srgb, oklch(69.6% 0.17 162.48) 20%, transparent);
2329
+ @supports (color: color-mix(in lab, red, red)) {
2330
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-emerald-500) 20%, transparent);
2331
+ }
2332
+ }
2333
+ }
2334
+ .dark\\:inset-ring-fuchsia-400\\/20 {
2335
+ &:is(.dark *, :host(.dark) *) {
2336
+ --tw-inset-ring-color: color-mix(in srgb, oklch(74% 0.238 322.16) 20%, transparent);
2337
+ @supports (color: color-mix(in lab, red, red)) {
2338
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-fuchsia-400) 20%, transparent);
2339
+ }
2340
+ }
2341
+ }
2342
+ .dark\\:inset-ring-rose-400\\/20 {
2343
+ &:is(.dark *, :host(.dark) *) {
2344
+ --tw-inset-ring-color: color-mix(in srgb, oklch(71.2% 0.194 13.428) 20%, transparent);
2345
+ @supports (color: color-mix(in lab, red, red)) {
2346
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-rose-400) 20%, transparent);
2347
+ }
2170
2348
  }
2171
2349
  }
2172
- .dark\\:text-rose-300 {
2173
- &:is(.dark *) {
2174
- color: var(--color-rose-300);
2350
+ .dark\\:inset-ring-slate-400\\/20 {
2351
+ &:is(.dark *, :host(.dark) *) {
2352
+ --tw-inset-ring-color: color-mix(in srgb, oklch(70.4% 0.04 256.788) 20%, transparent);
2353
+ @supports (color: color-mix(in lab, red, red)) {
2354
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-slate-400) 20%, transparent);
2355
+ }
2175
2356
  }
2176
2357
  }
2177
- .dark\\:text-slate-300 {
2178
- &:is(.dark *) {
2179
- color: var(--color-slate-300);
2358
+ .dark\\:inset-ring-violet-400\\/30 {
2359
+ &:is(.dark *, :host(.dark) *) {
2360
+ --tw-inset-ring-color: color-mix(in srgb, oklch(70.2% 0.183 293.541) 30%, transparent);
2361
+ @supports (color: color-mix(in lab, red, red)) {
2362
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-violet-400) 30%, transparent);
2363
+ }
2180
2364
  }
2181
2365
  }
2182
- .dark\\:text-violet-300 {
2183
- &:is(.dark *) {
2184
- color: var(--color-violet-300);
2366
+ .dark\\:\\[--skeleton-highlight\\:--alpha\\(var\\(--color-white\\)\\/4\\%\\)\\] {
2367
+ &:is(.dark *, :host(.dark) *) {
2368
+ --skeleton-highlight: color-mix(in srgb, #fff 4%, transparent);
2369
+ @supports (color: color-mix(in lab, red, red)) {
2370
+ --skeleton-highlight: color-mix(in oklab, var(--color-white) 4%, transparent);
2371
+ }
2185
2372
  }
2186
2373
  }
2187
- .dark\\:group-data-hover\\:bg-amber-400\\/15 {
2188
- &:is(.dark *) {
2374
+ .dark\\:group-data-hover\\:bg-amber-400\\/20 {
2375
+ &:is(.dark *, :host(.dark) *) {
2189
2376
  &:is(:where(.group)[data-hover] *) {
2190
- background-color: color-mix(in srgb, oklch(82.8% 0.189 84.429) 15%, transparent);
2377
+ background-color: color-mix(in srgb, oklch(82.8% 0.189 84.429) 20%, transparent);
2191
2378
  @supports (color: color-mix(in lab, red, red)) {
2192
- background-color: color-mix(in oklab, var(--color-amber-400) 15%, transparent);
2379
+ background-color: color-mix(in oklab, var(--color-amber-400) 20%, transparent);
2193
2380
  }
2194
2381
  }
2195
2382
  }
2196
2383
  }
2197
- .dark\\:group-data-hover\\:bg-blue-400\\/15 {
2198
- &:is(.dark *) {
2384
+ .dark\\:group-data-hover\\:bg-blue-400\\/20 {
2385
+ &:is(.dark *, :host(.dark) *) {
2199
2386
  &:is(:where(.group)[data-hover] *) {
2200
- background-color: color-mix(in srgb, oklch(70.7% 0.165 254.624) 15%, transparent);
2387
+ background-color: color-mix(in srgb, oklch(70.7% 0.165 254.624) 20%, transparent);
2201
2388
  @supports (color: color-mix(in lab, red, red)) {
2202
- background-color: color-mix(in oklab, var(--color-blue-400) 15%, transparent);
2389
+ background-color: color-mix(in oklab, var(--color-blue-400) 20%, transparent);
2203
2390
  }
2204
2391
  }
2205
2392
  }
2206
2393
  }
2207
- .dark\\:group-data-hover\\:bg-cyan-400\\/15 {
2208
- &:is(.dark *) {
2394
+ .dark\\:group-data-hover\\:bg-cyan-400\\/20 {
2395
+ &:is(.dark *, :host(.dark) *) {
2209
2396
  &:is(:where(.group)[data-hover] *) {
2210
- background-color: color-mix(in srgb, oklch(78.9% 0.154 211.53) 15%, transparent);
2397
+ background-color: color-mix(in srgb, oklch(78.9% 0.154 211.53) 20%, transparent);
2211
2398
  @supports (color: color-mix(in lab, red, red)) {
2212
- background-color: color-mix(in oklab, var(--color-cyan-400) 15%, transparent);
2399
+ background-color: color-mix(in oklab, var(--color-cyan-400) 20%, transparent);
2213
2400
  }
2214
2401
  }
2215
2402
  }
2216
2403
  }
2217
- .dark\\:group-data-hover\\:bg-emerald-400\\/15 {
2218
- &:is(.dark *) {
2404
+ .dark\\:group-data-hover\\:bg-emerald-400\\/20 {
2405
+ &:is(.dark *, :host(.dark) *) {
2219
2406
  &:is(:where(.group)[data-hover] *) {
2220
- background-color: color-mix(in srgb, oklch(76.5% 0.177 163.223) 15%, transparent);
2407
+ background-color: color-mix(in srgb, oklch(76.5% 0.177 163.223) 20%, transparent);
2221
2408
  @supports (color: color-mix(in lab, red, red)) {
2222
- background-color: color-mix(in oklab, var(--color-emerald-400) 15%, transparent);
2409
+ background-color: color-mix(in oklab, var(--color-emerald-400) 20%, transparent);
2223
2410
  }
2224
2411
  }
2225
2412
  }
2226
2413
  }
2227
- .dark\\:group-data-hover\\:bg-fuchsia-400\\/15 {
2228
- &:is(.dark *) {
2414
+ .dark\\:group-data-hover\\:bg-fuchsia-400\\/20 {
2415
+ &:is(.dark *, :host(.dark) *) {
2229
2416
  &:is(:where(.group)[data-hover] *) {
2230
- background-color: color-mix(in srgb, oklch(74% 0.238 322.16) 15%, transparent);
2417
+ background-color: color-mix(in srgb, oklch(74% 0.238 322.16) 20%, transparent);
2231
2418
  @supports (color: color-mix(in lab, red, red)) {
2232
- background-color: color-mix(in oklab, var(--color-fuchsia-400) 15%, transparent);
2419
+ background-color: color-mix(in oklab, var(--color-fuchsia-400) 20%, transparent);
2233
2420
  }
2234
2421
  }
2235
2422
  }
2236
2423
  }
2237
- .dark\\:group-data-hover\\:bg-rose-400\\/15 {
2238
- &:is(.dark *) {
2424
+ .dark\\:group-data-hover\\:bg-rose-400\\/20 {
2425
+ &:is(.dark *, :host(.dark) *) {
2239
2426
  &:is(:where(.group)[data-hover] *) {
2240
- background-color: color-mix(in srgb, oklch(71.2% 0.194 13.428) 15%, transparent);
2427
+ background-color: color-mix(in srgb, oklch(71.2% 0.194 13.428) 20%, transparent);
2241
2428
  @supports (color: color-mix(in lab, red, red)) {
2242
- background-color: color-mix(in oklab, var(--color-rose-400) 15%, transparent);
2429
+ background-color: color-mix(in oklab, var(--color-rose-400) 20%, transparent);
2243
2430
  }
2244
2431
  }
2245
2432
  }
2246
2433
  }
2247
- .dark\\:group-data-hover\\:bg-slate-400\\/15 {
2248
- &:is(.dark *) {
2434
+ .dark\\:group-data-hover\\:bg-slate-400\\/20 {
2435
+ &:is(.dark *, :host(.dark) *) {
2249
2436
  &:is(:where(.group)[data-hover] *) {
2250
- background-color: color-mix(in srgb, oklch(70.4% 0.04 256.788) 15%, transparent);
2437
+ background-color: color-mix(in srgb, oklch(70.4% 0.04 256.788) 20%, transparent);
2251
2438
  @supports (color: color-mix(in lab, red, red)) {
2252
- background-color: color-mix(in oklab, var(--color-slate-400) 15%, transparent);
2439
+ background-color: color-mix(in oklab, var(--color-slate-400) 20%, transparent);
2253
2440
  }
2254
2441
  }
2255
2442
  }
2256
2443
  }
2257
- .dark\\:group-data-hover\\:bg-violet-400\\/15 {
2258
- &:is(.dark *) {
2444
+ .dark\\:group-data-hover\\:bg-violet-400\\/20 {
2445
+ &:is(.dark *, :host(.dark) *) {
2259
2446
  &:is(:where(.group)[data-hover] *) {
2260
- background-color: color-mix(in srgb, oklch(70.2% 0.183 293.541) 15%, transparent);
2447
+ background-color: color-mix(in srgb, oklch(70.2% 0.183 293.541) 20%, transparent);
2261
2448
  @supports (color: color-mix(in lab, red, red)) {
2262
- background-color: color-mix(in oklab, var(--color-violet-400) 15%, transparent);
2449
+ background-color: color-mix(in oklab, var(--color-violet-400) 20%, transparent);
2263
2450
  }
2264
2451
  }
2265
2452
  }
2266
2453
  }
2267
2454
  .dark\\:before\\:shadow-\\[0_-1px_--theme\\(--color-white\\/6\\%\\)\\] {
2268
- &:is(.dark *) {
2455
+ &:is(.dark *, :host(.dark) *) {
2269
2456
  &::before {
2270
2457
  content: var(--tw-content);
2271
2458
  --tw-shadow: 0 -1px var(--tw-shadow-color, color-mix(in srgb, #fff 6%, transparent));
@@ -2303,6 +2490,66 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2303
2490
  height: calc(var(--spacing) * 4);
2304
2491
  }
2305
2492
  }
2493
+ .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4\\.5 {
2494
+ & svg:not([class*='size-']) {
2495
+ width: calc(var(--spacing) * 4.5);
2496
+ height: calc(var(--spacing) * 4.5);
2497
+ }
2498
+ }
2499
+ .\\[\\&\\>svg\\]\\:pointer-events-none {
2500
+ &>svg {
2501
+ pointer-events: none;
2502
+ }
2503
+ }
2504
+ .\\[\\&\\>svg\\]\\:-mx-0\\.5 {
2505
+ &>svg {
2506
+ margin-inline: calc(var(--spacing) * -0.5);
2507
+ }
2508
+ }
2509
+ .\\[\\&\\>svg\\]\\:shrink-0 {
2510
+ &>svg {
2511
+ flex-shrink: 0;
2512
+ }
2513
+ }
2514
+ .\\[\\&\\>svg\\:not\\(\\[class\\*\\=\\'opacity-\\'\\]\\)\\]\\:opacity-80 {
2515
+ &>svg:not([class*='opacity-']) {
2516
+ opacity: 80%;
2517
+ }
2518
+ }
2519
+ .\\[\\&\\>svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 {
2520
+ &>svg:not([class*='size-']) {
2521
+ width: calc(var(--spacing) * 4);
2522
+ height: calc(var(--spacing) * 4);
2523
+ }
2524
+ }
2525
+ .\\[\\[data-kbd-nav\\]_\\&\\]\\:focus-within\\:bg-accent {
2526
+ [data-kbd-nav] & {
2527
+ &:focus-within {
2528
+ background-color: var(--accent);
2529
+ }
2530
+ }
2531
+ }
2532
+ .\\[\\[data-kbd-nav\\]_\\&\\]\\:focus-within\\:text-accent-foreground {
2533
+ [data-kbd-nav] & {
2534
+ &:focus-within {
2535
+ color: var(--accent-foreground);
2536
+ }
2537
+ }
2538
+ }
2539
+ .\\[\\[data-kbd-nav\\]_\\&\\]\\:focus\\:bg-accent {
2540
+ [data-kbd-nav] & {
2541
+ &:focus {
2542
+ background-color: var(--accent);
2543
+ }
2544
+ }
2545
+ }
2546
+ .\\[\\[data-kbd-nav\\]_\\&\\]\\:focus\\:text-accent-foreground {
2547
+ [data-kbd-nav] & {
2548
+ &:focus {
2549
+ color: var(--accent-foreground);
2550
+ }
2551
+ }
2552
+ }
2306
2553
  }
2307
2554
  @layer base {
2308
2555
  *, ::after, ::before {
@@ -2310,6 +2557,30 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2310
2557
  }
2311
2558
  }
2312
2559
  @layer components {
2560
+ [data-highlighted] {
2561
+ background-color: var(--accent);
2562
+ color: var(--accent-foreground);
2563
+ transition: background-color 150ms ease-out;
2564
+ }
2565
+ [data-kbd-nav] [data-highlighted]:not([data-kbd-highlighted]) {
2566
+ background-color: transparent;
2567
+ color: inherit;
2568
+ }
2569
+ [data-kbd-highlighted] {
2570
+ background-color: var(--accent);
2571
+ @supports (color: color-mix(in lab, red, red)) {
2572
+ background-color: color-mix(in srgb, var(--accent) 200%, transparent);
2573
+ }
2574
+ color: var(--accent-foreground);
2575
+ }
2576
+ .uidex-item-interactive:hover {
2577
+ background-color: var(--accent);
2578
+ color: var(--accent-foreground);
2579
+ }
2580
+ [data-kbd-nav] .uidex-item-interactive:hover:not(:focus):not(:focus-within) {
2581
+ background-color: transparent;
2582
+ color: inherit;
2583
+ }
2313
2584
  .uidex-scrollbar {
2314
2585
  scrollbar-width: thin;
2315
2586
  scrollbar-color: var(--muted-foreground) transparent;
@@ -2343,6 +2614,11 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2343
2614
  background: transparent;
2344
2615
  }
2345
2616
  }
2617
+ @keyframes skeleton {
2618
+ to {
2619
+ background-position: -200% 0;
2620
+ }
2621
+ }
2346
2622
  :where(:host, :root) {
2347
2623
  --background: color-mix(
2348
2624
  in srgb,
@@ -2478,6 +2754,36 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2478
2754
  --warning: var(--color-amber-500);
2479
2755
  --warning-foreground: var(--color-amber-700);
2480
2756
  }
2757
+ @property --tw-translate-x {
2758
+ syntax: "*";
2759
+ inherits: false;
2760
+ initial-value: 0;
2761
+ }
2762
+ @property --tw-translate-y {
2763
+ syntax: "*";
2764
+ inherits: false;
2765
+ initial-value: 0;
2766
+ }
2767
+ @property --tw-translate-z {
2768
+ syntax: "*";
2769
+ inherits: false;
2770
+ initial-value: 0;
2771
+ }
2772
+ @property --tw-scale-x {
2773
+ syntax: "*";
2774
+ inherits: false;
2775
+ initial-value: 1;
2776
+ }
2777
+ @property --tw-scale-y {
2778
+ syntax: "*";
2779
+ inherits: false;
2780
+ initial-value: 1;
2781
+ }
2782
+ @property --tw-scale-z {
2783
+ syntax: "*";
2784
+ inherits: false;
2785
+ initial-value: 1;
2786
+ }
2481
2787
  @property --tw-rotate-x {
2482
2788
  syntax: "*";
2483
2789
  inherits: false;
@@ -2515,6 +2821,26 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2515
2821
  syntax: "*";
2516
2822
  inherits: false;
2517
2823
  }
2824
+ @property --tw-ordinal {
2825
+ syntax: "*";
2826
+ inherits: false;
2827
+ }
2828
+ @property --tw-slashed-zero {
2829
+ syntax: "*";
2830
+ inherits: false;
2831
+ }
2832
+ @property --tw-numeric-figure {
2833
+ syntax: "*";
2834
+ inherits: false;
2835
+ }
2836
+ @property --tw-numeric-spacing {
2837
+ syntax: "*";
2838
+ inherits: false;
2839
+ }
2840
+ @property --tw-numeric-fraction {
2841
+ syntax: "*";
2842
+ inherits: false;
2843
+ }
2518
2844
  @property --tw-shadow {
2519
2845
  syntax: "*";
2520
2846
  inherits: false;
@@ -2683,9 +3009,20 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2683
3009
  initial-value: "";
2684
3010
  inherits: false;
2685
3011
  }
3012
+ @keyframes spin {
3013
+ to {
3014
+ transform: rotate(360deg);
3015
+ }
3016
+ }
2686
3017
  @layer properties {
2687
3018
  @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {
2688
3019
  *, ::before, ::after, ::backdrop {
3020
+ --tw-translate-x: 0;
3021
+ --tw-translate-y: 0;
3022
+ --tw-translate-z: 0;
3023
+ --tw-scale-x: 1;
3024
+ --tw-scale-y: 1;
3025
+ --tw-scale-z: 1;
2689
3026
  --tw-rotate-x: initial;
2690
3027
  --tw-rotate-y: initial;
2691
3028
  --tw-rotate-z: initial;
@@ -2695,6 +3032,11 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2695
3032
  --tw-leading: initial;
2696
3033
  --tw-font-weight: initial;
2697
3034
  --tw-tracking: initial;
3035
+ --tw-ordinal: initial;
3036
+ --tw-slashed-zero: initial;
3037
+ --tw-numeric-figure: initial;
3038
+ --tw-numeric-spacing: initial;
3039
+ --tw-numeric-fraction: initial;
2698
3040
  --tw-shadow: 0 0 #0000;
2699
3041
  --tw-shadow-color: initial;
2700
3042
  --tw-shadow-alpha: 100%;
@@ -2739,12 +3081,12 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2739
3081
  }
2740
3082
  `;
2741
3083
 
2742
- // src/surface/constants.ts
3084
+ // src/browser/surface/constants.ts
2743
3085
  var SURFACE_HOST_CLASS = "uidex-surface-host";
2744
3086
  var SURFACE_CONTAINER_CLASS = "uidex-container";
2745
- var Z_BASE = 2147483644;
2746
- var Z_OVERLAY = 2147483645;
2747
- var Z_CHROME = 2147483646;
3087
+ var Z_BASE = 2147483630;
3088
+ var Z_OVERLAY = 2147483635;
3089
+ var Z_CHROME = 2147483645;
2748
3090
  var SURFACE_IGNORE_SELECTOR = `.${SURFACE_HOST_CLASS},.${SURFACE_CONTAINER_CLASS}`;
2749
3091
  var UIDEX_ATTR_TO_KIND = [
2750
3092
  ["data-uidex", "element"],
@@ -2753,7 +3095,7 @@ var UIDEX_ATTR_TO_KIND = [
2753
3095
  ["data-uidex-primitive", "primitive"]
2754
3096
  ];
2755
3097
 
2756
- // src/surface/host.ts
3098
+ // src/browser/surface/host.ts
2757
3099
  function createSurfaceHost(options) {
2758
3100
  const { mount, stylesheets = [], initialTheme = "light" } = options;
2759
3101
  const hostEl = document.createElement("div");
@@ -2767,6 +3109,8 @@ function createSurfaceHost(options) {
2767
3109
  applyStylesheets(shadow, [tailwind_built_default, ...stylesheets]);
2768
3110
  const chromeEl = document.createElement("div");
2769
3111
  chromeEl.classList.add("uidex-chrome");
3112
+ chromeEl.style.position = "relative";
3113
+ chromeEl.style.zIndex = String(Z_CHROME);
2770
3114
  chromeEl.style.pointerEvents = "auto";
2771
3115
  shadow.appendChild(chromeEl);
2772
3116
  mount.appendChild(hostEl);
@@ -2814,29 +3158,29 @@ function supportsConstructableStylesheets(shadow) {
2814
3158
  }
2815
3159
  }
2816
3160
 
2817
- // src/surface/cursor-tooltip.ts
3161
+ // src/browser/surface/cursor-tooltip.ts
2818
3162
  import { createElement as createLucideElement } from "lucide";
2819
3163
  var DEFAULT_TOOLTIP_COLOR = "#34d399";
2820
3164
  var TOOLTIP_OFFSET = 16;
2821
3165
  var ARROW_SIZE = 5;
2822
3166
  function createCursorTooltip(deps) {
2823
3167
  const { container } = deps;
2824
- const el = document.createElement("div");
2825
- el.setAttribute("data-uidex-cursor-tooltip", "");
2826
- el.style.position = "fixed";
2827
- el.style.pointerEvents = "none";
2828
- el.style.zIndex = String(Z_CHROME);
2829
- el.style.padding = "4px 8px";
2830
- el.style.fontSize = "12px";
2831
- el.style.fontFamily = "ui-sans-serif, system-ui, sans-serif";
2832
- el.style.borderRadius = "6px";
2833
- el.style.background = DEFAULT_TOOLTIP_COLOR;
2834
- el.style.color = "#0a0a0a";
2835
- el.style.display = "none";
2836
- el.style.whiteSpace = "nowrap";
2837
- el.style.transform = "translate(-50%, 0)";
2838
- el.style.alignItems = "center";
2839
- el.style.gap = "6px";
3168
+ const el2 = document.createElement("div");
3169
+ el2.setAttribute("data-uidex-cursor-tooltip", "");
3170
+ el2.style.position = "fixed";
3171
+ el2.style.pointerEvents = "none";
3172
+ el2.style.zIndex = String(Z_CHROME);
3173
+ el2.style.padding = "4px 8px";
3174
+ el2.style.fontSize = "12px";
3175
+ el2.style.fontFamily = "ui-sans-serif, system-ui, sans-serif";
3176
+ el2.style.borderRadius = "6px";
3177
+ el2.style.background = DEFAULT_TOOLTIP_COLOR;
3178
+ el2.style.color = "#0a0a0a";
3179
+ el2.style.display = "none";
3180
+ el2.style.whiteSpace = "nowrap";
3181
+ el2.style.transform = "translate(-50%, 0)";
3182
+ el2.style.alignItems = "center";
3183
+ el2.style.gap = "6px";
2840
3184
  const arrow = document.createElement("div");
2841
3185
  arrow.setAttribute("data-uidex-cursor-tooltip-arrow", "");
2842
3186
  arrow.style.position = "absolute";
@@ -2848,18 +3192,18 @@ function createCursorTooltip(deps) {
2848
3192
  arrow.style.borderLeft = `${ARROW_SIZE}px solid transparent`;
2849
3193
  arrow.style.borderRight = `${ARROW_SIZE}px solid transparent`;
2850
3194
  arrow.style.borderBottom = `${ARROW_SIZE}px solid ${DEFAULT_TOOLTIP_COLOR}`;
2851
- el.appendChild(arrow);
3195
+ el2.appendChild(arrow);
2852
3196
  const body = document.createElement("span");
2853
3197
  body.setAttribute("data-uidex-cursor-tooltip-body", "");
2854
3198
  body.style.display = "inline-flex";
2855
3199
  body.style.alignItems = "center";
2856
3200
  body.style.gap = "6px";
2857
- el.appendChild(body);
2858
- container.appendChild(el);
3201
+ el2.appendChild(body);
3202
+ container.appendChild(el2);
2859
3203
  let currentContent = null;
2860
3204
  let currentCursor = null;
2861
3205
  const applyColor = (color) => {
2862
- el.style.background = color;
3206
+ el2.style.background = color;
2863
3207
  arrow.style.borderBottom = `${ARROW_SIZE}px solid ${color}`;
2864
3208
  };
2865
3209
  const renderBody = () => {
@@ -2872,7 +3216,9 @@ function createCursorTooltip(deps) {
2872
3216
  if (!currentContent) return;
2873
3217
  const { entity, node } = currentContent;
2874
3218
  const style = KIND_STYLE[entity.kind];
3219
+ const demoted = entity.kind === "primitive";
2875
3220
  applyColor(style?.color ?? DEFAULT_TOOLTIP_COLOR);
3221
+ el2.style.opacity = demoted ? "0.55" : "1";
2876
3222
  if (style) {
2877
3223
  const svg = createLucideElement(style.icon);
2878
3224
  svg.setAttribute("aria-hidden", "true");
@@ -2883,26 +3229,28 @@ function createCursorTooltip(deps) {
2883
3229
  }
2884
3230
  const label = displayName(entity, node);
2885
3231
  body.append(document.createTextNode(label));
2886
- const rawId = entity.kind === "route" ? entity.path : entity.id;
2887
- if (rawId && rawId !== label) {
2888
- const subordinate = document.createElement("span");
2889
- subordinate.setAttribute("data-uidex-cursor-tooltip-id", "");
2890
- subordinate.style.opacity = "0.65";
2891
- subordinate.style.fontFamily = "ui-monospace, SFMono-Regular, Menlo, monospace";
2892
- subordinate.style.fontSize = "11px";
2893
- subordinate.textContent = rawId;
2894
- body.append(subordinate);
3232
+ if (currentContent.layer) {
3233
+ const counter = document.createElement("span");
3234
+ counter.setAttribute("data-uidex-cursor-tooltip-layer", "");
3235
+ counter.style.fontFamily = "ui-monospace, SFMono-Regular, Menlo, monospace";
3236
+ counter.style.fontSize = "10px";
3237
+ counter.style.lineHeight = "1";
3238
+ counter.style.padding = "2px 5px";
3239
+ counter.style.borderRadius = "4px";
3240
+ counter.style.background = "rgba(0,0,0,0.18)";
3241
+ counter.textContent = `${currentContent.layer.index + 1}/${currentContent.layer.total}`;
3242
+ body.append(counter);
2895
3243
  }
2896
3244
  };
2897
3245
  const render = () => {
2898
3246
  if (!currentContent || !currentCursor) {
2899
- el.style.display = "none";
3247
+ el2.style.display = "none";
2900
3248
  return;
2901
3249
  }
2902
3250
  renderBody();
2903
- el.style.display = "inline-flex";
2904
- el.style.left = `${currentCursor.x}px`;
2905
- el.style.top = `${currentCursor.y + TOOLTIP_OFFSET}px`;
3251
+ el2.style.display = "inline-flex";
3252
+ el2.style.left = `${currentCursor.x}px`;
3253
+ el2.style.top = `${currentCursor.y + TOOLTIP_OFFSET}px`;
2906
3254
  };
2907
3255
  return {
2908
3256
  update(content, cursor) {
@@ -2911,14 +3259,14 @@ function createCursorTooltip(deps) {
2911
3259
  render();
2912
3260
  },
2913
3261
  destroy() {
2914
- el.remove();
3262
+ el2.remove();
2915
3263
  currentContent = null;
2916
3264
  currentCursor = null;
2917
3265
  }
2918
3266
  };
2919
3267
  }
2920
3268
 
2921
- // src/surface/inspector.ts
3269
+ // src/browser/surface/inspector.ts
2922
3270
  function entityForRef(ref, registry) {
2923
3271
  if (registry) {
2924
3272
  const found = registry.get(ref.kind, ref.id);
@@ -2926,70 +3274,108 @@ function entityForRef(ref, registry) {
2926
3274
  }
2927
3275
  if (ref.kind === "route") return { kind: "route", path: ref.id, page: ref.id };
2928
3276
  if (ref.kind === "flow") {
2929
- return { kind: "flow", id: ref.id, loc: { file: "" }, touches: [] };
3277
+ return {
3278
+ kind: "flow",
3279
+ id: ref.id,
3280
+ loc: { file: "" },
3281
+ touches: [],
3282
+ steps: []
3283
+ };
2930
3284
  }
2931
3285
  return { kind: ref.kind, id: ref.id };
2932
3286
  }
2933
- function defaultResolveMatch(target, registry) {
2934
- if (target.closest(SURFACE_IGNORE_SELECTOR)) return null;
3287
+ function defaultResolveAllMatches(target, registry) {
3288
+ if (target.closest(SURFACE_IGNORE_SELECTOR)) return [];
3289
+ const semantic = [];
3290
+ const primitives = [];
3291
+ const seen = /* @__PURE__ */ new Set();
2935
3292
  let node = target;
2936
3293
  while (node) {
2937
3294
  if (node instanceof HTMLElement) {
2938
3295
  for (const [attr, kind] of UIDEX_ATTR_TO_KIND) {
2939
3296
  const id = node.getAttribute(attr);
2940
3297
  if (id) {
2941
- const ref = { kind, id };
2942
- const entity = entityForRef(ref, registry);
2943
- return {
2944
- element: node,
2945
- ref,
2946
- entity,
2947
- label: displayName(entity, node)
2948
- };
3298
+ const key = `${kind}:${id}`;
3299
+ if (!seen.has(key)) {
3300
+ seen.add(key);
3301
+ const ref = { kind, id };
3302
+ const entity = entityForRef(ref, registry);
3303
+ const match = {
3304
+ element: node,
3305
+ ref,
3306
+ entity,
3307
+ label: displayName(entity, node)
3308
+ };
3309
+ if (kind === "primitive") {
3310
+ primitives.push(match);
3311
+ } else {
3312
+ semantic.push(match);
3313
+ }
3314
+ }
2949
3315
  }
2950
3316
  }
2951
3317
  }
2952
3318
  node = node.parentElement;
2953
3319
  }
2954
- return null;
3320
+ return semantic.concat(primitives);
2955
3321
  }
2956
3322
  function createInspector(options) {
2957
3323
  const {
2958
3324
  session,
2959
3325
  registry,
2960
- resolve = (target) => defaultResolveMatch(target, registry),
3326
+ resolveAll = (target) => defaultResolveAllMatches(target, registry),
2961
3327
  onHover,
2962
- onSelect
3328
+ onSelect,
3329
+ onCycle
2963
3330
  } = options;
2964
3331
  let mounted = false;
2965
3332
  let currentEl = null;
2966
3333
  let cursorStyleEl = null;
3334
+ let stack = [];
3335
+ let layerIndex = 0;
3336
+ let lastCursor = { x: 0, y: 0 };
3337
+ const makeStack = () => stack.length > 0 ? { matches: stack, index: layerIndex, current: stack[layerIndex] } : null;
2967
3338
  const onMouseMove = (e) => {
2968
3339
  if (!(e.target instanceof Element)) return;
2969
- const match = resolve(e.target);
3340
+ const matches = resolveAll(e.target);
2970
3341
  const cursor = { x: e.clientX, y: e.clientY };
2971
- if (match) {
2972
- if (match.element !== currentEl) {
2973
- currentEl = match.element;
2974
- session.getState().actions.hover(match.ref);
3342
+ lastCursor = cursor;
3343
+ const topEl = matches.length > 0 ? matches[0].element : null;
3344
+ if (topEl) {
3345
+ if (topEl !== currentEl) {
3346
+ currentEl = topEl;
3347
+ stack = matches;
3348
+ layerIndex = 0;
3349
+ session.highlight.hover(stack[0].ref);
2975
3350
  }
2976
- onHover?.(match, cursor);
3351
+ onHover?.(makeStack(), cursor);
2977
3352
  } else if (currentEl) {
2978
3353
  currentEl = null;
2979
- session.getState().actions.hover(null);
3354
+ stack = [];
3355
+ layerIndex = 0;
3356
+ session.highlight.unhover();
2980
3357
  onHover?.(null, cursor);
2981
3358
  }
2982
3359
  };
2983
3360
  const onClick = (e) => {
2984
3361
  if (!(e.target instanceof Element)) return;
2985
3362
  if (e.target.closest(SURFACE_IGNORE_SELECTOR)) return;
2986
- const match = resolve(e.target);
2987
- if (!match) return;
3363
+ if (stack.length === 0) return;
2988
3364
  e.preventDefault();
2989
3365
  e.stopPropagation();
2990
- session.getState().actions.select(match.ref);
3366
+ const match = stack[layerIndex];
3367
+ session.select(match.ref);
2991
3368
  onSelect?.(match, { x: e.clientX, y: e.clientY });
2992
3369
  };
3370
+ const onContextMenu = (e) => {
3371
+ if (stack.length <= 1) return;
3372
+ e.preventDefault();
3373
+ e.stopPropagation();
3374
+ layerIndex = (layerIndex + 1) % stack.length;
3375
+ const match = stack[layerIndex];
3376
+ session.highlight.hover(match.ref);
3377
+ onCycle?.(makeStack(), lastCursor);
3378
+ };
2993
3379
  return {
2994
3380
  mount() {
2995
3381
  if (mounted) return;
@@ -3002,124 +3388,363 @@ function createInspector(options) {
3002
3388
  }
3003
3389
  document.addEventListener("mousemove", onMouseMove);
3004
3390
  document.addEventListener("click", onClick, true);
3391
+ document.addEventListener("contextmenu", onContextMenu, true);
3005
3392
  },
3006
3393
  destroy() {
3007
3394
  if (!mounted) return;
3008
3395
  mounted = false;
3009
3396
  currentEl = null;
3397
+ stack = [];
3398
+ layerIndex = 0;
3010
3399
  if (cursorStyleEl) {
3011
3400
  cursorStyleEl.remove();
3012
3401
  cursorStyleEl = null;
3013
3402
  }
3014
3403
  document.removeEventListener("mousemove", onMouseMove);
3015
3404
  document.removeEventListener("click", onClick, true);
3016
- session.getState().actions.hover(null);
3405
+ document.removeEventListener("contextmenu", onContextMenu, true);
3406
+ session.highlight.unhover();
3017
3407
  onHover?.(null, null);
3018
3408
  }
3019
3409
  };
3020
3410
  }
3021
3411
 
3022
- // src/surface/menu-bar.ts
3412
+ // src/browser/surface/menu-bar.ts
3413
+ import {
3414
+ ChevronLeft,
3415
+ ChevronRight,
3416
+ Command,
3417
+ Highlighter,
3418
+ MapPin,
3419
+ MousePointerClick as MousePointerClick2,
3420
+ Users,
3421
+ createElement as createLucideElement2
3422
+ } from "lucide";
3423
+
3424
+ // src/browser/internal/cn.ts
3425
+ import { clsx } from "clsx";
3426
+ import { twMerge } from "tailwind-merge";
3427
+ function cn(...inputs) {
3428
+ return twMerge(clsx(inputs));
3429
+ }
3430
+
3431
+ // src/browser/internal/el.ts
3432
+ function el(tag, options = {}, children = []) {
3433
+ const node = document.createElement(tag);
3434
+ if (options.class) node.className = cn(options.class);
3435
+ if (options.attrs) {
3436
+ for (const [key, value] of Object.entries(options.attrs)) {
3437
+ if (value === void 0 || value === null || value === false) continue;
3438
+ if (value === true) {
3439
+ node.setAttribute(key, "");
3440
+ } else {
3441
+ node.setAttribute(key, String(value));
3442
+ }
3443
+ }
3444
+ }
3445
+ if (options.dataset) {
3446
+ for (const [key, value] of Object.entries(options.dataset)) {
3447
+ node.dataset[key] = value;
3448
+ }
3449
+ }
3450
+ if (options.style) {
3451
+ Object.assign(node.style, options.style);
3452
+ }
3453
+ if (options.text !== void 0) {
3454
+ node.textContent = options.text;
3455
+ }
3456
+ const list = Array.isArray(children) ? children : [children];
3457
+ for (const child of list) {
3458
+ if (child === null || child === void 0 || child === false) continue;
3459
+ node.append(
3460
+ typeof child === "string" ? document.createTextNode(child) : child
3461
+ );
3462
+ }
3463
+ return node;
3464
+ }
3465
+
3466
+ // src/browser/surface/keys.ts
3467
+ var INSPECT_SHORTCUT = { key: "i" };
3468
+ function formatShortcutLabel(shortcut) {
3469
+ const parts = [];
3470
+ if (shortcut.mod !== false) parts.push("\u2318");
3471
+ if (shortcut.shift) parts.push("\u21E7");
3472
+ parts.push(shortcut.key.toUpperCase());
3473
+ return parts.join("");
3474
+ }
3475
+
3476
+ // src/browser/surface/menu-bar.ts
3477
+ var ROOT_CLASS = "inline-flex items-center gap-1.5 rounded-xl border border-border bg-popover p-1.5 font-sans text-xs text-popover-foreground shadow-lg/5 select-none not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-xl)-1px)] before:bg-muted/72 before:shadow-[0_1px_--theme(--color-black/4%)] dark:before:shadow-[0_-1px_--theme(--color-white/6%)]";
3478
+ var BUTTON_CLASS = "relative z-1 inline-flex size-6 shrink-0 cursor-pointer items-center justify-center rounded-md border border-transparent text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-ring";
3479
+ var BUTTON_ACTIVE_CLASS = "border-info/40 bg-info/15 text-info-foreground hover:bg-info/20";
3480
+ var TITLE_CLASS = "relative z-1 whitespace-nowrap px-1.5 text-xs font-semibold tracking-tight text-foreground";
3481
+ var BUTTON_HIGHLIGHT_ACTIVE_CLASS = "border-amber-500/40 bg-amber-500/15 text-amber-600 hover:bg-amber-500/20 dark:text-amber-400";
3023
3482
  function createMenuBar(options) {
3024
3483
  const {
3025
3484
  container,
3026
3485
  session,
3027
3486
  initialCorner = "bottom-right",
3028
- appTitle
3487
+ appTitle,
3488
+ channel = null,
3489
+ pinLayer: initialPinLayer = null
3029
3490
  } = options;
3030
- const root = document.createElement("div");
3031
- root.setAttribute("data-uidex-menubar", "");
3032
- root.setAttribute("role", "toolbar");
3033
- Object.assign(root.style, {
3034
- position: "fixed",
3035
- zIndex: String(Z_CHROME),
3036
- pointerEvents: "auto",
3037
- display: "inline-flex",
3038
- alignItems: "center",
3039
- gap: "6px",
3040
- padding: "6px",
3041
- borderRadius: "8px",
3042
- background: "rgba(20, 20, 20, 0.92)",
3043
- color: "#f5f5f5",
3044
- fontFamily: "ui-sans-serif, system-ui, sans-serif",
3045
- fontSize: "12px",
3046
- userSelect: "none",
3047
- cursor: "grab"
3491
+ let activePinLayer = initialPinLayer;
3492
+ const root = el("div", {
3493
+ class: ROOT_CLASS,
3494
+ attrs: {
3495
+ "data-uidex-menubar": "",
3496
+ role: "toolbar"
3497
+ },
3498
+ style: {
3499
+ position: "fixed",
3500
+ zIndex: String(Z_CHROME),
3501
+ pointerEvents: "auto",
3502
+ cursor: "grab"
3503
+ }
3048
3504
  });
3049
- const buttonStyle = {
3050
- background: "rgba(255,255,255,0.08)",
3051
- color: "inherit",
3052
- border: "1px solid rgba(255,255,255,0.12)",
3053
- borderRadius: "6px",
3054
- padding: "4px 8px",
3055
- font: "inherit",
3056
- cursor: "pointer"
3057
- };
3058
- const buttonActiveStyle = {
3059
- background: "rgba(120, 180, 255, 0.28)",
3060
- borderColor: "rgba(120, 180, 255, 0.55)"
3061
- };
3505
+ let titleEl = null;
3062
3506
  if (appTitle) {
3063
- const titleEl = document.createElement("span");
3064
- titleEl.setAttribute("data-uidex-menubar-title", "");
3065
- titleEl.textContent = appTitle;
3066
- Object.assign(titleEl.style, {
3067
- padding: "0 6px 0 4px",
3068
- fontWeight: "600",
3069
- letterSpacing: "0.01em",
3070
- whiteSpace: "nowrap"
3507
+ titleEl = el("span", {
3508
+ class: TITLE_CLASS,
3509
+ attrs: { "data-uidex-menubar-title": "" },
3510
+ text: appTitle
3071
3511
  });
3072
3512
  root.appendChild(titleEl);
3073
3513
  }
3074
- const highlightDot = document.createElement("span");
3075
- highlightDot.setAttribute("data-uidex-menubar-highlight-indicator", "");
3076
- highlightDot.setAttribute("aria-label", "Element highlighted (press Esc)");
3077
- highlightDot.setAttribute("role", "status");
3078
- Object.assign(highlightDot.style, {
3079
- display: "none",
3080
- width: "8px",
3081
- height: "8px",
3082
- borderRadius: "50%",
3083
- margin: "0 2px 0 4px",
3084
- background: "rgba(120, 180, 255, 0.85)",
3085
- boxShadow: "0 0 6px rgba(120, 180, 255, 0.75)",
3086
- flex: "0 0 auto"
3514
+ const highlightIcon = createLucideElement2(Highlighter);
3515
+ highlightIcon.setAttribute("class", "size-3.5");
3516
+ highlightIcon.setAttribute("aria-hidden", "true");
3517
+ const highlightBtn = el(
3518
+ "button",
3519
+ {
3520
+ class: BUTTON_CLASS,
3521
+ attrs: {
3522
+ type: "button",
3523
+ "data-uidex-menubar-highlight": "",
3524
+ "aria-label": "Dismiss highlight"
3525
+ }
3526
+ },
3527
+ highlightIcon
3528
+ );
3529
+ highlightBtn.hidden = true;
3530
+ highlightBtn.addEventListener("click", (e) => {
3531
+ e.stopPropagation();
3532
+ session.highlight.unpin();
3087
3533
  });
3088
- root.appendChild(highlightDot);
3089
- const inspectBtn = document.createElement("button");
3090
- inspectBtn.type = "button";
3091
- inspectBtn.setAttribute("data-uidex-menubar-inspect", "");
3092
- inspectBtn.textContent = "Inspect";
3093
- Object.assign(inspectBtn.style, buttonStyle);
3534
+ root.appendChild(highlightBtn);
3535
+ const inspectIcon = createLucideElement2(MousePointerClick2);
3536
+ inspectIcon.setAttribute("class", "size-3.5");
3537
+ inspectIcon.setAttribute("aria-hidden", "true");
3538
+ const inspectBtn = el(
3539
+ "button",
3540
+ {
3541
+ class: BUTTON_CLASS,
3542
+ attrs: {
3543
+ type: "button",
3544
+ "data-uidex-menubar-inspect": "",
3545
+ "aria-label": `Inspect (${formatShortcutLabel(INSPECT_SHORTCUT)})`
3546
+ }
3547
+ },
3548
+ inspectIcon
3549
+ );
3094
3550
  inspectBtn.addEventListener("click", (e) => {
3095
3551
  e.stopPropagation();
3096
- session.send({ type: "TOGGLE_INSPECTOR" });
3552
+ session.mode.transition.toggleInspector();
3553
+ inspectBtn.blur();
3097
3554
  });
3098
3555
  root.appendChild(inspectBtn);
3099
- const paletteBtn = document.createElement("button");
3100
- paletteBtn.type = "button";
3101
- paletteBtn.setAttribute("data-uidex-menubar-palette", "");
3102
- paletteBtn.textContent = "\u2318K";
3103
- Object.assign(paletteBtn.style, buttonStyle);
3556
+ const pinIcon = createLucideElement2(MapPin);
3557
+ pinIcon.setAttribute("class", "size-3.5");
3558
+ pinIcon.setAttribute("aria-hidden", "true");
3559
+ const pinBtn = el(
3560
+ "button",
3561
+ {
3562
+ class: BUTTON_CLASS,
3563
+ attrs: {
3564
+ type: "button",
3565
+ "data-uidex-menubar-pins": "",
3566
+ "aria-label": "Report pins"
3567
+ }
3568
+ },
3569
+ pinIcon
3570
+ );
3571
+ const commitCycler = el("div", {
3572
+ class: "relative z-1 inline-flex items-center gap-0.5",
3573
+ attrs: { "data-uidex-menubar-commit-cycler": "" }
3574
+ });
3575
+ commitCycler.hidden = true;
3576
+ const prevIcon = createLucideElement2(ChevronLeft);
3577
+ prevIcon.setAttribute("class", "size-3");
3578
+ prevIcon.setAttribute("aria-hidden", "true");
3579
+ const prevBtn = el(
3580
+ "button",
3581
+ {
3582
+ class: BUTTON_CLASS,
3583
+ attrs: { type: "button", "aria-label": "Previous commit" },
3584
+ style: { width: "18px", height: "18px" }
3585
+ },
3586
+ prevIcon
3587
+ );
3588
+ const commitLabel = el("span", {
3589
+ class: "relative z-1 whitespace-nowrap px-1 text-[10px] font-mono text-muted-foreground",
3590
+ attrs: { "data-uidex-menubar-commit-label": "" }
3591
+ });
3592
+ const nextIcon = createLucideElement2(ChevronRight);
3593
+ nextIcon.setAttribute("class", "size-3");
3594
+ nextIcon.setAttribute("aria-hidden", "true");
3595
+ const nextBtn = el(
3596
+ "button",
3597
+ {
3598
+ class: BUTTON_CLASS,
3599
+ attrs: { type: "button", "aria-label": "Next commit" },
3600
+ style: { width: "18px", height: "18px" }
3601
+ },
3602
+ nextIcon
3603
+ );
3604
+ commitCycler.appendChild(prevBtn);
3605
+ commitCycler.appendChild(commitLabel);
3606
+ commitCycler.appendChild(nextBtn);
3607
+ const pinWrapper = el("div", {
3608
+ class: "relative z-1 inline-flex items-center gap-0.5",
3609
+ attrs: { "data-uidex-menubar-pin-wrapper": "" }
3610
+ });
3611
+ pinWrapper.hidden = true;
3612
+ pinWrapper.appendChild(pinBtn);
3613
+ pinWrapper.appendChild(commitCycler);
3614
+ root.appendChild(pinWrapper);
3615
+ const updatePinUI = () => {
3616
+ if (!activePinLayer) {
3617
+ pinWrapper.hidden = true;
3618
+ return;
3619
+ }
3620
+ const pinsVisible = activePinLayer.visible;
3621
+ const state = activePinLayer.filterState;
3622
+ const hasCommits = state.commits.length > 0;
3623
+ pinWrapper.hidden = false;
3624
+ commitCycler.hidden = !pinsVisible || !hasCommits;
3625
+ if (state.commitIndex === -1 || !state.commits[state.commitIndex]) {
3626
+ commitLabel.textContent = `all (${state.commits.length})`;
3627
+ } else {
3628
+ const sha = state.commits[state.commitIndex] ?? "";
3629
+ commitLabel.textContent = sha.slice(0, 7);
3630
+ }
3631
+ pinBtn.className = cn(BUTTON_CLASS, pinsVisible && BUTTON_ACTIVE_CLASS);
3632
+ };
3633
+ pinBtn.addEventListener("click", (e) => {
3634
+ e.stopPropagation();
3635
+ if (activePinLayer) {
3636
+ activePinLayer.setVisible(!activePinLayer.visible);
3637
+ }
3638
+ });
3639
+ prevBtn.addEventListener("click", (e) => {
3640
+ e.stopPropagation();
3641
+ activePinLayer?.prevCommit();
3642
+ });
3643
+ nextBtn.addEventListener("click", (e) => {
3644
+ e.stopPropagation();
3645
+ activePinLayer?.nextCommit();
3646
+ });
3647
+ let unsubscribePinFilter = activePinLayer?.onFilterChange(() => updatePinUI());
3648
+ const presenceIcon = createLucideElement2(Users);
3649
+ presenceIcon.setAttribute("class", "size-3.5");
3650
+ presenceIcon.setAttribute("aria-hidden", "true");
3651
+ const presenceBtn = el(
3652
+ "button",
3653
+ {
3654
+ class: BUTTON_CLASS,
3655
+ attrs: {
3656
+ type: "button",
3657
+ "data-uidex-menubar-presence": "",
3658
+ "aria-label": "Online users"
3659
+ }
3660
+ },
3661
+ presenceIcon
3662
+ );
3663
+ presenceBtn.hidden = true;
3664
+ const presenceBadge = el("span", {
3665
+ 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"
3666
+ });
3667
+ presenceBtn.appendChild(presenceBadge);
3668
+ const presencePopover = el("div", {
3669
+ 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"
3670
+ });
3671
+ presencePopover.hidden = true;
3672
+ let presencePopoverVisible = false;
3673
+ presenceBtn.addEventListener("click", (e) => {
3674
+ e.stopPropagation();
3675
+ presencePopoverVisible = !presencePopoverVisible;
3676
+ presencePopover.hidden = !presencePopoverVisible;
3677
+ });
3678
+ const presenceWrapper = el("div", { class: "relative z-1 inline-flex" }, [
3679
+ presenceBtn,
3680
+ presencePopover
3681
+ ]);
3682
+ presenceWrapper.hidden = true;
3683
+ root.appendChild(presenceWrapper);
3684
+ let presenceUsers = [];
3685
+ const updatePresenceUI = () => {
3686
+ const localUserId = session.getState().user?.id ?? null;
3687
+ const peers = localUserId ? presenceUsers.filter((u) => u.userId !== localUserId) : presenceUsers;
3688
+ const count = peers.length;
3689
+ presenceWrapper.hidden = count === 0;
3690
+ presenceBadge.textContent = String(count);
3691
+ presenceBtn.setAttribute(
3692
+ "aria-label",
3693
+ count === 1 ? "1 other user online" : `${count} other users online`
3694
+ );
3695
+ presencePopover.innerHTML = "";
3696
+ for (const user of peers) {
3697
+ const row = el("div", {
3698
+ class: "flex items-center gap-2 rounded px-1.5 py-1"
3699
+ });
3700
+ const dot = el("span", {
3701
+ class: "inline-block size-2 shrink-0 rounded-full bg-emerald-500"
3702
+ });
3703
+ const name = el("span", {
3704
+ class: "truncate",
3705
+ text: user.name || "Anonymous"
3706
+ });
3707
+ row.appendChild(dot);
3708
+ row.appendChild(name);
3709
+ presencePopover.appendChild(row);
3710
+ }
3711
+ };
3712
+ const paletteIcon = createLucideElement2(Command);
3713
+ paletteIcon.setAttribute("class", "size-3.5");
3714
+ paletteIcon.setAttribute("aria-hidden", "true");
3715
+ const paletteBtn = el(
3716
+ "button",
3717
+ {
3718
+ class: BUTTON_CLASS,
3719
+ attrs: {
3720
+ type: "button",
3721
+ "data-uidex-menubar-palette": "",
3722
+ "aria-label": "Command palette"
3723
+ }
3724
+ },
3725
+ paletteIcon
3726
+ );
3104
3727
  paletteBtn.addEventListener("click", (e) => {
3105
3728
  e.stopPropagation();
3106
3729
  if (session.getState().stack.length > 0) {
3107
- session.send({ type: "CLOSE" });
3730
+ session.mode.transition.dismiss();
3108
3731
  } else {
3109
- session.send({ type: "OPEN_PALETTE" });
3732
+ session.mode.transition.openPalette();
3110
3733
  }
3734
+ paletteBtn.blur();
3111
3735
  });
3112
3736
  root.appendChild(paletteBtn);
3113
3737
  container.appendChild(root);
3114
3738
  const syncButtonStates = () => {
3115
3739
  const state = session.getState();
3740
+ const inspectActive = state.inspectorActive;
3116
3741
  inspectBtn.setAttribute(
3117
3742
  "data-uidex-menubar-inspect-active",
3118
- state.inspectorActive ? "true" : "false"
3743
+ inspectActive ? "true" : "false"
3119
3744
  );
3120
- Object.assign(
3121
- inspectBtn.style,
3122
- state.inspectorActive ? buttonActiveStyle : buttonStyle
3745
+ inspectBtn.className = cn(
3746
+ BUTTON_CLASS,
3747
+ inspectActive && BUTTON_ACTIVE_CLASS
3123
3748
  );
3124
3749
  const top = state.stack[state.stack.length - 1] ?? null;
3125
3750
  const paletteOpen = top?.id === "command-palette";
@@ -3127,16 +3752,17 @@ function createMenuBar(options) {
3127
3752
  "data-uidex-menubar-palette-active",
3128
3753
  paletteOpen ? "true" : "false"
3129
3754
  );
3130
- Object.assign(
3131
- paletteBtn.style,
3132
- paletteOpen ? buttonActiveStyle : buttonStyle
3133
- );
3755
+ paletteBtn.className = cn(BUTTON_CLASS, paletteOpen && BUTTON_ACTIVE_CLASS);
3134
3756
  const highlightActive = state.pinnedHighlight !== null;
3135
- highlightDot.setAttribute(
3757
+ highlightBtn.setAttribute(
3136
3758
  "data-uidex-menubar-highlight-active",
3137
3759
  highlightActive ? "true" : "false"
3138
3760
  );
3139
- highlightDot.style.display = highlightActive ? "inline-block" : "none";
3761
+ highlightBtn.className = cn(
3762
+ BUTTON_CLASS,
3763
+ highlightActive && BUTTON_HIGHLIGHT_ACTIVE_CLASS
3764
+ );
3765
+ highlightBtn.hidden = !highlightActive;
3140
3766
  };
3141
3767
  syncButtonStates();
3142
3768
  const unsubscribeSession = session.subscribe(syncButtonStates);
@@ -3197,14 +3823,28 @@ function createMenuBar(options) {
3197
3823
  const vertical = y / (window.innerHeight || 1) < 0.5 ? "top" : "bottom";
3198
3824
  snapTo(`${vertical}-${horizontal}`);
3199
3825
  }
3826
+ const unsubscribePresence = channel?.onPresence(
3827
+ (users) => {
3828
+ presenceUsers = users;
3829
+ updatePresenceUI();
3830
+ }
3831
+ );
3200
3832
  return {
3201
3833
  destroy() {
3834
+ unsubscribePinFilter?.();
3835
+ unsubscribePresence?.();
3202
3836
  unsubscribeSession();
3203
3837
  root.removeEventListener("mousedown", onMouseDown);
3204
3838
  document.removeEventListener("mousemove", onMouseMove);
3205
3839
  document.removeEventListener("mouseup", onMouseUp);
3206
3840
  root.remove();
3207
3841
  },
3842
+ setPinLayer(layer) {
3843
+ unsubscribePinFilter?.();
3844
+ activePinLayer = layer;
3845
+ unsubscribePinFilter = layer.onFilterChange(() => updatePinUI());
3846
+ updatePinUI();
3847
+ },
3208
3848
  snapTo,
3209
3849
  snapToNearest,
3210
3850
  get corner() {
@@ -3216,19 +3856,38 @@ function createMenuBar(options) {
3216
3856
  };
3217
3857
  }
3218
3858
 
3219
- // src/surface/overlay.ts
3859
+ // src/browser/surface/overlay.ts
3220
3860
  var DEFAULT_COLOR = "#34d399";
3221
3861
  var DEFAULT_BORDER_WIDTH = 2;
3222
3862
  var DEFAULT_FILL_OPACITY = 0.08;
3863
+ var BACKDROP_OPACITY = 0.45;
3223
3864
  function createOverlay(deps) {
3224
3865
  const { container } = deps;
3866
+ const backdrop = document.createElement("div");
3867
+ backdrop.setAttribute("data-uidex-overlay-backdrop", "");
3868
+ backdrop.style.position = "fixed";
3869
+ backdrop.style.inset = "0";
3870
+ backdrop.style.zIndex = String(Z_OVERLAY);
3871
+ backdrop.style.backgroundColor = `rgba(0, 0, 0, ${BACKDROP_OPACITY})`;
3872
+ backdrop.style.opacity = "0";
3873
+ backdrop.style.visibility = "hidden";
3874
+ backdrop.style.transition = "opacity 150ms ease-out";
3875
+ backdrop.style.pointerEvents = "auto";
3876
+ backdrop.style.cursor = "default";
3877
+ backdrop.addEventListener("click", (e) => {
3878
+ e.stopPropagation();
3879
+ overlay.onDismiss?.();
3880
+ });
3881
+ container.appendChild(backdrop);
3225
3882
  const box = document.createElement("div");
3226
3883
  box.setAttribute("data-uidex-overlay", "");
3227
3884
  box.style.position = "fixed";
3228
3885
  box.style.pointerEvents = "none";
3229
- box.style.zIndex = String(Z_OVERLAY);
3886
+ box.style.zIndex = String(Z_OVERLAY + 1);
3230
3887
  box.style.boxSizing = "border-box";
3231
- box.style.display = "none";
3888
+ box.style.opacity = "0";
3889
+ box.style.transition = "opacity 150ms ease-out";
3890
+ box.style.visibility = "hidden";
3232
3891
  const label = document.createElement("div");
3233
3892
  label.setAttribute("data-uidex-overlay-label", "");
3234
3893
  label.style.position = "absolute";
@@ -3241,6 +3900,17 @@ function createOverlay(deps) {
3241
3900
  label.style.whiteSpace = "nowrap";
3242
3901
  label.style.color = "#0a0a0a";
3243
3902
  label.style.display = "none";
3903
+ box.addEventListener("transitionend", () => {
3904
+ if (box.style.opacity === "0") {
3905
+ box.style.visibility = "hidden";
3906
+ }
3907
+ });
3908
+ backdrop.addEventListener("transitionend", () => {
3909
+ if (backdrop.style.opacity === "0") {
3910
+ backdrop.style.visibility = "hidden";
3911
+ backdrop.style.clipPath = "";
3912
+ }
3913
+ });
3244
3914
  box.appendChild(label);
3245
3915
  container.appendChild(box);
3246
3916
  let target = null;
@@ -3250,7 +3920,8 @@ function createOverlay(deps) {
3250
3920
  padding: 0,
3251
3921
  borderStyle: "solid",
3252
3922
  borderWidth: DEFAULT_BORDER_WIDTH,
3253
- fillOpacity: DEFAULT_FILL_OPACITY
3923
+ fillOpacity: DEFAULT_FILL_OPACITY,
3924
+ backdrop: false
3254
3925
  };
3255
3926
  let rafId = null;
3256
3927
  let attached = false;
@@ -3294,16 +3965,26 @@ function createOverlay(deps) {
3294
3965
  if (!target) return;
3295
3966
  const rect = target.getBoundingClientRect();
3296
3967
  const pad = opts.padding;
3297
- box.style.top = `${rect.top - pad}px`;
3298
- box.style.left = `${rect.left - pad}px`;
3299
- box.style.width = `${rect.width + pad * 2}px`;
3300
- box.style.height = `${rect.height + pad * 2}px`;
3968
+ const top = rect.top - pad;
3969
+ const left = rect.left - pad;
3970
+ const w = rect.width + pad * 2;
3971
+ const h = rect.height + pad * 2;
3972
+ box.style.top = `${top}px`;
3973
+ box.style.left = `${left}px`;
3974
+ box.style.width = `${w}px`;
3975
+ box.style.height = `${h}px`;
3976
+ if (opts.backdrop) {
3977
+ const vw = window.innerWidth;
3978
+ const vh = window.innerHeight;
3979
+ backdrop.style.clipPath = cutoutPath(vw, vh, left, top, w, h);
3980
+ }
3301
3981
  }
3302
3982
  function applyStyles() {
3303
3983
  box.style.borderColor = opts.color;
3304
3984
  box.style.borderStyle = opts.borderStyle;
3305
3985
  box.style.borderWidth = `${opts.borderWidth}px`;
3306
3986
  box.style.backgroundColor = rgbaFromColor(opts.color, opts.fillOpacity);
3987
+ box.style.borderRadius = "6px";
3307
3988
  if (opts.label) {
3308
3989
  label.textContent = opts.label;
3309
3990
  label.style.backgroundColor = opts.color;
@@ -3312,9 +3993,19 @@ function createOverlay(deps) {
3312
3993
  label.textContent = "";
3313
3994
  label.style.display = "none";
3314
3995
  }
3996
+ if (opts.backdrop) {
3997
+ backdrop.style.visibility = "visible";
3998
+ backdrop.style.opacity = "1";
3999
+ } else {
4000
+ backdrop.style.opacity = "0";
4001
+ backdrop.style.visibility = "hidden";
4002
+ backdrop.style.clipPath = "";
4003
+ }
3315
4004
  }
3316
- return {
4005
+ const overlay = {
4006
+ onDismiss: null,
3317
4007
  show(nextTarget, showOpts) {
4008
+ const wasVisible = target !== null;
3318
4009
  target = nextTarget;
3319
4010
  opts = {
3320
4011
  label: showOpts?.label ?? "",
@@ -3322,27 +4013,41 @@ function createOverlay(deps) {
3322
4013
  padding: showOpts?.padding ?? 0,
3323
4014
  borderStyle: showOpts?.borderStyle ?? "solid",
3324
4015
  borderWidth: showOpts?.borderWidth ?? DEFAULT_BORDER_WIDTH,
3325
- fillOpacity: showOpts?.fillOpacity ?? DEFAULT_FILL_OPACITY
4016
+ fillOpacity: showOpts?.fillOpacity ?? DEFAULT_FILL_OPACITY,
4017
+ backdrop: showOpts?.backdrop ?? false
3326
4018
  };
3327
4019
  applyStyles();
3328
4020
  updatePosition();
3329
- box.style.display = "";
4021
+ if (!wasVisible) {
4022
+ box.style.opacity = "0";
4023
+ box.style.visibility = "visible";
4024
+ box.offsetHeight;
4025
+ }
4026
+ box.style.opacity = "1";
3330
4027
  attach();
3331
4028
  },
3332
4029
  hide() {
3333
4030
  target = null;
3334
- box.style.display = "none";
4031
+ box.style.opacity = "0";
4032
+ backdrop.style.opacity = "0";
3335
4033
  detach();
3336
4034
  },
3337
4035
  destroy() {
3338
4036
  detach();
3339
4037
  box.remove();
4038
+ backdrop.remove();
3340
4039
  target = null;
3341
4040
  },
3342
4041
  get isVisible() {
3343
4042
  return target !== null;
3344
4043
  }
3345
4044
  };
4045
+ return overlay;
4046
+ }
4047
+ function cutoutPath(vw, vh, x, y, w, h) {
4048
+ const outer = `M0 0H${vw}V${vh}H0Z`;
4049
+ const inner = `M${x} ${y}V${y + h}H${x + w}V${y}Z`;
4050
+ return `path(evenodd,"${outer}${inner}")`;
3346
4051
  }
3347
4052
  function rgbaFromColor(color, alpha) {
3348
4053
  if (color.startsWith("#")) {
@@ -3359,7 +4064,7 @@ function rgbaFromColor(color, alpha) {
3359
4064
  return color;
3360
4065
  }
3361
4066
 
3362
- // src/surface/theme.ts
4067
+ // src/browser/surface/theme.ts
3363
4068
  function createThemeDetector(deps) {
3364
4069
  const { session, onResolve } = deps;
3365
4070
  let resolved = session.getState().resolvedTheme;
@@ -3377,7 +4082,7 @@ function createThemeDetector(deps) {
3377
4082
  const next = detect(preference);
3378
4083
  if (next === resolved) return;
3379
4084
  resolved = next;
3380
- session.getState().actions.setTheme(preference, next);
4085
+ session.setTheme(preference, next);
3381
4086
  onResolve?.(next);
3382
4087
  };
3383
4088
  push();
@@ -3428,7 +4133,7 @@ function readHtmlClassToken() {
3428
4133
  return null;
3429
4134
  }
3430
4135
 
3431
- // src/surface/shell.ts
4136
+ // src/browser/surface/shell.ts
3432
4137
  function createSurfaceShell(options) {
3433
4138
  const cleanup = createCleanupStack();
3434
4139
  const host = createSurfaceHost({
@@ -3442,7 +4147,7 @@ function createSurfaceShell(options) {
3442
4147
  onResolve: (theme) => host.applyTheme(theme)
3443
4148
  });
3444
4149
  cleanup.add(themeDetector);
3445
- const overlay = createOverlay({ container: host.chromeEl });
4150
+ const overlay = createOverlay({ container: host.shadowRoot });
3446
4151
  cleanup.add(overlay);
3447
4152
  const tooltip = createCursorTooltip({
3448
4153
  container: host.chromeEl,
@@ -3450,21 +4155,37 @@ function createSurfaceShell(options) {
3450
4155
  });
3451
4156
  cleanup.add(tooltip);
3452
4157
  const afterHover = options.inspector?.onAfterHover;
4158
+ const showStack = (stack, cursor) => {
4159
+ if (!stack) {
4160
+ overlay.hide();
4161
+ tooltip.update(null, cursor);
4162
+ return;
4163
+ }
4164
+ const { current } = stack;
4165
+ const demoted = current.ref.kind === "primitive";
4166
+ overlay.show(current.element, {
4167
+ color: KIND_STYLE[current.ref.kind].color,
4168
+ ...demoted && { borderStyle: "dashed", fillOpacity: 0.04 }
4169
+ });
4170
+ tooltip.update(
4171
+ {
4172
+ entity: current.entity,
4173
+ node: current.element,
4174
+ layer: stack.matches.length > 1 ? { index: stack.index, total: stack.matches.length } : void 0
4175
+ },
4176
+ cursor
4177
+ );
4178
+ };
3453
4179
  const inspector = createInspector({
3454
4180
  session: options.session,
3455
4181
  registry: options.registry,
3456
4182
  onSelect: options.inspector?.onSelect,
3457
- onHover: (match, cursor) => {
3458
- if (!match) {
3459
- overlay.hide();
3460
- tooltip.update(null, cursor);
3461
- } else {
3462
- overlay.show(match.element, {
3463
- color: KIND_STYLE[match.ref.kind].color
3464
- });
3465
- tooltip.update({ entity: match.entity, node: match.element }, cursor);
3466
- }
3467
- afterHover?.(match, cursor);
4183
+ onHover: (stack, cursor) => {
4184
+ showStack(stack, cursor);
4185
+ afterHover?.(stack?.current ?? null, cursor);
4186
+ },
4187
+ onCycle: (stack, cursor) => {
4188
+ showStack(stack, cursor);
3468
4189
  }
3469
4190
  });
3470
4191
  cleanup.add(inspector);
@@ -3472,7 +4193,9 @@ function createSurfaceShell(options) {
3472
4193
  container: host.chromeEl,
3473
4194
  session: options.session,
3474
4195
  initialCorner: options.initialCorner,
3475
- appTitle: options.appTitle
4196
+ appTitle: options.appTitle,
4197
+ channel: options.channel ?? null,
4198
+ pinLayer: options.pinLayer ?? null
3476
4199
  });
3477
4200
  cleanup.add(menuBar);
3478
4201
  return {