@opengeni/react 3.7.0-canary.1 → 3.7.0-canary.3

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.
@@ -0,0 +1,5 @@
1
+ import type { MachineInputMember } from "../timeline/types.js";
2
+ /** Source IDs are routing coordinates only for typed child updates, never parsed from prose. */
3
+ export declare function ChildSessionLink({ kind, sourceId, onOpenSession, }: Pick<MachineInputMember, "kind" | "sourceId"> & {
4
+ onOpenSession?: ((sessionId: string) => void) | undefined;
5
+ }): import("react").JSX.Element | null;
@@ -39,7 +39,7 @@
39
39
  * shell uses one CSS grid-track transition for deliberate open/close actions;
40
40
  * live queue reconciliation never feeds measurements back into layout.
41
41
  */
42
- import type { SessionGoal, SessionTurn } from "@opengeni/sdk";
42
+ import type { SessionGoal, SessionStatus, SessionTurn } from "@opengeni/sdk";
43
43
  import { type ReactNode } from "react";
44
44
  import type { ComposerOptimisticMessage, ComposerState } from "../hooks/use-composer.js";
45
45
  import type { UseGoalResult } from "../hooks/use-goal.js";
@@ -53,6 +53,8 @@ export type SessionChromeAgentsSignal = {
53
53
  };
54
54
  export type SessionChromeProps = {
55
55
  compact?: boolean;
56
+ /** Authoritative execution status; omitted by older embedding hosts. */
57
+ sessionStatus?: SessionStatus | undefined;
56
58
  queue: UseTurnQueueResult;
57
59
  /** Needed for queue edit → composer checkout. Omit with `readOnly`. */
58
60
  composer?: ComposerState | undefined;
@@ -69,6 +71,8 @@ export type SessionChromeProps = {
69
71
  * (and the gallery) may still pass a handler so the action is visible.
70
72
  */
71
73
  onDismissIncoming?: ((inputId: string) => void) | undefined;
74
+ /** Open a typed child update's source through the host's normal authorized route. */
75
+ onOpenSession?: ((sessionId: string) => void) | undefined;
72
76
  readOnly?: boolean | undefined;
73
77
  className?: string | undefined;
74
78
  /** Controlled active segment; omit for uncontrolled. */
@@ -76,7 +80,7 @@ export type SessionChromeProps = {
76
80
  defaultActive?: SessionChromeSignalId | null | undefined;
77
81
  onActiveChange?: ((next: SessionChromeSignalId | null) => void) | undefined;
78
82
  };
79
- type GoalPillState = "pursuing" | "waiting" | "scheduled" | "blocked" | "held" | "paused" | "invariant_broken" | "completed";
83
+ type GoalPillState = "pursuing" | "waiting" | "scheduled" | "session_failed" | "blocked" | "held" | "paused" | "invariant_broken" | "completed";
80
84
  type GoalPillRecord = Pick<SessionGoal, "status" | "pausedReason"> & {
81
85
  continuation?: SessionGoal["continuation"] | null | undefined;
82
86
  };
@@ -111,6 +115,6 @@ export declare function sessionChromeShouldOfferQueue(input: {
111
115
  suppressed: boolean;
112
116
  }): boolean;
113
117
  /** Select pill state from the goal's authoritative continuation projection. */
114
- export declare function sessionChromeGoalPillState(goalStatus: "active" | "paused" | "completed", continuation: SessionGoal["continuation"] | null | undefined): GoalPillState;
115
- export declare function SessionChrome({ compact, queue, composer, goal, agentsPanel, commandsPanel, commandsCount, agentsSignal, onDismissIncoming, readOnly, className, active: activeControlled, defaultActive, onActiveChange, }: SessionChromeProps): import("react").JSX.Element | null;
118
+ export declare function sessionChromeGoalPillState(goalStatus: "active" | "paused" | "completed", continuation: SessionGoal["continuation"] | null | undefined, sessionStatus?: SessionStatus): GoalPillState;
119
+ export declare function SessionChrome({ compact, sessionStatus, queue, composer, goal, agentsPanel, commandsPanel, commandsCount, agentsSignal, onDismissIncoming, onOpenSession, readOnly, className, active: activeControlled, defaultActive, onActiveChange, }: SessionChromeProps): import("react").JSX.Element | null;
116
120
  export {};
package/dist/composer.js CHANGED
@@ -37,7 +37,7 @@ import {
37
37
  useChatComposer,
38
38
  useChatComposerController,
39
39
  useVoiceInput
40
- } from "./chunk-INGB2N5R.js";
40
+ } from "./chunk-3IY6UZI6.js";
41
41
  import {
42
42
  BillingClassMark,
43
43
  ModelPolicyPicker,
package/dist/index.js CHANGED
@@ -105,7 +105,7 @@ import {
105
105
  useWorkspaceModelCatalog,
106
106
  userMessageLikelyNeedsDisclosure,
107
107
  v4aToGitFileDiff
108
- } from "./chunk-5IXTJTK3.js";
108
+ } from "./chunk-2ZICNIGZ.js";
109
109
  import "./chunk-W3OUAH6M.js";
110
110
  import {
111
111
  OpenGeniProvider
@@ -153,7 +153,7 @@ import {
153
153
  useSlashCommands,
154
154
  useTranscription,
155
155
  useVoiceInput
156
- } from "./chunk-INGB2N5R.js";
156
+ } from "./chunk-3IY6UZI6.js";
157
157
  import {
158
158
  BillingClassMark,
159
159
  ModelPolicyPicker,
@@ -13,11 +13,11 @@ import {
13
13
  sessionChromeGoalPillLabel,
14
14
  sessionChromeGoalPillState,
15
15
  userMessageLikelyNeedsDisclosure
16
- } from "./chunk-5IXTJTK3.js";
16
+ } from "./chunk-2ZICNIGZ.js";
17
17
  import "./chunk-W3OUAH6M.js";
18
18
  import "./chunk-PAJU5KKL.js";
19
19
  import "./chunk-JVYQRRC4.js";
20
- import "./chunk-INGB2N5R.js";
20
+ import "./chunk-3IY6UZI6.js";
21
21
  import "./chunk-4JFUT22W.js";
22
22
  import "./chunk-VZTQ73XT.js";
23
23
  import {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengeni/react",
3
- "version": "3.7.0-canary.1",
3
+ "version": "3.7.0-canary.3",
4
4
  "description": "React hooks and styled components for OpenGeni: live session streaming, chat composer, message timeline, session status, and fleet views — token-themed (CSS variables), dark-first, built on Tailwind v4 + Radix + Motion.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -120,7 +120,7 @@
120
120
  "@dnd-kit/utilities": "3.2.2",
121
121
  "@fontsource-variable/noto-sans-arabic": "5.2.10",
122
122
  "@fontsource-variable/noto-sans-jp": "5.2.10",
123
- "@opengeni/sdk": "^3.7.0-canary.1",
123
+ "@opengeni/sdk": "^3.7.0-canary.3",
124
124
  "clsx": "^2.1.1",
125
125
  "dequal": "2.0.3",
126
126
  "lucide-react": "^1.8.0",
@@ -0,0 +1,27 @@
1
+ import type { MachineInputMember } from "../timeline/types";
2
+
3
+ /** Source IDs are routing coordinates only for typed child updates, never parsed from prose. */
4
+ export function ChildSessionLink({
5
+ kind,
6
+ sourceId,
7
+ onOpenSession,
8
+ }: Pick<MachineInputMember, "kind" | "sourceId"> & {
9
+ onOpenSession?: ((sessionId: string) => void) | undefined;
10
+ }) {
11
+ if (
12
+ !onOpenSession ||
13
+ !kind.startsWith("child_") ||
14
+ !/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(sourceId)
15
+ ) {
16
+ return null;
17
+ }
18
+ return (
19
+ <button
20
+ type="button"
21
+ onClick={() => onOpenSession(sourceId)}
22
+ className="mt-1 rounded-og-sm text-og-xs font-medium text-og-accent underline-offset-4 hover:underline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-og-accent"
23
+ >
24
+ View session
25
+ </button>
26
+ );
27
+ }
@@ -281,7 +281,7 @@ function measureComposerContentHeight(textarea: HTMLTextAreaElement): number {
281
281
  mirror.tabIndex = -1;
282
282
  mirror.rows = 1;
283
283
  mirror.style.cssText =
284
- "position:absolute;top:0;left:0;visibility:hidden;pointer-events:none;height:auto;min-height:0;max-height:none;overflow:hidden;z-index:-1;";
284
+ "position:fixed;top:0;left:-100000px;visibility:hidden;pointer-events:none;height:auto;min-height:0;max-height:none;overflow:hidden;z-index:-1;";
285
285
  composerHeightMirror = mirror;
286
286
  }
287
287
 
@@ -7,7 +7,7 @@ export const MACHINE_INPUT_META: Record<MachineInputMember["kind"], string> = {
7
7
  session_wait_timeout: "Wait ended",
8
8
  agent_message: "Agent update",
9
9
  agent_steer_instruction: "Agent direction",
10
- child_terminal_result: "Agent finished",
10
+ child_terminal_result: "Agent result received",
11
11
  media_generation_result: "Video update",
12
12
  child_requires_action: "Agent needs input",
13
13
  child_requires_action_resolved: "Agent unblocked",
@@ -35,7 +35,7 @@ export function machineInputBatchLabel(members: readonly MachineInputMember[]):
35
35
  case "session_wait_timeout":
36
36
  return n === 1 ? "Wait ended" : `${n} waits ended`;
37
37
  case "child_terminal_result":
38
- return n === 1 ? "Agent finished" : `${n} agents finished`;
38
+ return n === 1 ? "Agent result received" : `${n} agent results received`;
39
39
  case "goal_continuation":
40
40
  return n === 1 ? "Goal continued" : `${n} goal continuations`;
41
41
  case "scheduled_occurrence":
@@ -1,3 +1,4 @@
1
+ import { ChildSessionLink } from "./child-session-link";
1
2
  import type {
2
3
  DraftTimelineAnnotation,
3
4
  MediaGenerationResult,
@@ -2847,7 +2848,11 @@ export function TimelineRow({
2847
2848
  return <GoalRow item={item} />;
2848
2849
  case "machine-input-batch":
2849
2850
  return (
2850
- <MachineInputBatchRow item={item} loadVideoArtifactPlayback={loadVideoArtifactPlayback} />
2851
+ <MachineInputBatchRow
2852
+ item={item}
2853
+ onOpenSession={onOpenSession}
2854
+ loadVideoArtifactPlayback={loadVideoArtifactPlayback}
2855
+ />
2851
2856
  );
2852
2857
  case "notice":
2853
2858
  return <NoticeRow item={item} />;
@@ -3460,9 +3465,11 @@ function GoalRow({ item }: { item: GoalItem }) {
3460
3465
 
3461
3466
  function MachineInputBatchRow({
3462
3467
  item,
3468
+ onOpenSession,
3463
3469
  loadVideoArtifactPlayback,
3464
3470
  }: {
3465
3471
  item: MachineInputBatchItem;
3472
+ onOpenSession?: ((sessionId: string) => void) | undefined;
3466
3473
  loadVideoArtifactPlayback?: VideoArtifactPlaybackLoader | undefined;
3467
3474
  }) {
3468
3475
  const enter = useEntranceAnimation();
@@ -3509,6 +3516,7 @@ function MachineInputBatchRow({
3509
3516
  <MachineInputRow
3510
3517
  key={member.id}
3511
3518
  member={member}
3519
+ onOpenSession={onOpenSession}
3512
3520
  loadVideoArtifactPlayback={loadVideoArtifactPlayback}
3513
3521
  />
3514
3522
  ))}
@@ -3525,9 +3533,11 @@ function MachineInputBatchRow({
3525
3533
 
3526
3534
  function MachineInputRow({
3527
3535
  member,
3536
+ onOpenSession,
3528
3537
  loadVideoArtifactPlayback,
3529
3538
  }: {
3530
3539
  member: MachineInputBatchItem["members"][number];
3540
+ onOpenSession?: ((sessionId: string) => void) | undefined;
3531
3541
  loadVideoArtifactPlayback?: VideoArtifactPlaybackLoader | undefined;
3532
3542
  }) {
3533
3543
  if (member.kind === "media_generation_result" && member.result) {
@@ -3554,6 +3564,11 @@ function MachineInputRow({
3554
3564
  {truncate(summary, 320)}
3555
3565
  </p>
3556
3566
  ) : null}
3567
+ <ChildSessionLink
3568
+ kind={member.kind}
3569
+ sourceId={member.sourceId}
3570
+ onOpenSession={onOpenSession}
3571
+ />
3557
3572
  </div>
3558
3573
  </div>
3559
3574
  );
@@ -3662,7 +3677,7 @@ function NoticeRow({ item }: { item: NoticeItem }) {
3662
3677
  {item.details ? (
3663
3678
  <details className="mt-2 text-og-control">
3664
3679
  <summary className="cursor-pointer font-medium">{item.details.label}</summary>
3665
- <pre className="mt-2 max-h-64 overflow-auto whitespace-pre-wrap break-all rounded-og-sm bg-black/5 p-2 font-mono dark:bg-white/5">
3680
+ <pre className="mt-2 max-h-64 overflow-auto whitespace-pre-wrap break-all rounded-og-sm bg-og-fg/5 p-2 font-mono">
3666
3681
  {JSON.stringify(item.details.value, null, 2)}
3667
3682
  </pre>
3668
3683
  </details>
@@ -1,3 +1,4 @@
1
+ import { ChildSessionLink } from "./child-session-link";
1
2
  /**
2
3
  * SessionChrome — compact merged session signals above the composer.
3
4
  *
@@ -39,7 +40,12 @@
39
40
  * shell uses one CSS grid-track transition for deliberate open/close actions;
40
41
  * live queue reconciliation never feeds measurements back into layout.
41
42
  */
42
- import type { SessionGoal, SessionPendingInputPreview, SessionTurn } from "@opengeni/sdk";
43
+ import type {
44
+ SessionGoal,
45
+ SessionPendingInputPreview,
46
+ SessionStatus,
47
+ SessionTurn,
48
+ } from "@opengeni/sdk";
43
49
  import {
44
50
  ActivityIcon,
45
51
  AudioLinesIcon,
@@ -89,6 +95,8 @@ export type SessionChromeAgentsSignal = {
89
95
 
90
96
  export type SessionChromeProps = {
91
97
  compact?: boolean;
98
+ /** Authoritative execution status; omitted by older embedding hosts. */
99
+ sessionStatus?: SessionStatus | undefined;
92
100
  queue: UseTurnQueueResult;
93
101
  /** Needed for queue edit → composer checkout. Omit with `readOnly`. */
94
102
  composer?: ComposerState | undefined;
@@ -105,6 +113,8 @@ export type SessionChromeProps = {
105
113
  * (and the gallery) may still pass a handler so the action is visible.
106
114
  */
107
115
  onDismissIncoming?: ((inputId: string) => void) | undefined;
116
+ /** Open a typed child update's source through the host's normal authorized route. */
117
+ onOpenSession?: ((sessionId: string) => void) | undefined;
108
118
  readOnly?: boolean | undefined;
109
119
  className?: string | undefined;
110
120
  /** Controlled active segment; omit for uncontrolled. */
@@ -117,6 +127,7 @@ type GoalPillState =
117
127
  | "pursuing"
118
128
  | "waiting"
119
129
  | "scheduled"
130
+ | "session_failed"
120
131
  | "blocked"
121
132
  | "held"
122
133
  | "paused"
@@ -133,6 +144,7 @@ const GOAL_LABEL: Record<GoalPillState, string> = {
133
144
  waiting: "Waiting",
134
145
  scheduled: "Waiting",
135
146
  blocked: "Blocked",
147
+ session_failed: "Blocked by session failure",
136
148
  held: "Held",
137
149
  paused: "Paused",
138
150
  invariant_broken: "Needs attention",
@@ -187,6 +199,9 @@ export function sessionChromeGoalPillExplanation(
187
199
  record: GoalPillRecord | null | undefined,
188
200
  ): string | null {
189
201
  const continuation = record?.continuation ?? null;
202
+ if (state === "session_failed") {
203
+ return "Resolve the session failure, then use Continue or send a message to continue this active goal.";
204
+ }
190
205
  if (state === "paused") {
191
206
  return record?.pausedReason
192
207
  ? (GOAL_PAUSED_REASON_EXPLANATION[record.pausedReason] ?? null)
@@ -309,9 +324,11 @@ function objectValue(value: unknown): Record<string, unknown> | null {
309
324
  export function sessionChromeGoalPillState(
310
325
  goalStatus: "active" | "paused" | "completed",
311
326
  continuation: SessionGoal["continuation"] | null | undefined,
327
+ sessionStatus?: SessionStatus,
312
328
  ): GoalPillState {
313
329
  if (goalStatus === "completed") return "completed";
314
330
  if (goalStatus === "paused") return "paused";
331
+ if (sessionStatus === "failed") return "session_failed";
315
332
  if (!continuation) return "invariant_broken";
316
333
  if (continuation.state === "running") {
317
334
  return continuation.reason === "goal_turn_running"
@@ -411,6 +428,7 @@ function toneClass(tone: SessionChromeSignalTone, selected: boolean): string {
411
428
 
412
429
  export function SessionChrome({
413
430
  compact = false,
431
+ sessionStatus,
414
432
  queue,
415
433
  composer,
416
434
  goal,
@@ -419,6 +437,7 @@ export function SessionChrome({
419
437
  commandsCount = 0,
420
438
  agentsSignal,
421
439
  onDismissIncoming,
440
+ onOpenSession,
422
441
  readOnly = false,
423
442
  className,
424
443
  active: activeControlled,
@@ -458,7 +477,9 @@ export function SessionChrome({
458
477
  const canMutateQueue = !readOnly && composer !== undefined;
459
478
 
460
479
  const elapsed = useLiveElapsed(record?.createdAt, Boolean(record));
461
- const goalState = record ? sessionChromeGoalPillState(record.status, record.continuation) : null;
480
+ const goalState = record
481
+ ? sessionChromeGoalPillState(record.status, record.continuation, sessionStatus)
482
+ : null;
462
483
 
463
484
  const initialAuthoritativeQueuedCount = countAuthoritativeQueuedTurns(
464
485
  queue.queue,
@@ -571,6 +592,7 @@ export function SessionChrome({
571
592
  const waiting =
572
593
  goalState === "waiting" ||
573
594
  goalState === "blocked" ||
595
+ goalState === "session_failed" ||
574
596
  goalState === "held" ||
575
597
  goalState === "paused";
576
598
  const explanation = sessionChromeGoalPillExplanation(goalState, record);
@@ -751,7 +773,11 @@ export function SessionChrome({
751
773
 
752
774
  const panelBody =
753
775
  active === "incoming" ? (
754
- <IncomingPanel inputs={incoming} onDismiss={onDismissIncoming} />
776
+ <IncomingPanel
777
+ inputs={incoming}
778
+ onDismiss={onDismissIncoming}
779
+ onOpenSession={onOpenSession}
780
+ />
755
781
  ) : active === "queue" ? (
756
782
  <QueuePanel
757
783
  turns={queuedTurns}
@@ -1221,47 +1247,59 @@ export function SessionChrome({
1221
1247
  function IncomingPanel({
1222
1248
  inputs,
1223
1249
  onDismiss,
1250
+ onOpenSession,
1224
1251
  }: {
1225
1252
  inputs: SessionPendingInputPreview[];
1226
1253
  onDismiss?: ((inputId: string) => void) | undefined;
1254
+ onOpenSession?: ((sessionId: string) => void) | undefined;
1227
1255
  }) {
1228
1256
  return (
1229
- <ul
1230
- className="flex flex-col gap-0.5"
1231
- aria-label="Incoming updates"
1232
- data-og-session-chrome-panel="incoming"
1233
- >
1234
- {inputs.map((input) => (
1235
- <li
1236
- key={input.id}
1237
- className="group flex items-start gap-1.5 rounded-og-sm px-1.5 py-1 transition-colors hover:bg-[var(--_og-session-chrome-row-hover)]"
1238
- >
1239
- <span
1240
- className={cn(
1241
- "mt-px shrink-0 rounded px-1 py-px text-[10px] font-medium leading-4",
1242
- input.classification === "action_required" || input.classification === "failure"
1243
- ? "bg-og-status-waiting/12 text-og-status-waiting"
1244
- : "bg-og-surface-3/80 text-og-fg-muted",
1245
- )}
1257
+ <div>
1258
+ <p className="mb-2 text-og-xs text-og-fg-subtle">Waiting to be included in an agent turn.</p>
1259
+ <ul
1260
+ className="flex flex-col gap-0.5"
1261
+ aria-label="Incoming updates"
1262
+ data-og-session-chrome-panel="incoming"
1263
+ >
1264
+ {inputs.map((input) => (
1265
+ <li
1266
+ key={input.id}
1267
+ className="group flex items-start gap-1.5 rounded-og-sm px-1.5 py-1 transition-colors hover:bg-[var(--_og-session-chrome-row-hover)]"
1246
1268
  >
1247
- {pendingKindLabel(input.kind)}
1248
- </span>
1249
- <p className="min-w-0 flex-1 text-og-xs leading-4 text-og-fg">{input.summary}</p>
1250
- {onDismiss ? (
1251
- <div className="flex shrink-0 items-center gap-0.5 opacity-0 transition-opacity group-hover:opacity-100 focus-within:opacity-100 max-sm:opacity-100">
1252
- <IconAction
1253
- label={`Dismiss incoming ${pendingKindLabel(input.kind)}`}
1254
- tip="Dismiss"
1255
- onClick={() => onDismiss(input.id)}
1256
- danger
1257
- >
1258
- <Trash2Icon className="size-3" />
1259
- </IconAction>
1269
+ <span
1270
+ className={cn(
1271
+ "mt-px shrink-0 rounded px-1 py-px text-[10px] font-medium leading-4",
1272
+ input.classification === "action_required" || input.classification === "failure"
1273
+ ? "bg-og-status-waiting/12 text-og-status-waiting"
1274
+ : "bg-og-surface-3/80 text-og-fg-muted",
1275
+ )}
1276
+ >
1277
+ {pendingKindLabel(input.kind)}
1278
+ </span>
1279
+ <div className="min-w-0 flex-1">
1280
+ <p className="break-words text-og-xs leading-4 text-og-fg">{input.summary}</p>
1281
+ <ChildSessionLink
1282
+ kind={input.kind}
1283
+ sourceId={input.sourceId}
1284
+ onOpenSession={onOpenSession}
1285
+ />
1260
1286
  </div>
1261
- ) : null}
1262
- </li>
1263
- ))}
1264
- </ul>
1287
+ {onDismiss ? (
1288
+ <div className="flex shrink-0 items-center gap-0.5 opacity-0 transition-opacity group-hover:opacity-100 focus-within:opacity-100 max-sm:opacity-100">
1289
+ <IconAction
1290
+ label={`Dismiss incoming ${pendingKindLabel(input.kind)}`}
1291
+ tip="Dismiss"
1292
+ onClick={() => onDismiss(input.id)}
1293
+ danger
1294
+ >
1295
+ <Trash2Icon className="size-3" />
1296
+ </IconAction>
1297
+ </div>
1298
+ ) : null}
1299
+ </li>
1300
+ ))}
1301
+ </ul>
1302
+ </div>
1265
1303
  );
1266
1304
  }
1267
1305
 
@@ -2307,12 +2307,6 @@
2307
2307
  :where(.og-root).bg-black,:where(.og-root) .bg-black {
2308
2308
  background-color: var(--color-black);
2309
2309
  }
2310
- :where(.og-root).bg-black\/5,:where(.og-root) .bg-black\/5 {
2311
- background-color: color-mix(in srgb, #000 5%, transparent);
2312
- @supports (color: color-mix(in lab, red, red)) {
2313
- background-color: color-mix(in oklab, var(--color-black) 5%, transparent);
2314
- }
2315
- }
2316
2310
  :where(.og-root).bg-black\/45,:where(.og-root) .bg-black\/45 {
2317
2311
  background-color: color-mix(in srgb, #000 45%, transparent);
2318
2312
  @supports (color: color-mix(in lab, red, red)) {
@@ -2430,6 +2424,12 @@
2430
2424
  :where(.og-root).bg-og-fg-subtle,:where(.og-root) .bg-og-fg-subtle {
2431
2425
  background-color: var(--og-color-fg-subtle);
2432
2426
  }
2427
+ :where(.og-root).bg-og-fg\/5,:where(.og-root) .bg-og-fg\/5 {
2428
+ background-color: var(--og-color-fg);
2429
+ @supports (color: color-mix(in lab, red, red)) {
2430
+ background-color: color-mix(in oklab, var(--og-color-fg) 5%, transparent);
2431
+ }
2432
+ }
2433
2433
  :where(.og-root).bg-og-status-cancelled,:where(.og-root) .bg-og-status-cancelled {
2434
2434
  background-color: var(--og-color-status-cancelled);
2435
2435
  }
@@ -3257,6 +3257,9 @@
3257
3257
  :where(.og-root).underline-offset-2,:where(.og-root) .underline-offset-2 {
3258
3258
  text-underline-offset: 2px;
3259
3259
  }
3260
+ :where(.og-root).underline-offset-4,:where(.og-root) .underline-offset-4 {
3261
+ text-underline-offset: 4px;
3262
+ }
3260
3263
  :where(.og-root).accent-og-accent,:where(.og-root) .accent-og-accent {
3261
3264
  accent-color: var(--og-color-accent);
3262
3265
  }
@@ -4523,6 +4526,22 @@
4523
4526
  }
4524
4527
  }
4525
4528
  }
4529
+ :where(.og-root).focus-visible\:outline-2,:where(.og-root) .focus-visible\:outline-2 {
4530
+ &:focus-visible {
4531
+ outline-style: var(--tw-outline-style);
4532
+ outline-width: 2px;
4533
+ }
4534
+ }
4535
+ :where(.og-root).focus-visible\:outline-offset-2,:where(.og-root) .focus-visible\:outline-offset-2 {
4536
+ &:focus-visible {
4537
+ outline-offset: 2px;
4538
+ }
4539
+ }
4540
+ :where(.og-root).focus-visible\:outline-og-accent,:where(.og-root) .focus-visible\:outline-og-accent {
4541
+ &:focus-visible {
4542
+ outline-color: var(--og-color-accent);
4543
+ }
4544
+ }
4526
4545
  :where(.og-root).focus-visible\:ring-inset,:where(.og-root) .focus-visible\:ring-inset {
4527
4546
  &:focus-visible {
4528
4547
  --tw-ring-inset: inset;
@@ -5077,14 +5096,6 @@
5077
5096
  grid-template-columns: repeat(3, minmax(0, 1fr));
5078
5097
  }
5079
5098
  }
5080
- :where(.og-root).dark\:bg-white\/5,:where(.og-root) .dark\:bg-white\/5 {
5081
- @media (prefers-color-scheme: dark) {
5082
- background-color: color-mix(in srgb, #fff 5%, transparent);
5083
- @supports (color: color-mix(in lab, red, red)) {
5084
- background-color: color-mix(in oklab, var(--color-white) 5%, transparent);
5085
- }
5086
- }
5087
- }
5088
5099
  :where(.og-root).dark\:data-\[variant\=destructive\]\:focus\:bg-destructive\/20,:where(.og-root) .dark\:data-\[variant\=destructive\]\:focus\:bg-destructive\/20 {
5089
5100
  @media (prefers-color-scheme: dark) {
5090
5101
  &[data-variant="destructive"] {