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
@@ -24,7 +24,7 @@ __export(headless_exports, {
24
24
  });
25
25
  module.exports = __toCommonJS(headless_exports);
26
26
 
27
- // src/entities/types.ts
27
+ // src/shared/entities/types.ts
28
28
  var ENTITY_KINDS = [
29
29
  "route",
30
30
  "page",
@@ -62,7 +62,7 @@ function assertEntityKind(kind) {
62
62
  if (!KIND_SET.has(kind)) throw new UnknownEntityKindError(kind);
63
63
  }
64
64
 
65
- // src/entities/registry.ts
65
+ // src/shared/entities/registry.ts
66
66
  function emptyStore() {
67
67
  return {
68
68
  route: /* @__PURE__ */ new Map(),
@@ -144,71 +144,94 @@ function createRegistry() {
144
144
  return ids.has(entity.id);
145
145
  });
146
146
  };
147
- return { add, get, list, query, byScope, touchedBy };
147
+ const reports = /* @__PURE__ */ new Map();
148
+ const reportsCbs = /* @__PURE__ */ new Set();
149
+ const setReports = (kind, id, records) => {
150
+ reports.set(`${kind}:${id}`, records);
151
+ for (const cb of reportsCbs) cb();
152
+ };
153
+ const getReports = (kind, id) => reports.get(`${kind}:${id}`) ?? [];
154
+ const listReportKeys = () => Array.from(reports.keys());
155
+ const onReportsChange = (cb) => {
156
+ reportsCbs.add(cb);
157
+ return () => reportsCbs.delete(cb);
158
+ };
159
+ return {
160
+ add,
161
+ get,
162
+ list,
163
+ query,
164
+ byScope,
165
+ touchedBy,
166
+ setReports,
167
+ getReports,
168
+ listReportKeys,
169
+ onReportsChange
170
+ };
148
171
  }
149
172
 
150
- // src/entities/style.ts
173
+ // src/shared/entities/style.ts
151
174
  var import_lucide = require("lucide");
152
175
  var KIND_STYLE = {
153
176
  route: {
154
177
  icon: import_lucide.Route,
155
- tone: "text-blue-700 dark:text-blue-300",
156
- 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",
178
+ tone: "text-blue-700 dark:text-blue-400",
179
+ 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",
157
180
  color: "#60a5fa",
158
181
  label: "Route"
159
182
  },
160
183
  page: {
161
184
  icon: import_lucide.FileText,
162
- tone: "text-emerald-700 dark:text-emerald-300",
163
- 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",
185
+ tone: "text-emerald-700 dark:text-emerald-400",
186
+ 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",
164
187
  color: "#34d399",
165
188
  label: "Page"
166
189
  },
167
190
  feature: {
168
191
  icon: import_lucide.Sparkles,
169
- tone: "text-amber-700 dark:text-amber-300",
170
- 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",
192
+ tone: "text-amber-700 dark:text-amber-500",
193
+ 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",
171
194
  color: "#fbbf24",
172
195
  label: "Feature"
173
196
  },
174
197
  widget: {
175
198
  icon: import_lucide.LayoutGrid,
176
- tone: "text-violet-700 dark:text-violet-300",
177
- 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",
199
+ tone: "text-violet-700 dark:text-violet-400",
200
+ 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",
178
201
  color: "#a78bfa",
179
202
  label: "Widget"
180
203
  },
181
204
  region: {
182
205
  icon: import_lucide.LayoutPanelTop,
183
- tone: "text-cyan-700 dark:text-cyan-300",
184
- 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",
206
+ tone: "text-cyan-700 dark:text-cyan-400",
207
+ 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",
185
208
  color: "#22d3ee",
186
209
  label: "Region"
187
210
  },
188
211
  element: {
189
212
  icon: import_lucide.MousePointerClick,
190
- tone: "text-rose-700 dark:text-rose-300",
191
- 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",
213
+ tone: "text-rose-700 dark:text-rose-400",
214
+ 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",
192
215
  color: "#fb7185",
193
216
  label: "Element"
194
217
  },
195
218
  primitive: {
196
219
  icon: import_lucide.Circle,
197
- tone: "text-slate-700 dark:text-slate-300",
198
- 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",
220
+ tone: "text-slate-600 dark:text-slate-400",
221
+ 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",
199
222
  color: "#94a3b8",
200
223
  label: "Primitive"
201
224
  },
202
225
  flow: {
203
226
  icon: import_lucide.Workflow,
204
- tone: "text-fuchsia-700 dark:text-fuchsia-300",
205
- 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",
227
+ tone: "text-fuchsia-700 dark:text-fuchsia-400",
228
+ 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",
206
229
  color: "#e879f9",
207
230
  label: "Flow"
208
231
  }
209
232
  };
210
233
 
211
- // src/entities/display-name.ts
234
+ // src/shared/entities/display-name.ts
212
235
  function prettify(id) {
213
236
  const parts = id.split(/[-_]+/).filter(Boolean);
214
237
  const words = parts.flatMap((part) => part.split(/(?=[A-Z])/).filter(Boolean));
@@ -226,7 +249,7 @@ function displayName(entity, node) {
226
249
  return prettify(entity.id);
227
250
  }
228
251
 
229
- // src/internal/cleanup.ts
252
+ // src/browser/internal/cleanup.ts
230
253
  function createCleanupStack() {
231
254
  const stack = [];
232
255
  return {
@@ -248,293 +271,147 @@ function createCleanupStack() {
248
271
  };
249
272
  }
250
273
 
251
- // src/session/store.ts
252
- var import_xstate3 = require("xstate");
253
- var import_vanilla = require("zustand/vanilla");
274
+ // src/browser/session/store.ts
275
+ var import_vanilla3 = require("zustand/vanilla");
254
276
 
255
- // src/flows/highlight.ts
256
- var import_xstate = require("xstate");
257
- var initialContext = {
258
- ref: null,
259
- element: null,
260
- pinnedRef: null,
261
- color: null
277
+ // src/browser/session/mode.ts
278
+ var import_vanilla = require("zustand/vanilla");
279
+ var COMMAND_PALETTE_ENTRY = {
280
+ id: "command-palette",
281
+ ref: null
262
282
  };
263
- var highlightMachine = (0, import_xstate.setup)({
264
- types: {},
265
- actions: {
266
- showOverlay: () => {
283
+ function createModeStore(options) {
284
+ const { nav, bindings } = options;
285
+ const store = (0, import_vanilla.createStore)(() => ({
286
+ mode: "idle",
287
+ inspectorActive: false
288
+ }));
289
+ const transition = {
290
+ openPalette() {
291
+ const prev = store.getState();
292
+ if (prev.mode === "inspecting") {
293
+ bindings?.destroyInspector?.();
294
+ }
295
+ nav.nav.reset([COMMAND_PALETTE_ENTRY]);
296
+ store.setState({ mode: "palette", inspectorActive: false });
267
297
  },
268
- hideOverlay: () => {
298
+ openInspector() {
299
+ bindings?.mountInspector?.();
300
+ nav.nav.clear();
301
+ store.setState({ mode: "inspecting", inspectorActive: true });
269
302
  },
270
- updateOverlay: () => {
271
- }
272
- }
273
- }).createMachine({
274
- id: "highlight",
275
- initial: "none",
276
- context: initialContext,
277
- states: {
278
- none: {
279
- entry: [
280
- (0, import_xstate.assign)({
281
- ref: null,
282
- element: null,
283
- pinnedRef: null,
284
- color: null
285
- }),
286
- { type: "hideOverlay" }
287
- ],
288
- on: {
289
- HOVER: {
290
- target: "transient",
291
- actions: (0, import_xstate.assign)(({ event }) => ({
292
- ref: event.ref,
293
- element: event.element,
294
- color: event.color ?? null
295
- }))
296
- },
297
- PIN: {
298
- target: "pinned",
299
- actions: (0, import_xstate.assign)(({ context, event }) => ({
300
- ref: event.ref ?? context.ref,
301
- pinnedRef: event.ref ?? context.ref
302
- }))
303
- }
304
- }
303
+ closeInspector() {
304
+ bindings?.destroyInspector?.();
305
+ nav.nav.clear();
306
+ store.setState({ mode: "idle", inspectorActive: false });
305
307
  },
306
- transient: {
307
- entry: { type: "showOverlay" },
308
- on: {
309
- HOVER: {
310
- actions: [
311
- (0, import_xstate.assign)(({ event }) => ({
312
- ref: event.ref,
313
- element: event.element,
314
- color: event.color ?? null
315
- })),
316
- { type: "updateOverlay" }
317
- ]
318
- },
319
- UNHOVER: { target: "none" },
320
- PIN: {
321
- target: "pinned",
322
- actions: (0, import_xstate.assign)(({ context, event }) => ({
323
- pinnedRef: event.ref ?? context.ref
324
- }))
325
- }
308
+ toggleInspector() {
309
+ if (store.getState().mode === "inspecting") {
310
+ transition.closeInspector();
311
+ } else {
312
+ transition.openInspector();
326
313
  }
327
314
  },
328
- pinned: {
329
- entry: { type: "showOverlay" },
330
- on: {
331
- UNPIN: { target: "none" }
315
+ enterViewing(initialStack) {
316
+ const prev = store.getState();
317
+ if (prev.mode === "inspecting") {
318
+ bindings?.destroyInspector?.();
332
319
  }
333
- }
334
- }
335
- });
336
-
337
- // src/flows/surface.ts
338
- var import_xstate2 = require("xstate");
339
- var initialContext2 = {
340
- stack: [],
341
- hover: null,
342
- selection: null,
343
- pinnedHighlight: null,
344
- theme: "auto",
345
- resolvedTheme: "light",
346
- ingestActive: false
347
- };
348
- var surfaceMachine = (0, import_xstate2.setup)({
349
- types: {},
350
- actors: {
351
- highlight: highlightMachine
352
- },
353
- actions: {
354
- mountInspector: () => {
320
+ nav.nav.reset(initialStack);
321
+ store.setState({ mode: "viewing", inspectorActive: false });
355
322
  },
356
- destroyInspector: () => {
323
+ dismiss() {
324
+ const prev = store.getState();
325
+ if (prev.mode === "inspecting") {
326
+ bindings?.destroyInspector?.();
327
+ }
328
+ nav.nav.clear();
329
+ store.setState({ mode: "idle", inspectorActive: false });
357
330
  },
358
- openActionsPopup: () => {
331
+ popOrTransition() {
332
+ const { stack } = nav.getState();
333
+ if (stack.length > 2) {
334
+ nav.nav.pop();
335
+ } else if (stack.length === 2 && stack[0]?.id === "command-palette") {
336
+ nav.nav.reset([COMMAND_PALETTE_ENTRY]);
337
+ store.setState({ mode: "palette", inspectorActive: false });
338
+ } else if (stack.length === 2) {
339
+ nav.nav.pop();
340
+ } else {
341
+ nav.nav.clear();
342
+ store.setState({ mode: "idle", inspectorActive: false });
343
+ }
359
344
  },
360
- closePopup: () => {
345
+ pushView(entry) {
346
+ const { mode } = store.getState();
347
+ const { stack } = nav.getState();
348
+ if (entry.id === "command-palette" && stack.length === 0) {
349
+ transition.openPalette();
350
+ return;
351
+ }
352
+ switch (mode) {
353
+ case "idle":
354
+ transition.enterViewing([entry]);
355
+ break;
356
+ case "inspecting":
357
+ bindings?.destroyInspector?.();
358
+ nav.nav.reset([entry]);
359
+ store.setState({ mode: "viewing", inspectorActive: false });
360
+ break;
361
+ case "palette":
362
+ case "viewing":
363
+ nav.nav.push(entry);
364
+ if (mode === "palette") {
365
+ store.setState({ mode: "viewing" });
366
+ }
367
+ break;
368
+ }
361
369
  }
362
- },
363
- guards: {
364
- hasPinnedHighlight: ({ context }) => context.pinnedHighlight !== null,
365
- hasActions: () => false,
366
- popupOpen: () => false,
367
- stackDeeperThanTwo: ({ context }) => context.stack.length > 2,
368
- stackEqualsTwo: ({ context }) => context.stack.length === 2,
369
- stackEqualsOne: ({ context }) => context.stack.length === 1,
370
- paletteAtBottomDepthTwo: ({ context }) => context.stack.length === 2 && context.stack[0]?.id === "command-palette"
371
- }
372
- }).createMachine({
373
- id: "surface",
374
- initial: "idle",
375
- context: ({ input }) => ({
376
- ...initialContext2,
377
- ...input ?? {}
378
- }),
379
- invoke: {
380
- id: "highlight",
381
- src: "highlight"
382
- },
383
- on: {
384
- HOVER: {
385
- actions: [
386
- (0, import_xstate2.assign)(({ event }) => ({ hover: event.ref })),
387
- (0, import_xstate2.forwardTo)("highlight")
388
- ]
389
- },
390
- UNHOVER: {
391
- actions: [(0, import_xstate2.assign)({ hover: null }), (0, import_xstate2.forwardTo)("highlight")]
392
- },
393
- PIN: {
394
- actions: [
395
- (0, import_xstate2.assign)(({ context, event }) => ({
396
- pinnedHighlight: event.ref ?? context.hover
397
- })),
398
- (0, import_xstate2.forwardTo)("highlight")
399
- ]
400
- },
401
- UNPIN: {
402
- actions: [(0, import_xstate2.assign)({ pinnedHighlight: null }), (0, import_xstate2.forwardTo)("highlight")]
403
- },
404
- SET_SELECTION: {
405
- actions: (0, import_xstate2.assign)(({ event }) => ({ selection: event.ref }))
406
- },
407
- SET_THEME: {
408
- actions: (0, import_xstate2.assign)(({ event }) => ({
409
- theme: event.theme,
410
- resolvedTheme: event.resolvedTheme
411
- }))
370
+ };
371
+ const modeStore = store;
372
+ modeStore.transition = transition;
373
+ return modeStore;
374
+ }
375
+
376
+ // src/browser/session/navigation.ts
377
+ var import_vanilla2 = require("zustand/vanilla");
378
+ function createNavigationStore() {
379
+ const store = (0, import_vanilla2.createStore)(() => ({
380
+ stack: []
381
+ }));
382
+ const nav = {
383
+ push(entry) {
384
+ store.setState({ stack: [...store.getState().stack, entry] });
412
385
  },
413
- SET_INGEST: {
414
- actions: (0, import_xstate2.assign)(({ event }) => ({ ingestActive: event.active }))
415
- }
416
- },
417
- states: {
418
- idle: {
419
- entry: (0, import_xstate2.assign)({ stack: [] }),
420
- on: {
421
- TOGGLE_INSPECTOR: { target: "inspecting" },
422
- OPEN_PALETTE: { target: "palette" },
423
- PUSH_VIEW: {
424
- target: "viewing",
425
- actions: (0, import_xstate2.assign)(({ event }) => ({ stack: [event.entry] }))
426
- },
427
- ESC: {
428
- guard: "hasPinnedHighlight",
429
- actions: [
430
- (0, import_xstate2.assign)({ pinnedHighlight: null }),
431
- (0, import_xstate2.sendTo)("highlight", { type: "UNPIN" })
432
- ]
433
- }
386
+ pop() {
387
+ const s = store.getState().stack;
388
+ if (s.length <= 1) {
389
+ store.setState({ stack: [] });
390
+ } else {
391
+ store.setState({ stack: s.slice(0, -1) });
434
392
  }
435
393
  },
436
- inspecting: {
437
- entry: { type: "mountInspector" },
438
- exit: { type: "destroyInspector" },
439
- on: {
440
- SELECT: {
441
- target: "viewing",
442
- actions: (0, import_xstate2.assign)(({ context, event }) => ({
443
- selection: event.ref,
444
- stack: [...context.stack, event.entry]
445
- }))
446
- },
447
- PUSH_VIEW: {
448
- target: "viewing",
449
- actions: (0, import_xstate2.assign)(({ event }) => ({ stack: [event.entry] }))
450
- },
451
- TOGGLE_INSPECTOR: { target: "idle" },
452
- OPEN_PALETTE: { target: "palette" },
453
- ESC: { target: "idle" }
394
+ replace(entry) {
395
+ const s = store.getState().stack;
396
+ if (s.length === 0) {
397
+ store.setState({ stack: [entry] });
398
+ } else {
399
+ store.setState({ stack: [...s.slice(0, -1), entry] });
454
400
  }
455
401
  },
456
- palette: {
457
- entry: (0, import_xstate2.assign)({ stack: [{ id: "command-palette", ref: null }] }),
458
- on: {
459
- PUSH_VIEW: {
460
- target: "viewing",
461
- actions: (0, import_xstate2.assign)(({ context, event }) => ({
462
- stack: [...context.stack, event.entry]
463
- }))
464
- },
465
- CLOSE: { target: "idle" },
466
- ESC: { target: "idle" },
467
- CMD_K: [
468
- {
469
- guard: "hasActions",
470
- actions: { type: "openActionsPopup" }
471
- },
472
- { target: "idle" }
473
- ]
474
- }
402
+ clear() {
403
+ store.setState({ stack: [] });
475
404
  },
476
- viewing: {
477
- on: {
478
- PUSH_VIEW: {
479
- actions: (0, import_xstate2.assign)(({ context, event }) => ({
480
- stack: [...context.stack, event.entry]
481
- }))
482
- },
483
- POP_VIEW: [
484
- {
485
- guard: "stackDeeperThanTwo",
486
- actions: (0, import_xstate2.assign)(({ context }) => ({
487
- stack: context.stack.slice(0, -1)
488
- }))
489
- },
490
- {
491
- guard: "paletteAtBottomDepthTwo",
492
- target: "palette"
493
- },
494
- {
495
- guard: "stackEqualsTwo",
496
- actions: (0, import_xstate2.assign)(({ context }) => ({
497
- stack: context.stack.slice(0, -1)
498
- }))
499
- },
500
- {
501
- guard: "stackEqualsOne",
502
- target: "idle"
503
- }
504
- ],
505
- CLOSE: { target: "idle" },
506
- ESC: [
507
- {
508
- guard: "popupOpen",
509
- actions: { type: "closePopup" }
510
- },
511
- {
512
- guard: "stackDeeperThanTwo",
513
- actions: (0, import_xstate2.assign)(({ context }) => ({
514
- stack: context.stack.slice(0, -1)
515
- }))
516
- },
517
- {
518
- guard: "paletteAtBottomDepthTwo",
519
- target: "palette"
520
- },
521
- {
522
- guard: "stackEqualsTwo",
523
- actions: (0, import_xstate2.assign)(({ context }) => ({
524
- stack: context.stack.slice(0, -1)
525
- }))
526
- },
527
- {
528
- guard: "stackEqualsOne",
529
- target: "idle"
530
- }
531
- ]
532
- }
405
+ reset(stack) {
406
+ store.setState({ stack });
533
407
  }
534
- }
535
- });
408
+ };
409
+ const navStore = store;
410
+ navStore.nav = nav;
411
+ return navStore;
412
+ }
536
413
 
537
- // src/session/store.ts
414
+ // src/browser/session/store.ts
538
415
  var defaultSnapshot = {
539
416
  hover: null,
540
417
  selection: null,
@@ -543,7 +420,8 @@ var defaultSnapshot = {
543
420
  inspectorActive: false,
544
421
  theme: "auto",
545
422
  resolvedTheme: "light",
546
- ingestActive: false
423
+ ingestActive: false,
424
+ user: null
547
425
  };
548
426
  function resolveTheme(preference, detect) {
549
427
  if (preference !== "auto") return preference;
@@ -554,197 +432,188 @@ function resolveTheme(preference, detect) {
554
432
  }
555
433
  return "light";
556
434
  }
557
- function projectFromActor(actor) {
558
- const sn = actor.getSnapshot();
559
- const child = sn.children.highlight;
560
- const childSnapshot = child?.getSnapshot();
561
- const pinned = childSnapshot && childSnapshot.value === "pinned" ? childSnapshot.context.pinnedRef : null;
562
- return {
563
- hover: sn.context.hover,
564
- selection: sn.context.selection,
565
- stack: sn.context.stack,
566
- pinnedHighlight: pinned,
567
- inspectorActive: sn.matches("inspecting"),
568
- theme: sn.context.theme,
569
- resolvedTheme: sn.context.resolvedTheme,
570
- ingestActive: sn.context.ingestActive
571
- };
572
- }
573
435
  function createSession(options = {}) {
574
- const { detectTheme, bindings, ...overrides } = options;
436
+ const {
437
+ detectTheme,
438
+ onMountInspector,
439
+ onDestroyInspector,
440
+ onShowOverlay,
441
+ onHideOverlay,
442
+ onUpdateOverlay,
443
+ ...overrides
444
+ } = options;
575
445
  const initialPref = overrides.theme ?? defaultSnapshot.theme;
576
446
  const initialResolved = overrides.resolvedTheme ?? resolveTheme(initialPref, detectTheme);
577
447
  const initialStack = overrides.stack ?? [];
578
- const input = {
448
+ const nav = createNavigationStore();
449
+ const modeStore = createModeStore({
450
+ nav,
451
+ bindings: {
452
+ mountInspector: onMountInspector,
453
+ destroyInspector: onDestroyInspector
454
+ }
455
+ });
456
+ let highlightMode = "none";
457
+ const hlCtx = {
458
+ ref: null,
459
+ element: null,
460
+ pinnedRef: null,
461
+ color: null
462
+ };
463
+ const highlightActions = {
464
+ hover(ref, element, color) {
465
+ hlCtx.ref = ref;
466
+ hlCtx.element = element ?? null;
467
+ hlCtx.color = color ?? null;
468
+ if (highlightMode === "none") {
469
+ highlightMode = "transient";
470
+ onShowOverlay?.(hlCtx);
471
+ } else if (highlightMode === "transient") {
472
+ onUpdateOverlay?.(hlCtx);
473
+ }
474
+ store.setState({ hover: ref });
475
+ },
476
+ unhover() {
477
+ if (highlightMode === "transient") {
478
+ highlightMode = "none";
479
+ hlCtx.ref = null;
480
+ hlCtx.element = null;
481
+ hlCtx.color = null;
482
+ onHideOverlay?.();
483
+ }
484
+ store.setState({ hover: null });
485
+ },
486
+ pin(ref) {
487
+ const pinRef = ref ?? hlCtx.ref;
488
+ hlCtx.pinnedRef = pinRef;
489
+ if (highlightMode === "none") {
490
+ hlCtx.ref = pinRef;
491
+ }
492
+ if (highlightMode !== "pinned") {
493
+ highlightMode = "pinned";
494
+ onShowOverlay?.(hlCtx);
495
+ }
496
+ store.setState({ pinnedHighlight: hlCtx.pinnedRef });
497
+ },
498
+ unpin() {
499
+ if (highlightMode === "pinned") {
500
+ highlightMode = "none";
501
+ hlCtx.ref = null;
502
+ hlCtx.element = null;
503
+ hlCtx.pinnedRef = null;
504
+ hlCtx.color = null;
505
+ onHideOverlay?.();
506
+ }
507
+ store.setState({ pinnedHighlight: null });
508
+ }
509
+ };
510
+ const store = (0, import_vanilla3.createStore)(() => ({
511
+ ...defaultSnapshot,
579
512
  hover: overrides.hover ?? null,
580
513
  selection: overrides.selection ?? null,
514
+ stack: [],
581
515
  pinnedHighlight: null,
516
+ inspectorActive: false,
582
517
  theme: initialPref,
583
518
  resolvedTheme: initialResolved,
584
- ingestActive: overrides.ingestActive ?? false
585
- };
586
- const providedHighlight = highlightMachine.provide({
587
- actions: {
588
- showOverlay: ({ context }) => bindings?.highlight?.showOverlay?.(context),
589
- hideOverlay: () => bindings?.highlight?.hideOverlay?.(),
590
- updateOverlay: ({ context }) => bindings?.highlight?.updateOverlay?.(context)
519
+ ingestActive: overrides.ingestActive ?? false,
520
+ user: overrides.user ?? null
521
+ }));
522
+ nav.subscribe(() => {
523
+ const { stack } = nav.getState();
524
+ if (store.getState().stack !== stack) {
525
+ store.setState({ stack });
591
526
  }
592
527
  });
593
- const providedSurface = surfaceMachine.provide({
594
- actions: {
595
- mountInspector: () => bindings?.surface?.mountInspector?.(),
596
- destroyInspector: () => bindings?.surface?.destroyInspector?.(),
597
- openActionsPopup: () => bindings?.surface?.openActionsPopup?.(),
598
- closePopup: () => bindings?.surface?.closePopup?.()
599
- },
600
- actors: {
601
- highlight: providedHighlight
528
+ modeStore.subscribe(() => {
529
+ const { inspectorActive } = modeStore.getState();
530
+ if (store.getState().inspectorActive !== inspectorActive) {
531
+ store.setState({ inspectorActive });
602
532
  }
603
533
  });
604
- const actor = (0, import_xstate3.createActor)(providedSurface, { input });
605
- actor.start();
534
+ const session = store;
535
+ session.nav = nav;
536
+ session.mode = modeStore;
537
+ session.highlight = highlightActions;
538
+ session.select = (ref) => {
539
+ if (sameRef(store.getState().selection, ref)) return;
540
+ store.setState({ selection: ref });
541
+ };
542
+ session.setTheme = (theme, resolved) => {
543
+ const state = store.getState();
544
+ const nextResolved = resolved ?? resolveTheme(theme, detectTheme);
545
+ if (state.theme === theme && state.resolvedTheme === nextResolved) return;
546
+ store.setState({ theme, resolvedTheme: nextResolved });
547
+ };
548
+ session.setIngest = (active) => {
549
+ if (store.getState().ingestActive === active) return;
550
+ store.setState({ ingestActive: active });
551
+ };
606
552
  if (initialStack.length > 0) {
607
- actor.send({ type: "OPEN_PALETTE" });
553
+ modeStore.transition.openPalette();
608
554
  for (let i = 1; i < initialStack.length; i++) {
609
- actor.send({ type: "PUSH_VIEW", entry: initialStack[i] });
555
+ modeStore.transition.pushView(initialStack[i]);
610
556
  }
611
557
  } else if (overrides.inspectorActive) {
612
- actor.send({ type: "TOGGLE_INSPECTOR" });
558
+ modeStore.transition.openInspector();
613
559
  }
614
560
  if (overrides.pinnedHighlight) {
615
- actor.send({ type: "PIN", ref: overrides.pinnedHighlight });
616
- }
617
- const store = (0, import_vanilla.createStore)((_set, get) => ({
618
- ...projectFromActor(actor),
619
- actions: {
620
- hover(ref) {
621
- if (sameRef(get().hover, ref)) return;
622
- if (ref === null) {
623
- actor.send({ type: "UNHOVER" });
624
- } else {
625
- actor.send({ type: "HOVER", ref, element: null });
626
- }
627
- },
628
- select(ref) {
629
- if (sameRef(get().selection, ref)) return;
630
- actor.send({ type: "SET_SELECTION", ref });
631
- },
632
- pushStack(entry) {
633
- if (entry.id === "command-palette" && get().stack.length === 0) {
634
- actor.send({ type: "OPEN_PALETTE" });
635
- } else {
636
- actor.send({ type: "PUSH_VIEW", entry });
637
- }
638
- },
639
- popStack() {
640
- const sn = actor.getSnapshot();
641
- if (sn.matches("palette")) {
642
- actor.send({ type: "ESC" });
643
- } else if (sn.matches("viewing")) {
644
- actor.send({ type: "POP_VIEW" });
645
- }
646
- },
647
- clearStack() {
648
- if (get().stack.length === 0) return;
649
- actor.send({ type: "CLOSE" });
650
- },
651
- openView(id, ref) {
652
- const resolvedRef = ref === void 0 ? get().selection : ref;
653
- get().actions.pushStack({ id, ref: resolvedRef });
654
- },
655
- closeView() {
656
- get().actions.clearStack();
657
- },
658
- setInspectorActive(active) {
659
- if (get().inspectorActive === active) return;
660
- actor.send({ type: "TOGGLE_INSPECTOR" });
661
- },
662
- toggleInspector() {
663
- actor.send({ type: "TOGGLE_INSPECTOR" });
664
- },
665
- pinHighlight(ref) {
666
- if (sameRef(get().pinnedHighlight, ref)) return;
667
- actor.send({ type: "PIN", ref });
668
- },
669
- clearPinnedHighlight() {
670
- if (get().pinnedHighlight === null) return;
671
- actor.send({ type: "UNPIN" });
672
- },
673
- setTheme(theme, resolved) {
674
- const state = get();
675
- const nextResolved = resolved ?? resolveTheme(theme, detectTheme);
676
- if (state.theme === theme && state.resolvedTheme === nextResolved)
677
- return;
678
- actor.send({ type: "SET_THEME", theme, resolvedTheme: nextResolved });
679
- },
680
- setIngest(active) {
681
- if (get().ingestActive === active) return;
682
- actor.send({ type: "SET_INGEST", active });
683
- }
684
- }
685
- }));
686
- const projectAndSet = () => {
687
- const next = projectFromActor(actor);
688
- const prev = store.getState();
689
- const updates = {};
690
- if (!sameRef(prev.hover, next.hover)) updates.hover = next.hover;
691
- if (!sameRef(prev.selection, next.selection))
692
- updates.selection = next.selection;
693
- if (prev.stack !== next.stack) updates.stack = next.stack;
694
- if (!sameRef(prev.pinnedHighlight, next.pinnedHighlight))
695
- updates.pinnedHighlight = next.pinnedHighlight;
696
- if (prev.inspectorActive !== next.inspectorActive)
697
- updates.inspectorActive = next.inspectorActive;
698
- if (prev.theme !== next.theme) updates.theme = next.theme;
699
- if (prev.resolvedTheme !== next.resolvedTheme)
700
- updates.resolvedTheme = next.resolvedTheme;
701
- if (prev.ingestActive !== next.ingestActive)
702
- updates.ingestActive = next.ingestActive;
703
- if (Object.keys(updates).length === 0) return;
704
- store.setState(updates);
705
- };
706
- actor.subscribe(projectAndSet);
707
- const session = store;
708
- session.send = (event) => actor.send(event);
561
+ highlightActions.pin(overrides.pinnedHighlight);
562
+ }
709
563
  return session;
710
564
  }
711
565
 
712
- // src/styles/tailwind.built.css
566
+ // src/browser/styles/tailwind.built.css
713
567
  var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */
714
568
  @layer properties;
715
569
  @layer theme, base, components, utilities;
716
570
  @layer theme {
717
571
  :root, :host {
572
+ --font-sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
573
+ Roboto, sans-serif;
718
574
  --color-red-400: oklch(70.4% 0.191 22.216);
719
575
  --color-red-500: oklch(63.7% 0.237 25.331);
720
576
  --color-red-700: oklch(50.5% 0.213 27.518);
721
- --color-amber-300: oklch(87.9% 0.169 91.605);
577
+ --color-amber-50: oklch(98.7% 0.022 95.277);
578
+ --color-amber-100: oklch(96.2% 0.059 95.617);
722
579
  --color-amber-400: oklch(82.8% 0.189 84.429);
723
580
  --color-amber-500: oklch(76.9% 0.188 70.08);
581
+ --color-amber-600: oklch(66.6% 0.179 58.318);
724
582
  --color-amber-700: oklch(55.5% 0.163 48.998);
725
- --color-emerald-300: oklch(84.5% 0.143 164.978);
583
+ --color-amber-800: oklch(47.3% 0.137 46.201);
584
+ --color-emerald-50: oklch(97.9% 0.021 166.113);
585
+ --color-emerald-100: oklch(95% 0.052 163.051);
726
586
  --color-emerald-400: oklch(76.5% 0.177 163.223);
727
587
  --color-emerald-500: oklch(69.6% 0.17 162.48);
588
+ --color-emerald-600: oklch(59.6% 0.145 163.225);
728
589
  --color-emerald-700: oklch(50.8% 0.118 165.612);
729
- --color-cyan-300: oklch(86.5% 0.127 207.078);
590
+ --color-cyan-50: oklch(98.4% 0.019 200.873);
591
+ --color-cyan-100: oklch(95.6% 0.045 203.388);
730
592
  --color-cyan-400: oklch(78.9% 0.154 211.53);
731
593
  --color-cyan-700: oklch(52% 0.105 223.128);
732
- --color-blue-300: oklch(80.9% 0.105 251.813);
594
+ --color-blue-50: oklch(97% 0.014 254.604);
595
+ --color-blue-100: oklch(93.2% 0.032 255.585);
733
596
  --color-blue-400: oklch(70.7% 0.165 254.624);
734
597
  --color-blue-500: oklch(62.3% 0.214 259.815);
735
598
  --color-blue-700: oklch(48.8% 0.243 264.376);
736
- --color-violet-300: oklch(81.1% 0.111 293.571);
599
+ --color-violet-50: oklch(96.9% 0.016 293.756);
600
+ --color-violet-100: oklch(94.3% 0.029 294.588);
737
601
  --color-violet-400: oklch(70.2% 0.183 293.541);
738
602
  --color-violet-700: oklch(49.1% 0.27 292.581);
739
- --color-fuchsia-300: oklch(83.3% 0.145 321.434);
603
+ --color-fuchsia-50: oklch(97.7% 0.017 320.058);
604
+ --color-fuchsia-100: oklch(95.2% 0.037 318.852);
740
605
  --color-fuchsia-400: oklch(74% 0.238 322.16);
741
606
  --color-fuchsia-700: oklch(51.8% 0.253 323.949);
742
- --color-rose-300: oklch(81% 0.117 11.638);
607
+ --color-rose-50: oklch(96.9% 0.015 12.422);
608
+ --color-rose-100: oklch(94.1% 0.03 12.58);
743
609
  --color-rose-400: oklch(71.2% 0.194 13.428);
610
+ --color-rose-600: oklch(58.6% 0.253 17.585);
744
611
  --color-rose-700: oklch(51.4% 0.222 16.935);
745
- --color-slate-300: oklch(86.9% 0.022 252.894);
612
+ --color-slate-50: oklch(98.4% 0.003 247.858);
613
+ --color-slate-100: oklch(96.8% 0.007 247.896);
746
614
  --color-slate-400: oklch(70.4% 0.04 256.788);
747
- --color-slate-700: oklch(37.2% 0.044 257.287);
615
+ --color-slate-500: oklch(55.4% 0.046 257.417);
616
+ --color-slate-600: oklch(44.6% 0.043 257.281);
748
617
  --color-neutral-50: oklch(98.5% 0 0);
749
618
  --color-neutral-100: oklch(97% 0 0);
750
619
  --color-neutral-400: oklch(70.8% 0 0);
@@ -754,6 +623,7 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
754
623
  --color-black: #000;
755
624
  --color-white: #fff;
756
625
  --spacing: 0.25rem;
626
+ --container-sm: 24rem;
757
627
  --container-xl: 36rem;
758
628
  --text-xs: 0.75rem;
759
629
  --text-xs--line-height: calc(1 / 0.75);
@@ -761,20 +631,28 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
761
631
  --text-sm--line-height: calc(1.25 / 0.875);
762
632
  --text-base: 1rem;
763
633
  --text-base--line-height: calc(1.5 / 1);
634
+ --text-xl: 1.25rem;
635
+ --text-xl--line-height: calc(1.75 / 1.25);
764
636
  --font-weight-normal: 400;
765
637
  --font-weight-medium: 500;
766
638
  --font-weight-semibold: 600;
639
+ --font-weight-bold: 700;
640
+ --tracking-tight: -0.025em;
767
641
  --tracking-widest: 0.1em;
768
642
  --leading-relaxed: 1.625;
643
+ --radius-md: calc(var(--radius) * 0.8);
644
+ --radius-lg: var(--radius);
769
645
  --radius-xl: calc(var(--radius) * 1.4);
770
646
  --radius-2xl: calc(var(--radius) * 1.8);
771
647
  --ease-out: cubic-bezier(0, 0, 0.2, 1);
648
+ --animate-spin: spin 1s linear infinite;
772
649
  --blur-sm: 8px;
773
650
  --default-transition-duration: 150ms;
774
651
  --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
775
652
  --default-font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
776
653
  Roboto, sans-serif;
777
654
  --default-mono-font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
655
+ --color-muted: var(--muted);
778
656
  --color-border: var(--border);
779
657
  }
780
658
  }
@@ -930,6 +808,12 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
930
808
  .pointer-events-none {
931
809
  pointer-events: none;
932
810
  }
811
+ .\\!visible {
812
+ visibility: visible !important;
813
+ }
814
+ .collapse {
815
+ visibility: collapse;
816
+ }
933
817
  .invisible {
934
818
  visibility: hidden;
935
819
  }
@@ -965,18 +849,33 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
965
849
  .end {
966
850
  inset-inline-end: var(--spacing);
967
851
  }
852
+ .-top-1 {
853
+ top: calc(var(--spacing) * -1);
854
+ }
855
+ .-right-1 {
856
+ right: calc(var(--spacing) * -1);
857
+ }
858
+ .right-0 {
859
+ right: calc(var(--spacing) * 0);
860
+ }
968
861
  .right-2 {
969
862
  right: calc(var(--spacing) * 2);
970
863
  }
971
- .right-3 {
972
- right: calc(var(--spacing) * 3);
864
+ .bottom-full {
865
+ bottom: 100%;
866
+ }
867
+ .bottom-px {
868
+ bottom: 1px;
973
869
  }
974
- .bottom-12 {
975
- bottom: calc(var(--spacing) * 12);
870
+ .z-1 {
871
+ z-index: 1;
976
872
  }
977
873
  .z-10 {
978
874
  z-index: 10;
979
875
  }
876
+ .z-\\[2147483647\\] {
877
+ z-index: 2147483647;
878
+ }
980
879
  .container {
981
880
  width: 100%;
982
881
  @media (width >= 40rem) {
@@ -1013,6 +912,12 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1013
912
  .mt-1 {
1014
913
  margin-top: calc(var(--spacing) * 1);
1015
914
  }
915
+ .mb-2 {
916
+ margin-bottom: calc(var(--spacing) * 2);
917
+ }
918
+ .mb-6 {
919
+ margin-bottom: calc(var(--spacing) * 6);
920
+ }
1016
921
  .ml-auto {
1017
922
  margin-left: auto;
1018
923
  }
@@ -1043,6 +948,14 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1043
948
  .table {
1044
949
  display: table;
1045
950
  }
951
+ .size-2 {
952
+ width: calc(var(--spacing) * 2);
953
+ height: calc(var(--spacing) * 2);
954
+ }
955
+ .size-3 {
956
+ width: calc(var(--spacing) * 3);
957
+ height: calc(var(--spacing) * 3);
958
+ }
1046
959
  .size-3\\.5 {
1047
960
  width: calc(var(--spacing) * 3.5);
1048
961
  height: calc(var(--spacing) * 3.5);
@@ -1109,6 +1022,12 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1109
1022
  .h-px {
1110
1023
  height: 1px;
1111
1024
  }
1025
+ .max-h-32 {
1026
+ max-height: calc(var(--spacing) * 32);
1027
+ }
1028
+ .max-h-full {
1029
+ max-height: 100%;
1030
+ }
1112
1031
  .min-h-0 {
1113
1032
  min-height: calc(var(--spacing) * 0);
1114
1033
  }
@@ -1127,6 +1046,12 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1127
1046
  .w-4 {
1128
1047
  width: calc(var(--spacing) * 4);
1129
1048
  }
1049
+ .w-20 {
1050
+ width: calc(var(--spacing) * 20);
1051
+ }
1052
+ .w-36 {
1053
+ width: calc(var(--spacing) * 36);
1054
+ }
1130
1055
  .w-56 {
1131
1056
  width: calc(var(--spacing) * 56);
1132
1057
  }
@@ -1139,6 +1064,12 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1139
1064
  .w-px {
1140
1065
  width: 1px;
1141
1066
  }
1067
+ .max-w-full {
1068
+ max-width: 100%;
1069
+ }
1070
+ .max-w-sm {
1071
+ max-width: var(--container-sm);
1072
+ }
1142
1073
  .max-w-xl {
1143
1074
  max-width: var(--container-xl);
1144
1075
  }
@@ -1166,9 +1097,41 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1166
1097
  .shrink-0 {
1167
1098
  flex-shrink: 0;
1168
1099
  }
1100
+ .origin-bottom-left {
1101
+ transform-origin: 0 100%;
1102
+ }
1103
+ .origin-bottom-right {
1104
+ transform-origin: 100% 100%;
1105
+ }
1106
+ .-translate-x-0\\.5 {
1107
+ --tw-translate-x: calc(var(--spacing) * -0.5);
1108
+ translate: var(--tw-translate-x) var(--tw-translate-y);
1109
+ }
1110
+ .translate-x-0\\.5 {
1111
+ --tw-translate-x: calc(var(--spacing) * 0.5);
1112
+ translate: var(--tw-translate-x) var(--tw-translate-y);
1113
+ }
1114
+ .scale-84 {
1115
+ --tw-scale-x: 84%;
1116
+ --tw-scale-y: 84%;
1117
+ --tw-scale-z: 84%;
1118
+ scale: var(--tw-scale-x) var(--tw-scale-y);
1119
+ }
1120
+ .-rotate-10 {
1121
+ rotate: calc(10deg * -1);
1122
+ }
1123
+ .rotate-10 {
1124
+ rotate: 10deg;
1125
+ }
1169
1126
  .transform {
1170
1127
  transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);
1171
1128
  }
1129
+ .animate-skeleton {
1130
+ animation: skeleton 2s -1s infinite linear;
1131
+ }
1132
+ .animate-spin {
1133
+ animation: var(--animate-spin);
1134
+ }
1172
1135
  .cursor-default {
1173
1136
  cursor: default;
1174
1137
  }
@@ -1193,9 +1156,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1193
1156
  .flex-row {
1194
1157
  flex-direction: row;
1195
1158
  }
1196
- .flex-wrap {
1197
- flex-wrap: wrap;
1198
- }
1199
1159
  .items-center {
1200
1160
  align-items: center;
1201
1161
  }
@@ -1214,6 +1174,9 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1214
1174
  .gap-0 {
1215
1175
  gap: calc(var(--spacing) * 0);
1216
1176
  }
1177
+ .gap-0\\.5 {
1178
+ gap: calc(var(--spacing) * 0.5);
1179
+ }
1217
1180
  .gap-1 {
1218
1181
  gap: calc(var(--spacing) * 1);
1219
1182
  }
@@ -1229,6 +1192,9 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1229
1192
  .gap-4 {
1230
1193
  gap: calc(var(--spacing) * 4);
1231
1194
  }
1195
+ .gap-6 {
1196
+ gap: calc(var(--spacing) * 6);
1197
+ }
1232
1198
  .self-start {
1233
1199
  align-self: flex-start;
1234
1200
  }
@@ -1249,6 +1215,9 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1249
1215
  .rounded-\\[0\\.25rem\\] {
1250
1216
  border-radius: 0.25rem;
1251
1217
  }
1218
+ .rounded-full {
1219
+ border-radius: calc(infinity * 1px);
1220
+ }
1252
1221
  .rounded-lg {
1253
1222
  border-radius: var(--radius);
1254
1223
  }
@@ -1258,6 +1227,9 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1258
1227
  .rounded-sm {
1259
1228
  border-radius: calc(var(--radius) * 0.6);
1260
1229
  }
1230
+ .rounded-xl {
1231
+ border-radius: calc(var(--radius) * 1.4);
1232
+ }
1261
1233
  .rounded-t-xl {
1262
1234
  border-top-left-radius: calc(var(--radius) * 1.4);
1263
1235
  border-top-right-radius: calc(var(--radius) * 1.4);
@@ -1278,12 +1250,24 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1278
1250
  border-bottom-style: var(--tw-border-style);
1279
1251
  border-bottom-width: 0px;
1280
1252
  }
1253
+ .border-amber-500\\/40 {
1254
+ border-color: color-mix(in srgb, oklch(76.9% 0.188 70.08) 40%, transparent);
1255
+ @supports (color: color-mix(in lab, red, red)) {
1256
+ border-color: color-mix(in oklab, var(--color-amber-500) 40%, transparent);
1257
+ }
1258
+ }
1281
1259
  .border-border {
1282
1260
  border-color: var(--border);
1283
1261
  }
1284
1262
  .border-destructive {
1285
1263
  border-color: var(--destructive);
1286
1264
  }
1265
+ .border-info\\/40 {
1266
+ border-color: var(--info);
1267
+ @supports (color: color-mix(in lab, red, red)) {
1268
+ border-color: color-mix(in oklab, var(--info) 40%, transparent);
1269
+ }
1270
+ }
1287
1271
  .border-input {
1288
1272
  border-color: var(--input);
1289
1273
  }
@@ -1293,10 +1277,13 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1293
1277
  .border-transparent {
1294
1278
  border-color: transparent;
1295
1279
  }
1296
- .bg-amber-400\\/20 {
1297
- background-color: color-mix(in srgb, oklch(82.8% 0.189 84.429) 20%, transparent);
1280
+ .bg-amber-50 {
1281
+ background-color: var(--color-amber-50);
1282
+ }
1283
+ .bg-amber-500\\/15 {
1284
+ background-color: color-mix(in srgb, oklch(76.9% 0.188 70.08) 15%, transparent);
1298
1285
  @supports (color: color-mix(in lab, red, red)) {
1299
- background-color: color-mix(in oklab, var(--color-amber-400) 20%, transparent);
1286
+ background-color: color-mix(in oklab, var(--color-amber-500) 15%, transparent);
1300
1287
  }
1301
1288
  }
1302
1289
  .bg-background {
@@ -1308,20 +1295,23 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1308
1295
  background-color: color-mix(in oklab, var(--color-black) 32%, transparent);
1309
1296
  }
1310
1297
  }
1311
- .bg-blue-400\\/20 {
1312
- background-color: color-mix(in srgb, oklch(70.7% 0.165 254.624) 20%, transparent);
1298
+ .bg-black\\/80 {
1299
+ background-color: color-mix(in srgb, #000 80%, transparent);
1313
1300
  @supports (color: color-mix(in lab, red, red)) {
1314
- background-color: color-mix(in oklab, var(--color-blue-400) 20%, transparent);
1301
+ background-color: color-mix(in oklab, var(--color-black) 80%, transparent);
1315
1302
  }
1316
1303
  }
1304
+ .bg-blue-50 {
1305
+ background-color: var(--color-blue-50);
1306
+ }
1317
1307
  .bg-border {
1318
1308
  background-color: var(--border);
1319
1309
  }
1320
- .bg-cyan-400\\/20 {
1321
- background-color: color-mix(in srgb, oklch(78.9% 0.154 211.53) 20%, transparent);
1322
- @supports (color: color-mix(in lab, red, red)) {
1323
- background-color: color-mix(in oklab, var(--color-cyan-400) 20%, transparent);
1324
- }
1310
+ .bg-card {
1311
+ background-color: var(--card);
1312
+ }
1313
+ .bg-cyan-50 {
1314
+ background-color: var(--color-cyan-50);
1325
1315
  }
1326
1316
  .bg-destructive {
1327
1317
  background-color: var(--destructive);
@@ -1332,17 +1322,17 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1332
1322
  background-color: color-mix(in oklab, var(--destructive) 10%, transparent);
1333
1323
  }
1334
1324
  }
1335
- .bg-emerald-400\\/20 {
1336
- background-color: color-mix(in srgb, oklch(76.5% 0.177 163.223) 20%, transparent);
1337
- @supports (color: color-mix(in lab, red, red)) {
1338
- background-color: color-mix(in oklab, var(--color-emerald-400) 20%, transparent);
1339
- }
1325
+ .bg-emerald-50 {
1326
+ background-color: var(--color-emerald-50);
1340
1327
  }
1341
- .bg-fuchsia-400\\/20 {
1342
- background-color: color-mix(in srgb, oklch(74% 0.238 322.16) 20%, transparent);
1343
- @supports (color: color-mix(in lab, red, red)) {
1344
- background-color: color-mix(in oklab, var(--color-fuchsia-400) 20%, transparent);
1345
- }
1328
+ .bg-emerald-500 {
1329
+ background-color: var(--color-emerald-500);
1330
+ }
1331
+ .bg-fuchsia-50 {
1332
+ background-color: var(--color-fuchsia-50);
1333
+ }
1334
+ .bg-info {
1335
+ background-color: var(--info);
1346
1336
  }
1347
1337
  .bg-info\\/10 {
1348
1338
  background-color: var(--info);
@@ -1350,6 +1340,12 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1350
1340
  background-color: color-mix(in oklab, var(--info) 10%, transparent);
1351
1341
  }
1352
1342
  }
1343
+ .bg-info\\/15 {
1344
+ background-color: var(--info);
1345
+ @supports (color: color-mix(in lab, red, red)) {
1346
+ background-color: color-mix(in oklab, var(--info) 15%, transparent);
1347
+ }
1348
+ }
1353
1349
  .bg-muted {
1354
1350
  background-color: var(--muted);
1355
1351
  }
@@ -1359,20 +1355,14 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1359
1355
  .bg-primary {
1360
1356
  background-color: var(--primary);
1361
1357
  }
1362
- .bg-rose-400\\/20 {
1363
- background-color: color-mix(in srgb, oklch(71.2% 0.194 13.428) 20%, transparent);
1364
- @supports (color: color-mix(in lab, red, red)) {
1365
- background-color: color-mix(in oklab, var(--color-rose-400) 20%, transparent);
1366
- }
1358
+ .bg-rose-50 {
1359
+ background-color: var(--color-rose-50);
1367
1360
  }
1368
1361
  .bg-secondary {
1369
1362
  background-color: var(--secondary);
1370
1363
  }
1371
- .bg-slate-400\\/20 {
1372
- background-color: color-mix(in srgb, oklch(70.4% 0.04 256.788) 20%, transparent);
1373
- @supports (color: color-mix(in lab, red, red)) {
1374
- background-color: color-mix(in oklab, var(--color-slate-400) 20%, transparent);
1375
- }
1364
+ .bg-slate-50 {
1365
+ background-color: var(--color-slate-50);
1376
1366
  }
1377
1367
  .bg-success\\/10 {
1378
1368
  background-color: var(--success);
@@ -1383,11 +1373,8 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1383
1373
  .bg-transparent {
1384
1374
  background-color: transparent;
1385
1375
  }
1386
- .bg-violet-400\\/20 {
1387
- background-color: color-mix(in srgb, oklch(70.2% 0.183 293.541) 20%, transparent);
1388
- @supports (color: color-mix(in lab, red, red)) {
1389
- background-color: color-mix(in oklab, var(--color-violet-400) 20%, transparent);
1390
- }
1376
+ .bg-violet-50 {
1377
+ background-color: var(--color-violet-50);
1391
1378
  }
1392
1379
  .bg-warning\\/10 {
1393
1380
  background-color: var(--warning);
@@ -1404,15 +1391,27 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1404
1391
  .bg-no-repeat {
1405
1392
  background-repeat: no-repeat;
1406
1393
  }
1394
+ .object-cover {
1395
+ object-fit: cover;
1396
+ }
1397
+ .object-top {
1398
+ object-position: top;
1399
+ }
1407
1400
  .p-1 {
1408
1401
  padding: calc(var(--spacing) * 1);
1409
1402
  }
1403
+ .p-1\\.5 {
1404
+ padding: calc(var(--spacing) * 1.5);
1405
+ }
1410
1406
  .p-2 {
1411
1407
  padding: calc(var(--spacing) * 2);
1412
1408
  }
1413
1409
  .p-4 {
1414
1410
  padding: calc(var(--spacing) * 4);
1415
1411
  }
1412
+ .p-6 {
1413
+ padding: calc(var(--spacing) * 6);
1414
+ }
1416
1415
  .px-0 {
1417
1416
  padding-inline: calc(var(--spacing) * 0);
1418
1417
  }
@@ -1437,8 +1436,8 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1437
1436
  .px-4 {
1438
1437
  padding-inline: calc(var(--spacing) * 4);
1439
1438
  }
1440
- .px-5 {
1441
- padding-inline: calc(var(--spacing) * 5);
1439
+ .px-6 {
1440
+ padding-inline: calc(var(--spacing) * 6);
1442
1441
  }
1443
1442
  .py-0 {
1444
1443
  padding-block: calc(var(--spacing) * 0);
@@ -1452,12 +1451,12 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1452
1451
  .py-2 {
1453
1452
  padding-block: calc(var(--spacing) * 2);
1454
1453
  }
1455
- .py-3 {
1456
- padding-block: calc(var(--spacing) * 3);
1457
- }
1458
1454
  .py-4 {
1459
1455
  padding-block: calc(var(--spacing) * 4);
1460
1456
  }
1457
+ .py-12 {
1458
+ padding-block: calc(var(--spacing) * 12);
1459
+ }
1461
1460
  .py-\\[max\\(1rem\\,4vh\\)\\] {
1462
1461
  padding-block: max(1rem, 4vh);
1463
1462
  }
@@ -1467,6 +1466,9 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1467
1466
  .pe-3 {
1468
1467
  padding-inline-end: calc(var(--spacing) * 3);
1469
1468
  }
1469
+ .pt-2 {
1470
+ padding-top: calc(var(--spacing) * 2);
1471
+ }
1470
1472
  .pr-8 {
1471
1473
  padding-right: calc(var(--spacing) * 8);
1472
1474
  }
@@ -1498,6 +1500,10 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1498
1500
  font-size: var(--text-sm);
1499
1501
  line-height: var(--tw-leading, var(--text-sm--line-height));
1500
1502
  }
1503
+ .text-xl {
1504
+ font-size: var(--text-xl);
1505
+ line-height: var(--tw-leading, var(--text-xl--line-height));
1506
+ }
1501
1507
  .text-xs {
1502
1508
  font-size: var(--text-xs);
1503
1509
  line-height: var(--tw-leading, var(--text-xs--line-height));
@@ -1505,10 +1511,27 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1505
1511
  .text-\\[0\\.625rem\\] {
1506
1512
  font-size: 0.625rem;
1507
1513
  }
1514
+ .text-\\[9px\\] {
1515
+ font-size: 9px;
1516
+ }
1517
+ .text-\\[10px\\] {
1518
+ font-size: 10px;
1519
+ }
1520
+ .text-\\[11px\\] {
1521
+ font-size: 11px;
1522
+ }
1523
+ .leading-none {
1524
+ --tw-leading: 1;
1525
+ line-height: 1;
1526
+ }
1508
1527
  .leading-relaxed {
1509
1528
  --tw-leading: var(--leading-relaxed);
1510
1529
  line-height: var(--leading-relaxed);
1511
1530
  }
1531
+ .font-bold {
1532
+ --tw-font-weight: var(--font-weight-bold);
1533
+ font-weight: var(--font-weight-bold);
1534
+ }
1512
1535
  .font-medium {
1513
1536
  --tw-font-weight: var(--font-weight-medium);
1514
1537
  font-weight: var(--font-weight-medium);
@@ -1521,10 +1544,17 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1521
1544
  --tw-font-weight: var(--font-weight-semibold);
1522
1545
  font-weight: var(--font-weight-semibold);
1523
1546
  }
1547
+ .tracking-tight {
1548
+ --tw-tracking: var(--tracking-tight);
1549
+ letter-spacing: var(--tracking-tight);
1550
+ }
1524
1551
  .tracking-widest {
1525
1552
  --tw-tracking: var(--tracking-widest);
1526
1553
  letter-spacing: var(--tracking-widest);
1527
1554
  }
1555
+ .text-balance {
1556
+ text-wrap: balance;
1557
+ }
1528
1558
  .break-words {
1529
1559
  overflow-wrap: break-word;
1530
1560
  }
@@ -1534,15 +1564,24 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1534
1564
  .whitespace-nowrap {
1535
1565
  white-space: nowrap;
1536
1566
  }
1567
+ .text-amber-600 {
1568
+ color: var(--color-amber-600);
1569
+ }
1537
1570
  .text-amber-700 {
1538
1571
  color: var(--color-amber-700);
1539
1572
  }
1573
+ .text-amber-800 {
1574
+ color: var(--color-amber-800);
1575
+ }
1540
1576
  .text-blue-700 {
1541
1577
  color: var(--color-blue-700);
1542
1578
  }
1543
1579
  .text-cyan-700 {
1544
1580
  color: var(--color-cyan-700);
1545
1581
  }
1582
+ .text-destructive {
1583
+ color: var(--destructive);
1584
+ }
1546
1585
  .text-destructive-foreground {
1547
1586
  color: var(--destructive-foreground);
1548
1587
  }
@@ -1579,8 +1618,8 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1579
1618
  .text-secondary-foreground {
1580
1619
  color: var(--secondary-foreground);
1581
1620
  }
1582
- .text-slate-700 {
1583
- color: var(--color-slate-700);
1621
+ .text-slate-600 {
1622
+ color: var(--color-slate-600);
1584
1623
  }
1585
1624
  .text-success-foreground {
1586
1625
  color: var(--success-foreground);
@@ -1597,6 +1636,14 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1597
1636
  .lowercase {
1598
1637
  text-transform: lowercase;
1599
1638
  }
1639
+ .ordinal {
1640
+ --tw-ordinal: ordinal;
1641
+ font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);
1642
+ }
1643
+ .tabular-nums {
1644
+ --tw-numeric-spacing: tabular-nums;
1645
+ font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);
1646
+ }
1600
1647
  .line-through {
1601
1648
  text-decoration-line: line-through;
1602
1649
  }
@@ -1612,6 +1659,9 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1612
1659
  .accent-primary {
1613
1660
  accent-color: var(--primary);
1614
1661
  }
1662
+ .opacity-50 {
1663
+ opacity: 50%;
1664
+ }
1615
1665
  .opacity-80 {
1616
1666
  opacity: 80%;
1617
1667
  }
@@ -1620,6 +1670,11 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1620
1670
  --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%));
1621
1671
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1622
1672
  }
1673
+ .shadow-sm\\/5 {
1674
+ --tw-shadow-alpha: 5%;
1675
+ --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%));
1676
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1677
+ }
1623
1678
  .shadow-xs\\/5 {
1624
1679
  --tw-shadow-alpha: 5%;
1625
1680
  --tw-shadow: 0 1px 2px 0 var(--tw-shadow-color, oklab(from rgb(0 0 0 / 0.05) l a b / 5%));
@@ -1645,6 +1700,58 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1645
1700
  --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
1646
1701
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1647
1702
  }
1703
+ .inset-ring {
1704
+ --tw-inset-ring-shadow: inset 0 0 0 1px var(--tw-inset-ring-color, currentcolor);
1705
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1706
+ }
1707
+ .inset-ring-amber-600\\/20 {
1708
+ --tw-inset-ring-color: color-mix(in srgb, oklch(66.6% 0.179 58.318) 20%, transparent);
1709
+ @supports (color: color-mix(in lab, red, red)) {
1710
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-amber-600) 20%, transparent);
1711
+ }
1712
+ }
1713
+ .inset-ring-blue-700\\/10 {
1714
+ --tw-inset-ring-color: color-mix(in srgb, oklch(48.8% 0.243 264.376) 10%, transparent);
1715
+ @supports (color: color-mix(in lab, red, red)) {
1716
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-blue-700) 10%, transparent);
1717
+ }
1718
+ }
1719
+ .inset-ring-cyan-700\\/10 {
1720
+ --tw-inset-ring-color: color-mix(in srgb, oklch(52% 0.105 223.128) 10%, transparent);
1721
+ @supports (color: color-mix(in lab, red, red)) {
1722
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-cyan-700) 10%, transparent);
1723
+ }
1724
+ }
1725
+ .inset-ring-emerald-600\\/20 {
1726
+ --tw-inset-ring-color: color-mix(in srgb, oklch(59.6% 0.145 163.225) 20%, transparent);
1727
+ @supports (color: color-mix(in lab, red, red)) {
1728
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-emerald-600) 20%, transparent);
1729
+ }
1730
+ }
1731
+ .inset-ring-fuchsia-700\\/10 {
1732
+ --tw-inset-ring-color: color-mix(in srgb, oklch(51.8% 0.253 323.949) 10%, transparent);
1733
+ @supports (color: color-mix(in lab, red, red)) {
1734
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-fuchsia-700) 10%, transparent);
1735
+ }
1736
+ }
1737
+ .inset-ring-rose-600\\/10 {
1738
+ --tw-inset-ring-color: color-mix(in srgb, oklch(58.6% 0.253 17.585) 10%, transparent);
1739
+ @supports (color: color-mix(in lab, red, red)) {
1740
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-rose-600) 10%, transparent);
1741
+ }
1742
+ }
1743
+ .inset-ring-slate-500\\/10 {
1744
+ --tw-inset-ring-color: color-mix(in srgb, oklch(55.4% 0.046 257.417) 10%, transparent);
1745
+ @supports (color: color-mix(in lab, red, red)) {
1746
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-slate-500) 10%, transparent);
1747
+ }
1748
+ }
1749
+ .inset-ring-violet-700\\/10 {
1750
+ --tw-inset-ring-color: color-mix(in srgb, oklch(49.1% 0.27 292.581) 10%, transparent);
1751
+ @supports (color: color-mix(in lab, red, red)) {
1752
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-violet-700) 10%, transparent);
1753
+ }
1754
+ }
1648
1755
  .outline {
1649
1756
  outline-style: var(--tw-outline-style);
1650
1757
  outline-width: 1px;
@@ -1688,76 +1795,61 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1688
1795
  -webkit-user-select: none;
1689
1796
  user-select: none;
1690
1797
  }
1798
+ .\\[--skeleton-highlight\\:--alpha\\(var\\(--color-white\\)\\/64\\%\\)\\] {
1799
+ --skeleton-highlight: color-mix(in srgb, #fff 64%, transparent);
1800
+ @supports (color: color-mix(in lab, red, red)) {
1801
+ --skeleton-highlight: color-mix(in oklab, var(--color-white) 64%, transparent);
1802
+ }
1803
+ }
1804
+ .\\[background\\:linear-gradient\\(120deg\\,transparent_40\\%\\,var\\(--skeleton-highlight\\)\\,transparent_60\\%\\)_var\\(--color-muted\\)_0_0\\/200\\%_100\\%_fixed\\] {
1805
+ background: linear-gradient(120deg,transparent 40%,var(--skeleton-highlight),transparent 60%) var(--color-muted) 0 0/200% 100% fixed;
1806
+ }
1691
1807
  .\\[clip-path\\:inset\\(0_1px\\)\\] {
1692
1808
  clip-path: inset(0 1px);
1693
1809
  }
1694
1810
  .not-dark\\:bg-clip-padding {
1695
- &:not(*:is(.dark *)) {
1811
+ &:not(*:is(.dark *, :host(.dark) *)) {
1696
1812
  background-clip: padding-box;
1697
1813
  }
1698
1814
  }
1699
- .group-data-hover\\:bg-amber-400\\/30 {
1815
+ .group-data-hover\\:bg-amber-100 {
1700
1816
  &:is(:where(.group)[data-hover] *) {
1701
- background-color: color-mix(in srgb, oklch(82.8% 0.189 84.429) 30%, transparent);
1702
- @supports (color: color-mix(in lab, red, red)) {
1703
- background-color: color-mix(in oklab, var(--color-amber-400) 30%, transparent);
1704
- }
1817
+ background-color: var(--color-amber-100);
1705
1818
  }
1706
1819
  }
1707
- .group-data-hover\\:bg-blue-400\\/30 {
1820
+ .group-data-hover\\:bg-blue-100 {
1708
1821
  &:is(:where(.group)[data-hover] *) {
1709
- background-color: color-mix(in srgb, oklch(70.7% 0.165 254.624) 30%, transparent);
1710
- @supports (color: color-mix(in lab, red, red)) {
1711
- background-color: color-mix(in oklab, var(--color-blue-400) 30%, transparent);
1712
- }
1822
+ background-color: var(--color-blue-100);
1713
1823
  }
1714
1824
  }
1715
- .group-data-hover\\:bg-cyan-400\\/30 {
1825
+ .group-data-hover\\:bg-cyan-100 {
1716
1826
  &:is(:where(.group)[data-hover] *) {
1717
- background-color: color-mix(in srgb, oklch(78.9% 0.154 211.53) 30%, transparent);
1718
- @supports (color: color-mix(in lab, red, red)) {
1719
- background-color: color-mix(in oklab, var(--color-cyan-400) 30%, transparent);
1720
- }
1827
+ background-color: var(--color-cyan-100);
1721
1828
  }
1722
1829
  }
1723
- .group-data-hover\\:bg-emerald-400\\/30 {
1830
+ .group-data-hover\\:bg-emerald-100 {
1724
1831
  &:is(:where(.group)[data-hover] *) {
1725
- background-color: color-mix(in srgb, oklch(76.5% 0.177 163.223) 30%, transparent);
1726
- @supports (color: color-mix(in lab, red, red)) {
1727
- background-color: color-mix(in oklab, var(--color-emerald-400) 30%, transparent);
1728
- }
1832
+ background-color: var(--color-emerald-100);
1729
1833
  }
1730
1834
  }
1731
- .group-data-hover\\:bg-fuchsia-400\\/30 {
1835
+ .group-data-hover\\:bg-fuchsia-100 {
1732
1836
  &:is(:where(.group)[data-hover] *) {
1733
- background-color: color-mix(in srgb, oklch(74% 0.238 322.16) 30%, transparent);
1734
- @supports (color: color-mix(in lab, red, red)) {
1735
- background-color: color-mix(in oklab, var(--color-fuchsia-400) 30%, transparent);
1736
- }
1837
+ background-color: var(--color-fuchsia-100);
1737
1838
  }
1738
1839
  }
1739
- .group-data-hover\\:bg-rose-400\\/30 {
1840
+ .group-data-hover\\:bg-rose-100 {
1740
1841
  &:is(:where(.group)[data-hover] *) {
1741
- background-color: color-mix(in srgb, oklch(71.2% 0.194 13.428) 30%, transparent);
1742
- @supports (color: color-mix(in lab, red, red)) {
1743
- background-color: color-mix(in oklab, var(--color-rose-400) 30%, transparent);
1744
- }
1842
+ background-color: var(--color-rose-100);
1745
1843
  }
1746
1844
  }
1747
- .group-data-hover\\:bg-slate-400\\/30 {
1845
+ .group-data-hover\\:bg-slate-100 {
1748
1846
  &:is(:where(.group)[data-hover] *) {
1749
- background-color: color-mix(in srgb, oklch(70.4% 0.04 256.788) 30%, transparent);
1750
- @supports (color: color-mix(in lab, red, red)) {
1751
- background-color: color-mix(in oklab, var(--color-slate-400) 30%, transparent);
1752
- }
1847
+ background-color: var(--color-slate-100);
1753
1848
  }
1754
1849
  }
1755
- .group-data-hover\\:bg-violet-400\\/30 {
1850
+ .group-data-hover\\:bg-violet-100 {
1756
1851
  &:is(:where(.group)[data-hover] *) {
1757
- background-color: color-mix(in srgb, oklch(70.2% 0.183 293.541) 30%, transparent);
1758
- @supports (color: color-mix(in lab, red, red)) {
1759
- background-color: color-mix(in oklab, var(--color-violet-400) 30%, transparent);
1760
- }
1852
+ background-color: var(--color-violet-100);
1761
1853
  }
1762
1854
  }
1763
1855
  .placeholder\\:text-muted-foreground {
@@ -1789,6 +1881,24 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1789
1881
  border-radius: calc(var(--radius-2xl) - 1px);
1790
1882
  }
1791
1883
  }
1884
+ .before\\:rounded-\\[calc\\(var\\(--radius-lg\\)-1px\\)\\] {
1885
+ &::before {
1886
+ content: var(--tw-content);
1887
+ border-radius: calc(var(--radius-lg) - 1px);
1888
+ }
1889
+ }
1890
+ .before\\:rounded-\\[calc\\(var\\(--radius-md\\)-1px\\)\\] {
1891
+ &::before {
1892
+ content: var(--tw-content);
1893
+ border-radius: calc(var(--radius-md) - 1px);
1894
+ }
1895
+ }
1896
+ .before\\:rounded-\\[calc\\(var\\(--radius-xl\\)-1px\\)\\] {
1897
+ &::before {
1898
+ content: var(--tw-content);
1899
+ border-radius: calc(var(--radius-xl) - 1px);
1900
+ }
1901
+ }
1792
1902
  .before\\:rounded-t-\\[calc\\(var\\(--radius-xl\\)-1px\\)\\] {
1793
1903
  &::before {
1794
1904
  content: var(--tw-content);
@@ -1820,16 +1930,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1820
1930
  border-color: var(--ring);
1821
1931
  }
1822
1932
  }
1823
- .focus-within\\:bg-accent {
1824
- &:focus-within {
1825
- background-color: var(--accent);
1826
- }
1827
- }
1828
- .focus-within\\:text-accent-foreground {
1829
- &:focus-within {
1830
- color: var(--accent-foreground);
1831
- }
1832
- }
1833
1933
  .focus-within\\:ring-\\[3px\\] {
1834
1934
  &:focus-within {
1835
1935
  --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
@@ -1861,6 +1961,16 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1861
1961
  }
1862
1962
  }
1863
1963
  }
1964
+ .hover\\:bg-amber-500\\/20 {
1965
+ &:hover {
1966
+ @media (hover: hover) {
1967
+ background-color: color-mix(in srgb, oklch(76.9% 0.188 70.08) 20%, transparent);
1968
+ @supports (color: color-mix(in lab, red, red)) {
1969
+ background-color: color-mix(in oklab, var(--color-amber-500) 20%, transparent);
1970
+ }
1971
+ }
1972
+ }
1973
+ }
1864
1974
  .hover\\:bg-destructive\\/5 {
1865
1975
  &:hover {
1866
1976
  @media (hover: hover) {
@@ -1881,6 +1991,16 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1881
1991
  }
1882
1992
  }
1883
1993
  }
1994
+ .hover\\:bg-info\\/20 {
1995
+ &:hover {
1996
+ @media (hover: hover) {
1997
+ background-color: var(--info);
1998
+ @supports (color: color-mix(in lab, red, red)) {
1999
+ background-color: color-mix(in oklab, var(--info) 20%, transparent);
2000
+ }
2001
+ }
2002
+ }
2003
+ }
1884
2004
  .hover\\:bg-primary\\/90 {
1885
2005
  &:hover {
1886
2006
  @media (hover: hover) {
@@ -1915,16 +2035,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1915
2035
  }
1916
2036
  }
1917
2037
  }
1918
- .focus\\:bg-accent {
1919
- &:focus {
1920
- background-color: var(--accent);
1921
- }
1922
- }
1923
- .focus\\:text-accent-foreground {
1924
- &:focus {
1925
- color: var(--accent-foreground);
1926
- }
1927
- }
1928
2038
  .focus\\:outline-none {
1929
2039
  &:focus {
1930
2040
  --tw-outline-style: none;
@@ -1982,6 +2092,11 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
1982
2092
  cursor: not-allowed;
1983
2093
  }
1984
2094
  }
2095
+ .disabled\\:opacity-50 {
2096
+ &:disabled {
2097
+ opacity: 50%;
2098
+ }
2099
+ }
1985
2100
  .disabled\\:opacity-60 {
1986
2101
  &:disabled {
1987
2102
  opacity: 60%;
@@ -2015,11 +2130,6 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2015
2130
  pointer-events: none;
2016
2131
  }
2017
2132
  }
2018
- .data-\\[disabled\\]\\:opacity-60 {
2019
- &[data-disabled] {
2020
- opacity: 60%;
2021
- }
2022
- }
2023
2133
  .data-\\[disabled\\]\\:opacity-64 {
2024
2134
  &[data-disabled] {
2025
2135
  opacity: 64%;
@@ -2058,7 +2168,7 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2058
2168
  }
2059
2169
  }
2060
2170
  .dark\\:bg-amber-400\\/10 {
2061
- &:is(.dark *) {
2171
+ &:is(.dark *, :host(.dark) *) {
2062
2172
  background-color: color-mix(in srgb, oklch(82.8% 0.189 84.429) 10%, transparent);
2063
2173
  @supports (color: color-mix(in lab, red, red)) {
2064
2174
  background-color: color-mix(in oklab, var(--color-amber-400) 10%, transparent);
@@ -2066,7 +2176,7 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2066
2176
  }
2067
2177
  }
2068
2178
  .dark\\:bg-blue-400\\/10 {
2069
- &:is(.dark *) {
2179
+ &:is(.dark *, :host(.dark) *) {
2070
2180
  background-color: color-mix(in srgb, oklch(70.7% 0.165 254.624) 10%, transparent);
2071
2181
  @supports (color: color-mix(in lab, red, red)) {
2072
2182
  background-color: color-mix(in oklab, var(--color-blue-400) 10%, transparent);
@@ -2074,7 +2184,7 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2074
2184
  }
2075
2185
  }
2076
2186
  .dark\\:bg-cyan-400\\/10 {
2077
- &:is(.dark *) {
2187
+ &:is(.dark *, :host(.dark) *) {
2078
2188
  background-color: color-mix(in srgb, oklch(78.9% 0.154 211.53) 10%, transparent);
2079
2189
  @supports (color: color-mix(in lab, red, red)) {
2080
2190
  background-color: color-mix(in oklab, var(--color-cyan-400) 10%, transparent);
@@ -2082,7 +2192,7 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2082
2192
  }
2083
2193
  }
2084
2194
  .dark\\:bg-destructive\\/20 {
2085
- &:is(.dark *) {
2195
+ &:is(.dark *, :host(.dark) *) {
2086
2196
  background-color: var(--destructive);
2087
2197
  @supports (color: color-mix(in lab, red, red)) {
2088
2198
  background-color: color-mix(in oklab, var(--destructive) 20%, transparent);
@@ -2090,7 +2200,7 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2090
2200
  }
2091
2201
  }
2092
2202
  .dark\\:bg-emerald-400\\/10 {
2093
- &:is(.dark *) {
2203
+ &:is(.dark *, :host(.dark) *) {
2094
2204
  background-color: color-mix(in srgb, oklch(76.5% 0.177 163.223) 10%, transparent);
2095
2205
  @supports (color: color-mix(in lab, red, red)) {
2096
2206
  background-color: color-mix(in oklab, var(--color-emerald-400) 10%, transparent);
@@ -2098,7 +2208,7 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2098
2208
  }
2099
2209
  }
2100
2210
  .dark\\:bg-fuchsia-400\\/10 {
2101
- &:is(.dark *) {
2211
+ &:is(.dark *, :host(.dark) *) {
2102
2212
  background-color: color-mix(in srgb, oklch(74% 0.238 322.16) 10%, transparent);
2103
2213
  @supports (color: color-mix(in lab, red, red)) {
2104
2214
  background-color: color-mix(in oklab, var(--color-fuchsia-400) 10%, transparent);
@@ -2106,7 +2216,7 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2106
2216
  }
2107
2217
  }
2108
2218
  .dark\\:bg-info\\/20 {
2109
- &:is(.dark *) {
2219
+ &:is(.dark *, :host(.dark) *) {
2110
2220
  background-color: var(--info);
2111
2221
  @supports (color: color-mix(in lab, red, red)) {
2112
2222
  background-color: color-mix(in oklab, var(--info) 20%, transparent);
@@ -2114,7 +2224,7 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2114
2224
  }
2115
2225
  }
2116
2226
  .dark\\:bg-input\\/30 {
2117
- &:is(.dark *) {
2227
+ &:is(.dark *, :host(.dark) *) {
2118
2228
  background-color: var(--input);
2119
2229
  @supports (color: color-mix(in lab, red, red)) {
2120
2230
  background-color: color-mix(in oklab, var(--input) 30%, transparent);
@@ -2122,7 +2232,7 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2122
2232
  }
2123
2233
  }
2124
2234
  .dark\\:bg-rose-400\\/10 {
2125
- &:is(.dark *) {
2235
+ &:is(.dark *, :host(.dark) *) {
2126
2236
  background-color: color-mix(in srgb, oklch(71.2% 0.194 13.428) 10%, transparent);
2127
2237
  @supports (color: color-mix(in lab, red, red)) {
2128
2238
  background-color: color-mix(in oklab, var(--color-rose-400) 10%, transparent);
@@ -2130,7 +2240,7 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2130
2240
  }
2131
2241
  }
2132
2242
  .dark\\:bg-slate-400\\/10 {
2133
- &:is(.dark *) {
2243
+ &:is(.dark *, :host(.dark) *) {
2134
2244
  background-color: color-mix(in srgb, oklch(70.4% 0.04 256.788) 10%, transparent);
2135
2245
  @supports (color: color-mix(in lab, red, red)) {
2136
2246
  background-color: color-mix(in oklab, var(--color-slate-400) 10%, transparent);
@@ -2138,7 +2248,7 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2138
2248
  }
2139
2249
  }
2140
2250
  .dark\\:bg-success\\/20 {
2141
- &:is(.dark *) {
2251
+ &:is(.dark *, :host(.dark) *) {
2142
2252
  background-color: var(--success);
2143
2253
  @supports (color: color-mix(in lab, red, red)) {
2144
2254
  background-color: color-mix(in oklab, var(--success) 20%, transparent);
@@ -2146,7 +2256,7 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2146
2256
  }
2147
2257
  }
2148
2258
  .dark\\:bg-violet-400\\/10 {
2149
- &:is(.dark *) {
2259
+ &:is(.dark *, :host(.dark) *) {
2150
2260
  background-color: color-mix(in srgb, oklch(70.2% 0.183 293.541) 10%, transparent);
2151
2261
  @supports (color: color-mix(in lab, red, red)) {
2152
2262
  background-color: color-mix(in oklab, var(--color-violet-400) 10%, transparent);
@@ -2154,135 +2264,212 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2154
2264
  }
2155
2265
  }
2156
2266
  .dark\\:bg-warning\\/20 {
2157
- &:is(.dark *) {
2267
+ &:is(.dark *, :host(.dark) *) {
2158
2268
  background-color: var(--warning);
2159
2269
  @supports (color: color-mix(in lab, red, red)) {
2160
2270
  background-color: color-mix(in oklab, var(--warning) 20%, transparent);
2161
2271
  }
2162
2272
  }
2163
2273
  }
2164
- .dark\\:text-amber-300 {
2165
- &:is(.dark *) {
2166
- color: var(--color-amber-300);
2274
+ .dark\\:text-amber-400 {
2275
+ &:is(.dark *, :host(.dark) *) {
2276
+ color: var(--color-amber-400);
2277
+ }
2278
+ }
2279
+ .dark\\:text-amber-500 {
2280
+ &:is(.dark *, :host(.dark) *) {
2281
+ color: var(--color-amber-500);
2282
+ }
2283
+ }
2284
+ .dark\\:text-blue-400 {
2285
+ &:is(.dark *, :host(.dark) *) {
2286
+ color: var(--color-blue-400);
2287
+ }
2288
+ }
2289
+ .dark\\:text-cyan-400 {
2290
+ &:is(.dark *, :host(.dark) *) {
2291
+ color: var(--color-cyan-400);
2167
2292
  }
2168
2293
  }
2169
- .dark\\:text-blue-300 {
2170
- &:is(.dark *) {
2171
- color: var(--color-blue-300);
2294
+ .dark\\:text-emerald-400 {
2295
+ &:is(.dark *, :host(.dark) *) {
2296
+ color: var(--color-emerald-400);
2172
2297
  }
2173
2298
  }
2174
- .dark\\:text-cyan-300 {
2175
- &:is(.dark *) {
2176
- color: var(--color-cyan-300);
2299
+ .dark\\:text-fuchsia-400 {
2300
+ &:is(.dark *, :host(.dark) *) {
2301
+ color: var(--color-fuchsia-400);
2177
2302
  }
2178
2303
  }
2179
- .dark\\:text-emerald-300 {
2180
- &:is(.dark *) {
2181
- color: var(--color-emerald-300);
2304
+ .dark\\:text-rose-400 {
2305
+ &:is(.dark *, :host(.dark) *) {
2306
+ color: var(--color-rose-400);
2307
+ }
2308
+ }
2309
+ .dark\\:text-slate-400 {
2310
+ &:is(.dark *, :host(.dark) *) {
2311
+ color: var(--color-slate-400);
2312
+ }
2313
+ }
2314
+ .dark\\:text-violet-400 {
2315
+ &:is(.dark *, :host(.dark) *) {
2316
+ color: var(--color-violet-400);
2317
+ }
2318
+ }
2319
+ .dark\\:inset-ring-amber-400\\/20 {
2320
+ &:is(.dark *, :host(.dark) *) {
2321
+ --tw-inset-ring-color: color-mix(in srgb, oklch(82.8% 0.189 84.429) 20%, transparent);
2322
+ @supports (color: color-mix(in lab, red, red)) {
2323
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-amber-400) 20%, transparent);
2324
+ }
2325
+ }
2326
+ }
2327
+ .dark\\:inset-ring-blue-400\\/30 {
2328
+ &:is(.dark *, :host(.dark) *) {
2329
+ --tw-inset-ring-color: color-mix(in srgb, oklch(70.7% 0.165 254.624) 30%, transparent);
2330
+ @supports (color: color-mix(in lab, red, red)) {
2331
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-blue-400) 30%, transparent);
2332
+ }
2333
+ }
2334
+ }
2335
+ .dark\\:inset-ring-cyan-400\\/30 {
2336
+ &:is(.dark *, :host(.dark) *) {
2337
+ --tw-inset-ring-color: color-mix(in srgb, oklch(78.9% 0.154 211.53) 30%, transparent);
2338
+ @supports (color: color-mix(in lab, red, red)) {
2339
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-cyan-400) 30%, transparent);
2340
+ }
2341
+ }
2342
+ }
2343
+ .dark\\:inset-ring-emerald-500\\/20 {
2344
+ &:is(.dark *, :host(.dark) *) {
2345
+ --tw-inset-ring-color: color-mix(in srgb, oklch(69.6% 0.17 162.48) 20%, transparent);
2346
+ @supports (color: color-mix(in lab, red, red)) {
2347
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-emerald-500) 20%, transparent);
2348
+ }
2349
+ }
2350
+ }
2351
+ .dark\\:inset-ring-fuchsia-400\\/20 {
2352
+ &:is(.dark *, :host(.dark) *) {
2353
+ --tw-inset-ring-color: color-mix(in srgb, oklch(74% 0.238 322.16) 20%, transparent);
2354
+ @supports (color: color-mix(in lab, red, red)) {
2355
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-fuchsia-400) 20%, transparent);
2356
+ }
2182
2357
  }
2183
2358
  }
2184
- .dark\\:text-fuchsia-300 {
2185
- &:is(.dark *) {
2186
- color: var(--color-fuchsia-300);
2359
+ .dark\\:inset-ring-rose-400\\/20 {
2360
+ &:is(.dark *, :host(.dark) *) {
2361
+ --tw-inset-ring-color: color-mix(in srgb, oklch(71.2% 0.194 13.428) 20%, transparent);
2362
+ @supports (color: color-mix(in lab, red, red)) {
2363
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-rose-400) 20%, transparent);
2364
+ }
2187
2365
  }
2188
2366
  }
2189
- .dark\\:text-rose-300 {
2190
- &:is(.dark *) {
2191
- color: var(--color-rose-300);
2367
+ .dark\\:inset-ring-slate-400\\/20 {
2368
+ &:is(.dark *, :host(.dark) *) {
2369
+ --tw-inset-ring-color: color-mix(in srgb, oklch(70.4% 0.04 256.788) 20%, transparent);
2370
+ @supports (color: color-mix(in lab, red, red)) {
2371
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-slate-400) 20%, transparent);
2372
+ }
2192
2373
  }
2193
2374
  }
2194
- .dark\\:text-slate-300 {
2195
- &:is(.dark *) {
2196
- color: var(--color-slate-300);
2375
+ .dark\\:inset-ring-violet-400\\/30 {
2376
+ &:is(.dark *, :host(.dark) *) {
2377
+ --tw-inset-ring-color: color-mix(in srgb, oklch(70.2% 0.183 293.541) 30%, transparent);
2378
+ @supports (color: color-mix(in lab, red, red)) {
2379
+ --tw-inset-ring-color: color-mix(in oklab, var(--color-violet-400) 30%, transparent);
2380
+ }
2197
2381
  }
2198
2382
  }
2199
- .dark\\:text-violet-300 {
2200
- &:is(.dark *) {
2201
- color: var(--color-violet-300);
2383
+ .dark\\:\\[--skeleton-highlight\\:--alpha\\(var\\(--color-white\\)\\/4\\%\\)\\] {
2384
+ &:is(.dark *, :host(.dark) *) {
2385
+ --skeleton-highlight: color-mix(in srgb, #fff 4%, transparent);
2386
+ @supports (color: color-mix(in lab, red, red)) {
2387
+ --skeleton-highlight: color-mix(in oklab, var(--color-white) 4%, transparent);
2388
+ }
2202
2389
  }
2203
2390
  }
2204
- .dark\\:group-data-hover\\:bg-amber-400\\/15 {
2205
- &:is(.dark *) {
2391
+ .dark\\:group-data-hover\\:bg-amber-400\\/20 {
2392
+ &:is(.dark *, :host(.dark) *) {
2206
2393
  &:is(:where(.group)[data-hover] *) {
2207
- background-color: color-mix(in srgb, oklch(82.8% 0.189 84.429) 15%, transparent);
2394
+ background-color: color-mix(in srgb, oklch(82.8% 0.189 84.429) 20%, transparent);
2208
2395
  @supports (color: color-mix(in lab, red, red)) {
2209
- background-color: color-mix(in oklab, var(--color-amber-400) 15%, transparent);
2396
+ background-color: color-mix(in oklab, var(--color-amber-400) 20%, transparent);
2210
2397
  }
2211
2398
  }
2212
2399
  }
2213
2400
  }
2214
- .dark\\:group-data-hover\\:bg-blue-400\\/15 {
2215
- &:is(.dark *) {
2401
+ .dark\\:group-data-hover\\:bg-blue-400\\/20 {
2402
+ &:is(.dark *, :host(.dark) *) {
2216
2403
  &:is(:where(.group)[data-hover] *) {
2217
- background-color: color-mix(in srgb, oklch(70.7% 0.165 254.624) 15%, transparent);
2404
+ background-color: color-mix(in srgb, oklch(70.7% 0.165 254.624) 20%, transparent);
2218
2405
  @supports (color: color-mix(in lab, red, red)) {
2219
- background-color: color-mix(in oklab, var(--color-blue-400) 15%, transparent);
2406
+ background-color: color-mix(in oklab, var(--color-blue-400) 20%, transparent);
2220
2407
  }
2221
2408
  }
2222
2409
  }
2223
2410
  }
2224
- .dark\\:group-data-hover\\:bg-cyan-400\\/15 {
2225
- &:is(.dark *) {
2411
+ .dark\\:group-data-hover\\:bg-cyan-400\\/20 {
2412
+ &:is(.dark *, :host(.dark) *) {
2226
2413
  &:is(:where(.group)[data-hover] *) {
2227
- background-color: color-mix(in srgb, oklch(78.9% 0.154 211.53) 15%, transparent);
2414
+ background-color: color-mix(in srgb, oklch(78.9% 0.154 211.53) 20%, transparent);
2228
2415
  @supports (color: color-mix(in lab, red, red)) {
2229
- background-color: color-mix(in oklab, var(--color-cyan-400) 15%, transparent);
2416
+ background-color: color-mix(in oklab, var(--color-cyan-400) 20%, transparent);
2230
2417
  }
2231
2418
  }
2232
2419
  }
2233
2420
  }
2234
- .dark\\:group-data-hover\\:bg-emerald-400\\/15 {
2235
- &:is(.dark *) {
2421
+ .dark\\:group-data-hover\\:bg-emerald-400\\/20 {
2422
+ &:is(.dark *, :host(.dark) *) {
2236
2423
  &:is(:where(.group)[data-hover] *) {
2237
- background-color: color-mix(in srgb, oklch(76.5% 0.177 163.223) 15%, transparent);
2424
+ background-color: color-mix(in srgb, oklch(76.5% 0.177 163.223) 20%, transparent);
2238
2425
  @supports (color: color-mix(in lab, red, red)) {
2239
- background-color: color-mix(in oklab, var(--color-emerald-400) 15%, transparent);
2426
+ background-color: color-mix(in oklab, var(--color-emerald-400) 20%, transparent);
2240
2427
  }
2241
2428
  }
2242
2429
  }
2243
2430
  }
2244
- .dark\\:group-data-hover\\:bg-fuchsia-400\\/15 {
2245
- &:is(.dark *) {
2431
+ .dark\\:group-data-hover\\:bg-fuchsia-400\\/20 {
2432
+ &:is(.dark *, :host(.dark) *) {
2246
2433
  &:is(:where(.group)[data-hover] *) {
2247
- background-color: color-mix(in srgb, oklch(74% 0.238 322.16) 15%, transparent);
2434
+ background-color: color-mix(in srgb, oklch(74% 0.238 322.16) 20%, transparent);
2248
2435
  @supports (color: color-mix(in lab, red, red)) {
2249
- background-color: color-mix(in oklab, var(--color-fuchsia-400) 15%, transparent);
2436
+ background-color: color-mix(in oklab, var(--color-fuchsia-400) 20%, transparent);
2250
2437
  }
2251
2438
  }
2252
2439
  }
2253
2440
  }
2254
- .dark\\:group-data-hover\\:bg-rose-400\\/15 {
2255
- &:is(.dark *) {
2441
+ .dark\\:group-data-hover\\:bg-rose-400\\/20 {
2442
+ &:is(.dark *, :host(.dark) *) {
2256
2443
  &:is(:where(.group)[data-hover] *) {
2257
- background-color: color-mix(in srgb, oklch(71.2% 0.194 13.428) 15%, transparent);
2444
+ background-color: color-mix(in srgb, oklch(71.2% 0.194 13.428) 20%, transparent);
2258
2445
  @supports (color: color-mix(in lab, red, red)) {
2259
- background-color: color-mix(in oklab, var(--color-rose-400) 15%, transparent);
2446
+ background-color: color-mix(in oklab, var(--color-rose-400) 20%, transparent);
2260
2447
  }
2261
2448
  }
2262
2449
  }
2263
2450
  }
2264
- .dark\\:group-data-hover\\:bg-slate-400\\/15 {
2265
- &:is(.dark *) {
2451
+ .dark\\:group-data-hover\\:bg-slate-400\\/20 {
2452
+ &:is(.dark *, :host(.dark) *) {
2266
2453
  &:is(:where(.group)[data-hover] *) {
2267
- background-color: color-mix(in srgb, oklch(70.4% 0.04 256.788) 15%, transparent);
2454
+ background-color: color-mix(in srgb, oklch(70.4% 0.04 256.788) 20%, transparent);
2268
2455
  @supports (color: color-mix(in lab, red, red)) {
2269
- background-color: color-mix(in oklab, var(--color-slate-400) 15%, transparent);
2456
+ background-color: color-mix(in oklab, var(--color-slate-400) 20%, transparent);
2270
2457
  }
2271
2458
  }
2272
2459
  }
2273
2460
  }
2274
- .dark\\:group-data-hover\\:bg-violet-400\\/15 {
2275
- &:is(.dark *) {
2461
+ .dark\\:group-data-hover\\:bg-violet-400\\/20 {
2462
+ &:is(.dark *, :host(.dark) *) {
2276
2463
  &:is(:where(.group)[data-hover] *) {
2277
- background-color: color-mix(in srgb, oklch(70.2% 0.183 293.541) 15%, transparent);
2464
+ background-color: color-mix(in srgb, oklch(70.2% 0.183 293.541) 20%, transparent);
2278
2465
  @supports (color: color-mix(in lab, red, red)) {
2279
- background-color: color-mix(in oklab, var(--color-violet-400) 15%, transparent);
2466
+ background-color: color-mix(in oklab, var(--color-violet-400) 20%, transparent);
2280
2467
  }
2281
2468
  }
2282
2469
  }
2283
2470
  }
2284
2471
  .dark\\:before\\:shadow-\\[0_-1px_--theme\\(--color-white\\/6\\%\\)\\] {
2285
- &:is(.dark *) {
2472
+ &:is(.dark *, :host(.dark) *) {
2286
2473
  &::before {
2287
2474
  content: var(--tw-content);
2288
2475
  --tw-shadow: 0 -1px var(--tw-shadow-color, color-mix(in srgb, #fff 6%, transparent));
@@ -2320,6 +2507,66 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2320
2507
  height: calc(var(--spacing) * 4);
2321
2508
  }
2322
2509
  }
2510
+ .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4\\.5 {
2511
+ & svg:not([class*='size-']) {
2512
+ width: calc(var(--spacing) * 4.5);
2513
+ height: calc(var(--spacing) * 4.5);
2514
+ }
2515
+ }
2516
+ .\\[\\&\\>svg\\]\\:pointer-events-none {
2517
+ &>svg {
2518
+ pointer-events: none;
2519
+ }
2520
+ }
2521
+ .\\[\\&\\>svg\\]\\:-mx-0\\.5 {
2522
+ &>svg {
2523
+ margin-inline: calc(var(--spacing) * -0.5);
2524
+ }
2525
+ }
2526
+ .\\[\\&\\>svg\\]\\:shrink-0 {
2527
+ &>svg {
2528
+ flex-shrink: 0;
2529
+ }
2530
+ }
2531
+ .\\[\\&\\>svg\\:not\\(\\[class\\*\\=\\'opacity-\\'\\]\\)\\]\\:opacity-80 {
2532
+ &>svg:not([class*='opacity-']) {
2533
+ opacity: 80%;
2534
+ }
2535
+ }
2536
+ .\\[\\&\\>svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 {
2537
+ &>svg:not([class*='size-']) {
2538
+ width: calc(var(--spacing) * 4);
2539
+ height: calc(var(--spacing) * 4);
2540
+ }
2541
+ }
2542
+ .\\[\\[data-kbd-nav\\]_\\&\\]\\:focus-within\\:bg-accent {
2543
+ [data-kbd-nav] & {
2544
+ &:focus-within {
2545
+ background-color: var(--accent);
2546
+ }
2547
+ }
2548
+ }
2549
+ .\\[\\[data-kbd-nav\\]_\\&\\]\\:focus-within\\:text-accent-foreground {
2550
+ [data-kbd-nav] & {
2551
+ &:focus-within {
2552
+ color: var(--accent-foreground);
2553
+ }
2554
+ }
2555
+ }
2556
+ .\\[\\[data-kbd-nav\\]_\\&\\]\\:focus\\:bg-accent {
2557
+ [data-kbd-nav] & {
2558
+ &:focus {
2559
+ background-color: var(--accent);
2560
+ }
2561
+ }
2562
+ }
2563
+ .\\[\\[data-kbd-nav\\]_\\&\\]\\:focus\\:text-accent-foreground {
2564
+ [data-kbd-nav] & {
2565
+ &:focus {
2566
+ color: var(--accent-foreground);
2567
+ }
2568
+ }
2569
+ }
2323
2570
  }
2324
2571
  @layer base {
2325
2572
  *, ::after, ::before {
@@ -2327,6 +2574,30 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2327
2574
  }
2328
2575
  }
2329
2576
  @layer components {
2577
+ [data-highlighted] {
2578
+ background-color: var(--accent);
2579
+ color: var(--accent-foreground);
2580
+ transition: background-color 150ms ease-out;
2581
+ }
2582
+ [data-kbd-nav] [data-highlighted]:not([data-kbd-highlighted]) {
2583
+ background-color: transparent;
2584
+ color: inherit;
2585
+ }
2586
+ [data-kbd-highlighted] {
2587
+ background-color: var(--accent);
2588
+ @supports (color: color-mix(in lab, red, red)) {
2589
+ background-color: color-mix(in srgb, var(--accent) 200%, transparent);
2590
+ }
2591
+ color: var(--accent-foreground);
2592
+ }
2593
+ .uidex-item-interactive:hover {
2594
+ background-color: var(--accent);
2595
+ color: var(--accent-foreground);
2596
+ }
2597
+ [data-kbd-nav] .uidex-item-interactive:hover:not(:focus):not(:focus-within) {
2598
+ background-color: transparent;
2599
+ color: inherit;
2600
+ }
2330
2601
  .uidex-scrollbar {
2331
2602
  scrollbar-width: thin;
2332
2603
  scrollbar-color: var(--muted-foreground) transparent;
@@ -2360,6 +2631,11 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2360
2631
  background: transparent;
2361
2632
  }
2362
2633
  }
2634
+ @keyframes skeleton {
2635
+ to {
2636
+ background-position: -200% 0;
2637
+ }
2638
+ }
2363
2639
  :where(:host, :root) {
2364
2640
  --background: color-mix(
2365
2641
  in srgb,
@@ -2495,6 +2771,36 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2495
2771
  --warning: var(--color-amber-500);
2496
2772
  --warning-foreground: var(--color-amber-700);
2497
2773
  }
2774
+ @property --tw-translate-x {
2775
+ syntax: "*";
2776
+ inherits: false;
2777
+ initial-value: 0;
2778
+ }
2779
+ @property --tw-translate-y {
2780
+ syntax: "*";
2781
+ inherits: false;
2782
+ initial-value: 0;
2783
+ }
2784
+ @property --tw-translate-z {
2785
+ syntax: "*";
2786
+ inherits: false;
2787
+ initial-value: 0;
2788
+ }
2789
+ @property --tw-scale-x {
2790
+ syntax: "*";
2791
+ inherits: false;
2792
+ initial-value: 1;
2793
+ }
2794
+ @property --tw-scale-y {
2795
+ syntax: "*";
2796
+ inherits: false;
2797
+ initial-value: 1;
2798
+ }
2799
+ @property --tw-scale-z {
2800
+ syntax: "*";
2801
+ inherits: false;
2802
+ initial-value: 1;
2803
+ }
2498
2804
  @property --tw-rotate-x {
2499
2805
  syntax: "*";
2500
2806
  inherits: false;
@@ -2532,6 +2838,26 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2532
2838
  syntax: "*";
2533
2839
  inherits: false;
2534
2840
  }
2841
+ @property --tw-ordinal {
2842
+ syntax: "*";
2843
+ inherits: false;
2844
+ }
2845
+ @property --tw-slashed-zero {
2846
+ syntax: "*";
2847
+ inherits: false;
2848
+ }
2849
+ @property --tw-numeric-figure {
2850
+ syntax: "*";
2851
+ inherits: false;
2852
+ }
2853
+ @property --tw-numeric-spacing {
2854
+ syntax: "*";
2855
+ inherits: false;
2856
+ }
2857
+ @property --tw-numeric-fraction {
2858
+ syntax: "*";
2859
+ inherits: false;
2860
+ }
2535
2861
  @property --tw-shadow {
2536
2862
  syntax: "*";
2537
2863
  inherits: false;
@@ -2700,9 +3026,20 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2700
3026
  initial-value: "";
2701
3027
  inherits: false;
2702
3028
  }
3029
+ @keyframes spin {
3030
+ to {
3031
+ transform: rotate(360deg);
3032
+ }
3033
+ }
2703
3034
  @layer properties {
2704
3035
  @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {
2705
3036
  *, ::before, ::after, ::backdrop {
3037
+ --tw-translate-x: 0;
3038
+ --tw-translate-y: 0;
3039
+ --tw-translate-z: 0;
3040
+ --tw-scale-x: 1;
3041
+ --tw-scale-y: 1;
3042
+ --tw-scale-z: 1;
2706
3043
  --tw-rotate-x: initial;
2707
3044
  --tw-rotate-y: initial;
2708
3045
  --tw-rotate-z: initial;
@@ -2712,6 +3049,11 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2712
3049
  --tw-leading: initial;
2713
3050
  --tw-font-weight: initial;
2714
3051
  --tw-tracking: initial;
3052
+ --tw-ordinal: initial;
3053
+ --tw-slashed-zero: initial;
3054
+ --tw-numeric-figure: initial;
3055
+ --tw-numeric-spacing: initial;
3056
+ --tw-numeric-fraction: initial;
2715
3057
  --tw-shadow: 0 0 #0000;
2716
3058
  --tw-shadow-color: initial;
2717
3059
  --tw-shadow-alpha: 100%;
@@ -2756,12 +3098,12 @@ var tailwind_built_default = `/*! tailwindcss v4.2.2 | MIT License | https://tai
2756
3098
  }
2757
3099
  `;
2758
3100
 
2759
- // src/surface/constants.ts
3101
+ // src/browser/surface/constants.ts
2760
3102
  var SURFACE_HOST_CLASS = "uidex-surface-host";
2761
3103
  var SURFACE_CONTAINER_CLASS = "uidex-container";
2762
- var Z_BASE = 2147483644;
2763
- var Z_OVERLAY = 2147483645;
2764
- var Z_CHROME = 2147483646;
3104
+ var Z_BASE = 2147483630;
3105
+ var Z_OVERLAY = 2147483635;
3106
+ var Z_CHROME = 2147483645;
2765
3107
  var SURFACE_IGNORE_SELECTOR = `.${SURFACE_HOST_CLASS},.${SURFACE_CONTAINER_CLASS}`;
2766
3108
  var UIDEX_ATTR_TO_KIND = [
2767
3109
  ["data-uidex", "element"],
@@ -2770,7 +3112,7 @@ var UIDEX_ATTR_TO_KIND = [
2770
3112
  ["data-uidex-primitive", "primitive"]
2771
3113
  ];
2772
3114
 
2773
- // src/surface/host.ts
3115
+ // src/browser/surface/host.ts
2774
3116
  function createSurfaceHost(options) {
2775
3117
  const { mount, stylesheets = [], initialTheme = "light" } = options;
2776
3118
  const hostEl = document.createElement("div");
@@ -2784,6 +3126,8 @@ function createSurfaceHost(options) {
2784
3126
  applyStylesheets(shadow, [tailwind_built_default, ...stylesheets]);
2785
3127
  const chromeEl = document.createElement("div");
2786
3128
  chromeEl.classList.add("uidex-chrome");
3129
+ chromeEl.style.position = "relative";
3130
+ chromeEl.style.zIndex = String(Z_CHROME);
2787
3131
  chromeEl.style.pointerEvents = "auto";
2788
3132
  shadow.appendChild(chromeEl);
2789
3133
  mount.appendChild(hostEl);
@@ -2831,29 +3175,29 @@ function supportsConstructableStylesheets(shadow) {
2831
3175
  }
2832
3176
  }
2833
3177
 
2834
- // src/surface/cursor-tooltip.ts
3178
+ // src/browser/surface/cursor-tooltip.ts
2835
3179
  var import_lucide2 = require("lucide");
2836
3180
  var DEFAULT_TOOLTIP_COLOR = "#34d399";
2837
3181
  var TOOLTIP_OFFSET = 16;
2838
3182
  var ARROW_SIZE = 5;
2839
3183
  function createCursorTooltip(deps) {
2840
3184
  const { container } = deps;
2841
- const el = document.createElement("div");
2842
- el.setAttribute("data-uidex-cursor-tooltip", "");
2843
- el.style.position = "fixed";
2844
- el.style.pointerEvents = "none";
2845
- el.style.zIndex = String(Z_CHROME);
2846
- el.style.padding = "4px 8px";
2847
- el.style.fontSize = "12px";
2848
- el.style.fontFamily = "ui-sans-serif, system-ui, sans-serif";
2849
- el.style.borderRadius = "6px";
2850
- el.style.background = DEFAULT_TOOLTIP_COLOR;
2851
- el.style.color = "#0a0a0a";
2852
- el.style.display = "none";
2853
- el.style.whiteSpace = "nowrap";
2854
- el.style.transform = "translate(-50%, 0)";
2855
- el.style.alignItems = "center";
2856
- el.style.gap = "6px";
3185
+ const el2 = document.createElement("div");
3186
+ el2.setAttribute("data-uidex-cursor-tooltip", "");
3187
+ el2.style.position = "fixed";
3188
+ el2.style.pointerEvents = "none";
3189
+ el2.style.zIndex = String(Z_CHROME);
3190
+ el2.style.padding = "4px 8px";
3191
+ el2.style.fontSize = "12px";
3192
+ el2.style.fontFamily = "ui-sans-serif, system-ui, sans-serif";
3193
+ el2.style.borderRadius = "6px";
3194
+ el2.style.background = DEFAULT_TOOLTIP_COLOR;
3195
+ el2.style.color = "#0a0a0a";
3196
+ el2.style.display = "none";
3197
+ el2.style.whiteSpace = "nowrap";
3198
+ el2.style.transform = "translate(-50%, 0)";
3199
+ el2.style.alignItems = "center";
3200
+ el2.style.gap = "6px";
2857
3201
  const arrow = document.createElement("div");
2858
3202
  arrow.setAttribute("data-uidex-cursor-tooltip-arrow", "");
2859
3203
  arrow.style.position = "absolute";
@@ -2865,18 +3209,18 @@ function createCursorTooltip(deps) {
2865
3209
  arrow.style.borderLeft = `${ARROW_SIZE}px solid transparent`;
2866
3210
  arrow.style.borderRight = `${ARROW_SIZE}px solid transparent`;
2867
3211
  arrow.style.borderBottom = `${ARROW_SIZE}px solid ${DEFAULT_TOOLTIP_COLOR}`;
2868
- el.appendChild(arrow);
3212
+ el2.appendChild(arrow);
2869
3213
  const body = document.createElement("span");
2870
3214
  body.setAttribute("data-uidex-cursor-tooltip-body", "");
2871
3215
  body.style.display = "inline-flex";
2872
3216
  body.style.alignItems = "center";
2873
3217
  body.style.gap = "6px";
2874
- el.appendChild(body);
2875
- container.appendChild(el);
3218
+ el2.appendChild(body);
3219
+ container.appendChild(el2);
2876
3220
  let currentContent = null;
2877
3221
  let currentCursor = null;
2878
3222
  const applyColor = (color) => {
2879
- el.style.background = color;
3223
+ el2.style.background = color;
2880
3224
  arrow.style.borderBottom = `${ARROW_SIZE}px solid ${color}`;
2881
3225
  };
2882
3226
  const renderBody = () => {
@@ -2889,7 +3233,9 @@ function createCursorTooltip(deps) {
2889
3233
  if (!currentContent) return;
2890
3234
  const { entity, node } = currentContent;
2891
3235
  const style = KIND_STYLE[entity.kind];
3236
+ const demoted = entity.kind === "primitive";
2892
3237
  applyColor(style?.color ?? DEFAULT_TOOLTIP_COLOR);
3238
+ el2.style.opacity = demoted ? "0.55" : "1";
2893
3239
  if (style) {
2894
3240
  const svg = (0, import_lucide2.createElement)(style.icon);
2895
3241
  svg.setAttribute("aria-hidden", "true");
@@ -2900,26 +3246,28 @@ function createCursorTooltip(deps) {
2900
3246
  }
2901
3247
  const label = displayName(entity, node);
2902
3248
  body.append(document.createTextNode(label));
2903
- const rawId = entity.kind === "route" ? entity.path : entity.id;
2904
- if (rawId && rawId !== label) {
2905
- const subordinate = document.createElement("span");
2906
- subordinate.setAttribute("data-uidex-cursor-tooltip-id", "");
2907
- subordinate.style.opacity = "0.65";
2908
- subordinate.style.fontFamily = "ui-monospace, SFMono-Regular, Menlo, monospace";
2909
- subordinate.style.fontSize = "11px";
2910
- subordinate.textContent = rawId;
2911
- body.append(subordinate);
3249
+ if (currentContent.layer) {
3250
+ const counter = document.createElement("span");
3251
+ counter.setAttribute("data-uidex-cursor-tooltip-layer", "");
3252
+ counter.style.fontFamily = "ui-monospace, SFMono-Regular, Menlo, monospace";
3253
+ counter.style.fontSize = "10px";
3254
+ counter.style.lineHeight = "1";
3255
+ counter.style.padding = "2px 5px";
3256
+ counter.style.borderRadius = "4px";
3257
+ counter.style.background = "rgba(0,0,0,0.18)";
3258
+ counter.textContent = `${currentContent.layer.index + 1}/${currentContent.layer.total}`;
3259
+ body.append(counter);
2912
3260
  }
2913
3261
  };
2914
3262
  const render = () => {
2915
3263
  if (!currentContent || !currentCursor) {
2916
- el.style.display = "none";
3264
+ el2.style.display = "none";
2917
3265
  return;
2918
3266
  }
2919
3267
  renderBody();
2920
- el.style.display = "inline-flex";
2921
- el.style.left = `${currentCursor.x}px`;
2922
- el.style.top = `${currentCursor.y + TOOLTIP_OFFSET}px`;
3268
+ el2.style.display = "inline-flex";
3269
+ el2.style.left = `${currentCursor.x}px`;
3270
+ el2.style.top = `${currentCursor.y + TOOLTIP_OFFSET}px`;
2923
3271
  };
2924
3272
  return {
2925
3273
  update(content, cursor) {
@@ -2928,14 +3276,14 @@ function createCursorTooltip(deps) {
2928
3276
  render();
2929
3277
  },
2930
3278
  destroy() {
2931
- el.remove();
3279
+ el2.remove();
2932
3280
  currentContent = null;
2933
3281
  currentCursor = null;
2934
3282
  }
2935
3283
  };
2936
3284
  }
2937
3285
 
2938
- // src/surface/inspector.ts
3286
+ // src/browser/surface/inspector.ts
2939
3287
  function entityForRef(ref, registry) {
2940
3288
  if (registry) {
2941
3289
  const found = registry.get(ref.kind, ref.id);
@@ -2943,70 +3291,108 @@ function entityForRef(ref, registry) {
2943
3291
  }
2944
3292
  if (ref.kind === "route") return { kind: "route", path: ref.id, page: ref.id };
2945
3293
  if (ref.kind === "flow") {
2946
- return { kind: "flow", id: ref.id, loc: { file: "" }, touches: [] };
3294
+ return {
3295
+ kind: "flow",
3296
+ id: ref.id,
3297
+ loc: { file: "" },
3298
+ touches: [],
3299
+ steps: []
3300
+ };
2947
3301
  }
2948
3302
  return { kind: ref.kind, id: ref.id };
2949
3303
  }
2950
- function defaultResolveMatch(target, registry) {
2951
- if (target.closest(SURFACE_IGNORE_SELECTOR)) return null;
3304
+ function defaultResolveAllMatches(target, registry) {
3305
+ if (target.closest(SURFACE_IGNORE_SELECTOR)) return [];
3306
+ const semantic = [];
3307
+ const primitives = [];
3308
+ const seen = /* @__PURE__ */ new Set();
2952
3309
  let node = target;
2953
3310
  while (node) {
2954
3311
  if (node instanceof HTMLElement) {
2955
3312
  for (const [attr, kind] of UIDEX_ATTR_TO_KIND) {
2956
3313
  const id = node.getAttribute(attr);
2957
3314
  if (id) {
2958
- const ref = { kind, id };
2959
- const entity = entityForRef(ref, registry);
2960
- return {
2961
- element: node,
2962
- ref,
2963
- entity,
2964
- label: displayName(entity, node)
2965
- };
3315
+ const key = `${kind}:${id}`;
3316
+ if (!seen.has(key)) {
3317
+ seen.add(key);
3318
+ const ref = { kind, id };
3319
+ const entity = entityForRef(ref, registry);
3320
+ const match = {
3321
+ element: node,
3322
+ ref,
3323
+ entity,
3324
+ label: displayName(entity, node)
3325
+ };
3326
+ if (kind === "primitive") {
3327
+ primitives.push(match);
3328
+ } else {
3329
+ semantic.push(match);
3330
+ }
3331
+ }
2966
3332
  }
2967
3333
  }
2968
3334
  }
2969
3335
  node = node.parentElement;
2970
3336
  }
2971
- return null;
3337
+ return semantic.concat(primitives);
2972
3338
  }
2973
3339
  function createInspector(options) {
2974
3340
  const {
2975
3341
  session,
2976
3342
  registry,
2977
- resolve = (target) => defaultResolveMatch(target, registry),
3343
+ resolveAll = (target) => defaultResolveAllMatches(target, registry),
2978
3344
  onHover,
2979
- onSelect
3345
+ onSelect,
3346
+ onCycle
2980
3347
  } = options;
2981
3348
  let mounted = false;
2982
3349
  let currentEl = null;
2983
3350
  let cursorStyleEl = null;
3351
+ let stack = [];
3352
+ let layerIndex = 0;
3353
+ let lastCursor = { x: 0, y: 0 };
3354
+ const makeStack = () => stack.length > 0 ? { matches: stack, index: layerIndex, current: stack[layerIndex] } : null;
2984
3355
  const onMouseMove = (e) => {
2985
3356
  if (!(e.target instanceof Element)) return;
2986
- const match = resolve(e.target);
3357
+ const matches = resolveAll(e.target);
2987
3358
  const cursor = { x: e.clientX, y: e.clientY };
2988
- if (match) {
2989
- if (match.element !== currentEl) {
2990
- currentEl = match.element;
2991
- session.getState().actions.hover(match.ref);
3359
+ lastCursor = cursor;
3360
+ const topEl = matches.length > 0 ? matches[0].element : null;
3361
+ if (topEl) {
3362
+ if (topEl !== currentEl) {
3363
+ currentEl = topEl;
3364
+ stack = matches;
3365
+ layerIndex = 0;
3366
+ session.highlight.hover(stack[0].ref);
2992
3367
  }
2993
- onHover?.(match, cursor);
3368
+ onHover?.(makeStack(), cursor);
2994
3369
  } else if (currentEl) {
2995
3370
  currentEl = null;
2996
- session.getState().actions.hover(null);
3371
+ stack = [];
3372
+ layerIndex = 0;
3373
+ session.highlight.unhover();
2997
3374
  onHover?.(null, cursor);
2998
3375
  }
2999
3376
  };
3000
3377
  const onClick = (e) => {
3001
3378
  if (!(e.target instanceof Element)) return;
3002
3379
  if (e.target.closest(SURFACE_IGNORE_SELECTOR)) return;
3003
- const match = resolve(e.target);
3004
- if (!match) return;
3380
+ if (stack.length === 0) return;
3005
3381
  e.preventDefault();
3006
3382
  e.stopPropagation();
3007
- session.getState().actions.select(match.ref);
3383
+ const match = stack[layerIndex];
3384
+ session.select(match.ref);
3008
3385
  onSelect?.(match, { x: e.clientX, y: e.clientY });
3009
3386
  };
3387
+ const onContextMenu = (e) => {
3388
+ if (stack.length <= 1) return;
3389
+ e.preventDefault();
3390
+ e.stopPropagation();
3391
+ layerIndex = (layerIndex + 1) % stack.length;
3392
+ const match = stack[layerIndex];
3393
+ session.highlight.hover(match.ref);
3394
+ onCycle?.(makeStack(), lastCursor);
3395
+ };
3010
3396
  return {
3011
3397
  mount() {
3012
3398
  if (mounted) return;
@@ -3019,124 +3405,354 @@ function createInspector(options) {
3019
3405
  }
3020
3406
  document.addEventListener("mousemove", onMouseMove);
3021
3407
  document.addEventListener("click", onClick, true);
3408
+ document.addEventListener("contextmenu", onContextMenu, true);
3022
3409
  },
3023
3410
  destroy() {
3024
3411
  if (!mounted) return;
3025
3412
  mounted = false;
3026
3413
  currentEl = null;
3414
+ stack = [];
3415
+ layerIndex = 0;
3027
3416
  if (cursorStyleEl) {
3028
3417
  cursorStyleEl.remove();
3029
3418
  cursorStyleEl = null;
3030
3419
  }
3031
3420
  document.removeEventListener("mousemove", onMouseMove);
3032
3421
  document.removeEventListener("click", onClick, true);
3033
- session.getState().actions.hover(null);
3422
+ document.removeEventListener("contextmenu", onContextMenu, true);
3423
+ session.highlight.unhover();
3034
3424
  onHover?.(null, null);
3035
3425
  }
3036
3426
  };
3037
3427
  }
3038
3428
 
3039
- // src/surface/menu-bar.ts
3429
+ // src/browser/surface/menu-bar.ts
3430
+ var import_lucide3 = require("lucide");
3431
+
3432
+ // src/browser/internal/cn.ts
3433
+ var import_clsx = require("clsx");
3434
+ var import_tailwind_merge = require("tailwind-merge");
3435
+ function cn(...inputs) {
3436
+ return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs));
3437
+ }
3438
+
3439
+ // src/browser/internal/el.ts
3440
+ function el(tag, options = {}, children = []) {
3441
+ const node = document.createElement(tag);
3442
+ if (options.class) node.className = cn(options.class);
3443
+ if (options.attrs) {
3444
+ for (const [key, value] of Object.entries(options.attrs)) {
3445
+ if (value === void 0 || value === null || value === false) continue;
3446
+ if (value === true) {
3447
+ node.setAttribute(key, "");
3448
+ } else {
3449
+ node.setAttribute(key, String(value));
3450
+ }
3451
+ }
3452
+ }
3453
+ if (options.dataset) {
3454
+ for (const [key, value] of Object.entries(options.dataset)) {
3455
+ node.dataset[key] = value;
3456
+ }
3457
+ }
3458
+ if (options.style) {
3459
+ Object.assign(node.style, options.style);
3460
+ }
3461
+ if (options.text !== void 0) {
3462
+ node.textContent = options.text;
3463
+ }
3464
+ const list = Array.isArray(children) ? children : [children];
3465
+ for (const child of list) {
3466
+ if (child === null || child === void 0 || child === false) continue;
3467
+ node.append(
3468
+ typeof child === "string" ? document.createTextNode(child) : child
3469
+ );
3470
+ }
3471
+ return node;
3472
+ }
3473
+
3474
+ // src/browser/surface/keys.ts
3475
+ var INSPECT_SHORTCUT = { key: "i" };
3476
+ function formatShortcutLabel(shortcut) {
3477
+ const parts = [];
3478
+ if (shortcut.mod !== false) parts.push("\u2318");
3479
+ if (shortcut.shift) parts.push("\u21E7");
3480
+ parts.push(shortcut.key.toUpperCase());
3481
+ return parts.join("");
3482
+ }
3483
+
3484
+ // src/browser/surface/menu-bar.ts
3485
+ 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%)]";
3486
+ 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";
3487
+ var BUTTON_ACTIVE_CLASS = "border-info/40 bg-info/15 text-info-foreground hover:bg-info/20";
3488
+ var TITLE_CLASS = "relative z-1 whitespace-nowrap px-1.5 text-xs font-semibold tracking-tight text-foreground";
3489
+ 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";
3040
3490
  function createMenuBar(options) {
3041
3491
  const {
3042
3492
  container,
3043
3493
  session,
3044
3494
  initialCorner = "bottom-right",
3045
- appTitle
3495
+ appTitle,
3496
+ channel = null,
3497
+ pinLayer: initialPinLayer = null
3046
3498
  } = options;
3047
- const root = document.createElement("div");
3048
- root.setAttribute("data-uidex-menubar", "");
3049
- root.setAttribute("role", "toolbar");
3050
- Object.assign(root.style, {
3051
- position: "fixed",
3052
- zIndex: String(Z_CHROME),
3053
- pointerEvents: "auto",
3054
- display: "inline-flex",
3055
- alignItems: "center",
3056
- gap: "6px",
3057
- padding: "6px",
3058
- borderRadius: "8px",
3059
- background: "rgba(20, 20, 20, 0.92)",
3060
- color: "#f5f5f5",
3061
- fontFamily: "ui-sans-serif, system-ui, sans-serif",
3062
- fontSize: "12px",
3063
- userSelect: "none",
3064
- cursor: "grab"
3499
+ let activePinLayer = initialPinLayer;
3500
+ const root = el("div", {
3501
+ class: ROOT_CLASS,
3502
+ attrs: {
3503
+ "data-uidex-menubar": "",
3504
+ role: "toolbar"
3505
+ },
3506
+ style: {
3507
+ position: "fixed",
3508
+ zIndex: String(Z_CHROME),
3509
+ pointerEvents: "auto",
3510
+ cursor: "grab"
3511
+ }
3065
3512
  });
3066
- const buttonStyle = {
3067
- background: "rgba(255,255,255,0.08)",
3068
- color: "inherit",
3069
- border: "1px solid rgba(255,255,255,0.12)",
3070
- borderRadius: "6px",
3071
- padding: "4px 8px",
3072
- font: "inherit",
3073
- cursor: "pointer"
3074
- };
3075
- const buttonActiveStyle = {
3076
- background: "rgba(120, 180, 255, 0.28)",
3077
- borderColor: "rgba(120, 180, 255, 0.55)"
3078
- };
3513
+ let titleEl = null;
3079
3514
  if (appTitle) {
3080
- const titleEl = document.createElement("span");
3081
- titleEl.setAttribute("data-uidex-menubar-title", "");
3082
- titleEl.textContent = appTitle;
3083
- Object.assign(titleEl.style, {
3084
- padding: "0 6px 0 4px",
3085
- fontWeight: "600",
3086
- letterSpacing: "0.01em",
3087
- whiteSpace: "nowrap"
3515
+ titleEl = el("span", {
3516
+ class: TITLE_CLASS,
3517
+ attrs: { "data-uidex-menubar-title": "" },
3518
+ text: appTitle
3088
3519
  });
3089
3520
  root.appendChild(titleEl);
3090
3521
  }
3091
- const highlightDot = document.createElement("span");
3092
- highlightDot.setAttribute("data-uidex-menubar-highlight-indicator", "");
3093
- highlightDot.setAttribute("aria-label", "Element highlighted (press Esc)");
3094
- highlightDot.setAttribute("role", "status");
3095
- Object.assign(highlightDot.style, {
3096
- display: "none",
3097
- width: "8px",
3098
- height: "8px",
3099
- borderRadius: "50%",
3100
- margin: "0 2px 0 4px",
3101
- background: "rgba(120, 180, 255, 0.85)",
3102
- boxShadow: "0 0 6px rgba(120, 180, 255, 0.75)",
3103
- flex: "0 0 auto"
3522
+ const highlightIcon = (0, import_lucide3.createElement)(import_lucide3.Highlighter);
3523
+ highlightIcon.setAttribute("class", "size-3.5");
3524
+ highlightIcon.setAttribute("aria-hidden", "true");
3525
+ const highlightBtn = el(
3526
+ "button",
3527
+ {
3528
+ class: BUTTON_CLASS,
3529
+ attrs: {
3530
+ type: "button",
3531
+ "data-uidex-menubar-highlight": "",
3532
+ "aria-label": "Dismiss highlight"
3533
+ }
3534
+ },
3535
+ highlightIcon
3536
+ );
3537
+ highlightBtn.hidden = true;
3538
+ highlightBtn.addEventListener("click", (e) => {
3539
+ e.stopPropagation();
3540
+ session.highlight.unpin();
3104
3541
  });
3105
- root.appendChild(highlightDot);
3106
- const inspectBtn = document.createElement("button");
3107
- inspectBtn.type = "button";
3108
- inspectBtn.setAttribute("data-uidex-menubar-inspect", "");
3109
- inspectBtn.textContent = "Inspect";
3110
- Object.assign(inspectBtn.style, buttonStyle);
3542
+ root.appendChild(highlightBtn);
3543
+ const inspectIcon = (0, import_lucide3.createElement)(import_lucide3.MousePointerClick);
3544
+ inspectIcon.setAttribute("class", "size-3.5");
3545
+ inspectIcon.setAttribute("aria-hidden", "true");
3546
+ const inspectBtn = el(
3547
+ "button",
3548
+ {
3549
+ class: BUTTON_CLASS,
3550
+ attrs: {
3551
+ type: "button",
3552
+ "data-uidex-menubar-inspect": "",
3553
+ "aria-label": `Inspect (${formatShortcutLabel(INSPECT_SHORTCUT)})`
3554
+ }
3555
+ },
3556
+ inspectIcon
3557
+ );
3111
3558
  inspectBtn.addEventListener("click", (e) => {
3112
3559
  e.stopPropagation();
3113
- session.send({ type: "TOGGLE_INSPECTOR" });
3560
+ session.mode.transition.toggleInspector();
3561
+ inspectBtn.blur();
3114
3562
  });
3115
3563
  root.appendChild(inspectBtn);
3116
- const paletteBtn = document.createElement("button");
3117
- paletteBtn.type = "button";
3118
- paletteBtn.setAttribute("data-uidex-menubar-palette", "");
3119
- paletteBtn.textContent = "\u2318K";
3120
- Object.assign(paletteBtn.style, buttonStyle);
3564
+ const pinIcon = (0, import_lucide3.createElement)(import_lucide3.MapPin);
3565
+ pinIcon.setAttribute("class", "size-3.5");
3566
+ pinIcon.setAttribute("aria-hidden", "true");
3567
+ const pinBtn = el(
3568
+ "button",
3569
+ {
3570
+ class: BUTTON_CLASS,
3571
+ attrs: {
3572
+ type: "button",
3573
+ "data-uidex-menubar-pins": "",
3574
+ "aria-label": "Report pins"
3575
+ }
3576
+ },
3577
+ pinIcon
3578
+ );
3579
+ const commitCycler = el("div", {
3580
+ class: "relative z-1 inline-flex items-center gap-0.5",
3581
+ attrs: { "data-uidex-menubar-commit-cycler": "" }
3582
+ });
3583
+ commitCycler.hidden = true;
3584
+ const prevIcon = (0, import_lucide3.createElement)(import_lucide3.ChevronLeft);
3585
+ prevIcon.setAttribute("class", "size-3");
3586
+ prevIcon.setAttribute("aria-hidden", "true");
3587
+ const prevBtn = el(
3588
+ "button",
3589
+ {
3590
+ class: BUTTON_CLASS,
3591
+ attrs: { type: "button", "aria-label": "Previous commit" },
3592
+ style: { width: "18px", height: "18px" }
3593
+ },
3594
+ prevIcon
3595
+ );
3596
+ const commitLabel = el("span", {
3597
+ class: "relative z-1 whitespace-nowrap px-1 text-[10px] font-mono text-muted-foreground",
3598
+ attrs: { "data-uidex-menubar-commit-label": "" }
3599
+ });
3600
+ const nextIcon = (0, import_lucide3.createElement)(import_lucide3.ChevronRight);
3601
+ nextIcon.setAttribute("class", "size-3");
3602
+ nextIcon.setAttribute("aria-hidden", "true");
3603
+ const nextBtn = el(
3604
+ "button",
3605
+ {
3606
+ class: BUTTON_CLASS,
3607
+ attrs: { type: "button", "aria-label": "Next commit" },
3608
+ style: { width: "18px", height: "18px" }
3609
+ },
3610
+ nextIcon
3611
+ );
3612
+ commitCycler.appendChild(prevBtn);
3613
+ commitCycler.appendChild(commitLabel);
3614
+ commitCycler.appendChild(nextBtn);
3615
+ const pinWrapper = el("div", {
3616
+ class: "relative z-1 inline-flex items-center gap-0.5",
3617
+ attrs: { "data-uidex-menubar-pin-wrapper": "" }
3618
+ });
3619
+ pinWrapper.hidden = true;
3620
+ pinWrapper.appendChild(pinBtn);
3621
+ pinWrapper.appendChild(commitCycler);
3622
+ root.appendChild(pinWrapper);
3623
+ const updatePinUI = () => {
3624
+ if (!activePinLayer) {
3625
+ pinWrapper.hidden = true;
3626
+ return;
3627
+ }
3628
+ const pinsVisible = activePinLayer.visible;
3629
+ const state = activePinLayer.filterState;
3630
+ const hasCommits = state.commits.length > 0;
3631
+ pinWrapper.hidden = false;
3632
+ commitCycler.hidden = !pinsVisible || !hasCommits;
3633
+ if (state.commitIndex === -1 || !state.commits[state.commitIndex]) {
3634
+ commitLabel.textContent = `all (${state.commits.length})`;
3635
+ } else {
3636
+ const sha = state.commits[state.commitIndex] ?? "";
3637
+ commitLabel.textContent = sha.slice(0, 7);
3638
+ }
3639
+ pinBtn.className = cn(BUTTON_CLASS, pinsVisible && BUTTON_ACTIVE_CLASS);
3640
+ };
3641
+ pinBtn.addEventListener("click", (e) => {
3642
+ e.stopPropagation();
3643
+ if (activePinLayer) {
3644
+ activePinLayer.setVisible(!activePinLayer.visible);
3645
+ }
3646
+ });
3647
+ prevBtn.addEventListener("click", (e) => {
3648
+ e.stopPropagation();
3649
+ activePinLayer?.prevCommit();
3650
+ });
3651
+ nextBtn.addEventListener("click", (e) => {
3652
+ e.stopPropagation();
3653
+ activePinLayer?.nextCommit();
3654
+ });
3655
+ let unsubscribePinFilter = activePinLayer?.onFilterChange(() => updatePinUI());
3656
+ const presenceIcon = (0, import_lucide3.createElement)(import_lucide3.Users);
3657
+ presenceIcon.setAttribute("class", "size-3.5");
3658
+ presenceIcon.setAttribute("aria-hidden", "true");
3659
+ const presenceBtn = el(
3660
+ "button",
3661
+ {
3662
+ class: BUTTON_CLASS,
3663
+ attrs: {
3664
+ type: "button",
3665
+ "data-uidex-menubar-presence": "",
3666
+ "aria-label": "Online users"
3667
+ }
3668
+ },
3669
+ presenceIcon
3670
+ );
3671
+ presenceBtn.hidden = true;
3672
+ const presenceBadge = el("span", {
3673
+ 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"
3674
+ });
3675
+ presenceBtn.appendChild(presenceBadge);
3676
+ const presencePopover = el("div", {
3677
+ 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"
3678
+ });
3679
+ presencePopover.hidden = true;
3680
+ let presencePopoverVisible = false;
3681
+ presenceBtn.addEventListener("click", (e) => {
3682
+ e.stopPropagation();
3683
+ presencePopoverVisible = !presencePopoverVisible;
3684
+ presencePopover.hidden = !presencePopoverVisible;
3685
+ });
3686
+ const presenceWrapper = el("div", { class: "relative z-1 inline-flex" }, [
3687
+ presenceBtn,
3688
+ presencePopover
3689
+ ]);
3690
+ presenceWrapper.hidden = true;
3691
+ root.appendChild(presenceWrapper);
3692
+ let presenceUsers = [];
3693
+ const updatePresenceUI = () => {
3694
+ const localUserId = session.getState().user?.id ?? null;
3695
+ const peers = localUserId ? presenceUsers.filter((u) => u.userId !== localUserId) : presenceUsers;
3696
+ const count = peers.length;
3697
+ presenceWrapper.hidden = count === 0;
3698
+ presenceBadge.textContent = String(count);
3699
+ presenceBtn.setAttribute(
3700
+ "aria-label",
3701
+ count === 1 ? "1 other user online" : `${count} other users online`
3702
+ );
3703
+ presencePopover.innerHTML = "";
3704
+ for (const user of peers) {
3705
+ const row = el("div", {
3706
+ class: "flex items-center gap-2 rounded px-1.5 py-1"
3707
+ });
3708
+ const dot = el("span", {
3709
+ class: "inline-block size-2 shrink-0 rounded-full bg-emerald-500"
3710
+ });
3711
+ const name = el("span", {
3712
+ class: "truncate",
3713
+ text: user.name || "Anonymous"
3714
+ });
3715
+ row.appendChild(dot);
3716
+ row.appendChild(name);
3717
+ presencePopover.appendChild(row);
3718
+ }
3719
+ };
3720
+ const paletteIcon = (0, import_lucide3.createElement)(import_lucide3.Command);
3721
+ paletteIcon.setAttribute("class", "size-3.5");
3722
+ paletteIcon.setAttribute("aria-hidden", "true");
3723
+ const paletteBtn = el(
3724
+ "button",
3725
+ {
3726
+ class: BUTTON_CLASS,
3727
+ attrs: {
3728
+ type: "button",
3729
+ "data-uidex-menubar-palette": "",
3730
+ "aria-label": "Command palette"
3731
+ }
3732
+ },
3733
+ paletteIcon
3734
+ );
3121
3735
  paletteBtn.addEventListener("click", (e) => {
3122
3736
  e.stopPropagation();
3123
3737
  if (session.getState().stack.length > 0) {
3124
- session.send({ type: "CLOSE" });
3738
+ session.mode.transition.dismiss();
3125
3739
  } else {
3126
- session.send({ type: "OPEN_PALETTE" });
3740
+ session.mode.transition.openPalette();
3127
3741
  }
3742
+ paletteBtn.blur();
3128
3743
  });
3129
3744
  root.appendChild(paletteBtn);
3130
3745
  container.appendChild(root);
3131
3746
  const syncButtonStates = () => {
3132
3747
  const state = session.getState();
3748
+ const inspectActive = state.inspectorActive;
3133
3749
  inspectBtn.setAttribute(
3134
3750
  "data-uidex-menubar-inspect-active",
3135
- state.inspectorActive ? "true" : "false"
3751
+ inspectActive ? "true" : "false"
3136
3752
  );
3137
- Object.assign(
3138
- inspectBtn.style,
3139
- state.inspectorActive ? buttonActiveStyle : buttonStyle
3753
+ inspectBtn.className = cn(
3754
+ BUTTON_CLASS,
3755
+ inspectActive && BUTTON_ACTIVE_CLASS
3140
3756
  );
3141
3757
  const top = state.stack[state.stack.length - 1] ?? null;
3142
3758
  const paletteOpen = top?.id === "command-palette";
@@ -3144,16 +3760,17 @@ function createMenuBar(options) {
3144
3760
  "data-uidex-menubar-palette-active",
3145
3761
  paletteOpen ? "true" : "false"
3146
3762
  );
3147
- Object.assign(
3148
- paletteBtn.style,
3149
- paletteOpen ? buttonActiveStyle : buttonStyle
3150
- );
3763
+ paletteBtn.className = cn(BUTTON_CLASS, paletteOpen && BUTTON_ACTIVE_CLASS);
3151
3764
  const highlightActive = state.pinnedHighlight !== null;
3152
- highlightDot.setAttribute(
3765
+ highlightBtn.setAttribute(
3153
3766
  "data-uidex-menubar-highlight-active",
3154
3767
  highlightActive ? "true" : "false"
3155
3768
  );
3156
- highlightDot.style.display = highlightActive ? "inline-block" : "none";
3769
+ highlightBtn.className = cn(
3770
+ BUTTON_CLASS,
3771
+ highlightActive && BUTTON_HIGHLIGHT_ACTIVE_CLASS
3772
+ );
3773
+ highlightBtn.hidden = !highlightActive;
3157
3774
  };
3158
3775
  syncButtonStates();
3159
3776
  const unsubscribeSession = session.subscribe(syncButtonStates);
@@ -3214,14 +3831,28 @@ function createMenuBar(options) {
3214
3831
  const vertical = y / (window.innerHeight || 1) < 0.5 ? "top" : "bottom";
3215
3832
  snapTo(`${vertical}-${horizontal}`);
3216
3833
  }
3834
+ const unsubscribePresence = channel?.onPresence(
3835
+ (users) => {
3836
+ presenceUsers = users;
3837
+ updatePresenceUI();
3838
+ }
3839
+ );
3217
3840
  return {
3218
3841
  destroy() {
3842
+ unsubscribePinFilter?.();
3843
+ unsubscribePresence?.();
3219
3844
  unsubscribeSession();
3220
3845
  root.removeEventListener("mousedown", onMouseDown);
3221
3846
  document.removeEventListener("mousemove", onMouseMove);
3222
3847
  document.removeEventListener("mouseup", onMouseUp);
3223
3848
  root.remove();
3224
3849
  },
3850
+ setPinLayer(layer) {
3851
+ unsubscribePinFilter?.();
3852
+ activePinLayer = layer;
3853
+ unsubscribePinFilter = layer.onFilterChange(() => updatePinUI());
3854
+ updatePinUI();
3855
+ },
3225
3856
  snapTo,
3226
3857
  snapToNearest,
3227
3858
  get corner() {
@@ -3233,19 +3864,38 @@ function createMenuBar(options) {
3233
3864
  };
3234
3865
  }
3235
3866
 
3236
- // src/surface/overlay.ts
3867
+ // src/browser/surface/overlay.ts
3237
3868
  var DEFAULT_COLOR = "#34d399";
3238
3869
  var DEFAULT_BORDER_WIDTH = 2;
3239
3870
  var DEFAULT_FILL_OPACITY = 0.08;
3871
+ var BACKDROP_OPACITY = 0.45;
3240
3872
  function createOverlay(deps) {
3241
3873
  const { container } = deps;
3874
+ const backdrop = document.createElement("div");
3875
+ backdrop.setAttribute("data-uidex-overlay-backdrop", "");
3876
+ backdrop.style.position = "fixed";
3877
+ backdrop.style.inset = "0";
3878
+ backdrop.style.zIndex = String(Z_OVERLAY);
3879
+ backdrop.style.backgroundColor = `rgba(0, 0, 0, ${BACKDROP_OPACITY})`;
3880
+ backdrop.style.opacity = "0";
3881
+ backdrop.style.visibility = "hidden";
3882
+ backdrop.style.transition = "opacity 150ms ease-out";
3883
+ backdrop.style.pointerEvents = "auto";
3884
+ backdrop.style.cursor = "default";
3885
+ backdrop.addEventListener("click", (e) => {
3886
+ e.stopPropagation();
3887
+ overlay.onDismiss?.();
3888
+ });
3889
+ container.appendChild(backdrop);
3242
3890
  const box = document.createElement("div");
3243
3891
  box.setAttribute("data-uidex-overlay", "");
3244
3892
  box.style.position = "fixed";
3245
3893
  box.style.pointerEvents = "none";
3246
- box.style.zIndex = String(Z_OVERLAY);
3894
+ box.style.zIndex = String(Z_OVERLAY + 1);
3247
3895
  box.style.boxSizing = "border-box";
3248
- box.style.display = "none";
3896
+ box.style.opacity = "0";
3897
+ box.style.transition = "opacity 150ms ease-out";
3898
+ box.style.visibility = "hidden";
3249
3899
  const label = document.createElement("div");
3250
3900
  label.setAttribute("data-uidex-overlay-label", "");
3251
3901
  label.style.position = "absolute";
@@ -3258,6 +3908,17 @@ function createOverlay(deps) {
3258
3908
  label.style.whiteSpace = "nowrap";
3259
3909
  label.style.color = "#0a0a0a";
3260
3910
  label.style.display = "none";
3911
+ box.addEventListener("transitionend", () => {
3912
+ if (box.style.opacity === "0") {
3913
+ box.style.visibility = "hidden";
3914
+ }
3915
+ });
3916
+ backdrop.addEventListener("transitionend", () => {
3917
+ if (backdrop.style.opacity === "0") {
3918
+ backdrop.style.visibility = "hidden";
3919
+ backdrop.style.clipPath = "";
3920
+ }
3921
+ });
3261
3922
  box.appendChild(label);
3262
3923
  container.appendChild(box);
3263
3924
  let target = null;
@@ -3267,7 +3928,8 @@ function createOverlay(deps) {
3267
3928
  padding: 0,
3268
3929
  borderStyle: "solid",
3269
3930
  borderWidth: DEFAULT_BORDER_WIDTH,
3270
- fillOpacity: DEFAULT_FILL_OPACITY
3931
+ fillOpacity: DEFAULT_FILL_OPACITY,
3932
+ backdrop: false
3271
3933
  };
3272
3934
  let rafId = null;
3273
3935
  let attached = false;
@@ -3311,16 +3973,26 @@ function createOverlay(deps) {
3311
3973
  if (!target) return;
3312
3974
  const rect = target.getBoundingClientRect();
3313
3975
  const pad = opts.padding;
3314
- box.style.top = `${rect.top - pad}px`;
3315
- box.style.left = `${rect.left - pad}px`;
3316
- box.style.width = `${rect.width + pad * 2}px`;
3317
- box.style.height = `${rect.height + pad * 2}px`;
3976
+ const top = rect.top - pad;
3977
+ const left = rect.left - pad;
3978
+ const w = rect.width + pad * 2;
3979
+ const h = rect.height + pad * 2;
3980
+ box.style.top = `${top}px`;
3981
+ box.style.left = `${left}px`;
3982
+ box.style.width = `${w}px`;
3983
+ box.style.height = `${h}px`;
3984
+ if (opts.backdrop) {
3985
+ const vw = window.innerWidth;
3986
+ const vh = window.innerHeight;
3987
+ backdrop.style.clipPath = cutoutPath(vw, vh, left, top, w, h);
3988
+ }
3318
3989
  }
3319
3990
  function applyStyles() {
3320
3991
  box.style.borderColor = opts.color;
3321
3992
  box.style.borderStyle = opts.borderStyle;
3322
3993
  box.style.borderWidth = `${opts.borderWidth}px`;
3323
3994
  box.style.backgroundColor = rgbaFromColor(opts.color, opts.fillOpacity);
3995
+ box.style.borderRadius = "6px";
3324
3996
  if (opts.label) {
3325
3997
  label.textContent = opts.label;
3326
3998
  label.style.backgroundColor = opts.color;
@@ -3329,9 +4001,19 @@ function createOverlay(deps) {
3329
4001
  label.textContent = "";
3330
4002
  label.style.display = "none";
3331
4003
  }
4004
+ if (opts.backdrop) {
4005
+ backdrop.style.visibility = "visible";
4006
+ backdrop.style.opacity = "1";
4007
+ } else {
4008
+ backdrop.style.opacity = "0";
4009
+ backdrop.style.visibility = "hidden";
4010
+ backdrop.style.clipPath = "";
4011
+ }
3332
4012
  }
3333
- return {
4013
+ const overlay = {
4014
+ onDismiss: null,
3334
4015
  show(nextTarget, showOpts) {
4016
+ const wasVisible = target !== null;
3335
4017
  target = nextTarget;
3336
4018
  opts = {
3337
4019
  label: showOpts?.label ?? "",
@@ -3339,27 +4021,41 @@ function createOverlay(deps) {
3339
4021
  padding: showOpts?.padding ?? 0,
3340
4022
  borderStyle: showOpts?.borderStyle ?? "solid",
3341
4023
  borderWidth: showOpts?.borderWidth ?? DEFAULT_BORDER_WIDTH,
3342
- fillOpacity: showOpts?.fillOpacity ?? DEFAULT_FILL_OPACITY
4024
+ fillOpacity: showOpts?.fillOpacity ?? DEFAULT_FILL_OPACITY,
4025
+ backdrop: showOpts?.backdrop ?? false
3343
4026
  };
3344
4027
  applyStyles();
3345
4028
  updatePosition();
3346
- box.style.display = "";
4029
+ if (!wasVisible) {
4030
+ box.style.opacity = "0";
4031
+ box.style.visibility = "visible";
4032
+ box.offsetHeight;
4033
+ }
4034
+ box.style.opacity = "1";
3347
4035
  attach();
3348
4036
  },
3349
4037
  hide() {
3350
4038
  target = null;
3351
- box.style.display = "none";
4039
+ box.style.opacity = "0";
4040
+ backdrop.style.opacity = "0";
3352
4041
  detach();
3353
4042
  },
3354
4043
  destroy() {
3355
4044
  detach();
3356
4045
  box.remove();
4046
+ backdrop.remove();
3357
4047
  target = null;
3358
4048
  },
3359
4049
  get isVisible() {
3360
4050
  return target !== null;
3361
4051
  }
3362
4052
  };
4053
+ return overlay;
4054
+ }
4055
+ function cutoutPath(vw, vh, x, y, w, h) {
4056
+ const outer = `M0 0H${vw}V${vh}H0Z`;
4057
+ const inner = `M${x} ${y}V${y + h}H${x + w}V${y}Z`;
4058
+ return `path(evenodd,"${outer}${inner}")`;
3363
4059
  }
3364
4060
  function rgbaFromColor(color, alpha) {
3365
4061
  if (color.startsWith("#")) {
@@ -3376,7 +4072,7 @@ function rgbaFromColor(color, alpha) {
3376
4072
  return color;
3377
4073
  }
3378
4074
 
3379
- // src/surface/theme.ts
4075
+ // src/browser/surface/theme.ts
3380
4076
  function createThemeDetector(deps) {
3381
4077
  const { session, onResolve } = deps;
3382
4078
  let resolved = session.getState().resolvedTheme;
@@ -3394,7 +4090,7 @@ function createThemeDetector(deps) {
3394
4090
  const next = detect(preference);
3395
4091
  if (next === resolved) return;
3396
4092
  resolved = next;
3397
- session.getState().actions.setTheme(preference, next);
4093
+ session.setTheme(preference, next);
3398
4094
  onResolve?.(next);
3399
4095
  };
3400
4096
  push();
@@ -3445,7 +4141,7 @@ function readHtmlClassToken() {
3445
4141
  return null;
3446
4142
  }
3447
4143
 
3448
- // src/surface/shell.ts
4144
+ // src/browser/surface/shell.ts
3449
4145
  function createSurfaceShell(options) {
3450
4146
  const cleanup = createCleanupStack();
3451
4147
  const host = createSurfaceHost({
@@ -3459,7 +4155,7 @@ function createSurfaceShell(options) {
3459
4155
  onResolve: (theme) => host.applyTheme(theme)
3460
4156
  });
3461
4157
  cleanup.add(themeDetector);
3462
- const overlay = createOverlay({ container: host.chromeEl });
4158
+ const overlay = createOverlay({ container: host.shadowRoot });
3463
4159
  cleanup.add(overlay);
3464
4160
  const tooltip = createCursorTooltip({
3465
4161
  container: host.chromeEl,
@@ -3467,21 +4163,37 @@ function createSurfaceShell(options) {
3467
4163
  });
3468
4164
  cleanup.add(tooltip);
3469
4165
  const afterHover = options.inspector?.onAfterHover;
4166
+ const showStack = (stack, cursor) => {
4167
+ if (!stack) {
4168
+ overlay.hide();
4169
+ tooltip.update(null, cursor);
4170
+ return;
4171
+ }
4172
+ const { current } = stack;
4173
+ const demoted = current.ref.kind === "primitive";
4174
+ overlay.show(current.element, {
4175
+ color: KIND_STYLE[current.ref.kind].color,
4176
+ ...demoted && { borderStyle: "dashed", fillOpacity: 0.04 }
4177
+ });
4178
+ tooltip.update(
4179
+ {
4180
+ entity: current.entity,
4181
+ node: current.element,
4182
+ layer: stack.matches.length > 1 ? { index: stack.index, total: stack.matches.length } : void 0
4183
+ },
4184
+ cursor
4185
+ );
4186
+ };
3470
4187
  const inspector = createInspector({
3471
4188
  session: options.session,
3472
4189
  registry: options.registry,
3473
4190
  onSelect: options.inspector?.onSelect,
3474
- onHover: (match, cursor) => {
3475
- if (!match) {
3476
- overlay.hide();
3477
- tooltip.update(null, cursor);
3478
- } else {
3479
- overlay.show(match.element, {
3480
- color: KIND_STYLE[match.ref.kind].color
3481
- });
3482
- tooltip.update({ entity: match.entity, node: match.element }, cursor);
3483
- }
3484
- afterHover?.(match, cursor);
4191
+ onHover: (stack, cursor) => {
4192
+ showStack(stack, cursor);
4193
+ afterHover?.(stack?.current ?? null, cursor);
4194
+ },
4195
+ onCycle: (stack, cursor) => {
4196
+ showStack(stack, cursor);
3485
4197
  }
3486
4198
  });
3487
4199
  cleanup.add(inspector);
@@ -3489,7 +4201,9 @@ function createSurfaceShell(options) {
3489
4201
  container: host.chromeEl,
3490
4202
  session: options.session,
3491
4203
  initialCorner: options.initialCorner,
3492
- appTitle: options.appTitle
4204
+ appTitle: options.appTitle,
4205
+ channel: options.channel ?? null,
4206
+ pinLayer: options.pinLayer ?? null
3493
4207
  });
3494
4208
  cleanup.add(menuBar);
3495
4209
  return {