@agent-native/core 0.79.18 → 0.79.20
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.
- package/corpus/README.md +1 -1
- package/corpus/core/CHANGELOG.md +13 -0
- package/corpus/core/package.json +2 -1
- package/corpus/core/src/client/i18n.tsx +77 -65
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +1 -1
- package/corpus/templates/analytics/app/global.css +15 -0
- package/corpus/templates/analytics/app/pages/Ask.tsx +1 -1
- package/corpus/templates/analytics/changelog/2026-06-26-the-ask-tab-uses-a-softer-dark-gray-canvas-while-sidebar-cha.md +6 -0
- package/corpus/templates/clips/app/components/library/library-layout.tsx +325 -333
- package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +80 -40
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +44 -3
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +10 -2
- package/corpus/templates/clips/changelog/2026-06-26-recording-details-button-stays-at-the-far-right-on-small-screen.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-26-the-agent-sidebar-now-slides-in-smoothly-without-duplicate-e.md +6 -0
- package/corpus/templates/plan/app/components/plan/CanvasArea.tsx +56 -4
- package/corpus/templates/plan/app/global.css +8 -3
- package/corpus/templates/plan/app/pages/PlansPage.tsx +1 -1
- package/corpus/templates/plan/changelog/2026-06-26-canvas-grid-panning-now-stays-smooth-and-fills-the-workspace.md +6 -0
- package/dist/client/i18n.d.ts.map +1 -1
- package/dist/client/i18n.js +20 -9
- package/dist/client/i18n.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +2 -2
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/observability/routes.d.ts +2 -2
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/package.json +2 -1
|
@@ -233,370 +233,362 @@ export function LibraryLayout({ children }: LibraryLayoutProps) {
|
|
|
233
233
|
];
|
|
234
234
|
|
|
235
235
|
return (
|
|
236
|
-
<div className="flex h-screen overflow-hidden bg-background">
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
236
|
+
<div className="agent-layout-shell flex h-screen overflow-hidden bg-background">
|
|
237
|
+
{/* Mobile backdrop */}
|
|
238
|
+
{sidebarOpen && (
|
|
239
|
+
<div
|
|
240
|
+
className="fixed inset-0 z-40 bg-black/50 md:hidden"
|
|
241
|
+
onClick={() => setSidebarOpen(false)}
|
|
242
|
+
/>
|
|
243
|
+
)}
|
|
244
|
+
|
|
245
|
+
{/* Left sidebar */}
|
|
246
|
+
<aside
|
|
247
|
+
className={cn(
|
|
248
|
+
"agent-layout-left-drawer fixed inset-y-0 start-0 z-50 flex h-full w-[260px] flex-col overflow-hidden border-e border-border bg-sidebar transition-[width,transform] duration-200 ease-out md:static md:z-auto",
|
|
249
|
+
showCollapsedSidebar && "md:w-14",
|
|
250
|
+
sidebarOpen
|
|
251
|
+
? "translate-x-0"
|
|
252
|
+
: "-translate-x-full rtl:translate-x-full md:translate-x-0",
|
|
253
|
+
)}
|
|
250
254
|
>
|
|
251
|
-
<div
|
|
252
|
-
{
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
className="fixed inset-0 z-40 bg-black/50 md:hidden"
|
|
256
|
-
onClick={() => setSidebarOpen(false)}
|
|
257
|
-
/>
|
|
255
|
+
<div
|
|
256
|
+
className={cn(
|
|
257
|
+
"flex h-12 shrink-0 items-center border-b border-border",
|
|
258
|
+
showCollapsedSidebar ? "justify-center px-2" : "px-4",
|
|
258
259
|
)}
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
<aside
|
|
260
|
+
>
|
|
261
|
+
<div
|
|
262
262
|
className={cn(
|
|
263
|
-
"
|
|
264
|
-
showCollapsedSidebar && "
|
|
265
|
-
sidebarOpen
|
|
266
|
-
? "translate-x-0"
|
|
267
|
-
: "-translate-x-full rtl:translate-x-full md:translate-x-0",
|
|
263
|
+
"flex min-w-0 items-center gap-2",
|
|
264
|
+
!showCollapsedSidebar && "flex-1",
|
|
268
265
|
)}
|
|
269
266
|
>
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
267
|
+
{!showCollapsedSidebar && (
|
|
268
|
+
<>
|
|
269
|
+
<img
|
|
270
|
+
src={appPath("/agent-native-icon-light.svg")}
|
|
271
|
+
alt=""
|
|
272
|
+
aria-hidden="true"
|
|
273
|
+
className="block h-4 w-auto shrink-0 dark:hidden"
|
|
274
|
+
/>
|
|
275
|
+
<img
|
|
276
|
+
src={appPath("/agent-native-icon-dark.svg")}
|
|
277
|
+
alt=""
|
|
278
|
+
aria-hidden="true"
|
|
279
|
+
className="hidden h-4 w-auto shrink-0 dark:block"
|
|
280
|
+
/>
|
|
281
|
+
<span className="truncate text-sm font-semibold text-foreground">
|
|
282
|
+
{t("navigation.brand")}
|
|
283
|
+
</span>
|
|
284
|
+
</>
|
|
285
|
+
)}
|
|
286
|
+
</div>
|
|
287
|
+
|
|
288
|
+
<Tooltip>
|
|
289
|
+
<TooltipTrigger asChild>
|
|
290
|
+
<Button
|
|
291
|
+
type="button"
|
|
292
|
+
variant="ghost"
|
|
293
|
+
size="icon"
|
|
294
|
+
className="hidden h-7 w-7 shrink-0 text-muted-foreground hover:text-foreground md:inline-flex"
|
|
295
|
+
aria-label={
|
|
296
|
+
showCollapsedSidebar
|
|
297
|
+
? t("navigation.expandSidebar")
|
|
298
|
+
: t("navigation.collapseSidebar")
|
|
299
|
+
}
|
|
300
|
+
aria-expanded={!showCollapsedSidebar}
|
|
301
|
+
onClick={() => setSidebarCollapsed((value) => !value)}
|
|
281
302
|
>
|
|
282
|
-
{
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
alt=""
|
|
287
|
-
aria-hidden="true"
|
|
288
|
-
className="block h-4 w-auto shrink-0 dark:hidden"
|
|
289
|
-
/>
|
|
290
|
-
<img
|
|
291
|
-
src={appPath("/agent-native-icon-dark.svg")}
|
|
292
|
-
alt=""
|
|
293
|
-
aria-hidden="true"
|
|
294
|
-
className="hidden h-4 w-auto shrink-0 dark:block"
|
|
295
|
-
/>
|
|
296
|
-
<span className="truncate text-sm font-semibold text-foreground">
|
|
297
|
-
{t("navigation.brand")}
|
|
298
|
-
</span>
|
|
299
|
-
</>
|
|
303
|
+
{showCollapsedSidebar ? (
|
|
304
|
+
<IconLayoutSidebarLeftExpand className="h-4 w-4" />
|
|
305
|
+
) : (
|
|
306
|
+
<IconLayoutSidebarLeftCollapse className="h-4 w-4" />
|
|
300
307
|
)}
|
|
308
|
+
</Button>
|
|
309
|
+
</TooltipTrigger>
|
|
310
|
+
<TooltipContent side="right">
|
|
311
|
+
{showCollapsedSidebar
|
|
312
|
+
? t("navigation.expandSidebar")
|
|
313
|
+
: t("navigation.collapseSidebar")}
|
|
314
|
+
</TooltipContent>
|
|
315
|
+
</Tooltip>
|
|
316
|
+
</div>
|
|
317
|
+
<div className="min-h-0 flex-1 overflow-y-auto">
|
|
318
|
+
{showCollapsedSidebar ? (
|
|
319
|
+
<>
|
|
320
|
+
<div className="flex justify-center px-2 py-3">
|
|
321
|
+
<Tooltip>
|
|
322
|
+
<TooltipTrigger asChild>
|
|
323
|
+
<NavLink
|
|
324
|
+
to="/record"
|
|
325
|
+
aria-label={t("navigation.newRecording")}
|
|
326
|
+
className="flex h-9 w-9 items-center justify-center rounded-md bg-primary text-primary-foreground shadow-sm hover:bg-primary/90"
|
|
327
|
+
>
|
|
328
|
+
<IconPlayerRecord className="h-4 w-4" />
|
|
329
|
+
</NavLink>
|
|
330
|
+
</TooltipTrigger>
|
|
331
|
+
<TooltipContent side="right">
|
|
332
|
+
{t("navigation.newRecording")}
|
|
333
|
+
</TooltipContent>
|
|
334
|
+
</Tooltip>
|
|
301
335
|
</div>
|
|
302
336
|
|
|
303
|
-
<
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
size="icon"
|
|
309
|
-
className="hidden h-7 w-7 shrink-0 text-muted-foreground hover:text-foreground md:inline-flex"
|
|
310
|
-
aria-label={
|
|
311
|
-
showCollapsedSidebar
|
|
312
|
-
? t("navigation.expandSidebar")
|
|
313
|
-
: t("navigation.collapseSidebar")
|
|
314
|
-
}
|
|
315
|
-
aria-expanded={!showCollapsedSidebar}
|
|
316
|
-
onClick={() => setSidebarCollapsed((value) => !value)}
|
|
317
|
-
>
|
|
318
|
-
{showCollapsedSidebar ? (
|
|
319
|
-
<IconLayoutSidebarLeftExpand className="h-4 w-4" />
|
|
320
|
-
) : (
|
|
321
|
-
<IconLayoutSidebarLeftCollapse className="h-4 w-4" />
|
|
322
|
-
)}
|
|
323
|
-
</Button>
|
|
324
|
-
</TooltipTrigger>
|
|
325
|
-
<TooltipContent side="right">
|
|
326
|
-
{showCollapsedSidebar
|
|
327
|
-
? t("navigation.expandSidebar")
|
|
328
|
-
: t("navigation.collapseSidebar")}
|
|
329
|
-
</TooltipContent>
|
|
330
|
-
</Tooltip>
|
|
331
|
-
</div>
|
|
332
|
-
<div className="min-h-0 flex-1 overflow-y-auto">
|
|
333
|
-
{showCollapsedSidebar ? (
|
|
334
|
-
<>
|
|
335
|
-
<div className="flex justify-center px-2 py-3">
|
|
336
|
-
<Tooltip>
|
|
337
|
+
<nav className="mt-3 flex flex-col items-center gap-1 px-2">
|
|
338
|
+
{navItems.map(({ to, label, icon: Icon, match }) => {
|
|
339
|
+
const active = match(location.pathname);
|
|
340
|
+
return (
|
|
341
|
+
<Tooltip key={to}>
|
|
337
342
|
<TooltipTrigger asChild>
|
|
338
343
|
<NavLink
|
|
339
|
-
to=
|
|
340
|
-
aria-label={
|
|
341
|
-
className=
|
|
344
|
+
to={to}
|
|
345
|
+
aria-label={label}
|
|
346
|
+
className={cn(
|
|
347
|
+
"flex h-9 w-9 items-center justify-center rounded-md text-muted-foreground hover:bg-accent/60 hover:text-foreground",
|
|
348
|
+
active &&
|
|
349
|
+
"bg-primary/10 text-primary hover:bg-primary/10 hover:text-primary",
|
|
350
|
+
)}
|
|
342
351
|
>
|
|
343
|
-
<
|
|
352
|
+
<Icon className="h-4 w-4" />
|
|
344
353
|
</NavLink>
|
|
345
354
|
</TooltipTrigger>
|
|
346
|
-
<TooltipContent side="right">
|
|
347
|
-
{t("navigation.newRecording")}
|
|
348
|
-
</TooltipContent>
|
|
355
|
+
<TooltipContent side="right">{label}</TooltipContent>
|
|
349
356
|
</Tooltip>
|
|
350
|
-
|
|
357
|
+
);
|
|
358
|
+
})}
|
|
359
|
+
</nav>
|
|
360
|
+
</>
|
|
361
|
+
) : (
|
|
362
|
+
<>
|
|
363
|
+
<div className="px-3 py-3">
|
|
364
|
+
<Button
|
|
365
|
+
className="w-full gap-1.5 bg-primary text-primary-foreground shadow-sm hover:bg-primary/90"
|
|
366
|
+
size="sm"
|
|
367
|
+
asChild
|
|
368
|
+
>
|
|
369
|
+
<NavLink to="/record">
|
|
370
|
+
<IconPlayerRecord className="h-4 w-4" />
|
|
371
|
+
{t("navigation.newRecording")}
|
|
372
|
+
</NavLink>
|
|
373
|
+
</Button>
|
|
374
|
+
</div>
|
|
351
375
|
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
)}
|
|
366
|
-
>
|
|
367
|
-
<Icon className="h-4 w-4" />
|
|
368
|
-
</NavLink>
|
|
369
|
-
</TooltipTrigger>
|
|
370
|
-
<TooltipContent side="right">{label}</TooltipContent>
|
|
371
|
-
</Tooltip>
|
|
372
|
-
);
|
|
373
|
-
})}
|
|
374
|
-
</nav>
|
|
375
|
-
</>
|
|
376
|
-
) : (
|
|
377
|
-
<>
|
|
378
|
-
<div className="px-3 py-3">
|
|
379
|
-
<Button
|
|
380
|
-
className="w-full gap-1.5 bg-primary text-primary-foreground shadow-sm hover:bg-primary/90"
|
|
381
|
-
size="sm"
|
|
382
|
-
asChild
|
|
376
|
+
<nav className="mt-3 space-y-0.5 px-2">
|
|
377
|
+
{navItems.map(({ to, label, icon: Icon, match, count }) => {
|
|
378
|
+
const active = match(location.pathname);
|
|
379
|
+
return (
|
|
380
|
+
<NavLink
|
|
381
|
+
key={to}
|
|
382
|
+
to={to}
|
|
383
|
+
className={cn(
|
|
384
|
+
"flex items-center gap-2 rounded px-2 py-1.5 text-xs",
|
|
385
|
+
active
|
|
386
|
+
? "bg-primary/10 font-medium text-primary"
|
|
387
|
+
: "text-foreground hover:bg-accent/60",
|
|
388
|
+
)}
|
|
383
389
|
>
|
|
384
|
-
<
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
</Button>
|
|
389
|
-
</div>
|
|
390
|
-
|
|
391
|
-
<nav className="mt-3 space-y-0.5 px-2">
|
|
392
|
-
{navItems.map(({ to, label, icon: Icon, match, count }) => {
|
|
393
|
-
const active = match(location.pathname);
|
|
394
|
-
return (
|
|
395
|
-
<NavLink
|
|
396
|
-
key={to}
|
|
397
|
-
to={to}
|
|
390
|
+
<Icon className="h-4 w-4" />
|
|
391
|
+
<span className="flex-1 truncate">{label}</span>
|
|
392
|
+
{count !== undefined && count > 0 && (
|
|
393
|
+
<span
|
|
398
394
|
className={cn(
|
|
399
|
-
"
|
|
395
|
+
"shrink-0 tabular-nums text-[11px]",
|
|
400
396
|
active
|
|
401
|
-
? "
|
|
402
|
-
: "text-foreground
|
|
397
|
+
? "text-primary/80"
|
|
398
|
+
: "text-muted-foreground",
|
|
403
399
|
)}
|
|
404
400
|
>
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
401
|
+
{count}
|
|
402
|
+
</span>
|
|
403
|
+
)}
|
|
404
|
+
</NavLink>
|
|
405
|
+
);
|
|
406
|
+
})}
|
|
407
|
+
</nav>
|
|
408
|
+
|
|
409
|
+
<div className="mt-4 space-y-4 px-2 pb-3">
|
|
410
|
+
<div>
|
|
411
|
+
<div className="flex items-center justify-between px-2 pb-1">
|
|
412
|
+
<span className="text-[10px] font-semibold uppercase tracking-wide text-muted-foreground">
|
|
413
|
+
{t("navigation.folders")}
|
|
414
|
+
</span>
|
|
415
|
+
<Tooltip>
|
|
416
|
+
<TooltipTrigger asChild>
|
|
417
|
+
<button
|
|
418
|
+
type="button"
|
|
419
|
+
aria-label={t("navigation.newFolder")}
|
|
420
|
+
className="rounded p-1 text-muted-foreground hover:bg-accent"
|
|
421
|
+
onClick={() => setNewFolderOpen(true)}
|
|
422
|
+
>
|
|
423
|
+
<IconFolderPlus className="h-3.5 w-3.5" />
|
|
424
|
+
</button>
|
|
425
|
+
</TooltipTrigger>
|
|
426
|
+
<TooltipContent>
|
|
427
|
+
{t("navigation.newFolder")}
|
|
428
|
+
</TooltipContent>
|
|
429
|
+
</Tooltip>
|
|
430
|
+
</div>
|
|
431
|
+
<FolderTree
|
|
432
|
+
folders={libFolderList}
|
|
433
|
+
organizationId={currentOrganizationId}
|
|
434
|
+
spaceId={null}
|
|
435
|
+
buildPath={(id) => `/library/folder/${id}`}
|
|
436
|
+
activeFolderId={folderId ?? null}
|
|
437
|
+
/>
|
|
438
|
+
</div>
|
|
439
|
+
|
|
440
|
+
<div>
|
|
441
|
+
<div className="flex items-center justify-between px-2 pb-1">
|
|
442
|
+
<span className="text-[10px] font-semibold uppercase tracking-wide text-muted-foreground">
|
|
443
|
+
{t("navigation.spaces")}
|
|
444
|
+
</span>
|
|
445
|
+
<Tooltip>
|
|
446
|
+
<TooltipTrigger asChild>
|
|
447
|
+
<button
|
|
448
|
+
type="button"
|
|
449
|
+
aria-label={t("navigation.spaces")}
|
|
450
|
+
className="rounded p-1 text-muted-foreground hover:bg-accent"
|
|
451
|
+
onClick={() => setNewSpaceOpen(true)}
|
|
452
|
+
>
|
|
453
|
+
<IconPlus className="h-3.5 w-3.5" />
|
|
454
|
+
</button>
|
|
455
|
+
</TooltipTrigger>
|
|
456
|
+
<TooltipContent>{t("navigation.spaces")}</TooltipContent>
|
|
457
|
+
</Tooltip>
|
|
458
|
+
</div>
|
|
459
|
+
<ul className="space-y-0.5">
|
|
460
|
+
{(spaces?.spaces ?? []).map((s: any) => {
|
|
461
|
+
const active = spaceId === s.id;
|
|
462
|
+
return (
|
|
463
|
+
<li key={s.id}>
|
|
464
|
+
<NavLink
|
|
465
|
+
to={`/spaces/${s.id}`}
|
|
466
|
+
className={cn(
|
|
467
|
+
"flex items-center gap-2 rounded px-2 py-1 text-xs",
|
|
468
|
+
active
|
|
469
|
+
? "bg-primary/10 text-primary"
|
|
470
|
+
: "text-foreground hover:bg-accent/60",
|
|
471
|
+
)}
|
|
472
|
+
>
|
|
473
|
+
<div
|
|
474
|
+
className="flex h-4 w-4 items-center justify-center rounded text-[10px]"
|
|
475
|
+
style={{
|
|
476
|
+
background: s.color ?? "hsl(var(--primary))",
|
|
477
|
+
color: "white",
|
|
478
|
+
}}
|
|
415
479
|
>
|
|
416
|
-
{
|
|
417
|
-
</
|
|
418
|
-
|
|
419
|
-
|
|
480
|
+
{s.iconEmoji ?? s.name.slice(0, 1).toUpperCase()}
|
|
481
|
+
</div>
|
|
482
|
+
<span className="truncate">{s.name}</span>
|
|
483
|
+
</NavLink>
|
|
484
|
+
</li>
|
|
420
485
|
);
|
|
421
486
|
})}
|
|
422
|
-
|
|
487
|
+
{(spaces?.spaces ?? []).length === 0 && (
|
|
488
|
+
<li className="px-2 py-1 text-[11px] text-muted-foreground/70">
|
|
489
|
+
{t("navigation.noSpaces")}
|
|
490
|
+
</li>
|
|
491
|
+
)}
|
|
492
|
+
</ul>
|
|
493
|
+
</div>
|
|
494
|
+
</div>
|
|
495
|
+
</>
|
|
496
|
+
)}
|
|
497
|
+
</div>
|
|
423
498
|
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
<button
|
|
433
|
-
type="button"
|
|
434
|
-
aria-label={t("navigation.newFolder")}
|
|
435
|
-
className="rounded p-1 text-muted-foreground hover:bg-accent"
|
|
436
|
-
onClick={() => setNewFolderOpen(true)}
|
|
437
|
-
>
|
|
438
|
-
<IconFolderPlus className="h-3.5 w-3.5" />
|
|
439
|
-
</button>
|
|
440
|
-
</TooltipTrigger>
|
|
441
|
-
<TooltipContent>
|
|
442
|
-
{t("navigation.newFolder")}
|
|
443
|
-
</TooltipContent>
|
|
444
|
-
</Tooltip>
|
|
445
|
-
</div>
|
|
446
|
-
<FolderTree
|
|
447
|
-
folders={libFolderList}
|
|
448
|
-
organizationId={currentOrganizationId}
|
|
449
|
-
spaceId={null}
|
|
450
|
-
buildPath={(id) => `/library/folder/${id}`}
|
|
451
|
-
activeFolderId={folderId ?? null}
|
|
452
|
-
/>
|
|
453
|
-
</div>
|
|
454
|
-
|
|
455
|
-
<div>
|
|
456
|
-
<div className="flex items-center justify-between px-2 pb-1">
|
|
457
|
-
<span className="text-[10px] font-semibold uppercase tracking-wide text-muted-foreground">
|
|
458
|
-
{t("navigation.spaces")}
|
|
459
|
-
</span>
|
|
460
|
-
<Tooltip>
|
|
461
|
-
<TooltipTrigger asChild>
|
|
462
|
-
<button
|
|
463
|
-
type="button"
|
|
464
|
-
aria-label={t("navigation.spaces")}
|
|
465
|
-
className="rounded p-1 text-muted-foreground hover:bg-accent"
|
|
466
|
-
onClick={() => setNewSpaceOpen(true)}
|
|
467
|
-
>
|
|
468
|
-
<IconPlus className="h-3.5 w-3.5" />
|
|
469
|
-
</button>
|
|
470
|
-
</TooltipTrigger>
|
|
471
|
-
<TooltipContent>
|
|
472
|
-
{t("navigation.spaces")}
|
|
473
|
-
</TooltipContent>
|
|
474
|
-
</Tooltip>
|
|
475
|
-
</div>
|
|
476
|
-
<ul className="space-y-0.5">
|
|
477
|
-
{(spaces?.spaces ?? []).map((s: any) => {
|
|
478
|
-
const active = spaceId === s.id;
|
|
479
|
-
return (
|
|
480
|
-
<li key={s.id}>
|
|
481
|
-
<NavLink
|
|
482
|
-
to={`/spaces/${s.id}`}
|
|
483
|
-
className={cn(
|
|
484
|
-
"flex items-center gap-2 rounded px-2 py-1 text-xs",
|
|
485
|
-
active
|
|
486
|
-
? "bg-primary/10 text-primary"
|
|
487
|
-
: "text-foreground hover:bg-accent/60",
|
|
488
|
-
)}
|
|
489
|
-
>
|
|
490
|
-
<div
|
|
491
|
-
className="flex h-4 w-4 items-center justify-center rounded text-[10px]"
|
|
492
|
-
style={{
|
|
493
|
-
background:
|
|
494
|
-
s.color ?? "hsl(var(--primary))",
|
|
495
|
-
color: "white",
|
|
496
|
-
}}
|
|
497
|
-
>
|
|
498
|
-
{s.iconEmoji ??
|
|
499
|
-
s.name.slice(0, 1).toUpperCase()}
|
|
500
|
-
</div>
|
|
501
|
-
<span className="truncate">{s.name}</span>
|
|
502
|
-
</NavLink>
|
|
503
|
-
</li>
|
|
504
|
-
);
|
|
505
|
-
})}
|
|
506
|
-
{(spaces?.spaces ?? []).length === 0 && (
|
|
507
|
-
<li className="px-2 py-1 text-[11px] text-muted-foreground/70">
|
|
508
|
-
{t("navigation.noSpaces")}
|
|
509
|
-
</li>
|
|
510
|
-
)}
|
|
511
|
-
</ul>
|
|
512
|
-
</div>
|
|
513
|
-
</div>
|
|
514
|
-
</>
|
|
499
|
+
{!showCollapsedSidebar && (
|
|
500
|
+
<>
|
|
501
|
+
<div className="shrink-0 space-y-1.5 border-t border-border px-2 py-1.5">
|
|
502
|
+
{shouldShowSidebarLink && (
|
|
503
|
+
<CaptureInstallInlineLink className="flex items-center gap-2 rounded px-2 py-1.5 text-xs text-foreground hover:bg-accent/60">
|
|
504
|
+
<IconAppWindow className="h-4 w-4" />
|
|
505
|
+
{t("navigation.desktopCta")}
|
|
506
|
+
</CaptureInstallInlineLink>
|
|
515
507
|
)}
|
|
508
|
+
<SearchBar />
|
|
516
509
|
</div>
|
|
517
510
|
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
{shouldShowSidebarLink && (
|
|
522
|
-
<CaptureInstallInlineLink className="flex items-center gap-2 rounded px-2 py-1.5 text-xs text-foreground hover:bg-accent/60">
|
|
523
|
-
<IconAppWindow className="h-4 w-4" />
|
|
524
|
-
{t("navigation.desktopCta")}
|
|
525
|
-
</CaptureInstallInlineLink>
|
|
526
|
-
)}
|
|
527
|
-
<SearchBar />
|
|
528
|
-
</div>
|
|
511
|
+
<div className="shrink-0 border-t border-border px-1 py-1">
|
|
512
|
+
<ExtensionsSidebarSection />
|
|
513
|
+
</div>
|
|
529
514
|
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
515
|
+
<div className="shrink-0 space-y-2 border-t border-border px-3 py-2">
|
|
516
|
+
<OrgSwitcher settingsPath="/settings/organization" />
|
|
517
|
+
<DevDatabaseLink />
|
|
518
|
+
<FeedbackButton />
|
|
519
|
+
</div>
|
|
520
|
+
</>
|
|
521
|
+
)}
|
|
522
|
+
</aside>
|
|
533
523
|
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
<InvitationBanner />
|
|
563
|
-
{shouldShowPromo && (
|
|
564
|
-
<div className="flex items-center gap-3 border-b border-border bg-primary/5 px-5 py-2.5 text-sm">
|
|
565
|
-
<IconAppWindow className="h-4 w-4 shrink-0 text-primary" />
|
|
566
|
-
<div className="min-w-0 flex-1">
|
|
567
|
-
<span className="font-medium">
|
|
568
|
-
{t("navigation.desktopTitle")}
|
|
569
|
-
</span>{" "}
|
|
570
|
-
<span className="text-muted-foreground">
|
|
571
|
-
{t("navigation.desktopBody")}
|
|
572
|
-
</span>
|
|
573
|
-
</div>
|
|
574
|
-
<CaptureInstallButton size="sm" className="shrink-0">
|
|
575
|
-
Download
|
|
576
|
-
</CaptureInstallButton>
|
|
577
|
-
<Tooltip>
|
|
578
|
-
<TooltipTrigger asChild>
|
|
579
|
-
<Button
|
|
580
|
-
variant="ghost"
|
|
581
|
-
size="icon"
|
|
582
|
-
className="h-7 w-7 shrink-0 text-muted-foreground hover:text-foreground"
|
|
583
|
-
onClick={dismiss}
|
|
584
|
-
>
|
|
585
|
-
<IconX className="h-4 w-4" />
|
|
586
|
-
</Button>
|
|
587
|
-
</TooltipTrigger>
|
|
588
|
-
<TooltipContent>
|
|
589
|
-
{t("clipsFinalRaw.alreadyHaveIt")}
|
|
590
|
-
</TooltipContent>
|
|
591
|
-
</Tooltip>
|
|
524
|
+
<AgentSidebar
|
|
525
|
+
position="right"
|
|
526
|
+
defaultOpen={!isMobile}
|
|
527
|
+
emptyStateText={t("navigation.agentEmptyState")}
|
|
528
|
+
suggestions={[
|
|
529
|
+
t("navigation.agentSuggestionSummary"),
|
|
530
|
+
t("navigation.agentSuggestionPricing"),
|
|
531
|
+
t("navigation.agentSuggestionFiller"),
|
|
532
|
+
]}
|
|
533
|
+
scope={recordingScope}
|
|
534
|
+
browserTabId={getBrowserTabId()}
|
|
535
|
+
>
|
|
536
|
+
{/* Main content area */}
|
|
537
|
+
<div className="flex min-w-0 flex-1 flex-col">
|
|
538
|
+
{!pageOwnsToolbar && (
|
|
539
|
+
<header className="flex shrink-0 items-center gap-3 border-b border-border px-5 py-3">
|
|
540
|
+
<button
|
|
541
|
+
onClick={() => setSidebarOpen(true)}
|
|
542
|
+
className="flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-background text-muted-foreground hover:text-foreground md:hidden"
|
|
543
|
+
>
|
|
544
|
+
<IconMenu2 className="h-4 w-4" />
|
|
545
|
+
</button>
|
|
546
|
+
<div
|
|
547
|
+
ref={setHeaderSlot}
|
|
548
|
+
className="flex min-w-0 flex-1 items-center gap-3 overflow-hidden"
|
|
549
|
+
/>
|
|
550
|
+
<div className="ms-auto flex items-center gap-2">
|
|
551
|
+
<ClipsAgentToggleButton />
|
|
592
552
|
</div>
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
553
|
+
</header>
|
|
554
|
+
)}
|
|
555
|
+
<InvitationBanner />
|
|
556
|
+
{shouldShowPromo && (
|
|
557
|
+
<div className="flex items-center gap-3 border-b border-border bg-primary/5 px-5 py-2.5 text-sm">
|
|
558
|
+
<IconAppWindow className="h-4 w-4 shrink-0 text-primary" />
|
|
559
|
+
<div className="min-w-0 flex-1">
|
|
560
|
+
<span className="font-medium">
|
|
561
|
+
{t("navigation.desktopTitle")}
|
|
562
|
+
</span>{" "}
|
|
563
|
+
<span className="text-muted-foreground">
|
|
564
|
+
{t("navigation.desktopBody")}
|
|
565
|
+
</span>
|
|
566
|
+
</div>
|
|
567
|
+
<CaptureInstallButton size="sm" className="shrink-0">
|
|
568
|
+
Download
|
|
569
|
+
</CaptureInstallButton>
|
|
570
|
+
<Tooltip>
|
|
571
|
+
<TooltipTrigger asChild>
|
|
572
|
+
<Button
|
|
573
|
+
variant="ghost"
|
|
574
|
+
size="icon"
|
|
575
|
+
className="h-7 w-7 shrink-0 text-muted-foreground hover:text-foreground"
|
|
576
|
+
onClick={dismiss}
|
|
577
|
+
>
|
|
578
|
+
<IconX className="h-4 w-4" />
|
|
579
|
+
</Button>
|
|
580
|
+
</TooltipTrigger>
|
|
581
|
+
<TooltipContent>
|
|
582
|
+
{t("clipsFinalRaw.alreadyHaveIt")}
|
|
583
|
+
</TooltipContent>
|
|
584
|
+
</Tooltip>
|
|
585
|
+
</div>
|
|
586
|
+
)}
|
|
587
|
+
<main className="flex min-h-0 flex-1 flex-col overflow-y-auto">
|
|
588
|
+
<PageHeaderSlotProvider slot={headerSlot}>
|
|
589
|
+
{children}
|
|
590
|
+
</PageHeaderSlotProvider>
|
|
591
|
+
</main>
|
|
600
592
|
</div>
|
|
601
593
|
</AgentSidebar>
|
|
602
594
|
|