@particle-academy/react-fancy 5.17.1 → 5.19.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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/FileBrowser/FileBrowser.context.ts","../src/components/FileBrowser/FileBrowser.utils.ts","../src/components/FileBrowser/FileBrowserPathBar.tsx","../src/components/FileBrowser/FileBrowserToolbar.tsx","../src/components/FileBrowser/FileBrowserNode.tsx","../src/components/FileBrowser/FileBrowserTree.tsx","../src/components/FileBrowser/FileBrowser.tsx"],"names":["Fragment","jsxs","jsx","ChevronRight","useState"],"mappings":"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","file":"chunk-BYIY6BH2.js","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { FileBrowserContextValue } from \"./FileBrowser.types\";\n\nexport const FileBrowserContext = createContext<FileBrowserContextValue | null>(null);\n\nexport function useFileBrowser(): FileBrowserContextValue {\n const ctx = useContext(FileBrowserContext);\n if (!ctx) {\n throw new Error(\"useFileBrowser must be used within a <FileBrowser> component\");\n }\n return ctx;\n}\n","import type { FileEntry, FileSort } from \"./FileBrowser.types\";\n\n/**\n * Normalize free-typed path input: forward slashes, collapsed separators,\n * resolved `.` / `..` segments, no trailing slash. Absolute paths stay\n * absolute; relative paths stay relative (entry paths are identity and are\n * never rewritten — this is only for the editable path input).\n */\nexport function normalizePath(input: string): string {\n const raw = input.trim().replace(/\\\\/g, \"/\");\n if (raw === \"\") return \"/\";\n const absolute = raw.startsWith(\"/\");\n const out: string[] = [];\n for (const segment of raw.split(\"/\")) {\n if (segment === \"\" || segment === \".\") continue;\n if (segment === \"..\") {\n out.pop();\n continue;\n }\n out.push(segment);\n }\n if (out.length === 0) return \"/\";\n return (absolute ? \"/\" : \"\") + out.join(\"/\");\n}\n\n/** Parent of a path. Paths without a separator group under `\"/\"`. */\nexport function parentPath(path: string): string {\n const i = path.lastIndexOf(\"/\");\n if (i === -1) return \"/\";\n if (i === 0) return \"/\";\n return path.slice(0, i);\n}\n\nexport interface PathSegment {\n label: string;\n path: string;\n}\n\n/** Cumulative breadcrumb segments for a path (root anchor excluded). */\nexport function pathSegments(path: string): PathSegment[] {\n const absolute = path.startsWith(\"/\");\n const parts = path.split(\"/\").filter(Boolean);\n const segments: PathSegment[] = [];\n let acc = \"\";\n parts.forEach((part, i) => {\n acc = i === 0 && !absolute ? part : `${acc}/${part}`;\n segments.push({ label: part, path: acc });\n });\n return segments;\n}\n\n/**\n * Deterministic, numeric-aware name comparison. The locale is pinned to \"en\"\n * so server and client renders order identically (SSR safety).\n */\nfunction compareNames(a: string, b: string): number {\n const cmp = a.localeCompare(b, \"en\", { numeric: true, sensitivity: \"base\" });\n if (cmp !== 0) return cmp;\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\n/** Dirs-first, then the active sort field, with a stable ascending name tie-break. */\nexport function compareFileEntries(a: FileEntry, b: FileEntry, sort: FileSort): number {\n if (a.kind !== b.kind) return a.kind === \"dir\" ? -1 : 1;\n const direction = sort.direction === \"desc\" ? -1 : 1;\n let cmp: number;\n switch (sort.by) {\n case \"size\":\n cmp = (a.size ?? -1) - (b.size ?? -1);\n break;\n case \"mtime\": {\n const am = a.mtime ?? \"\";\n const bm = b.mtime ?? \"\";\n cmp = am < bm ? -1 : am > bm ? 1 : 0;\n break;\n }\n default:\n cmp = compareNames(a.name, b.name);\n }\n if (cmp !== 0) return direction * cmp;\n return compareNames(a.name, b.name);\n}\n\n/**\n * Whether a dir shows an expand affordance: known-empty dirs never do\n * (`hasChildren: false`, or a loaded/snapshot listing of zero entries);\n * unknown-depth dirs only do when a provider can load them.\n */\nexport function isEntryExpandable(\n entry: FileEntry,\n children: FileEntry[] | undefined,\n hasProvider: boolean,\n): boolean {\n if (entry.kind !== \"dir\" || entry.hasChildren === false) return false;\n if (children !== undefined) return children.length > 0;\n return hasProvider;\n}\n\n/**\n * Client-side name filter over loaded nodes only: an entry matches when its\n * name contains the query, or (for dirs) when any already-loaded descendant\n * matches. Never triggers loads.\n */\nexport function entryMatchesFilter(\n entry: FileEntry,\n query: string,\n entriesFor: (path: string) => FileEntry[] | undefined,\n visited: Set<string> = new Set(),\n): boolean {\n if (entry.name.toLowerCase().includes(query)) return true;\n if (entry.kind !== \"dir\" || visited.has(entry.path)) return false;\n visited.add(entry.path);\n const children = entriesFor(entry.path);\n return children?.some((child) => entryMatchesFilter(child, query, entriesFor, visited)) ?? false;\n}\n\n/** Compact, deterministic byte formatting (\"1.4 KB\", \"12 MB\"). */\nexport function formatFileSize(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return \"\";\n if (bytes < 1024) return `${bytes} B`;\n const units = [\"KB\", \"MB\", \"GB\", \"TB\"];\n let value = bytes;\n let unit = -1;\n do {\n value /= 1024;\n unit++;\n } while (value >= 1024 && unit < units.length - 1);\n const rounded = value >= 100 ? Math.round(value) : Math.round(value * 10) / 10;\n return `${rounded} ${units[unit]}`;\n}\n","import { Fragment, useState } from \"react\";\nimport { ChevronRight, Pencil } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useFileBrowser } from \"./FileBrowser.context\";\nimport { normalizePath, pathSegments } from \"./FileBrowser.utils\";\nimport type { FileBrowserPathBarProps } from \"./FileBrowser.types\";\n\n// Segment styling mirrors Breadcrumbs.Item (the Breadcrumbs component itself\n// is href-only and collapses to a dropdown on mobile, so the path bar renders\n// its own always-visible, click-to-navigate trail).\nconst SEGMENT_CLASS =\n \"shrink-0 rounded text-[13px] text-zinc-500 transition-colors hover:text-zinc-700 dark:text-zinc-400 dark:hover:text-zinc-300\";\nconst ACTIVE_SEGMENT_CLASS = \"shrink-0 truncate text-[13px] font-medium text-zinc-900 dark:text-white\";\n\n/**\n * Breadcrumb trail over the current directory plus an editable path input —\n * type a POSIX-style path and press Enter to navigate (lazy-loading it in\n * provider mode). Escape or blur cancels the edit.\n */\nexport function FileBrowserPathBar({\n editable = true,\n placeholder = \"/path/to/folder\",\n className,\n}: FileBrowserPathBarProps) {\n const { path, navigate } = useFileBrowser();\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState(\"\");\n\n const startEdit = () => {\n setDraft(path);\n setEditing(true);\n };\n\n const commit = () => {\n navigate(normalizePath(draft));\n setEditing(false);\n };\n\n const segments = pathSegments(path);\n const atRoot = segments.length === 0;\n\n return (\n <div\n data-react-fancy-file-browser-path=\"\"\n className={cn(\n \"flex items-center gap-1 border-b border-zinc-200 px-2 py-1.5 dark:border-zinc-700\",\n className,\n )}\n >\n {editing ? (\n <input\n data-react-fancy-file-browser-path-input=\"\"\n type=\"text\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commit();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n setEditing(false);\n }\n }}\n onBlur={() => setEditing(false)}\n autoFocus\n spellCheck={false}\n placeholder={placeholder}\n aria-label=\"Path\"\n className=\"min-w-0 flex-1 rounded-md border border-zinc-300 bg-transparent px-2 py-0.5 font-mono text-xs text-zinc-700 outline-none placeholder:text-zinc-400 focus:border-blue-400 dark:border-zinc-600 dark:text-zinc-300\"\n />\n ) : (\n <nav\n aria-label=\"Path\"\n onDoubleClick={editable ? startEdit : undefined}\n className=\"flex min-w-0 flex-1 items-center gap-1 overflow-x-auto\"\n >\n {atRoot ? (\n <span data-react-fancy-file-browser-path-segment=\"\" aria-current=\"location\" className={ACTIVE_SEGMENT_CLASS}>\n /\n </span>\n ) : (\n <button\n type=\"button\"\n data-react-fancy-file-browser-path-segment=\"\"\n onClick={() => navigate(\"/\")}\n className={SEGMENT_CLASS}\n >\n /\n </button>\n )}\n {segments.map((segment, i) => {\n const last = i === segments.length - 1;\n return (\n <Fragment key={segment.path}>\n {i > 0 && (\n <ChevronRight size={12} aria-hidden=\"true\" className=\"shrink-0 text-zinc-400\" />\n )}\n {last ? (\n <span\n data-react-fancy-file-browser-path-segment=\"\"\n aria-current=\"location\"\n className={ACTIVE_SEGMENT_CLASS}\n >\n {segment.label}\n </span>\n ) : (\n <button\n type=\"button\"\n data-react-fancy-file-browser-path-segment=\"\"\n onClick={() => navigate(segment.path)}\n className={SEGMENT_CLASS}\n >\n {segment.label}\n </button>\n )}\n </Fragment>\n );\n })}\n </nav>\n )}\n {editable && !editing && (\n <button\n type=\"button\"\n aria-label=\"Edit path\"\n onClick={startEdit}\n className=\"shrink-0 rounded-md p-1 text-zinc-400 transition-colors hover:bg-zinc-100 hover:text-zinc-600 dark:hover:bg-zinc-800 dark:hover:text-zinc-300\"\n >\n <Pencil size={13} />\n </button>\n )}\n </div>\n );\n}\n\nFileBrowserPathBar.displayName = \"FileBrowserPathBar\";\n","import { ArrowDown, ArrowUp, Search, X } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useFileBrowser } from \"./FileBrowser.context\";\nimport type { FileBrowserToolbarProps, FileSortField } from \"./FileBrowser.types\";\n\nconst SORT_FIELDS: { field: FileSortField; label: string }[] = [\n { field: \"name\", label: \"Name\" },\n { field: \"size\", label: \"Size\" },\n { field: \"mtime\", label: \"Modified\" },\n];\n\n/**\n * Toolbar: client-side name filter (over loaded nodes only — never triggers\n * loads) plus a dirs-first sort control. Clicking the active sort field flips\n * its direction.\n */\nexport function FileBrowserToolbar({ filterPlaceholder = \"Filter\", className }: FileBrowserToolbarProps) {\n const { filter, setFilter, sort, setSort } = useFileBrowser();\n\n return (\n <div\n data-react-fancy-file-browser-toolbar=\"\"\n className={cn(\n \"flex items-center gap-2 border-b border-zinc-200 px-2 py-1.5 dark:border-zinc-700\",\n className,\n )}\n >\n <div\n data-react-fancy-file-browser-filter=\"\"\n className=\"flex min-w-0 flex-1 items-center gap-1.5 rounded-md border border-zinc-200 px-2 dark:border-zinc-700\"\n >\n <Search size={13} aria-hidden=\"true\" className=\"shrink-0 text-zinc-400\" />\n <input\n type=\"text\"\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n placeholder={filterPlaceholder}\n aria-label=\"Filter by name\"\n spellCheck={false}\n className=\"min-w-0 flex-1 bg-transparent py-1 text-xs text-zinc-700 outline-none placeholder:text-zinc-400 dark:text-zinc-300\"\n />\n {filter !== \"\" && (\n <button\n type=\"button\"\n aria-label=\"Clear filter\"\n onClick={() => setFilter(\"\")}\n className=\"shrink-0 text-zinc-400 transition-colors hover:text-zinc-600 dark:hover:text-zinc-300\"\n >\n <X size={12} />\n </button>\n )}\n </div>\n <div\n data-react-fancy-file-browser-sort=\"\"\n role=\"group\"\n aria-label=\"Sort\"\n className=\"flex shrink-0 items-center gap-0.5\"\n >\n {SORT_FIELDS.map(({ field, label }) => {\n const active = sort.by === field;\n return (\n <button\n key={field}\n type=\"button\"\n data-sort-field={field}\n aria-pressed={active}\n onClick={() =>\n setSort(\n active\n ? { by: field, direction: sort.direction === \"asc\" ? \"desc\" : \"asc\" }\n : { by: field, direction: \"asc\" },\n )\n }\n className={cn(\n \"flex items-center gap-0.5 rounded-md px-1.5 py-0.5 text-xs transition-colors\",\n active\n ? \"bg-zinc-100 font-medium text-zinc-900 dark:bg-zinc-800 dark:text-white\"\n : \"text-zinc-500 hover:text-zinc-700 dark:text-zinc-400 dark:hover:text-zinc-300\",\n )}\n >\n {label}\n {active &&\n (sort.direction === \"asc\" ? (\n <ArrowUp size={11} aria-hidden=\"true\" />\n ) : (\n <ArrowDown size={11} aria-hidden=\"true\" />\n ))}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n\nFileBrowserToolbar.displayName = \"FileBrowserToolbar\";\n","import { ChevronRight, CircleAlert, Loader2, RotateCw } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useFileBrowser } from \"./FileBrowser.context\";\nimport { formatFileSize, isEntryExpandable } from \"./FileBrowser.utils\";\nimport type { FileBrowserNodeProps } from \"./FileBrowser.types\";\n\n// ---------------------------------------------------------------------------\n// Icons — mirror TreeNav's file/folder icons so both tree surfaces look the\n// same (TreeNav keeps them internal; duplicating ~40 lines beats widening its\n// public API).\n// ---------------------------------------------------------------------------\n\nconst EXT_COLORS: Record<string, string> = {\n ts: \"#3178c6\",\n tsx: \"#3178c6\",\n js: \"#f7df1e\",\n jsx: \"#f7df1e\",\n php: \"#777bb4\",\n html: \"#e34c26\",\n htm: \"#e34c26\",\n css: \"#264de4\",\n json: \"#a1a1aa\",\n md: \"#71717a\",\n yaml: \"#cb171e\",\n yml: \"#cb171e\",\n};\n\nfunction FileIcon({ ext }: { ext?: string }) {\n const color = (ext && EXT_COLORS[ext.toLowerCase()]) || \"#71717a\";\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"shrink-0\">\n <path d=\"M4 1h5.5L13 4.5V14a1 1 0 01-1 1H4a1 1 0 01-1-1V2a1 1 0 011-1z\" stroke={color} strokeWidth=\"1.2\" />\n <path d=\"M9 1v4h4\" stroke={color} strokeWidth=\"1.2\" />\n </svg>\n );\n}\n\nfunction FolderIcon({ open }: { open: boolean }) {\n if (open) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"shrink-0\">\n <path d=\"M1.5 3.5a1 1 0 011-1h3l1.5 1.5H13a1 1 0 011 1V5H2.5V3.5z\" fill=\"#fbbf24\" />\n <path d=\"M1 6h13l-1.5 7.5H2.5L1 6z\" fill=\"#fbbf24\" opacity=\"0.7\" />\n </svg>\n );\n }\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"shrink-0\">\n <path d=\"M1.5 3a1 1 0 011-1h3l1.5 1.5H13a1 1 0 011 1v8a1 1 0 01-1 1H2.5a1 1 0 01-1-1V3z\" fill=\"#fbbf24\" />\n </svg>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Status rows — loading / error / empty placeholders inside the tree. Not\n// treeitems (they never receive roving focus); the owning folder carries\n// `aria-busy` while its children load.\n// ---------------------------------------------------------------------------\n\nexport interface FileBrowserStatusRowProps {\n depth: number;\n kind: \"loading\" | \"error\" | \"empty\" | \"no-matches\" | \"unknown\";\n message?: string;\n onRetry?: () => void;\n}\n\nexport function FileBrowserStatusRow({ depth, kind, message, onRetry }: FileBrowserStatusRowProps) {\n const { indentSize } = useFileBrowser();\n const paddingLeft = depth * indentSize + 4 + 18;\n\n if (kind === \"error\") {\n return (\n <div\n role=\"none\"\n data-react-fancy-file-browser-status=\"error\"\n className=\"flex items-center gap-1.5 py-0.5 pr-2 text-xs text-red-600 dark:text-red-400\"\n style={{ paddingLeft }}\n >\n <CircleAlert size={12} className=\"shrink-0\" />\n <span className=\"min-w-0 flex-1 truncate\">{message || \"Failed to load\"}</span>\n {onRetry && (\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"flex shrink-0 items-center gap-1 rounded-md px-1.5 py-0.5 text-[11px] text-zinc-500 transition-colors hover:bg-zinc-100 hover:text-zinc-700 dark:text-zinc-400 dark:hover:bg-zinc-800 dark:hover:text-zinc-200\"\n >\n <RotateCw size={11} />\n Retry\n </button>\n )}\n </div>\n );\n }\n\n return (\n <div\n role=\"none\"\n data-react-fancy-file-browser-status={kind}\n className=\"flex items-center gap-1.5 py-0.5 text-xs text-zinc-400 italic dark:text-zinc-500\"\n style={{ paddingLeft }}\n >\n {kind === \"loading\" && <Loader2 size={12} className=\"shrink-0 animate-spin\" aria-hidden=\"true\" />}\n <span className=\"truncate\">\n {kind === \"loading\" ? \"Loading…\" : kind === \"empty\" ? \"Empty\" : kind === \"no-matches\" ? \"No matches\" : \"No entries\"}\n </span>\n </div>\n );\n}\n\nFileBrowserStatusRow.displayName = \"FileBrowserStatusRow\";\n\n// ---------------------------------------------------------------------------\n// Node\n// ---------------------------------------------------------------------------\n\nexport function FileBrowserNode({ entry, depth }: FileBrowserNodeProps) {\n const {\n entriesFor, visibleChildrenFor, statusFor, errorFor, loadPath, hasProvider,\n expandedPaths, toggleExpanded, navigate,\n isSelected, isSelectable, selectEntry,\n tabFocusPath, setFocusedPath, focusRow, registerRow,\n indentSize, showIcons,\n } = useFileBrowser();\n\n const rawChildren = entriesFor(entry.path);\n const childrenKnown = rawChildren !== undefined;\n const expandable = isEntryExpandable(entry, rawChildren, hasProvider);\n const expanded = expandable && expandedPaths.includes(entry.path);\n const status = statusFor(entry.path);\n const selectable = isSelectable(entry);\n const selected = isSelected(entry.path);\n const loading = expanded && !childrenKnown && status === \"loading\";\n const paddingLeft = depth * indentSize + 4;\n const ext = entry.name.includes(\".\") ? entry.name.split(\".\").pop() : undefined;\n\n const handleClick = () => {\n if (entry.disabled) return;\n setFocusedPath(entry.path);\n focusRow(entry.path);\n if (selectable) selectEntry(entry);\n if (expandable) toggleExpanded(entry.path);\n };\n\n const handleDoubleClick = () => {\n if (entry.disabled || entry.kind !== \"dir\") return;\n navigate(entry.path);\n };\n\n const handleChevronClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!entry.disabled && expandable) toggleExpanded(entry.path);\n };\n\n const visibleChildren = expanded && childrenKnown ? visibleChildrenFor(entry.path) : [];\n\n return (\n <div\n role=\"treeitem\"\n data-react-fancy-file-browser-node=\"\"\n data-path={entry.path}\n data-kind={entry.kind}\n aria-level={depth + 1}\n aria-expanded={expandable ? expanded : undefined}\n aria-selected={selectable ? selected : undefined}\n aria-disabled={entry.disabled || undefined}\n aria-busy={loading || undefined}\n tabIndex={tabFocusPath === entry.path ? 0 : -1}\n ref={(el) => registerRow(entry.path, el)}\n onFocus={(e) => {\n if (e.target === e.currentTarget) setFocusedPath(entry.path);\n }}\n className=\"group outline-none\"\n >\n <div\n data-react-fancy-file-browser-row=\"\"\n onClick={handleClick}\n onDoubleClick={handleDoubleClick}\n className={cn(\n \"flex w-full cursor-pointer items-center gap-1 rounded-md py-0.5 pr-2 text-left text-[13px] transition-colors select-none\",\n selected\n ? \"bg-blue-500/15 text-blue-600 dark:text-blue-400\"\n : \"text-zinc-700 hover:bg-zinc-100 dark:text-zinc-300 dark:hover:bg-zinc-800\",\n entry.disabled && \"pointer-events-none opacity-40\",\n \"group-focus-visible:ring-2 group-focus-visible:ring-blue-500/40 group-focus-visible:ring-inset\",\n )}\n style={{ paddingLeft }}\n >\n {expandable ? (\n loading ? (\n <Loader2 size={14} className=\"shrink-0 animate-spin text-zinc-400\" aria-hidden=\"true\" />\n ) : (\n <button\n type=\"button\"\n tabIndex={-1}\n aria-hidden=\"true\"\n onClick={handleChevronClick}\n className=\"flex shrink-0 items-center justify-center text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300\"\n >\n <ChevronRight\n size={14}\n className={cn(\"transition-transform duration-150\", expanded && \"rotate-90\")}\n />\n </button>\n )\n ) : (\n <span className=\"w-3.5 shrink-0\" />\n )}\n {showIcons &&\n (entry.kind === \"dir\" ? <FolderIcon open={expanded} /> : <FileIcon ext={ext} />)}\n <span className=\"min-w-0 flex-1 truncate\">{entry.name}</span>\n {entry.kind === \"file\" && entry.size !== undefined && (\n <span className=\"shrink-0 text-[11px] text-zinc-400 tabular-nums dark:text-zinc-500\">\n {formatFileSize(entry.size)}\n </span>\n )}\n </div>\n\n {expanded && (\n <div role=\"group\" data-react-fancy-file-browser-node-children=\"\">\n {/* An expanded-but-unknown folder is only reachable with a provider;\n \"idle\" means its lazy load is about to start, so render it as\n loading (keeps SSR output and the first client frame identical). */}\n {!childrenKnown && (status === \"loading\" || status === \"idle\") && (\n <FileBrowserStatusRow depth={depth + 1} kind=\"loading\" />\n )}\n {!childrenKnown && status === \"error\" && (\n <FileBrowserStatusRow\n depth={depth + 1}\n kind=\"error\"\n message={errorFor(entry.path)}\n onRetry={() => loadPath(entry.path, { reload: true })}\n />\n )}\n {childrenKnown &&\n (visibleChildren.length > 0 ? (\n visibleChildren.map((child) => (\n <FileBrowserNode key={child.path} entry={child} depth={depth + 1} />\n ))\n ) : (\n <FileBrowserStatusRow\n depth={depth + 1}\n kind={rawChildren!.length === 0 ? \"empty\" : \"no-matches\"}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nFileBrowserNode.displayName = \"FileBrowserNode\";\n","import { cn } from \"../../utils/cn\";\nimport { useFileBrowser } from \"./FileBrowser.context\";\nimport { FileBrowserNode, FileBrowserStatusRow } from \"./FileBrowserNode\";\nimport type { FileBrowserRow, FileBrowserTreeProps } from \"./FileBrowser.types\";\n\n/**\n * The tree pane: ARIA `tree` semantics, roving tabindex, and full keyboard\n * navigation (arrows / Enter / Space / Home / End) over the flattened row\n * order. Lazy loads fire on expand only.\n */\nexport function FileBrowserTree({ ariaLabel = \"Files\", className }: FileBrowserTreeProps) {\n const ctx = useFileBrowser();\n const {\n path, entriesFor, visibleChildrenFor, statusFor, errorFor, loadPath, hasProvider,\n visibleRows, tabFocusPath, setFocusedPath, focusRow,\n toggleExpanded, isSelectable, selectEntry, navigate, multiple,\n } = ctx;\n\n const rootEntries = entriesFor(path);\n const rootStatus = statusFor(path);\n const rootChildren = rootEntries !== undefined ? visibleChildrenFor(path) : [];\n\n const moveTo = (row: FileBrowserRow) => {\n setFocusedPath(row.entry.path);\n focusRow(row.entry.path);\n };\n\n const activate = (row: FileBrowserRow) => {\n if (row.entry.disabled) return;\n if (isSelectable(row.entry)) selectEntry(row.entry);\n if (row.expandable) toggleExpanded(row.entry.path);\n else if (row.entry.kind === \"dir\" && !isSelectable(row.entry)) navigate(row.entry.path);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n const rows = visibleRows;\n if (rows.length === 0) return;\n const index = rows.findIndex((row) => row.entry.path === tabFocusPath);\n const current = index >= 0 ? rows[index] : rows[0];\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n if (index < rows.length - 1) moveTo(rows[index + 1]);\n break;\n case \"ArrowUp\":\n e.preventDefault();\n if (index > 0) moveTo(rows[index - 1]);\n break;\n case \"Home\":\n e.preventDefault();\n moveTo(rows[0]);\n break;\n case \"End\":\n e.preventDefault();\n moveTo(rows[rows.length - 1]);\n break;\n case \"ArrowRight\":\n e.preventDefault();\n if (current.entry.disabled) break;\n if (current.expandable && !current.expanded) {\n toggleExpanded(current.entry.path);\n } else if (current.expanded) {\n const firstChild = rows[index + 1];\n if (firstChild && firstChild.parentPath === current.entry.path) moveTo(firstChild);\n }\n break;\n case \"ArrowLeft\":\n e.preventDefault();\n if (current.expanded && !current.entry.disabled) {\n toggleExpanded(current.entry.path);\n } else if (current.parentPath) {\n const parent = rows.find((row) => row.entry.path === current.parentPath);\n if (parent) moveTo(parent);\n }\n break;\n case \"Enter\":\n e.preventDefault();\n activate(current);\n break;\n case \" \":\n e.preventDefault();\n if (!current.entry.disabled) selectEntry(current.entry);\n break;\n }\n };\n\n return (\n <div\n role=\"tree\"\n aria-label={ariaLabel}\n aria-multiselectable={multiple || undefined}\n data-react-fancy-file-browser-tree=\"\"\n className={cn(\"min-h-0 flex-1 overflow-auto p-1\", className)}\n onKeyDown={handleKeyDown}\n >\n {/* \"idle\" with a provider renders as loading too: loads fire in an\n effect, so this is what the server (and first client frame) shows\n right before the request starts — keeps SSR + hydration identical. */}\n {rootEntries === undefined && hasProvider && (rootStatus === \"loading\" || rootStatus === \"idle\") && (\n <FileBrowserStatusRow depth={0} kind=\"loading\" />\n )}\n {rootEntries === undefined && rootStatus === \"error\" && (\n <FileBrowserStatusRow\n depth={0}\n kind=\"error\"\n message={errorFor(path)}\n onRetry={() => loadPath(path, { reload: true })}\n />\n )}\n {rootEntries === undefined && rootStatus === \"idle\" && !hasProvider && (\n <FileBrowserStatusRow depth={0} kind=\"unknown\" />\n )}\n {rootEntries !== undefined &&\n (rootChildren.length > 0 ? (\n rootChildren.map((entry) => (\n <FileBrowserNode key={entry.path} entry={entry} depth={0} />\n ))\n ) : (\n <FileBrowserStatusRow depth={0} kind={rootEntries.length === 0 ? \"empty\" : \"no-matches\"} />\n ))}\n </div>\n );\n}\n\nFileBrowserTree.displayName = \"FileBrowserTree\";\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useControllableState } from \"../../hooks/use-controllable-state\";\nimport { FileBrowserContext } from \"./FileBrowser.context\";\nimport { FileBrowserPathBar } from \"./FileBrowserPathBar\";\nimport { FileBrowserToolbar } from \"./FileBrowserToolbar\";\nimport { FileBrowserTree } from \"./FileBrowserTree\";\nimport { FileBrowserNode } from \"./FileBrowserNode\";\nimport {\n compareFileEntries,\n entryMatchesFilter,\n isEntryExpandable,\n parentPath,\n} from \"./FileBrowser.utils\";\nimport type {\n FileBrowserContextValue,\n FileBrowserProps,\n FileBrowserRow,\n FileEntry,\n FileLoadStatus,\n FileSnapshotNode,\n FileSort,\n} from \"./FileBrowser.types\";\n\nconst DEFAULT_SORT: FileSort = { by: \"name\", direction: \"asc\" };\n\nfunction snapshotNodeToEntry(node: FileSnapshotNode): FileEntry {\n const { children: _children, ...entry } = node;\n return entry;\n}\n\n/**\n * Index a snapshot tree into a `parent path -> children` map. Roots group\n * under their own parent path (usually `\"/\"`); any node with a materialized\n * `children` array defines that folder's listing. Dirs with `children`\n * undefined stay unknown — a provider fills them lazily in hybrid mode.\n */\nfunction buildSnapshotMap(snapshot: FileSnapshotNode[] | undefined): Map<string, FileEntry[]> {\n const map = new Map<string, FileEntry[]>();\n if (!snapshot || snapshot.length === 0) return map;\n\n for (const root of snapshot) {\n const parent = parentPath(root.path);\n const list = map.get(parent);\n if (list) list.push(snapshotNodeToEntry(root));\n else map.set(parent, [snapshotNodeToEntry(root)]);\n }\n\n const walk = (nodes: FileSnapshotNode[]) => {\n for (const node of nodes) {\n if (node.children) {\n map.set(node.path, node.children.map(snapshotNodeToEntry));\n walk(node.children);\n }\n }\n };\n walk(snapshot);\n\n return map;\n}\n\n/**\n * FileBrowser — remote-capable file/folder browser + directory picker.\n *\n * Browses any file tree the host can describe — local FS, HTTP, SSH, or a\n * remote machine streaming snapshots — via two feeding modes that may be\n * combined:\n *\n * - **Provider mode (lazy pull):** pass `provider.loadChildren(path)`. Folders\n * load on first expand with per-node loading + error states; the tree is\n * never walked eagerly.\n * - **Snapshot mode (streamed push):** pass a JSON-friendly `snapshot` tree\n * and replace/patch it as chunks arrive (relay / WebSocket / MCP). The\n * snapshot is the source of truth for every path it covers; with a provider\n * also present, unknown-depth folders stay lazily loadable (hybrid).\n *\n * Fully controlled per the Human+ component contract (`value`/`onChange`,\n * `path`/`onPathChange`, `expandedPaths`/`onExpandedChange`, plus\n * `sort`/`filter`), with uncontrolled `defaultX` fallbacks. Every row carries\n * a `data-path` attribute — paths are the stable handles agents target, never\n * indexes or generated ids.\n *\n * Agent bridge sketch (ships later in `@particle-academy/agent-integrations`):\n * `registerFilesBridge(server, { adapter })` will expose MCP tools over this\n * surface — `files_list(path)`, `files_expand(path)` / `files_collapse(path)`,\n * `files_select(paths)`, `files_navigate(path)`, and\n * `files_request_snapshot(path, depth)` — with each mutation emitting an\n * `AgentActivity` event so presence, undo, and coaching layers compose. The\n * adapter maps those tools onto the same controlled props\n * (`value`/`path`/`expandedPaths`) and provider/snapshot contract; no DOM\n * scraping required.\n *\n * Read-only in v1: no content preview (pair with fancy-code's `FileViewer`)\n * and no write operations — rename/delete/upload arrive later behind a\n * `pendingMode`-gated iteration.\n */\nfunction FileBrowserRoot({\n provider,\n snapshot,\n select = \"file\",\n multiple = false,\n value,\n defaultValue,\n onChange,\n path,\n defaultPath = \"/\",\n onPathChange,\n expandedPaths,\n defaultExpandedPaths,\n onExpandedChange,\n sort,\n defaultSort,\n onSortChange,\n filter,\n defaultFilter,\n onFilterChange,\n onError,\n indentSize = 16,\n showIcons = true,\n className,\n children,\n}: FileBrowserProps) {\n // ---------------------------------------------------------------------------\n // Controlled / uncontrolled state\n // ---------------------------------------------------------------------------\n\n const [currentPath, setCurrentPath] = useControllableState(path, defaultPath, onPathChange);\n const [expanded, setExpanded] = useControllableState(\n expandedPaths,\n defaultExpandedPaths ?? [],\n onExpandedChange,\n );\n const [sortState, setSortState] = useControllableState(sort, defaultSort ?? DEFAULT_SORT, onSortChange);\n const [filterState, setFilterState] = useControllableState(filter, defaultFilter ?? \"\", onFilterChange);\n\n // Selection is managed directly (not via useControllableState) because\n // onChange also receives the matching FileEntry objects.\n const [internalValue, setInternalValue] = useState<string | string[] | null>(\n () => defaultValue ?? (multiple ? [] : null),\n );\n const selection = value !== undefined ? value : internalValue;\n const selectedPaths = useMemo(\n () => (selection == null ? [] : Array.isArray(selection) ? selection : [selection]),\n [selection],\n );\n\n // ---------------------------------------------------------------------------\n // Data layer — snapshot map + lazy provider cache\n // ---------------------------------------------------------------------------\n\n const snapshotMap = useMemo(() => buildSnapshotMap(snapshot), [snapshot]);\n\n const [loadedChildren, setLoadedChildren] = useState<Record<string, FileEntry[]>>({});\n const [loadStatus, setLoadStatus] = useState<Record<string, FileLoadStatus>>({});\n const [loadErrors, setLoadErrors] = useState<Record<string, string>>({});\n\n const seqCounter = useRef(0);\n const requestSeq = useRef<Record<string, number>>({});\n\n // Latest-state refs so `loadPath` stays referentially stable.\n const stateRef = useRef({ snapshotMap, loadedChildren, loadStatus });\n stateRef.current = { snapshotMap, loadedChildren, loadStatus };\n const providerRef = useRef(provider);\n providerRef.current = provider;\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const loadPath = useCallback((targetPath: string, options?: { reload?: boolean }) => {\n const prov = providerRef.current;\n if (!prov) return;\n const { snapshotMap: snap, loadedChildren: loaded, loadStatus: statuses } = stateRef.current;\n const status = statuses[targetPath] ?? \"idle\";\n if (status === \"loading\") return;\n const known = snap.get(targetPath) ?? loaded[targetPath];\n if (!options?.reload && (known !== undefined || status === \"error\")) return;\n\n const requestId = ++seqCounter.current;\n requestSeq.current[targetPath] = requestId;\n setLoadStatus((prev) => ({ ...prev, [targetPath]: \"loading\" }));\n\n prov.loadChildren(targetPath).then(\n (entries) => {\n if (requestSeq.current[targetPath] !== requestId) return;\n setLoadedChildren((prev) => ({ ...prev, [targetPath]: entries }));\n setLoadStatus((prev) => ({ ...prev, [targetPath]: \"loaded\" }));\n setLoadErrors((prev) => {\n if (!(targetPath in prev)) return prev;\n const next = { ...prev };\n delete next[targetPath];\n return next;\n });\n },\n (error: unknown) => {\n if (requestSeq.current[targetPath] !== requestId) return;\n setLoadStatus((prev) => ({ ...prev, [targetPath]: \"error\" }));\n setLoadErrors((prev) => ({\n ...prev,\n [targetPath]: error instanceof Error ? error.message : String(error),\n }));\n onErrorRef.current?.(targetPath, error);\n },\n );\n }, []);\n\n const entriesFor = useCallback(\n (p: string) => snapshotMap.get(p) ?? loadedChildren[p],\n [snapshotMap, loadedChildren],\n );\n\n const statusFor = useCallback(\n (p: string): FileLoadStatus => {\n if (snapshotMap.has(p)) return \"loaded\";\n const status = loadStatus[p];\n if (status) return status;\n return loadedChildren[p] !== undefined ? \"loaded\" : \"idle\";\n },\n [snapshotMap, loadStatus, loadedChildren],\n );\n\n const errorFor = useCallback((p: string) => loadErrors[p], [loadErrors]);\n\n // Lazy loading — only the current directory and explicitly expanded folders\n // (including expansions driven from outside via the controlled\n // `expandedPaths` prop). Never an eager walk; errored paths wait for an\n // explicit retry.\n useEffect(() => {\n if (!provider) return;\n loadPath(currentPath);\n for (const p of expanded) loadPath(p);\n }, [provider, currentPath, expanded, snapshotMap, loadPath]);\n\n // ---------------------------------------------------------------------------\n // Filter + sort + flattened visible rows\n // ---------------------------------------------------------------------------\n\n const filterLower = filterState.trim().toLowerCase();\n\n const visibleChildrenFor = useCallback(\n (p: string): FileEntry[] => {\n const entries = entriesFor(p);\n if (!entries) return [];\n const filtered = filterLower\n ? entries.filter((entry) => entryMatchesFilter(entry, filterLower, entriesFor))\n : entries.slice();\n return filtered.sort((a, b) => compareFileEntries(a, b, sortState));\n },\n [entriesFor, filterLower, sortState],\n );\n\n const visibleRows = useMemo(() => {\n const rows: FileBrowserRow[] = [];\n const visited = new Set<string>([currentPath]);\n const walk = (p: string, depth: number, parent: string | null) => {\n for (const entry of visibleChildrenFor(p)) {\n const expandable = isEntryExpandable(entry, entriesFor(entry.path), !!provider);\n const isOpen = expandable && expanded.includes(entry.path);\n rows.push({ entry, depth, expandable, expanded: isOpen, parentPath: parent });\n if (isOpen && !visited.has(entry.path)) {\n visited.add(entry.path);\n walk(entry.path, depth + 1, entry.path);\n }\n }\n };\n walk(currentPath, 0, null);\n return rows;\n }, [visibleChildrenFor, entriesFor, provider, expanded, currentPath]);\n\n // ---------------------------------------------------------------------------\n // Selection\n // ---------------------------------------------------------------------------\n\n const entryIndex = useMemo(() => {\n const map = new Map<string, FileEntry>();\n for (const list of snapshotMap.values()) {\n for (const entry of list) map.set(entry.path, entry);\n }\n for (const list of Object.values(loadedChildren)) {\n for (const entry of list) {\n if (!map.has(entry.path)) map.set(entry.path, entry);\n }\n }\n return map;\n }, [snapshotMap, loadedChildren]);\n\n const isSelectable = useCallback(\n (entry: FileEntry) =>\n !entry.disabled &&\n (select === \"both\" || (select === \"file\" ? entry.kind === \"file\" : entry.kind === \"dir\")),\n [select],\n );\n\n const isSelected = useCallback((p: string) => selectedPaths.includes(p), [selectedPaths]);\n\n const commitSelection = useCallback(\n (paths: string[]) => {\n const nextValue = multiple ? paths : (paths[0] ?? null);\n if (value === undefined) setInternalValue(nextValue);\n onChangeRef.current?.(\n nextValue,\n paths\n .map((p) => entryIndex.get(p))\n .filter((entry): entry is FileEntry => entry !== undefined),\n );\n },\n [multiple, value, entryIndex],\n );\n\n const selectEntry = useCallback(\n (entry: FileEntry) => {\n if (!isSelectable(entry)) return;\n if (multiple) {\n commitSelection(\n selectedPaths.includes(entry.path)\n ? selectedPaths.filter((p) => p !== entry.path)\n : [...selectedPaths, entry.path],\n );\n } else {\n commitSelection([entry.path]);\n }\n },\n [isSelectable, multiple, selectedPaths, commitSelection],\n );\n\n // ---------------------------------------------------------------------------\n // Expansion, navigation, roving focus\n // ---------------------------------------------------------------------------\n\n const toggleExpanded = useCallback(\n (p: string) => {\n setExpanded((prev) => (prev.includes(p) ? prev.filter((x) => x !== p) : [...prev, p]));\n },\n [setExpanded],\n );\n\n const [focusedPath, setFocusedPath] = useState<string | null>(null);\n\n const navigate = useCallback(\n (p: string) => {\n setCurrentPath(p);\n setFilterState(\"\");\n setFocusedPath(null);\n },\n [setCurrentPath, setFilterState],\n );\n\n const rowRefs = useRef(new Map<string, HTMLElement>());\n\n const registerRow = useCallback((p: string, el: HTMLElement | null) => {\n if (el) rowRefs.current.set(p, el);\n else rowRefs.current.delete(p);\n }, []);\n\n const focusRow = useCallback((p: string) => {\n rowRefs.current.get(p)?.focus();\n }, []);\n\n const tabFocusPath = useMemo(() => {\n if (focusedPath && visibleRows.some((row) => row.entry.path === focusedPath)) {\n return focusedPath;\n }\n return visibleRows[0]?.entry.path ?? null;\n }, [focusedPath, visibleRows]);\n\n // ---------------------------------------------------------------------------\n // Context + render\n // ---------------------------------------------------------------------------\n\n const ctx = useMemo<FileBrowserContextValue>(\n () => ({\n entriesFor,\n visibleChildrenFor,\n statusFor,\n errorFor,\n loadPath,\n hasProvider: !!provider,\n path: currentPath,\n navigate,\n expandedPaths: expanded,\n toggleExpanded,\n select,\n multiple,\n selectedPaths,\n isSelected,\n isSelectable,\n selectEntry,\n sort: sortState,\n setSort: setSortState,\n filter: filterState,\n setFilter: setFilterState,\n visibleRows,\n focusedPath,\n setFocusedPath,\n tabFocusPath,\n focusRow,\n registerRow,\n indentSize,\n showIcons,\n }),\n [\n entriesFor, visibleChildrenFor, statusFor, errorFor, loadPath, provider,\n currentPath, navigate, expanded, toggleExpanded, select, multiple,\n selectedPaths, isSelected, isSelectable, selectEntry, sortState,\n setSortState, filterState, setFilterState, visibleRows, focusedPath,\n tabFocusPath, focusRow, registerRow, indentSize, showIcons,\n ],\n );\n\n return (\n <FileBrowserContext.Provider value={ctx}>\n <div\n data-react-fancy-file-browser=\"\"\n className={cn(\n \"flex flex-col overflow-hidden rounded-lg border border-zinc-200 bg-white text-sm dark:border-zinc-700 dark:bg-zinc-900\",\n className,\n )}\n >\n {children ?? (\n <>\n <FileBrowserPathBar />\n <FileBrowserToolbar />\n <FileBrowserTree />\n </>\n )}\n </div>\n </FileBrowserContext.Provider>\n );\n}\n\nFileBrowserRoot.displayName = \"FileBrowser\";\n\nexport const FileBrowser = Object.assign(FileBrowserRoot, {\n PathBar: FileBrowserPathBar,\n Toolbar: FileBrowserToolbar,\n Tree: FileBrowserTree,\n Node: FileBrowserNode,\n});\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Sidebar/Sidebar.context.ts","../src/components/Sidebar/SidebarItem.tsx","../src/components/Sidebar/SidebarGroup.tsx","../src/components/Sidebar/SidebarSubmenu.tsx","../src/components/Sidebar/SidebarToggle.tsx","../src/components/Sidebar/Sidebar.tsx"],"names":["jsxs","jsx","getLetters"],"mappings":"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","file":"chunk-N7WQ53US.js","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { SidebarContextValue } from \"./Sidebar.types\";\n\nexport const SidebarContext = createContext<SidebarContextValue | null>(null);\n\nexport function useSidebar(): SidebarContextValue {\n const ctx = useContext(SidebarContext);\n if (!ctx) {\n throw new Error(\"useSidebar must be used within a <Sidebar> component\");\n }\n return ctx;\n}\n","import type { ElementType } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useSidebar } from \"./Sidebar.context\";\nimport type { SidebarItemProps } from \"./Sidebar.types\";\n\n/** Extract first 3 characters from a ReactNode if it's a string. */\nfunction getLetters(children: React.ReactNode): string {\n if (typeof children === \"string\") return children.slice(0, 3);\n return \"...\";\n}\n\nexport function SidebarItem({\n children,\n href,\n as: As,\n icon,\n active = false,\n disabled = false,\n badge,\n onClick,\n className,\n ...rest\n}: SidebarItemProps) {\n const { collapsed, collapseMode } = useSidebar();\n\n // Link mode engages on `href` OR `as` — a `to`-based router (TanStack Router,\n // React Router) passes no href, and would otherwise render a <button> that\n // navigates nowhere. `onClick` now rides along in link mode instead of being\n // dropped: an item that both navigates and closes a drawer is the common case.\n const isLink = Boolean(href || As);\n const Tag = isLink ? ((As ?? \"a\") as ElementType) : \"button\";\n const tagProps = isLink\n ? { ...(href ? { href } : {}), onClick }\n : { type: \"button\" as const, onClick };\n\n const showIconOnly = collapsed && collapseMode === \"icons\" && icon;\n const showLetters = collapsed && (collapseMode === \"letters\" || (collapseMode === \"icons\" && !icon));\n\n const title = typeof children === \"string\" ? children : undefined;\n\n return (\n <Tag\n {...tagProps}\n {...rest}\n data-react-fancy-sidebar-item=\"\"\n data-active={active || undefined}\n aria-current={active ? \"page\" : undefined}\n aria-disabled={disabled || undefined}\n title={collapsed ? title : undefined}\n className={cn(\n // `w-full` matters when the Tag is a <button>: form controls size to\n // FIT-CONTENT, not to their parent, so a long label made the item wider\n // than the sidebar and an ancestor clipped the overflow — which reads as\n // a label cut off mid-word rather than an ellipsis. Without this,\n // `min-w-0` on the label below can never engage, because the item is\n // never under width pressure in the first place.\n \"flex w-full items-center rounded-md text-sm font-medium transition-colors\",\n \"outline-none focus-visible:ring-2 focus-visible:ring-blue-500\",\n collapsed ? \"justify-center px-2 py-2\" : \"gap-2 px-3 py-2\",\n active\n ? \"bg-zinc-100 text-zinc-900 dark:bg-zinc-800 dark:text-zinc-100\"\n : \"text-zinc-600 hover:bg-zinc-50 hover:text-zinc-900 dark:text-zinc-400 dark:hover:bg-zinc-800/50 dark:hover:text-zinc-100\",\n disabled && \"pointer-events-none opacity-50\",\n className,\n )}\n >\n {showIconOnly && (\n <span className=\"flex h-5 w-5 shrink-0 items-center justify-center\">{icon}</span>\n )}\n {showLetters && (\n <span className=\"text-xs font-semibold uppercase\">{getLetters(children)}</span>\n )}\n {!collapsed && (\n <>\n {icon && <span className=\"flex h-5 w-5 shrink-0 items-center justify-center\">{icon}</span>}\n {/*\n `min-w-0` is load-bearing, not tidiness. A flex item defaults to\n `min-width: auto`, which resolves to its MIN-CONTENT width — so with\n `truncate` alone the span refuses to shrink below the full label,\n and the item grows wider than the sidebar instead of ellipsing.\n The overflow then gets clipped by an ancestor, which looks like a\n mid-word cut rather than a truncation.\n\n Only shows up with labels longer than the sidebar is wide, which is\n why it survived: short nav labels never trigger it.\n */}\n <span className=\"min-w-0 flex-1 truncate text-left\">{children}</span>\n {badge && <span className=\"shrink-0\">{badge}</span>}\n </>\n )}\n </Tag>\n );\n}\n\nSidebarItem.displayName = \"SidebarItem\";\n","import { cn } from \"../../utils/cn\";\nimport { useSidebar } from \"./Sidebar.context\";\nimport type { SidebarGroupProps } from \"./Sidebar.types\";\n\nexport function SidebarGroup({ children, label, className }: SidebarGroupProps) {\n const { collapsed } = useSidebar();\n\n return (\n <div data-react-fancy-sidebar-group=\"\" className={cn(\"py-1\", className)}>\n {label && !collapsed && (\n <p className=\"mb-1 px-3 text-xs font-semibold uppercase tracking-wider text-zinc-400 dark:text-zinc-500\">\n {label}\n </p>\n )}\n {label && collapsed && (\n <div className=\"mx-auto mb-1 h-px w-6 bg-zinc-200 dark:bg-zinc-700\" />\n )}\n {children}\n </div>\n );\n}\n\nSidebarGroup.displayName = \"SidebarGroup\";\n","import { useState } from \"react\";\nimport { ChevronDown } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useSidebar } from \"./Sidebar.context\";\nimport type { SidebarSubmenuProps } from \"./Sidebar.types\";\n\n/** Extract first 3 characters from a string. */\nfunction getLetters(label: string): string {\n return label.slice(0, 3);\n}\n\nexport function SidebarSubmenu({\n children,\n label,\n icon,\n defaultOpen = false,\n className,\n}: SidebarSubmenuProps) {\n const [open, setOpen] = useState(defaultOpen);\n const { collapsed, collapseMode } = useSidebar();\n\n const showIconOnly = collapsed && collapseMode === \"icons\" && icon;\n const showLetters = collapsed && (collapseMode === \"letters\" || (collapseMode === \"icons\" && !icon));\n\n // When collapsed, just show the icon/letters as a simple item (no expand)\n if (collapsed) {\n return (\n <div\n data-react-fancy-sidebar-submenu=\"\"\n title={label}\n className={cn(\n \"flex items-center justify-center rounded-md px-2 py-2 text-sm font-medium transition-colors\",\n \"text-zinc-600 hover:bg-zinc-50 hover:text-zinc-900\",\n \"dark:text-zinc-400 dark:hover:bg-zinc-800/50 dark:hover:text-zinc-100\",\n className,\n )}\n >\n {showIconOnly && (\n <span className=\"flex h-5 w-5 shrink-0 items-center justify-center\">{icon}</span>\n )}\n {showLetters && (\n <span className=\"text-xs font-semibold uppercase\">{getLetters(label)}</span>\n )}\n </div>\n );\n }\n\n return (\n <div data-react-fancy-sidebar-submenu=\"\" className={className}>\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n className={cn(\n \"flex w-full items-center gap-2 rounded-md px-3 py-2 text-sm font-medium transition-colors\",\n \"text-zinc-600 hover:bg-zinc-50 hover:text-zinc-900\",\n \"dark:text-zinc-400 dark:hover:bg-zinc-800/50 dark:hover:text-zinc-100\",\n )}\n >\n {icon && <span className=\"flex h-5 w-5 shrink-0 items-center justify-center\">{icon}</span>}\n <span className=\"flex-1 text-left\">{label}</span>\n <ChevronDown\n className={cn(\n \"h-3.5 w-3.5 opacity-60 transition-transform duration-200\",\n open && \"rotate-180\",\n )}\n />\n </button>\n <div\n className={cn(\n \"grid transition-[grid-template-rows] duration-200\",\n open ? \"grid-rows-[1fr]\" : \"grid-rows-[0fr]\",\n )}\n >\n <div className=\"overflow-hidden\">\n <div className=\"ml-4 border-l border-zinc-200 pl-2 pt-1 dark:border-zinc-700\">\n {children}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nSidebarSubmenu.displayName = \"SidebarSubmenu\";\n","import { PanelLeftClose, PanelLeftOpen } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useSidebar } from \"./Sidebar.context\";\nimport type { SidebarToggleProps } from \"./Sidebar.types\";\n\nexport function SidebarToggle({ className }: SidebarToggleProps) {\n const { collapsed, setCollapsed } = useSidebar();\n\n return (\n <button\n type=\"button\"\n data-react-fancy-sidebar-toggle=\"\"\n onClick={() => setCollapsed(!collapsed)}\n title={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n className={cn(\n \"flex items-center justify-center rounded-md p-1.5 text-zinc-400 transition-colors\",\n \"hover:bg-zinc-100 hover:text-zinc-600 dark:hover:bg-zinc-800 dark:hover:text-zinc-300\",\n className,\n )}\n >\n {collapsed ? (\n <PanelLeftOpen className=\"h-4 w-4\" />\n ) : (\n <PanelLeftClose className=\"h-4 w-4\" />\n )}\n </button>\n );\n}\n\nSidebarToggle.displayName = \"SidebarToggle\";\n","import { cn } from \"../../utils/cn\";\nimport { useControllableState } from \"../../hooks\";\nimport { SidebarContext } from \"./Sidebar.context\";\nimport { SidebarItem } from \"./SidebarItem\";\nimport { SidebarGroup } from \"./SidebarGroup\";\nimport { SidebarSubmenu } from \"./SidebarSubmenu\";\nimport { SidebarToggle } from \"./SidebarToggle\";\nimport type { SidebarProps } from \"./Sidebar.types\";\n\nfunction SidebarRoot({\n children,\n collapsed: controlledCollapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n collapseMode = \"icons\",\n className,\n}: SidebarProps) {\n const [collapsed, setCollapsed] = useControllableState(\n controlledCollapsed,\n defaultCollapsed,\n onCollapsedChange,\n );\n\n return (\n <SidebarContext.Provider value={{ collapsed, collapseMode, setCollapsed }}>\n <aside\n data-react-fancy-sidebar=\"\"\n data-collapsed={collapsed || undefined}\n className={cn(\n \"flex flex-col gap-0.5 border-r border-zinc-200 bg-white transition-[width] duration-200 dark:border-zinc-700 dark:bg-zinc-900\",\n collapsed ? \"w-16\" : \"w-60\",\n className,\n )}\n >\n {children}\n </aside>\n </SidebarContext.Provider>\n );\n}\n\nexport const Sidebar = Object.assign(SidebarRoot, {\n Item: SidebarItem,\n Group: SidebarGroup,\n Submenu: SidebarSubmenu,\n Toggle: SidebarToggle,\n});\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Sidebar/Sidebar.context.ts","../src/components/Sidebar/SidebarItem.tsx","../src/components/Sidebar/SidebarGroup.tsx","../src/components/Sidebar/SidebarSubmenu.tsx","../src/components/Sidebar/SidebarToggle.tsx","../src/components/Sidebar/Sidebar.tsx"],"names":["createContext","useContext","jsxs","cn","jsx","Fragment","getLetters","useState","ChevronDown","PanelLeftOpen","PanelLeftClose","useControllableState"],"mappings":";;;;;;;;AAGO,IAAM,cAAA,GAAiBA,oBAA0C,IAAI,CAAA;AAErE,SAAS,UAAA,GAAkC;AAChD,EAAA,MAAM,GAAA,GAAMC,iBAAW,cAAc,CAAA;AACrC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,MAAM,sDAAsD,CAAA;AAAA,EACxE;AACA,EAAA,OAAO,GAAA;AACT;ACLA,SAAS,WAAW,QAAA,EAAmC;AACrD,EAAA,IAAI,OAAO,QAAA,KAAa,QAAA,SAAiB,QAAA,CAAS,KAAA,CAAM,GAAG,CAAC,CAAA;AAC5D,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,WAAA,CAAY;AAAA,EAC1B,QAAA;AAAA,EACA,IAAA;AAAA,EACA,EAAA,EAAI,EAAA;AAAA,EACJ,IAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EACT,QAAA,GAAW,KAAA;AAAA,EACX,KAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAqB;AACnB,EAAA,MAAM,EAAE,SAAA,EAAW,YAAA,EAAa,GAAI,UAAA,EAAW;AAM/C,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,IAAQ,EAAE,CAAA;AACjC,EAAA,MAAM,GAAA,GAAM,MAAA,GAAW,EAAA,IAAM,GAAA,GAAuB,QAAA;AACpD,EAAA,MAAM,QAAA,GAAW,MAAA,GACb,EAAE,GAAI,OAAO,EAAE,IAAA,EAAK,GAAI,IAAK,OAAA,EAAQ,GACrC,EAAE,IAAA,EAAM,UAAmB,OAAA,EAAQ;AAEvC,EAAA,MAAM,YAAA,GAAe,SAAA,IAAa,YAAA,KAAiB,OAAA,IAAW,IAAA;AAC9D,EAAA,MAAM,cAAc,SAAA,KAAc,YAAA,KAAiB,SAAA,IAAc,YAAA,KAAiB,WAAW,CAAC,IAAA,CAAA;AAE9F,EAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,KAAa,QAAA,GAAW,QAAA,GAAW,MAAA;AAExD,EAAA,uBACEC,eAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACE,GAAG,QAAA;AAAA,MACH,GAAG,IAAA;AAAA,MACJ,+BAAA,EAA8B,EAAA;AAAA,MAC9B,eAAa,MAAA,IAAU,MAAA;AAAA,MACvB,cAAA,EAAc,SAAS,MAAA,GAAS,MAAA;AAAA,MAChC,iBAAe,QAAA,IAAY,MAAA;AAAA,MAC3B,KAAA,EAAO,YAAY,KAAA,GAAQ,MAAA;AAAA,MAC3B,SAAA,EAAWC,oBAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOT,2EAAA;AAAA,QACA,+DAAA;AAAA,QACA,YAAY,0BAAA,GAA6B,iBAAA;AAAA,QACzC,SACI,+DAAA,GACA,0HAAA;AAAA,QACJ,QAAA,IAAY,gCAAA;AAAA,QACZ;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,YAAA,oBACCC,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mDAAA,EAAqD,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,QAE3E,+BACCA,cAAA,CAAC,MAAA,EAAA,EAAK,WAAU,iCAAA,EAAmC,QAAA,EAAA,UAAA,CAAW,QAAQ,CAAA,EAAE,CAAA;AAAA,QAEzE,CAAC,6BACAF,eAAA,CAAAG,mBAAA,EAAA,EACG,QAAA,EAAA;AAAA,UAAA,IAAA,oBAAQD,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mDAAA,EAAqD,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,0BAYnFA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mCAAA,EAAqC,QAAA,EAAS,CAAA;AAAA,UAC7D,KAAA,oBAASA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAY,QAAA,EAAA,KAAA,EAAM;AAAA,SAAA,EAC9C;AAAA;AAAA;AAAA,GAEJ;AAEJ;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA;AC1FnB,SAAS,YAAA,CAAa,EAAE,QAAA,EAAU,KAAA,EAAO,WAAU,EAAsB;AAC9E,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,UAAA,EAAW;AAEjC,EAAA,uBACEF,gBAAC,KAAA,EAAA,EAAI,gCAAA,EAA+B,IAAG,SAAA,EAAWC,oBAAA,CAAG,MAAA,EAAQ,SAAS,CAAA,EACnE,QAAA,EAAA;AAAA,IAAA,KAAA,IAAS,CAAC,SAAA,oBACTC,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6FACV,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,IAED,SAAS,SAAA,oBACRA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oDAAA,EAAqD,CAAA;AAAA,IAErE;AAAA,GAAA,EACH,CAAA;AAEJ;AAEA,YAAA,CAAa,WAAA,GAAc,cAAA;ACf3B,SAASE,YAAW,KAAA,EAAuB;AACzC,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACzB;AAEO,SAAS,cAAA,CAAe;AAAA,EAC7B,QAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIC,eAAS,WAAW,CAAA;AAC5C,EAAA,MAAM,EAAE,SAAA,EAAW,YAAA,EAAa,GAAI,UAAA,EAAW;AAE/C,EAAA,MAAM,YAAA,GAAe,SAAA,IAAa,YAAA,KAAiB,OAAA,IAAW,IAAA;AAC9D,EAAA,MAAM,cAAc,SAAA,KAAc,YAAA,KAAiB,SAAA,IAAc,YAAA,KAAiB,WAAW,CAAC,IAAA,CAAA;AAG9F,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBACEL,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,kCAAA,EAAiC,EAAA;AAAA,QACjC,KAAA,EAAO,KAAA;AAAA,QACP,SAAA,EAAWC,oBAAA;AAAA,UACT,6FAAA;AAAA,UACA,oDAAA;AAAA,UACA,uEAAA;AAAA,UACA;AAAA,SACF;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,YAAA,oBACCC,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qDAAqD,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,UAE3E,WAAA,oBACCA,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,iCAAA,EAAmC,QAAA,EAAAE,WAAAA,CAAW,KAAK,CAAA,EAAE;AAAA;AAAA;AAAA,KAEzE;AAAA,EAEJ;AAEA,EAAA,uBACEJ,eAAAA,CAAC,KAAA,EAAA,EAAI,kCAAA,EAAiC,IAAG,SAAA,EACvC,QAAA,EAAA;AAAA,oBAAAA,eAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAS,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,QAChC,SAAA,EAAWC,oBAAA;AAAA,UACT,2FAAA;AAAA,UACA,oDAAA;AAAA,UACA;AAAA,SACF;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,IAAA,oBAAQC,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qDAAqD,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,0BACnFA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAoB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,0BAC1CA,cAAAA;AAAA,YAACI,uBAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAWL,oBAAA;AAAA,gBACT,0DAAA;AAAA,gBACA,IAAA,IAAQ;AAAA;AACV;AAAA;AACF;AAAA;AAAA,KACF;AAAA,oBACAC,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWD,oBAAA;AAAA,UACT,mDAAA;AAAA,UACA,OAAO,iBAAA,GAAoB;AAAA,SAC7B;AAAA,QAEA,QAAA,kBAAAC,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DAAA,EACZ,QAAA,EACH,CAAA,EACF;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AAEA,cAAA,CAAe,WAAA,GAAc,gBAAA;AC9EtB,SAAS,aAAA,CAAc,EAAE,SAAA,EAAU,EAAuB;AAC/D,EAAA,MAAM,EAAE,SAAA,EAAW,YAAA,EAAa,GAAI,UAAA,EAAW;AAE/C,EAAA,uBACEA,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,iCAAA,EAAgC,EAAA;AAAA,MAChC,OAAA,EAAS,MAAM,YAAA,CAAa,CAAC,SAAS,CAAA;AAAA,MACtC,KAAA,EAAO,YAAY,gBAAA,GAAmB,kBAAA;AAAA,MACtC,SAAA,EAAWD,oBAAA;AAAA,QACT,mFAAA;AAAA,QACA,uFAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC,QAAA,EAAA,SAAA,mBACCC,cAAAA,CAACK,yBAAA,EAAA,EAAc,SAAA,EAAU,SAAA,EAAU,CAAA,mBAEnCL,cAAAA,CAACM,0BAAA,EAAA,EAAe,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,GAExC;AAEJ;AAEA,aAAA,CAAc,WAAA,GAAc,eAAA;ACpB5B,SAAS,WAAA,CAAY;AAAA,EACnB,QAAA;AAAA,EACA,SAAA,EAAW,mBAAA;AAAA,EACX,gBAAA,GAAmB,KAAA;AAAA,EACnB,iBAAA;AAAA,EACA,YAAA,GAAe,OAAA;AAAA,EACf;AACF,CAAA,EAAiB;AACf,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIC,sCAAA;AAAA,IAChC,mBAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,uBACEP,cAAAA,CAAC,cAAA,CAAe,QAAA,EAAf,EAAwB,KAAA,EAAO,EAAE,SAAA,EAAW,YAAA,EAAc,YAAA,EAAa,EACtE,QAAA,kBAAAA,cAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,0BAAA,EAAyB,EAAA;AAAA,MACzB,kBAAgB,SAAA,IAAa,MAAA;AAAA,MAC7B,SAAA,EAAWD,oBAAA;AAAA,QACT,+HAAA;AAAA,QACA,YAAY,MAAA,GAAS,MAAA;AAAA,QACrB;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;AAEO,IAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,WAAA,EAAa;AAAA,EAChD,IAAA,EAAM,WAAA;AAAA,EACN,KAAA,EAAO,YAAA;AAAA,EACP,OAAA,EAAS,cAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAC","file":"chunk-XBBEQLMY.cjs","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { SidebarContextValue } from \"./Sidebar.types\";\n\nexport const SidebarContext = createContext<SidebarContextValue | null>(null);\n\nexport function useSidebar(): SidebarContextValue {\n const ctx = useContext(SidebarContext);\n if (!ctx) {\n throw new Error(\"useSidebar must be used within a <Sidebar> component\");\n }\n return ctx;\n}\n","import type { ElementType } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useSidebar } from \"./Sidebar.context\";\nimport type { SidebarItemProps } from \"./Sidebar.types\";\n\n/** Extract first 3 characters from a ReactNode if it's a string. */\nfunction getLetters(children: React.ReactNode): string {\n if (typeof children === \"string\") return children.slice(0, 3);\n return \"...\";\n}\n\nexport function SidebarItem({\n children,\n href,\n as: As,\n icon,\n active = false,\n disabled = false,\n badge,\n onClick,\n className,\n ...rest\n}: SidebarItemProps) {\n const { collapsed, collapseMode } = useSidebar();\n\n // Link mode engages on `href` OR `as` — a `to`-based router (TanStack Router,\n // React Router) passes no href, and would otherwise render a <button> that\n // navigates nowhere. `onClick` now rides along in link mode instead of being\n // dropped: an item that both navigates and closes a drawer is the common case.\n const isLink = Boolean(href || As);\n const Tag = isLink ? ((As ?? \"a\") as ElementType) : \"button\";\n const tagProps = isLink\n ? { ...(href ? { href } : {}), onClick }\n : { type: \"button\" as const, onClick };\n\n const showIconOnly = collapsed && collapseMode === \"icons\" && icon;\n const showLetters = collapsed && (collapseMode === \"letters\" || (collapseMode === \"icons\" && !icon));\n\n const title = typeof children === \"string\" ? children : undefined;\n\n return (\n <Tag\n {...tagProps}\n {...rest}\n data-react-fancy-sidebar-item=\"\"\n data-active={active || undefined}\n aria-current={active ? \"page\" : undefined}\n aria-disabled={disabled || undefined}\n title={collapsed ? title : undefined}\n className={cn(\n // `w-full` matters when the Tag is a <button>: form controls size to\n // FIT-CONTENT, not to their parent, so a long label made the item wider\n // than the sidebar and an ancestor clipped the overflow — which reads as\n // a label cut off mid-word rather than an ellipsis. Without this,\n // `min-w-0` on the label below can never engage, because the item is\n // never under width pressure in the first place.\n \"flex w-full items-center rounded-md text-sm font-medium transition-colors\",\n \"outline-none focus-visible:ring-2 focus-visible:ring-blue-500\",\n collapsed ? \"justify-center px-2 py-2\" : \"gap-2 px-3 py-2\",\n active\n ? \"bg-zinc-100 text-zinc-900 dark:bg-zinc-800 dark:text-zinc-100\"\n : \"text-zinc-600 hover:bg-zinc-50 hover:text-zinc-900 dark:text-zinc-400 dark:hover:bg-zinc-800/50 dark:hover:text-zinc-100\",\n disabled && \"pointer-events-none opacity-50\",\n className,\n )}\n >\n {showIconOnly && (\n <span className=\"flex h-5 w-5 shrink-0 items-center justify-center\">{icon}</span>\n )}\n {showLetters && (\n <span className=\"text-xs font-semibold uppercase\">{getLetters(children)}</span>\n )}\n {!collapsed && (\n <>\n {icon && <span className=\"flex h-5 w-5 shrink-0 items-center justify-center\">{icon}</span>}\n {/*\n `min-w-0` is load-bearing, not tidiness. A flex item defaults to\n `min-width: auto`, which resolves to its MIN-CONTENT width — so with\n `truncate` alone the span refuses to shrink below the full label,\n and the item grows wider than the sidebar instead of ellipsing.\n The overflow then gets clipped by an ancestor, which looks like a\n mid-word cut rather than a truncation.\n\n Only shows up with labels longer than the sidebar is wide, which is\n why it survived: short nav labels never trigger it.\n */}\n <span className=\"min-w-0 flex-1 truncate text-left\">{children}</span>\n {badge && <span className=\"shrink-0\">{badge}</span>}\n </>\n )}\n </Tag>\n );\n}\n\nSidebarItem.displayName = \"SidebarItem\";\n","import { cn } from \"../../utils/cn\";\nimport { useSidebar } from \"./Sidebar.context\";\nimport type { SidebarGroupProps } from \"./Sidebar.types\";\n\nexport function SidebarGroup({ children, label, className }: SidebarGroupProps) {\n const { collapsed } = useSidebar();\n\n return (\n <div data-react-fancy-sidebar-group=\"\" className={cn(\"py-1\", className)}>\n {label && !collapsed && (\n <p className=\"mb-1 px-3 text-xs font-semibold uppercase tracking-wider text-zinc-400 dark:text-zinc-500\">\n {label}\n </p>\n )}\n {label && collapsed && (\n <div className=\"mx-auto mb-1 h-px w-6 bg-zinc-200 dark:bg-zinc-700\" />\n )}\n {children}\n </div>\n );\n}\n\nSidebarGroup.displayName = \"SidebarGroup\";\n","import { useState } from \"react\";\nimport { ChevronDown } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useSidebar } from \"./Sidebar.context\";\nimport type { SidebarSubmenuProps } from \"./Sidebar.types\";\n\n/** Extract first 3 characters from a string. */\nfunction getLetters(label: string): string {\n return label.slice(0, 3);\n}\n\nexport function SidebarSubmenu({\n children,\n label,\n icon,\n defaultOpen = false,\n className,\n}: SidebarSubmenuProps) {\n const [open, setOpen] = useState(defaultOpen);\n const { collapsed, collapseMode } = useSidebar();\n\n const showIconOnly = collapsed && collapseMode === \"icons\" && icon;\n const showLetters = collapsed && (collapseMode === \"letters\" || (collapseMode === \"icons\" && !icon));\n\n // When collapsed, just show the icon/letters as a simple item (no expand)\n if (collapsed) {\n return (\n <div\n data-react-fancy-sidebar-submenu=\"\"\n title={label}\n className={cn(\n \"flex items-center justify-center rounded-md px-2 py-2 text-sm font-medium transition-colors\",\n \"text-zinc-600 hover:bg-zinc-50 hover:text-zinc-900\",\n \"dark:text-zinc-400 dark:hover:bg-zinc-800/50 dark:hover:text-zinc-100\",\n className,\n )}\n >\n {showIconOnly && (\n <span className=\"flex h-5 w-5 shrink-0 items-center justify-center\">{icon}</span>\n )}\n {showLetters && (\n <span className=\"text-xs font-semibold uppercase\">{getLetters(label)}</span>\n )}\n </div>\n );\n }\n\n return (\n <div data-react-fancy-sidebar-submenu=\"\" className={className}>\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n className={cn(\n \"flex w-full items-center gap-2 rounded-md px-3 py-2 text-sm font-medium transition-colors\",\n \"text-zinc-600 hover:bg-zinc-50 hover:text-zinc-900\",\n \"dark:text-zinc-400 dark:hover:bg-zinc-800/50 dark:hover:text-zinc-100\",\n )}\n >\n {icon && <span className=\"flex h-5 w-5 shrink-0 items-center justify-center\">{icon}</span>}\n <span className=\"flex-1 text-left\">{label}</span>\n <ChevronDown\n className={cn(\n \"h-3.5 w-3.5 opacity-60 transition-transform duration-200\",\n open && \"rotate-180\",\n )}\n />\n </button>\n <div\n className={cn(\n \"grid transition-[grid-template-rows] duration-200\",\n open ? \"grid-rows-[1fr]\" : \"grid-rows-[0fr]\",\n )}\n >\n <div className=\"overflow-hidden\">\n <div className=\"ml-4 border-l border-zinc-200 pl-2 pt-1 dark:border-zinc-700\">\n {children}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nSidebarSubmenu.displayName = \"SidebarSubmenu\";\n","import { PanelLeftClose, PanelLeftOpen } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useSidebar } from \"./Sidebar.context\";\nimport type { SidebarToggleProps } from \"./Sidebar.types\";\n\nexport function SidebarToggle({ className }: SidebarToggleProps) {\n const { collapsed, setCollapsed } = useSidebar();\n\n return (\n <button\n type=\"button\"\n data-react-fancy-sidebar-toggle=\"\"\n onClick={() => setCollapsed(!collapsed)}\n title={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n className={cn(\n \"flex items-center justify-center rounded-md p-1.5 text-zinc-400 transition-colors\",\n \"hover:bg-zinc-100 hover:text-zinc-600 dark:hover:bg-zinc-800 dark:hover:text-zinc-300\",\n className,\n )}\n >\n {collapsed ? (\n <PanelLeftOpen className=\"h-4 w-4\" />\n ) : (\n <PanelLeftClose className=\"h-4 w-4\" />\n )}\n </button>\n );\n}\n\nSidebarToggle.displayName = \"SidebarToggle\";\n","import { cn } from \"../../utils/cn\";\nimport { useControllableState } from \"../../hooks\";\nimport { SidebarContext } from \"./Sidebar.context\";\nimport { SidebarItem } from \"./SidebarItem\";\nimport { SidebarGroup } from \"./SidebarGroup\";\nimport { SidebarSubmenu } from \"./SidebarSubmenu\";\nimport { SidebarToggle } from \"./SidebarToggle\";\nimport type { SidebarProps } from \"./Sidebar.types\";\n\nfunction SidebarRoot({\n children,\n collapsed: controlledCollapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n collapseMode = \"icons\",\n className,\n}: SidebarProps) {\n const [collapsed, setCollapsed] = useControllableState(\n controlledCollapsed,\n defaultCollapsed,\n onCollapsedChange,\n );\n\n return (\n <SidebarContext.Provider value={{ collapsed, collapseMode, setCollapsed }}>\n <aside\n data-react-fancy-sidebar=\"\"\n data-collapsed={collapsed || undefined}\n className={cn(\n \"flex flex-col gap-0.5 border-r border-zinc-200 bg-white transition-[width] duration-200 dark:border-zinc-700 dark:bg-zinc-900\",\n collapsed ? \"w-16\" : \"w-60\",\n className,\n )}\n >\n {children}\n </aside>\n </SidebarContext.Provider>\n );\n}\n\nexport const Sidebar = Object.assign(SidebarRoot, {\n Item: SidebarItem,\n Group: SidebarGroup,\n Submenu: SidebarSubmenu,\n Toggle: SidebarToggle,\n});\n"]}