"use client" /** * **Tree view** — `ListPageTreePanelShell` + outline tree + read-only details (`FolderDetailsShell`). * Hub wiring (folders, mock sheet) stays in the caller; this module hosts library demo wiring only. */ import * as React from "react" import { LIST_HUB_INSPECTOR_CHIP_SHELL } from "@/components/list-hub-status-badge" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { Collapsible, CollapsibleTrigger } from "@/components/ui/collapsible" import { Separator } from "@/components/ui/separator" import { Tip } from "@/components/ui/tip" import { Tooltip, TooltipContent, TooltipTrigger, } from "@/components/ui/tooltip" import { cn } from "@/lib/utils" import { OutlineTreeCollapsibleContentRail, OutlineTreeLeafButton, OutlineTreeMenu, OutlineTreeMenuItem, OutlineTreeSub, OutlineTreeSubItem, } from "@/components/data-views/outline-tree-menu" import { ListPageTreePanelShell } from "@/components/data-views/list-page-tree-panel-shell" import { ListPageSplitDetailsPlaceholder } from "@/components/data-views/list-page-split-details-placeholder" import { ListPageTreeColumnHeader } from "@/components/data-views/list-page-tree-column-header" import { LibraryNewFolderSheet } from "@/components/library-new-folder-sheet" import type { LibraryItem, LibraryLevel, } from "@/lib/mock/library" import type { LibraryFolder, LibraryFolderColorKey } from "@/lib/mock/library-folders" import { formatDateUS } from "@/lib/date-filter" import { deriveBloomLevel, deriveLastEditedLine, deriveQuestionItemCode, deriveTags, QUESTION_TYPE_ABBREV, } from "@/lib/mock/library-inspector" import { FolderDetailsShell } from "@/components/folder-details-shell" import { initialsFromDisplayName } from "@/lib/initials-from-name" const DIFFICULTY_LABEL: Record = { easy: "Low", medium: "Normal", hard: "High", } // ============================================================================ // TreeItem — recursive folder/question renderer using Collapsible // ============================================================================ interface TreeItemProps { folder: LibraryFolder folders: LibraryFolder[] questions: LibraryItem[] selectedItemId: string | null onSelectItem: (itemId: string) => void } function TreeItem({ folder, folders, questions, selectedItemId, onSelectItem, }: TreeItemProps) { const childFolders = folders .filter(f => f.parentId === folder.id) .sort((a, b) => a.name.localeCompare(b.name)) const childQuestions = questions .filter(q => q.folderId === folder.id) const hasChildren = childFolders.length > 0 || childQuestions.length > 0 const isFolderSelected = selectedItemId === folder.id return ( {/* Folder row — chevron column + row body (icons align with shadcn tree pattern) */}
{hasChildren ? (