@alivault/pico 0.4.0 → 0.5.1

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.
@@ -2,7 +2,7 @@ import { i as __toESM } from "../_runtime.mjs";
2
2
  import { A as DialogRoot, C as MenuPortal, D as TabsTab, E as TabsList$1, F as DialogBackdrop, I as Separator, K as mergeProps, L as Input, M as DialogPopup, N as DialogDescription$1, O as TabsRoot, P as DialogClose, R as Button, S as MenuPositioner, T as MenuItem, X as require_react, Y as require_jsx_runtime, _ as AccordionRoot, a as CollapsiblePanel, b as MenuSubmenuRoot, c as PopoverPopup, d as PopoverTrigger$1, f as PopoverRoot, g as AccordionItem$1, h as AccordionHeader, i as ContextMenuRoot, j as DialogPortal$1, k as DialogTitle$1, l as PopoverPositioner, m as AccordionTrigger$1, n as Toggle, o as CollapsibleTrigger$1, p as AccordionPanel, r as ContextMenuTrigger$1, s as CollapsibleRoot, t as ToggleGroup, u as PopoverPortal, v as MenuSubmenuTrigger, w as MenuPopup, x as MenuRoot, y as MenuTrigger, z as useRender } from "../_libs/@base-ui/react+[...].mjs";
3
3
  import { t as cva } from "../_libs/class-variance-authority+clsx.mjs";
4
4
  import { A as ChevronsUpDown, B as ArrowDown, C as FolderPlus, D as Copy, E as Download, F as Check, I as ArrowUp, L as ArrowUpToLine, M as ChevronUp, N as ChevronRight, O as Command, P as ChevronDown, S as Folder, T as EllipsisVertical, _ as ListEnd, a as Square, b as GitBranch, c as Settings2, d as PanelLeft, f as PanelLeftOpen, g as ListStart, h as OctagonX, j as ChevronsDownUp, l as Search, n as WandSparkles, o as SquarePen, p as PanelLeftClose, r as Upload, s as SquareArrowOutUpRight, t as X, u as PanelRight, w as Ellipsis, x as GitCommitHorizontal, y as ImagePlus, z as ArrowLeft } from "../_libs/lucide-react.mjs";
5
- import { $ as readStoredRightSidebarOpen, B as normalizeSessionSelectionKeys, C as TooltipContent, E as VIEWER_CONTEXT_STORAGE_KEY, G as readStoredAutoScrollEnabled, H as normalizeThemeMode, I as flattenTree, J as readStoredDraftDirectory, K as readStoredCenterMessages, L as getSessionTitle, M as createInitialSessionState, O as buildItemsFromSync, Q as readStoredRecentDirectories, S as Tooltip$1, T as TooltipTrigger, U as previewUrlForImage, V as normalizeStoredDirectoryList, W as promptDraftKey, X as readStoredPinnedSessionKeys, Y as readStoredHideToolBlocks, Z as readStoredPromptDraft, _ as SESSION_DONE_SOUND_ENABLED_STORAGE_KEY, a as HIDE_TOOL_BLOCKS_STORAGE_KEY, at as safeLocalStorageSetItem, c as PINNED_SESSIONS_STORAGE_KEY, ct as thinkingSummaryText, d as RIGHT_SIDEBAR_FILE_TREE_WIDTH_STORAGE_KEY, et as readStoredSessionDoneDesktopNotificationsEnabled, f as RIGHT_SIDEBAR_HISTORY_HEIGHT_STORAGE_KEY, g as SESSION_DONE_DESKTOP_NOTIFICATIONS_ENABLED_STORAGE_KEY, h as Route, i as DRAFT_DIRECTORY_STORAGE_KEY, it as safeLocalStorageGetItem, j as createContextId, k as cn, l as RECENT_DIRECTORIES_STORAGE_KEY, m as RIGHT_SIDEBAR_WIDTHS_STORAGE_KEY, n as CENTER_MESSAGES_STORAGE_KEY, nt as readStoredSidebarDirectories, o as Kbd, ot as sameContextUsage, p as RIGHT_SIDEBAR_OPEN_STORAGE_KEY, q as readStoredCollapsedDirectories, r as COLLAPSED_DIRECTORIES_STORAGE_KEY, rt as rememberStoredPromptDraft, s as KeyboardShortcutContent, st as sessionListEntryKey, t as AUTO_SCROLL_ENABLED_STORAGE_KEY, tt as readStoredSessionDoneSoundEnabled, u as RIGHT_SIDEBAR_ACTIVE_TAB_STORAGE_KEY, v as SIDEBAR_DIRECTORIES_STORAGE_KEY, x as TitleTooltip, y as Spinner, z as normalizePromptImage } from "./routes-D2MVUd_A.mjs";
5
+ import { $ as readStoredRightSidebarOpen, B as normalizeSessionSelectionKeys, C as TooltipContent, E as VIEWER_CONTEXT_STORAGE_KEY, G as readStoredAutoScrollEnabled, H as normalizeThemeMode, I as flattenTree, J as readStoredDraftDirectory, K as readStoredCenterMessages, L as getSessionTitle, M as createInitialSessionState, O as buildItemsFromSync, Q as readStoredRecentDirectories, S as Tooltip$1, T as TooltipTrigger, U as previewUrlForImage, V as normalizeStoredDirectoryList, W as promptDraftKey, X as readStoredPinnedSessionKeys, Y as readStoredHideToolBlocks, Z as readStoredPromptDraft, _ as SESSION_DONE_SOUND_ENABLED_STORAGE_KEY, a as HIDE_TOOL_BLOCKS_STORAGE_KEY, at as safeLocalStorageSetItem, c as PINNED_SESSIONS_STORAGE_KEY, ct as thinkingSummaryText, d as RIGHT_SIDEBAR_FILE_TREE_WIDTH_STORAGE_KEY, et as readStoredSessionDoneDesktopNotificationsEnabled, f as RIGHT_SIDEBAR_HISTORY_HEIGHT_STORAGE_KEY, g as SESSION_DONE_DESKTOP_NOTIFICATIONS_ENABLED_STORAGE_KEY, h as Route, i as DRAFT_DIRECTORY_STORAGE_KEY, it as safeLocalStorageGetItem, j as createContextId, k as cn, l as RECENT_DIRECTORIES_STORAGE_KEY, m as RIGHT_SIDEBAR_WIDTHS_STORAGE_KEY, n as CENTER_MESSAGES_STORAGE_KEY, nt as readStoredSidebarDirectories, o as Kbd, ot as sameContextUsage, p as RIGHT_SIDEBAR_OPEN_STORAGE_KEY, q as readStoredCollapsedDirectories, r as COLLAPSED_DIRECTORIES_STORAGE_KEY, rt as rememberStoredPromptDraft, s as KeyboardShortcutContent, st as sessionListEntryKey, t as AUTO_SCROLL_ENABLED_STORAGE_KEY, tt as readStoredSessionDoneSoundEnabled, u as RIGHT_SIDEBAR_ACTIVE_TAB_STORAGE_KEY, v as SIDEBAR_DIRECTORIES_STORAGE_KEY, x as TitleTooltip, y as Spinner, z as normalizePromptImage } from "./routes-CArKWa5i.mjs";
6
6
  import { i as useQuery, n as useIsMutating, o as useQueryClient, r as useIsFetching, t as useMutation } from "../_libs/tanstack__react-query.mjs";
7
7
  import { t as useHotkeys } from "../_libs/tanstack__react-hotkeys.mjs";
8
8
  import { a as matchesKeyboardEvent, i as batch, o as formatForDisplay, r as createStore } from "../_libs/@tanstack/hotkeys+[...].mjs";
@@ -22,7 +22,7 @@ import { t as remarkGfm } from "../_libs/remark-gfm.mjs";
22
22
  import { a as getBuiltInSpriteSheet, i as getBuiltInFileIconColor, n as FileTree, r as createFileTreeIconResolver, t as useFileTree } from "../_libs/@pierre/trees+[...].mjs";
23
23
  import { a as closestCenter, d as useSensors, f as CSS$1, i as PointerSensor, n as DragOverlay, t as DndContext, u as useSensor } from "../_libs/@dnd-kit/core+[...].mjs";
24
24
  import { a as verticalListSortingStrategy, i as useSortable, n as arrayMove, r as horizontalListSortingStrategy, t as SortableContext } from "../_libs/dnd-kit__sortable.mjs";
25
- //#region node_modules/.nitro/vite/services/ssr/assets/routes-CmLc8G9G.js
25
+ //#region node_modules/.nitro/vite/services/ssr/assets/routes-BulNPswx.js
26
26
  var import_react = /* @__PURE__ */ __toESM(require_react());
27
27
  var import_jsx_runtime = require_jsx_runtime();
28
28
  var MOBILE_BREAKPOINT = 768;
@@ -13174,6 +13174,8 @@ function GitSectionNote({ children, tone = "muted", className }) {
13174
13174
  children
13175
13175
  });
13176
13176
  }
13177
+ var EMPTY_PROJECT_FILE_PATHS = [];
13178
+ var EMPTY_GIT_CHANGE_FILES = [];
13177
13179
  var PROJECT_FILE_QUERY_STALE_TIME_MS = 1e3 * 30;
13178
13180
  var PROJECT_FILE_QUERY_GC_TIME_MS = 1e3 * 60 * 10;
13179
13181
  var PROJECT_FILE_TREE_DEFAULT_WIDTH = 320;
@@ -13269,11 +13271,19 @@ var GIT_FILE_TREE_UNSAFE_CSS = `
13269
13271
  --trees-bg-override: var(--background);
13270
13272
  --trees-fg-override: var(--foreground);
13271
13273
  --trees-border-color-override: var(--border);
13272
- --trees-muted-fg-override: var(--muted-foreground);
13274
+ --trees-fg-muted-override: var(--muted-foreground);
13273
13275
  --trees-selected-bg-override: var(--accent);
13274
13276
  --trees-selected-fg-override: var(--accent-foreground);
13275
13277
  --trees-padding-inline-override: 0px;
13276
13278
  }
13279
+
13280
+ [data-file-tree-virtualized-scroll='true'] {
13281
+ padding-inline: 0 16px;
13282
+ }
13283
+
13284
+ [data-file-tree-search-input] {
13285
+ font-size: 16px;
13286
+ }
13277
13287
  `;
13278
13288
  var PROJECT_FILE_ICON_SPRITE_SHEET = getBuiltInSpriteSheet("complete");
13279
13289
  var projectFileIconResolver = createFileTreeIconResolver({
@@ -13306,6 +13316,39 @@ function ProjectFileTypeIcon({ path }) {
13306
13316
  function isFileTreeDirectoryHandle(item) {
13307
13317
  return item?.isDirectory() === true;
13308
13318
  }
13319
+ function isProjectFileTreeItemEvent(event) {
13320
+ return event.nativeEvent.composedPath().some((target) => target instanceof Element && target.getAttribute("data-type") === "item");
13321
+ }
13322
+ function getProjectFileTreeGitStatusFromPorcelain(status) {
13323
+ const indexStatus = status[0] || " ";
13324
+ const worktreeStatus = status[1] || " ";
13325
+ if (status === "??") return "untracked";
13326
+ if (status === "!!") return "ignored";
13327
+ if (indexStatus === "R" || worktreeStatus === "R") return "renamed";
13328
+ if (indexStatus === "C" || worktreeStatus === "C") return "renamed";
13329
+ if (indexStatus === "D" || worktreeStatus === "D") return "deleted";
13330
+ if (indexStatus === "A" || worktreeStatus === "A") return "added";
13331
+ return "modified";
13332
+ }
13333
+ function getProjectFileTreeGitStatus(files) {
13334
+ return files.map((file) => ({
13335
+ path: file.path,
13336
+ status: getProjectFileTreeGitStatusFromPorcelain(file.status)
13337
+ }));
13338
+ }
13339
+ function getProjectFileTreePaths(paths, files) {
13340
+ if (files.length === 0) return paths;
13341
+ const pathSet = new Set(paths);
13342
+ let addedPath = false;
13343
+ for (const file of files) {
13344
+ if (getProjectFileTreeGitStatusFromPorcelain(file.status) !== "deleted") continue;
13345
+ if (!file.path || pathSet.has(file.path)) continue;
13346
+ pathSet.add(file.path);
13347
+ addedPath = true;
13348
+ }
13349
+ if (!addedPath) return paths;
13350
+ return [...pathSet];
13351
+ }
13309
13352
  function getProjectFileDirectoryPaths(paths) {
13310
13353
  const directoryPaths = /* @__PURE__ */ new Set();
13311
13354
  for (const path of paths) {
@@ -13314,7 +13357,7 @@ function getProjectFileDirectoryPaths(paths) {
13314
13357
  }
13315
13358
  return [...directoryPaths].sort((left, right) => right.split("/").length - left.split("/").length || right.length - left.length || right.localeCompare(left));
13316
13359
  }
13317
- function ProjectFileTree({ collapseAllRevision, paths, selectedPath, onSelectFile }) {
13360
+ function ProjectFileTree({ collapseAllRevision, gitStatus, paths, selectedPath, onSelectFile }) {
13318
13361
  const validPathsRef = import_react.useRef(new Set(paths));
13319
13362
  const onSelectFileRef = import_react.useRef(onSelectFile);
13320
13363
  const lastCollapseAllRevisionRef = import_react.useRef(0);
@@ -13323,6 +13366,7 @@ function ProjectFileTree({ collapseAllRevision, paths, selectedPath, onSelectFil
13323
13366
  const { model } = useFileTree({
13324
13367
  paths,
13325
13368
  flattenEmptyDirectories: true,
13369
+ gitStatus,
13326
13370
  initialExpansion: 1,
13327
13371
  initialSelectedPaths: selectedPath ? [selectedPath] : [],
13328
13372
  onSelectionChange: (selectedPaths) => {
@@ -13336,6 +13380,9 @@ function ProjectFileTree({ collapseAllRevision, paths, selectedPath, onSelectFil
13336
13380
  import_react.useEffect(() => {
13337
13381
  model.resetPaths(paths);
13338
13382
  }, [model, paths]);
13383
+ import_react.useEffect(() => {
13384
+ model.setGitStatus(gitStatus);
13385
+ }, [gitStatus, model]);
13339
13386
  import_react.useEffect(() => {
13340
13387
  if (!selectedPath) return;
13341
13388
  const item = model.getItem(selectedPath);
@@ -13372,9 +13419,13 @@ function ProjectFileTree({ collapseAllRevision, paths, selectedPath, onSelectFil
13372
13419
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FileTree, {
13373
13420
  model,
13374
13421
  className: "block h-full min-h-0 w-full overflow-hidden",
13375
- onClick: openFocusedFile,
13422
+ onClick: (event) => {
13423
+ if (!isProjectFileTreeItemEvent(event)) return;
13424
+ openFocusedFile();
13425
+ },
13376
13426
  onKeyUp: (event) => {
13377
13427
  if (event.key !== "Enter" && event.key !== " ") return;
13428
+ if (!isProjectFileTreeItemEvent(event)) return;
13378
13429
  openFocusedFile();
13379
13430
  }
13380
13431
  });
@@ -13383,7 +13434,8 @@ function ProjectFilesWorkspace({ viewerContextId, cwd, active, activeFilePath, o
13383
13434
  const normalizedCwd = normalizeCwd(cwd);
13384
13435
  const [openFileDialogOpen, setOpenFileDialogOpen] = import_react.useState(false);
13385
13436
  const [collapseAllRevision, setCollapseAllRevision] = import_react.useState(0);
13386
- const showInlinePreview = previewMode === "inline" && Boolean(activeFilePath);
13437
+ const inlinePreview = previewMode === "inline";
13438
+ const showInlinePreview = inlinePreview && Boolean(activeFilePath);
13387
13439
  const fileTreeQuery = useQuery({
13388
13440
  ...projectFileTreeQueryOptions({
13389
13441
  viewerContextId,
@@ -13397,12 +13449,25 @@ function ProjectFilesWorkspace({ viewerContextId, cwd, active, activeFilePath, o
13397
13449
  "error"
13398
13450
  ]
13399
13451
  });
13400
- const paths = fileTreeQuery.data ?? [];
13452
+ const gitFilesQuery = useQuery({
13453
+ ...gitChangesQueryOptions({
13454
+ viewerContextId,
13455
+ cwd: normalizedCwd,
13456
+ scope: "files"
13457
+ }),
13458
+ enabled: Boolean(active && viewerContextId && normalizedCwd),
13459
+ select: (data) => data.files ?? [],
13460
+ notifyOnChangeProps: ["data"]
13461
+ });
13462
+ const projectPaths = fileTreeQuery.data ?? EMPTY_PROJECT_FILE_PATHS;
13463
+ const gitFiles = gitFilesQuery.data ?? EMPTY_GIT_CHANGE_FILES;
13464
+ const paths = import_react.useMemo(() => getProjectFileTreePaths(projectPaths, gitFiles), [gitFiles, projectPaths]);
13465
+ const gitStatus = import_react.useMemo(() => getProjectFileTreeGitStatus(gitFiles), [gitFiles]);
13401
13466
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
13402
- className: cn("h-full min-h-0 overflow-hidden", showInlinePreview ? "grid grid-rows-[minmax(0,1fr)_minmax(0,1fr)]" : "flex flex-col"),
13467
+ className: cn("h-full min-h-0 overflow-hidden", inlinePreview ? "relative flex flex-col" : "flex flex-col"),
13403
13468
  children: [
13404
13469
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
13405
- className: cn("flex min-h-0 flex-col bg-background", showInlinePreview ? "border-b border-border/70" : "flex-1 overflow-hidden"),
13470
+ className: "flex min-h-0 flex-1 flex-col overflow-hidden bg-background",
13406
13471
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
13407
13472
  className: "flex shrink-0 items-center justify-between gap-2 border-b border-border/70 p-2",
13408
13473
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
@@ -13439,36 +13504,36 @@ function ProjectFilesWorkspace({ viewerContextId, cwd, active, activeFilePath, o
13439
13504
  children: getErrorMessage(fileTreeQuery.error, "Failed to load files")
13440
13505
  }) : paths.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ProjectFileTree, {
13441
13506
  collapseAllRevision,
13507
+ gitStatus,
13442
13508
  paths,
13443
13509
  selectedPath: activeFilePath,
13444
13510
  onSelectFile: onOpenFile
13445
13511
  }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(GitSectionNote, { children: "No files found." })
13446
13512
  })]
13447
13513
  }),
13448
- showInlinePreview ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
13449
- className: "flex min-h-0 flex-col overflow-hidden bg-background",
13514
+ inlinePreview ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
13515
+ "aria-hidden": !showInlinePreview,
13516
+ inert: !showInlinePreview,
13517
+ className: cn("absolute inset-0 z-20 flex min-h-0 flex-col overflow-hidden bg-background transition-transform duration-200 ease-out", showInlinePreview ? "translate-x-0 shadow-xl" : "pointer-events-none translate-x-full"),
13450
13518
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
13451
- className: "flex h-10 shrink-0 items-center justify-between gap-2 border-b border-border/70 px-3 text-xs font-medium text-muted-foreground",
13452
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
13453
- className: "min-w-0 truncate",
13519
+ className: "flex h-10 shrink-0 items-center gap-2 border-b border-border/70 px-2 text-xs font-medium text-muted-foreground",
13520
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", {
13521
+ type: "button",
13522
+ "aria-label": "Back to file tree",
13523
+ className: "inline-flex h-8 shrink-0 items-center gap-1.5 rounded-md px-2 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground",
13524
+ onClick: onCloseFile,
13525
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(ArrowLeft, { className: "size-4" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "Files" })]
13526
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
13527
+ className: "min-w-0 flex-1 truncate",
13454
13528
  title: activeFilePath,
13455
13529
  children: activeFilePath
13456
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TitleTooltip, {
13457
- title: "Close file preview",
13458
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
13459
- type: "button",
13460
- "aria-label": "Close file preview",
13461
- className: "inline-flex size-7 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground",
13462
- onClick: onCloseFile,
13463
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(X, { className: "size-4" })
13464
- })
13465
13530
  })]
13466
13531
  }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
13467
13532
  className: "min-h-0 flex-1 overflow-hidden",
13468
13533
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ProjectFileContent, {
13469
13534
  viewerContextId,
13470
13535
  cwd: normalizedCwd,
13471
- active,
13536
+ active: active && showInlinePreview,
13472
13537
  path: activeFilePath
13473
13538
  })
13474
13539
  })]
@@ -13484,24 +13549,26 @@ function ProjectFilesWorkspace({ viewerContextId, cwd, active, activeFilePath, o
13484
13549
  }
13485
13550
  function ProjectOpenFileDialog({ open, onOpenChange, paths, onOpenFile }) {
13486
13551
  const [query, setQuery] = import_react.useState("");
13552
+ const isMobile = useIsMobile();
13553
+ const shouldAutoFocus = useCommandSurfaceAutoFocus(isMobile);
13487
13554
  import_react.useEffect(() => {
13488
13555
  if (!open) setQuery("");
13489
13556
  }, [open]);
13490
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CommandDialog, {
13491
- open,
13492
- onOpenChange,
13493
- title: "Open Files",
13494
- description: "Search project files to open.",
13495
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Command$1, {
13496
- shouldFilter: true,
13497
- children: [
13498
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ProjectFileIconSprite, {}),
13499
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CommandInput, {
13500
- value: query,
13501
- onValueChange: setQuery,
13502
- placeholder: "Search files…"
13503
- }),
13504
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(CommandList, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(CommandEmpty, { children: "No files found." }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CommandGroup, {
13557
+ const commandBody = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Command$1, {
13558
+ shouldFilter: true,
13559
+ className: cn(isMobile && "min-h-0 flex-1"),
13560
+ children: [
13561
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ProjectFileIconSprite, {}),
13562
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CommandInput, {
13563
+ autoFocus: shouldAutoFocus,
13564
+ value: query,
13565
+ onValueChange: setQuery,
13566
+ placeholder: "Search files…",
13567
+ className: "text-base md:text-sm"
13568
+ }),
13569
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(CommandList, {
13570
+ className: cn(isMobile && "max-h-none min-h-0 flex-1"),
13571
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(CommandEmpty, { children: "No files found." }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CommandGroup, {
13505
13572
  heading: "Files",
13506
13573
  children: paths.map((path) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(CommandItem, {
13507
13574
  value: path,
@@ -13515,10 +13582,29 @@ function ProjectOpenFileDialog({ open, onOpenChange, paths, onOpenFile }) {
13515
13582
  children: path
13516
13583
  })]
13517
13584
  }, path))
13518
- })] })
13519
- ]
13585
+ })]
13586
+ })
13587
+ ]
13588
+ });
13589
+ if (isMobile) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Drawer$1, {
13590
+ open,
13591
+ onOpenChange,
13592
+ autoFocus: shouldAutoFocus,
13593
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(DrawerContent, {
13594
+ className: "max-h-[90svh] overflow-hidden",
13595
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(DrawerHeader, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(DrawerTitle, { children: "Open Files" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DrawerDescription, { children: "Search project files to open." })] }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
13596
+ className: "flex min-h-0 flex-1 flex-col overflow-hidden px-4 pb-4",
13597
+ children: commandBody
13598
+ })]
13520
13599
  })
13521
13600
  });
13601
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CommandDialog, {
13602
+ open,
13603
+ onOpenChange,
13604
+ title: "Open Files",
13605
+ description: "Search project files to open.",
13606
+ children: commandBody
13607
+ });
13522
13608
  }
13523
13609
  function ProjectFileContent({ viewerContextId, cwd, active, path }) {
13524
13610
  const normalizedCwd = normalizeCwd(cwd);
@@ -15364,7 +15450,17 @@ function FileReviewContent({ viewerContextId, cwd, active, onOpenFile }) {
15364
15450
  })
15365
15451
  }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
15366
15452
  className: "flex shrink-0 items-center gap-2",
15367
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(ToggleGroup$1, {
15453
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(TitleTooltip, {
15454
+ title: hasOpenFile ? "Collapse all" : "Expand all",
15455
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Button$1, {
15456
+ variant: "outline",
15457
+ size: "icon",
15458
+ "aria-label": hasOpenFile ? "Collapse all" : "Expand all",
15459
+ disabled: changedFiles.length === 0,
15460
+ onClick: toggleAll,
15461
+ children: hasOpenFile ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ChevronsDownUp, { className: "size-4" }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ChevronsUpDown, { className: "size-4" })
15462
+ })
15463
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ToggleGroup$1, {
15368
15464
  variant: "outline",
15369
15465
  value: [diffStyle],
15370
15466
  onValueChange: (values) => {
@@ -15375,11 +15471,6 @@ function FileReviewContent({ viewerContextId, cwd, active, onOpenFile }) {
15375
15471
  value,
15376
15472
  children: value === "unified" ? "Unified" : "Split"
15377
15473
  }, value))
15378
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Button$1, {
15379
- variant: "outline",
15380
- disabled: changedFiles.length === 0,
15381
- onClick: toggleAll,
15382
- children: [hasOpenFile ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ChevronsDownUp, { className: "size-4" }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ChevronsUpDown, { className: "size-4" }), hasOpenFile ? "Collapse all" : "Expand all"]
15383
15474
  })]
15384
15475
  })]
15385
15476
  }),
@@ -20009,14 +20100,14 @@ function useAppShellShortcuts({ addDirectoryOpenRef, commandPaletteOpenRef, comp
20009
20100
  description: "Move keyboard focus through sidebar sessions."
20010
20101
  } }
20011
20102
  })),
20012
- ...["Delete", "Backspace"].map((hotkey) => ({
20013
- hotkey,
20103
+ {
20104
+ hotkey: "Delete",
20014
20105
  callback: handleSidebarDelete,
20015
20106
  options: { meta: {
20016
20107
  name: "Delete selected sidebar sessions",
20017
20108
  description: "Open the delete dialog for focused or selected sessions."
20018
20109
  } }
20019
- })),
20110
+ },
20020
20111
  {
20021
20112
  hotkey: {
20022
20113
  key: "Enter",
@@ -5,7 +5,7 @@ import { n as clsx } from "../_libs/class-variance-authority+clsx.mjs";
5
5
  import { t as twMerge } from "../_libs/tailwind-merge.mjs";
6
6
  import { B as ArrowDown, I as ArrowUp, M as ChevronUp, O as Command, R as ArrowRight, V as ArrowBigUp, m as Option, z as ArrowLeft } from "../_libs/lucide-react.mjs";
7
7
  import { n as string, t as object } from "../_libs/zod.mjs";
8
- //#region node_modules/.nitro/vite/services/ssr/assets/routes-D2MVUd_A.js
8
+ //#region node_modules/.nitro/vite/services/ssr/assets/routes-CArKWa5i.js
9
9
  var import_react = /* @__PURE__ */ __toESM(require_react());
10
10
  var import_jsx_runtime = require_jsx_runtime();
11
11
  function cn(...inputs) {
@@ -1279,7 +1279,7 @@ function getSessionTitle(summary) {
1279
1279
  if (summary?.name?.trim()) return summary.name.trim();
1280
1280
  return "New session";
1281
1281
  }
1282
- var $$splitComponentImporter = () => import("./routes-CmLc8G9G.mjs");
1282
+ var $$splitComponentImporter = () => import("./routes-BulNPswx.mjs");
1283
1283
  var indexSearchSchema = object({ session: string().optional() });
1284
1284
  var Route = createFileRoute("/")({
1285
1285
  validateSearch: indexSearchSchema,
@@ -3813,7 +3813,7 @@ var defaultSerovalPlugins = [
3813
3813
  * the dev styles URL for route-scoped CSS collection.
3814
3814
  */
3815
3815
  async function getStartManifest(matchedRoutes) {
3816
- const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-BSXP2b2T.mjs");
3816
+ const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-D-4It92t.mjs");
3817
3817
  const startManifest = tsrStartManifest();
3818
3818
  const rootRoute = startManifest.routes[rootRouteId] = startManifest.routes["__root__"] || {};
3819
3819
  rootRoute.assets = rootRoute.assets || [];
@@ -4799,7 +4799,7 @@ var baseManifestPromise;
4799
4799
  var cachedFinalManifestPromise;
4800
4800
  async function loadEntries() {
4801
4801
  const [routerEntry, startEntry, pluginAdapters] = await Promise.all([
4802
- import("./router-CgnX-Js0.mjs"),
4802
+ import("./router-0zOSfnDH.mjs"),
4803
4803
  import("./start-Captdpmb.mjs"),
4804
4804
  import("../__23tanstack-start-plugin-adapters-y_fshQDY.mjs")
4805
4805
  ]);
@@ -1,4 +1,4 @@
1
- //#region node_modules/.nitro/vite/services/ssr/assets/_tanstack-start-manifest_v-BSXP2b2T.js
1
+ //#region node_modules/.nitro/vite/services/ssr/assets/_tanstack-start-manifest_v-D-4It92t.js
2
2
  var tsrStartManifest = () => ({
3
3
  routes: {
4
4
  __root__: {
@@ -50,16 +50,16 @@ var tsrStartManifest = () => ({
50
50
  "/api/ui/$id"
51
51
  ],
52
52
  assets: void 0,
53
- preloads: ["/assets/index-BiaOlsw0.js", "/assets/rolldown-runtime-S-ySWqyJ.js"]
53
+ preloads: ["/assets/index-DA-hjRf1.js", "/assets/rolldown-runtime-S-ySWqyJ.js"]
54
54
  },
55
55
  "/": {
56
56
  filePath: "/home/runner/work/pico/pico/src/routes/index.tsx",
57
57
  children: void 0,
58
58
  assets: void 0,
59
- preloads: ["/assets/routes-C7eqqi44.js"]
59
+ preloads: ["/assets/routes-BEX21mVY.js"]
60
60
  }
61
61
  },
62
- clientEntry: "/assets/index-BiaOlsw0.js"
62
+ clientEntry: "/assets/index-DA-hjRf1.js"
63
63
  });
64
64
  //#endregion
65
65
  export { tsrStartManifest };