react-os-shell 0.14.0 → 1.1.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.
- package/dist/Files-V4SZKOGZ.js +12 -0
- package/dist/{Files-5N64E375.js.map → Files-V4SZKOGZ.js.map} +1 -1
- package/dist/{Notepad-AFAUA4KJ.js → Notepad-6JJ4RT3U.js} +110 -101
- package/dist/Notepad-6JJ4RT3U.js.map +1 -0
- package/dist/{PomodoroTimer-SBBPQMYB.js → PomodoroTimer-HGPJ5R6V.js} +3 -4
- package/dist/PomodoroTimer-HGPJ5R6V.js.map +1 -0
- package/dist/Stock-XLC3LZJV.js +152 -0
- package/dist/Stock-XLC3LZJV.js.map +1 -0
- package/dist/apps/index.d.ts +16 -4
- package/dist/apps/index.js +10 -11
- package/dist/apps/index.js.map +1 -1
- package/dist/chunk-4R4SXMDV.js +98 -0
- package/dist/chunk-4R4SXMDV.js.map +1 -0
- package/dist/{chunk-MK3HLUO4.js → chunk-5X5LQNOX.js} +172 -3
- package/dist/chunk-5X5LQNOX.js.map +1 -0
- package/dist/chunk-UXEG2NRI.js +682 -0
- package/dist/chunk-UXEG2NRI.js.map +1 -0
- package/dist/chunk-VGTEM5RZ.js +89 -0
- package/dist/chunk-VGTEM5RZ.js.map +1 -0
- package/dist/index.d.ts +9 -1
- package/dist/index.js +16 -142
- package/dist/index.js.map +1 -1
- package/dist/styles.css +26 -2
- package/package.json +1 -1
- package/dist/Files-5N64E375.js +0 -11
- package/dist/Notepad-AFAUA4KJ.js.map +0 -1
- package/dist/PomodoroTimer-SBBPQMYB.js.map +0 -1
- package/dist/Stock-ICDNFM7U.js +0 -234
- package/dist/Stock-ICDNFM7U.js.map +0 -1
- package/dist/TodoList-26N6ZTLN.js +0 -309
- package/dist/TodoList-26N6ZTLN.js.map +0 -1
- package/dist/chunk-D4ZM3K2S.js +0 -605
- package/dist/chunk-D4ZM3K2S.js.map +0 -1
- package/dist/chunk-MK3HLUO4.js.map +0 -1
- package/dist/chunk-OB7T3Q5C.js +0 -46
- package/dist/chunk-OB7T3Q5C.js.map +0 -1
- package/dist/chunk-QTJ2CHJX.js +0 -174
- package/dist/chunk-QTJ2CHJX.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/apps/Files.tsx"],"names":[],"mappings":"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","file":"chunk-UXEG2NRI.js","sourcesContent":["/**\n * Files — browser for the per-user file-server (see examples/file-server).\n *\n * Identity is a cookie the server sets on first visit; no login screen.\n * Every fetch carries `credentials: 'include'` so the cookie travels with\n * cross-origin requests. Toolbar shows a live \"X.X / Y MB used\" indicator\n * driven by `/api/quota`. Supported file types open straight into Preview;\n * everything else downloads.\n *\n * Server URL defaults to `http://localhost:4000`. Override at runtime via\n * `window.__REACT_OS_SHELL_FILE_SERVER__ = 'https://files.example.com'`.\n */\nimport { useState, useEffect, useRef, useCallback } from 'react';\nimport { WindowTitle } from '../shell/Modal';\nimport { useWindowManager } from '../shell/WindowManager';\nimport toast from '../shell/toast';\nimport { confirm, prompt } from '../shell/ConfirmDialog';\nimport { openPreviewFile } from '../utils/openPreviewFile';\nimport Breadcrumbs from '../shell/Breadcrumbs';\nimport type { BreadcrumbItem } from '../shell/Breadcrumbs';\nimport SidebarLayout from '../shell/SidebarLayout';\n\n/**\n * Demo filesystem. When a consumer (e.g. the demo app) injects a static tree\n * via `setFilesDemoTree`, Files browses it in-memory — no file server needed.\n * Browse-only: upload / new-folder / rename / delete / trash are hidden while a\n * demo tree is set. Consumers with a real file server never call it, so their\n * behaviour is unchanged.\n */\nexport interface FilesDemoNode {\n name: string;\n kind: 'file' | 'folder';\n size?: number;\n modifiedAt?: string;\n children?: FilesDemoNode[];\n}\nlet filesDemoTree: FilesDemoNode[] | null = null;\nexport function setFilesDemoTree(tree: FilesDemoNode[] | null) {\n filesDemoTree = tree;\n}\n\nconst DEFAULT_SERVER =\n (typeof window !== 'undefined' && (window as any).__REACT_OS_SHELL_FILE_SERVER__) ||\n 'http://localhost:4000';\n\n// Side-channel for \"open Files in trash mode\". Two cases handled:\n// 1) Files isn't open yet — caller sets `window.__REACT_OS_SHELL_FILES_VIEW__`\n// then calls `openPage('/files')`. Files reads the flag on first mount.\n// 2) Files is already open — caller dispatches the event below; the live\n// instance flips to trash view via its event listener.\nconst FILES_VIEW_EVENT = 'react-os-shell:files-show-trash';\nexport function openFilesInTrashMode() {\n if (typeof window === 'undefined') return;\n (window as any).__REACT_OS_SHELL_FILES_VIEW__ = 'trash';\n window.dispatchEvent(new CustomEvent(FILES_VIEW_EVENT));\n}\n\nconst PREVIEW_EXTS: Record<string, 'pdf' | 'image' | 'dxf' | '3d' | 'csv'> = {\n pdf: 'pdf',\n dxf: 'dxf',\n csv: 'csv',\n jpg: 'image', jpeg: 'image', png: 'image', gif: 'image',\n webp: 'image', svg: 'image', avif: 'image', bmp: 'image',\n stp: '3d', step: '3d', stl: '3d', obj: '3d',\n gltf: '3d', glb: '3d', '3mf': '3d', iges: '3d', igs: '3d', ply: '3d', fbx: '3d',\n};\n\ninterface FileEntry {\n name: string;\n kind: 'file' | 'folder';\n size: number;\n modifiedAt: string;\n}\n\ninterface TrashEntry {\n id: string;\n name: string;\n originalPath: string;\n deletedAt: string | null;\n kind: 'file' | 'folder';\n size: number;\n}\n\nfunction joinPath(parent: string, name: string) {\n if (parent === '/' || parent === '') return '/' + name;\n return parent.replace(/\\/$/, '') + '/' + name;\n}\n\nfunction parentOf(p: string) {\n if (p === '/' || p === '') return '/';\n const trimmed = p.replace(/\\/$/, '');\n const idx = trimmed.lastIndexOf('/');\n return idx <= 0 ? '/' : trimmed.slice(0, idx);\n}\n\nfunction formatSize(bytes: number) {\n if (!bytes) return '—';\n const units = ['B', 'KB', 'MB', 'GB'];\n let v = bytes, i = 0;\n while (v >= 1024 && i < units.length - 1) { v /= 1024; i++; }\n return `${v < 10 ? v.toFixed(1) : Math.round(v)} ${units[i]}`;\n}\n\nfunction formatTime(iso: string) {\n if (!iso) return '—';\n try {\n const d = new Date(iso);\n if (isNaN(d.getTime())) return '—';\n return d.toLocaleString(undefined, { dateStyle: 'short', timeStyle: 'short' });\n } catch { return iso; }\n}\n\n/** Resolve a directory path against the injected demo tree → its child entries. */\nfunction demoEntriesAt(dir: string): FileEntry[] {\n if (!filesDemoTree) return [];\n let level: FilesDemoNode[] = filesDemoTree;\n for (const part of dir.split('/').filter(Boolean)) {\n const node = level.find(n => n.kind === 'folder' && n.name === part);\n if (!node || !node.children) return [];\n level = node.children;\n }\n return level.map(n => ({\n name: n.name,\n kind: n.kind,\n size: n.size ?? 0,\n modifiedAt: n.modifiedAt ?? '',\n }));\n}\n\nexport default function Files() {\n const server = DEFAULT_SERVER.replace(/\\/$/, '');\n const demoMode = filesDemoTree !== null;\n const [path, setPath] = useState('/');\n const [entries, setEntries] = useState<FileEntry[]>([]);\n const [rootFolders, setRootFolders] = useState<string[]>([]);\n const [selected, setSelected] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [unreachable, setUnreachable] = useState(false);\n const [quota, setQuota] = useState<{ used: number; limit: number } | null>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [view, setView] = useState<'files' | 'trash'>(() => {\n if (typeof window === 'undefined') return 'files';\n const w = window as any;\n if (w.__REACT_OS_SHELL_FILES_VIEW__ === 'trash') {\n w.__REACT_OS_SHELL_FILES_VIEW__ = null;\n return 'trash';\n }\n return 'files';\n });\n const [trash, setTrash] = useState<TrashEntry[]>([]);\n\n // External trigger: when the Trash desktop icon is double-clicked while\n // a Files window is already open, flip this instance to trash view.\n useEffect(() => {\n const handler = () => setView('trash');\n window.addEventListener(FILES_VIEW_EVENT, handler);\n return () => window.removeEventListener(FILES_VIEW_EVENT, handler);\n }, []);\n const dragDepthRef = useRef(0);\n const fileRef = useRef<HTMLInputElement>(null);\n\n const { openPage } = useWindowManager();\n\n const authedFetch = useCallback(\n (url: string, init: RequestInit = {}) =>\n // `credentials: 'include'` makes the browser send the identity\n // cookie with every cross-origin request, and accept any\n // Set-Cookie response (e.g. the first-visit assignment).\n fetch(url, { ...init, credentials: 'include' }),\n [],\n );\n\n const refreshQuota = useCallback(async () => {\n try {\n const res = await authedFetch(`${server}/api/quota`);\n if (res.ok) {\n const q = await res.json();\n setQuota({ used: q.used, limit: q.limit });\n }\n } catch {}\n }, [authedFetch, server]);\n\n const loadDir = useCallback(async (dir: string) => {\n setSelected(null);\n if (demoMode) {\n const list = demoEntriesAt(dir);\n setEntries(list);\n setPath(dir);\n setUnreachable(false);\n setLoading(false);\n if (dir === '/') setRootFolders(list.filter(e => e.kind === 'folder').map(e => e.name));\n return;\n }\n setLoading(true);\n try {\n const res = await authedFetch(\n `${server}/api/files?path=${encodeURIComponent(dir)}`,\n );\n if (!res.ok) {\n const msg = await res.json().catch(() => ({} as any));\n toast.error(msg.error || `Failed to list (${res.status})`);\n return;\n }\n const data = await res.json();\n const list: FileEntry[] = data.entries || [];\n setEntries(list);\n setPath(data.path || dir);\n setUnreachable(false);\n if ((data.path || dir) === '/') setRootFolders(list.filter(e => e.kind === 'folder').map(e => e.name));\n } catch (e: any) {\n setUnreachable(true);\n } finally {\n setLoading(false);\n }\n refreshQuota();\n }, [authedFetch, server, refreshQuota, demoMode]);\n\n const loadTrash = useCallback(async () => {\n if (demoMode) { setTrash([]); setLoading(false); return; }\n setLoading(true);\n setSelected(null);\n try {\n const res = await authedFetch(`${server}/api/trash`);\n if (!res.ok) {\n const msg = await res.json().catch(() => ({} as any));\n toast.error(msg.error || `Failed to list trash (${res.status})`);\n return;\n }\n const data = await res.json();\n setTrash(data.entries || []);\n setUnreachable(false);\n } catch {\n setUnreachable(true);\n } finally {\n setLoading(false);\n }\n refreshQuota();\n }, [authedFetch, server, refreshQuota, demoMode]);\n\n useEffect(() => {\n if (view === 'files') loadDir(path);\n else loadTrash();\n /* eslint-disable-next-line */\n }, [path, view]);\n\n const handleRestore = async (entry: TrashEntry) => {\n const res = await authedFetch(`${server}/api/trash/restore`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ id: entry.id }),\n });\n if (!res.ok) {\n const msg = await res.json().catch(() => ({} as any));\n toast.error(msg.error || `Restore failed (${res.status})`);\n return;\n }\n toast.success(`Restored \"${entry.name}\"`);\n loadTrash();\n };\n\n const handleTrashPermanentDelete = async (entry: TrashEntry) => {\n const ok = await confirm({\n title: 'Permanently delete',\n message: `\"${entry.name}\" will be permanently removed. This can't be undone.`,\n confirmLabel: 'Delete forever',\n variant: 'danger',\n });\n if (!ok) return;\n const res = await authedFetch(`${server}/api/trash/${encodeURIComponent(entry.id)}`, {\n method: 'DELETE',\n });\n if (!res.ok) {\n const msg = await res.json().catch(() => ({} as any));\n toast.error(msg.error || `Delete failed (${res.status})`);\n return;\n }\n loadTrash();\n };\n\n const handleEmptyTrash = async () => {\n if (trash.length === 0) return;\n const ok = await confirm({\n title: 'Empty trash',\n message: `${trash.length} item${trash.length === 1 ? '' : 's'} will be permanently removed. This can't be undone.`,\n confirmLabel: 'Empty trash',\n variant: 'danger',\n });\n if (!ok) return;\n const res = await authedFetch(`${server}/api/trash`, { method: 'DELETE' });\n if (!res.ok) {\n const msg = await res.json().catch(() => ({} as any));\n toast.error(msg.error || `Empty trash failed (${res.status})`);\n return;\n }\n loadTrash();\n };\n\n // Open a file: route to Preview/Spreadsheet if extension is supported.\n // Delegates fetch + staging to `openPreviewFile`, which also emits the\n // event Desktop listens for to record a Documents-folder shortcut.\n const openFile = async (entry: FileEntry) => {\n if (demoMode) return;\n const fullPath = joinPath(path, entry.name);\n const ext = (entry.name.split('.').pop() || '').toLowerCase();\n const kind = PREVIEW_EXTS[ext];\n if (!kind) {\n downloadFile(entry);\n return;\n }\n await openPreviewFile({\n filePath: fullPath,\n filename: entry.name,\n kind,\n onStaged: route => openPage(route),\n });\n };\n\n const downloadFile = async (entry: FileEntry) => {\n const fullPath = joinPath(path, entry.name);\n try {\n const res = await authedFetch(\n `${server}/api/file?path=${encodeURIComponent(fullPath)}`,\n );\n if (!res.ok) { toast.error(`Download failed (${res.status})`); return; }\n const blob = await res.blob();\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = entry.name;\n a.click();\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n } catch (e: any) {\n toast.error(e?.message || 'Download failed');\n }\n };\n\n const handlePick = () => fileRef.current?.click();\n\n const uploadFiles = async (files: FileList | File[]) => {\n const arr = Array.from(files);\n for (const file of arr) {\n const form = new FormData();\n form.append('file', file);\n try {\n const res = await authedFetch(\n `${server}/api/upload?path=${encodeURIComponent(path)}`,\n { method: 'POST', body: form },\n );\n if (!res.ok) {\n const msg = await res.json().catch(() => ({} as any));\n if (res.status === 413) {\n const remaining = Math.max(0, (msg.limit || 0) - (msg.used || 0));\n toast.error(\n `Quota exceeded — ${formatSize(remaining)} free, ${file.name} is ${formatSize(msg.attempted || file.size)}`,\n );\n } else {\n toast.error(`Upload ${file.name}: ${msg.error || res.status}`);\n }\n }\n } catch (e: any) {\n toast.error(`Upload ${file.name}: ${e?.message || 'failed'}`);\n }\n }\n loadDir(path);\n };\n\n const handleNewFolder = async () => {\n const name = await prompt({\n title: 'New folder',\n placeholder: 'Folder name',\n confirmLabel: 'Create',\n });\n if (!name) return;\n if (/[\\\\/]/.test(name)) { toast.error('Folder names cannot contain slashes'); return; }\n const target = joinPath(path, name);\n const res = await authedFetch(`${server}/api/folder`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path: target }),\n });\n if (!res.ok) {\n const msg = await res.json().catch(() => ({} as any));\n toast.error(msg.error || `Create folder failed (${res.status})`);\n return;\n }\n loadDir(path);\n };\n\n const handleRename = async (entry: FileEntry) => {\n const next = await prompt({\n title: `Rename ${entry.kind}`,\n defaultValue: entry.name,\n confirmLabel: 'Rename',\n });\n if (!next || next === entry.name) return;\n if (/[\\\\/]/.test(next)) { toast.error('Names cannot contain slashes'); return; }\n const from = joinPath(path, entry.name);\n const to = joinPath(path, next);\n const res = await authedFetch(`${server}/api/rename`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ from, to }),\n });\n if (!res.ok) {\n const msg = await res.json().catch(() => ({} as any));\n toast.error(msg.error || `Rename failed (${res.status})`);\n return;\n }\n loadDir(path);\n };\n\n const handleDelete = async (entry: FileEntry) => {\n const ok = await confirm({\n title: `Delete ${entry.kind}`,\n message: `\"${entry.name}\"${entry.kind === 'folder' ? ' and everything inside' : ''} will be permanently removed.`,\n confirmLabel: 'Delete',\n variant: 'danger',\n });\n if (!ok) return;\n const target = joinPath(path, entry.name);\n const res = await authedFetch(\n `${server}/api/files?path=${encodeURIComponent(target)}`,\n { method: 'DELETE' },\n );\n if (!res.ok) {\n const msg = await res.json().catch(() => ({} as any));\n toast.error(msg.error || `Delete failed (${res.status})`);\n return;\n }\n loadDir(path);\n };\n\n const resetDrag = () => { dragDepthRef.current = 0; setIsDragging(false); };\n useEffect(() => {\n const reset = () => resetDrag();\n window.addEventListener('dragend', reset);\n window.addEventListener('drop', reset);\n return () => {\n window.removeEventListener('dragend', reset);\n window.removeEventListener('drop', reset);\n };\n }, []);\n\n // ── render ─────────────────────────────────────────────────────────────\n if (unreachable) {\n return (\n <div className=\"flex flex-col h-full bg-white\">\n <WindowTitle title=\"Files - offline\" />\n <div className=\"flex-1 flex items-center justify-center p-8 text-center\">\n <div className=\"max-w-md\">\n <svg className=\"h-12 w-12 mx-auto text-gray-300 mb-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.4}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M18.364 5.636l-12.728 12.728M5.636 5.636l12.728 12.728\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 21a9 9 0 100-18 9 9 0 000 18z\" />\n </svg>\n <h3 className=\"text-base font-semibold text-gray-800 mb-1\">Can't reach the file server</h3>\n <p className=\"text-sm text-gray-500 mb-3\">\n No response from <span className=\"font-mono\">{server}</span>. Make sure the\n server is running — see <span className=\"font-mono\">examples/file-server/README.md</span>.\n </p>\n <button onClick={() => loadDir(path)} className=\"px-3 py-1.5 text-sm bg-blue-500 text-white rounded hover:bg-blue-600\">\n Retry\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n const segments = path === '/' ? [] : path.split('/').filter(Boolean);\n const usagePct = quota && quota.limit > 0\n ? Math.min(100, Math.round((quota.used / quota.limit) * 100))\n : 0;\n const usageColor = usagePct > 90 ? 'bg-red-500' : usagePct > 75 ? 'bg-amber-500' : 'bg-blue-500';\n\n const crumbs: BreadcrumbItem[] = [\n { label: 'My files', onClick: () => setPath('/') },\n ...segments.map((seg, i) => ({\n label: seg,\n onClick: () => setPath('/' + segments.slice(0, i + 1).join('/')),\n })),\n ];\n const navBtn = (active: boolean) =>\n `flex w-full items-center gap-2 rounded-md px-2.5 py-1.5 text-left text-sm transition-colors ${\n active ? 'bg-blue-50 font-medium text-blue-700' : 'text-gray-700 hover:bg-gray-100'\n }`;\n const navSvg = (d: string) => (\n <svg className=\"h-4 w-4 shrink-0 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.6}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d={d} />\n </svg>\n );\n const folderNav = (\n <nav className=\"p-2\">\n <div className=\"px-2 py-1.5 text-[11px] font-semibold uppercase tracking-wide text-gray-400\">Locations</div>\n <button onClick={() => { setView('files'); setPath('/'); }} className={navBtn(view === 'files' && path === '/')}>\n {navSvg('M2.25 12l8.954-8.955a1.5 1.5 0 012.122 0L21.75 12M4.5 9.75v9.75a.75.75 0 00.75.75H9V15a.75.75 0 01.75-.75h4.5A.75.75 0 0115 15v5.25h3.75a.75.75 0 00.75-.75V9.75')}\n My files\n </button>\n {rootFolders.map(name => (\n <button key={name} onClick={() => { setView('files'); setPath('/' + name); }} className={navBtn(view === 'files' && path === '/' + name)}>\n {navSvg('M2.25 12.75V12A2.25 2.25 0 014.5 9.75h15A2.25 2.25 0 0121.75 12v.75m-8.69-6.44l-2.12-2.12a1.5 1.5 0 00-1.061-.44H4.5A2.25 2.25 0 002.25 6v12a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9a2.25 2.25 0 00-2.25-2.25h-5.379a1.5 1.5 0 01-1.06-.44z')}\n <span className=\"truncate\">{name}</span>\n </button>\n ))}\n {!demoMode && (\n <button onClick={() => setView('trash')} className={navBtn(view === 'trash')}>\n {navSvg('M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79')}\n Trash\n </button>\n )}\n </nav>\n );\n\n return (\n <div\n className=\"relative flex flex-col h-full bg-white\"\n onDragEnter={(e) => {\n if (demoMode) return;\n if (!e.dataTransfer?.types?.includes?.('Files')) return;\n e.preventDefault();\n dragDepthRef.current++;\n if (!isDragging) setIsDragging(true);\n }}\n onDragOver={(e) => {\n if (!e.dataTransfer?.types?.includes?.('Files')) return;\n e.preventDefault();\n }}\n onDragLeave={() => {\n if (dragDepthRef.current > 0) dragDepthRef.current--;\n if (dragDepthRef.current === 0) setIsDragging(false);\n }}\n onDrop={(e) => {\n e.preventDefault();\n resetDrag();\n if (demoMode) return;\n if (e.dataTransfer.files?.length) uploadFiles(e.dataTransfer.files);\n }}\n >\n <WindowTitle title={`Files${path === '/' ? '' : ' - ' + path}`} />\n <input\n ref={fileRef}\n type=\"file\"\n multiple\n className=\"hidden\"\n onChange={(e) => {\n if (e.target.files?.length) uploadFiles(e.target.files);\n if (fileRef.current) fileRef.current.value = '';\n }}\n />\n\n <div className=\"flex-1 min-h-0\">\n <SidebarLayout\n sidebar={folderNav}\n storageKey=\"files.sidebarWidth\"\n defaultWidth={200}\n minWidth={150}\n maxWidth={320}\n >\n <div className=\"flex h-full min-w-0 flex-col\">\n {/* Toolbar */}\n <div className=\"flex items-center gap-1 px-2 py-1.5 border-b border-gray-200 bg-gray-50 shrink-0 text-xs\">\n {view === 'files' ? (\n <>\n <button\n onClick={() => setPath(parentOf(path))}\n disabled={path === '/'}\n className=\"px-2 py-1 rounded hover:bg-gray-200 disabled:opacity-30 text-gray-600\"\n title=\"Parent folder\"\n >\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10.5 19.5L3 12m0 0l7.5-7.5M3 12h18\" />\n </svg>\n </button>\n\n <div className=\"flex-1 min-w-0\">\n <Breadcrumbs items={crumbs} maxItems={5} />\n </div>\n\n <button onClick={() => loadDir(path)} className=\"px-2 py-1 rounded hover:bg-gray-200 text-gray-600\" title=\"Refresh\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.023 9.348h4.992V4.356M2.985 19.644v-4.992h4.992M3.05 9.348a9 9 0 0114.85-3.36L21.015 9.348m0 5.304a9 9 0 01-14.85 3.36l-3.115-3.36\" />\n </svg>\n </button>\n {!demoMode && (\n <>\n <button onClick={() => setView('trash')} className=\"px-2 py-1 rounded hover:bg-gray-200 text-gray-600 flex items-center gap-1\" title=\"Open trash\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0\" />\n </svg>\n Trash\n </button>\n <button onClick={handleNewFolder} className=\"px-2 py-1 rounded hover:bg-gray-200 text-gray-600 flex items-center gap-1\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 10.5v6m3-3H9m4.06-7.19l-2.12-2.12a1.5 1.5 0 00-1.061-.44H4.5A2.25 2.25 0 002.25 6v12a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9a2.25 2.25 0 00-2.25-2.25h-5.379a1.5 1.5 0 01-1.06-.44z\" />\n </svg>\n New Folder\n </button>\n <button onClick={handlePick} className=\"px-2 py-1 rounded bg-blue-500 text-white hover:bg-blue-600 flex items-center gap-1\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M7.5 7.5L12 3m0 0l4.5 4.5M12 3v13.5\" />\n </svg>\n Upload\n </button>\n </>\n )}\n </>\n ) : (\n <>\n <button\n onClick={() => setView('files')}\n className=\"px-2 py-1 rounded hover:bg-gray-200 text-gray-600\"\n title=\"Back to files\"\n >\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10.5 19.5L3 12m0 0l7.5-7.5M3 12h18\" />\n </svg>\n </button>\n <span className=\"flex-1 text-gray-700 font-medium px-2\">Trash</span>\n <button onClick={loadTrash} className=\"px-2 py-1 rounded hover:bg-gray-200 text-gray-600\" title=\"Refresh\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.023 9.348h4.992V4.356M2.985 19.644v-4.992h4.992M3.05 9.348a9 9 0 0114.85-3.36L21.015 9.348m0 5.304a9 9 0 01-14.85 3.36l-3.115-3.36\" />\n </svg>\n </button>\n <button\n onClick={handleEmptyTrash}\n disabled={trash.length === 0}\n className=\"px-2 py-1 rounded text-red-600 hover:bg-red-50 disabled:opacity-30 flex items-center gap-1\"\n >\n Empty trash\n </button>\n </>\n )}\n\n {/* Quota indicator */}\n {quota && (\n <>\n <div className=\"h-4 w-px bg-gray-300 mx-1\" />\n <div className=\"flex items-center gap-1.5\" title={`${formatSize(quota.used)} of ${formatSize(quota.limit)} used`}>\n <div className=\"w-20 h-1.5 rounded-full bg-gray-200 overflow-hidden\">\n <div\n className={`h-full ${usageColor} transition-all`}\n style={{ width: `${usagePct}%` }}\n />\n </div>\n <span className=\"text-[10px] text-gray-500 tabular-nums whitespace-nowrap\">\n {formatSize(quota.used)} / {formatSize(quota.limit)}\n </span>\n </div>\n </>\n )}\n </div>\n\n {/* List — file or trash view */}\n <div className=\"flex-1 overflow-auto\">\n {view === 'trash' ? (\n loading && trash.length === 0 ? (\n <div className=\"p-6 text-center text-sm text-gray-400\">Loading…</div>\n ) : trash.length === 0 ? (\n <div className=\"p-10 text-center text-sm text-gray-400\">\n Trash is empty.\n </div>\n ) : (\n <table className=\"w-full text-sm\">\n <thead className=\"bg-gray-50 text-[11px] uppercase tracking-wide text-gray-500\">\n <tr>\n <th className=\"text-left font-medium px-3 py-1.5\">Name</th>\n <th className=\"text-left font-medium px-3 py-1.5\">Original location</th>\n <th className=\"text-right font-medium px-3 py-1.5 w-24\">Size</th>\n <th className=\"text-right font-medium px-3 py-1.5 w-40\">Deleted</th>\n <th className=\"w-44\" />\n </tr>\n </thead>\n <tbody>\n {trash.map((e) => (\n <tr key={e.id} className=\"border-b border-gray-100 hover:bg-gray-50\">\n <td className=\"px-3 py-1.5 flex items-center gap-2\">\n {e.kind === 'folder' ? (\n <svg className=\"h-4 w-4 text-amber-500 shrink-0\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M2.25 7.125A2.25 2.25 0 014.5 4.875h4.504c.61 0 1.193.243 1.624.673l1.494 1.494a.75.75 0 00.53.22h7.098A2.25 2.25 0 0122 9.51v8.366A2.25 2.25 0 0119.75 20.125H4.25A2.25 2.25 0 012 17.875V7.125z\" /></svg>\n ) : (\n <svg className=\"h-4 w-4 text-gray-400 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\" /></svg>\n )}\n <span className=\"truncate\" title={e.name}>{e.name}</span>\n </td>\n <td className=\"px-3 py-1.5 text-gray-500 text-xs font-mono truncate\" title={e.originalPath}>\n {e.originalPath || '—'}\n </td>\n <td className=\"px-3 py-1.5 text-right tabular-nums text-gray-500\">{formatSize(e.size)}</td>\n <td className=\"px-3 py-1.5 text-right text-gray-500 tabular-nums\">\n {e.deletedAt ? formatTime(e.deletedAt) : '—'}\n </td>\n <td className=\"px-3 py-1.5 text-right whitespace-nowrap\">\n <button\n onClick={() => handleRestore(e)}\n className=\"px-1.5 py-0.5 rounded hover:bg-gray-200 text-blue-600 text-[11px]\"\n >Restore</button>\n <button\n onClick={() => handleTrashPermanentDelete(e)}\n className=\"px-1.5 py-0.5 rounded hover:bg-red-100 text-red-600 text-[11px] ml-1\"\n >Delete forever</button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )\n ) : loading && entries.length === 0 ? (\n <div className=\"p-6 text-center text-sm text-gray-400\">Loading…</div>\n ) : entries.length === 0 ? (\n <div className=\"p-10 text-center text-sm text-gray-400\">\n Empty folder.{!demoMode && <> Drop files here or click <span className=\"font-medium\">Upload</span>.</>}\n </div>\n ) : (\n <table className=\"w-full text-sm\">\n <thead className=\"bg-gray-50 text-[11px] uppercase tracking-wide text-gray-500\">\n <tr>\n <th className=\"text-left font-medium px-3 py-1.5\">Name</th>\n <th className=\"text-right font-medium px-3 py-1.5 w-24\">Size</th>\n <th className=\"text-right font-medium px-3 py-1.5 w-40\">Modified</th>\n <th className=\"w-32\" />\n </tr>\n </thead>\n <tbody>\n {entries.map((e) => (\n <tr\n key={e.name}\n onClick={() => setSelected(e.name)}\n onDoubleClick={() => {\n if (e.kind === 'folder') setPath(joinPath(path, e.name));\n else openFile(e);\n }}\n className={`cursor-default border-b border-gray-100 ${selected === e.name ? 'bg-blue-50' : 'hover:bg-gray-50'}`}\n >\n <td className=\"px-3 py-1.5 flex items-center gap-2\">\n {e.kind === 'folder' ? (\n <svg className=\"h-4 w-4 text-amber-500 shrink-0\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M2.25 7.125A2.25 2.25 0 014.5 4.875h4.504c.61 0 1.193.243 1.624.673l1.494 1.494a.75.75 0 00.53.22h7.098A2.25 2.25 0 0122 9.51v8.366A2.25 2.25 0 0119.75 20.125H4.25A2.25 2.25 0 012 17.875V7.125z\" /></svg>\n ) : (\n <svg className=\"h-4 w-4 text-gray-400 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\" /></svg>\n )}\n <span className=\"truncate\" title={e.name}>{e.name}</span>\n </td>\n <td className=\"px-3 py-1.5 text-right tabular-nums text-gray-500\">\n {e.kind === 'folder' ? '—' : formatSize(e.size)}\n </td>\n <td className=\"px-3 py-1.5 text-right text-gray-500 tabular-nums\">\n {formatTime(e.modifiedAt)}\n </td>\n <td className=\"px-3 py-1.5 text-right whitespace-nowrap\">\n {!demoMode && (<>\n {e.kind === 'file' && (\n <button\n onClick={(ev) => { ev.stopPropagation(); downloadFile(e); }}\n className=\"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-500 text-[11px]\"\n >Download</button>\n )}\n <button\n onClick={(ev) => { ev.stopPropagation(); handleRename(e); }}\n className=\"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-500 text-[11px] ml-1\"\n >Rename</button>\n <button\n onClick={(ev) => { ev.stopPropagation(); handleDelete(e); }}\n className=\"px-1.5 py-0.5 rounded hover:bg-red-100 text-red-600 text-[11px] ml-1\"\n >Delete</button>\n </>)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </div>\n </div>\n </SidebarLayout>\n </div>\n\n {isDragging && (\n <div className=\"absolute inset-0 bg-blue-500/15 border-4 border-dashed border-blue-500 pointer-events-none flex items-center justify-center z-20\">\n <div className=\"px-4 py-2 rounded-md bg-blue-600 text-white text-sm font-medium shadow-lg\">\n Drop to upload\n </div>\n </div>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { useState, useRef, useCallback, useEffect } from 'react';
|
|
2
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
// src/shell/SidebarLayout.tsx
|
|
5
|
+
var clamp = (n, lo, hi) => Math.min(Math.max(n, lo), hi);
|
|
6
|
+
function SidebarLayout({
|
|
7
|
+
sidebar,
|
|
8
|
+
children,
|
|
9
|
+
side = "left",
|
|
10
|
+
storageKey,
|
|
11
|
+
defaultWidth = 256,
|
|
12
|
+
minWidth = 180,
|
|
13
|
+
maxWidth = 480,
|
|
14
|
+
className = "",
|
|
15
|
+
sidebarClassName = side === "right" ? "border-l border-gray-200 bg-gray-50" : "border-r border-gray-200 bg-gray-50",
|
|
16
|
+
contentClassName = "bg-white"
|
|
17
|
+
}) {
|
|
18
|
+
const sideRight = side === "right";
|
|
19
|
+
const [width, setWidth] = useState(() => {
|
|
20
|
+
if (storageKey && typeof window !== "undefined") {
|
|
21
|
+
const saved = window.localStorage.getItem(storageKey);
|
|
22
|
+
const n = saved ? parseInt(saved, 10) : NaN;
|
|
23
|
+
if (!Number.isNaN(n)) return clamp(n, minWidth, maxWidth);
|
|
24
|
+
}
|
|
25
|
+
return clamp(defaultWidth, minWidth, maxWidth);
|
|
26
|
+
});
|
|
27
|
+
const dragRef = useRef(null);
|
|
28
|
+
const onMove = useCallback((e) => {
|
|
29
|
+
const d = dragRef.current;
|
|
30
|
+
if (!d) return;
|
|
31
|
+
const delta = (e.clientX - d.startX) * (sideRight ? -1 : 1);
|
|
32
|
+
setWidth(clamp(d.startWidth + delta, minWidth, maxWidth));
|
|
33
|
+
}, [minWidth, maxWidth, sideRight]);
|
|
34
|
+
const onUp = useCallback(() => {
|
|
35
|
+
dragRef.current = null;
|
|
36
|
+
window.removeEventListener("pointermove", onMove);
|
|
37
|
+
window.removeEventListener("pointerup", onUp);
|
|
38
|
+
document.body.style.removeProperty("cursor");
|
|
39
|
+
document.body.style.removeProperty("user-select");
|
|
40
|
+
}, [onMove]);
|
|
41
|
+
const startDrag = useCallback((e) => {
|
|
42
|
+
e.preventDefault();
|
|
43
|
+
dragRef.current = { startX: e.clientX, startWidth: width };
|
|
44
|
+
window.addEventListener("pointermove", onMove);
|
|
45
|
+
window.addEventListener("pointerup", onUp);
|
|
46
|
+
document.body.style.cursor = "col-resize";
|
|
47
|
+
document.body.style.userSelect = "none";
|
|
48
|
+
}, [width, onMove, onUp]);
|
|
49
|
+
useEffect(() => {
|
|
50
|
+
if (!storageKey) return;
|
|
51
|
+
const id = window.setTimeout(() => {
|
|
52
|
+
try {
|
|
53
|
+
window.localStorage.setItem(storageKey, String(Math.round(width)));
|
|
54
|
+
} catch {
|
|
55
|
+
}
|
|
56
|
+
}, 200);
|
|
57
|
+
return () => window.clearTimeout(id);
|
|
58
|
+
}, [width, storageKey]);
|
|
59
|
+
useEffect(() => () => {
|
|
60
|
+
window.removeEventListener("pointermove", onMove);
|
|
61
|
+
window.removeEventListener("pointerup", onUp);
|
|
62
|
+
}, [onMove, onUp]);
|
|
63
|
+
const edge = sideRight ? "left-0" : "right-0";
|
|
64
|
+
const sidebarPane = /* @__PURE__ */ jsxs("div", { className: "relative flex h-full shrink-0 flex-col", style: { width }, children: [
|
|
65
|
+
/* @__PURE__ */ jsx("div", { className: `flex h-full flex-col overflow-y-auto ${sidebarClassName}`, children: sidebar }),
|
|
66
|
+
/* @__PURE__ */ jsx(
|
|
67
|
+
"div",
|
|
68
|
+
{
|
|
69
|
+
onPointerDown: startDrag,
|
|
70
|
+
onDoubleClick: () => setWidth(clamp(defaultWidth, minWidth, maxWidth)),
|
|
71
|
+
title: "Drag to resize \xB7 double-click to reset",
|
|
72
|
+
className: `group/resize absolute inset-y-0 ${edge} z-10 w-2 cursor-col-resize`,
|
|
73
|
+
children: /* @__PURE__ */ jsx("div", { className: `absolute inset-y-0 ${edge} w-px bg-transparent transition-colors group-hover/resize:bg-[var(--accent-500,#3b82f6)]` })
|
|
74
|
+
}
|
|
75
|
+
)
|
|
76
|
+
] });
|
|
77
|
+
const contentPane = /* @__PURE__ */ jsx("div", { className: `flex min-w-0 flex-1 flex-col ${contentClassName}`, children });
|
|
78
|
+
return /* @__PURE__ */ jsx("div", { className: `flex h-full w-full overflow-hidden ${className}`, children: sideRight ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
79
|
+
contentPane,
|
|
80
|
+
sidebarPane
|
|
81
|
+
] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
82
|
+
sidebarPane,
|
|
83
|
+
contentPane
|
|
84
|
+
] }) });
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export { SidebarLayout };
|
|
88
|
+
//# sourceMappingURL=chunk-VGTEM5RZ.js.map
|
|
89
|
+
//# sourceMappingURL=chunk-VGTEM5RZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shell/SidebarLayout.tsx"],"names":[],"mappings":"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","file":"chunk-VGTEM5RZ.js","sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { ReactNode, PointerEvent as ReactPointerEvent } from 'react';\n\n/**\n * Two-pane layout with a drag-to-resize sidebar (left or right).\n *\n * Renders flush (`h-full w-full`) — pair it with a `flushBody` window so the\n * sidebar runs from just under the title bar to the very bottom with no\n * surrounding padding. The user can drag the sidebar's inner edge to resize\n * it; pass `storageKey` to persist that width across reopens, or double-click\n * the handle to reset to `defaultWidth`. Set `side=\"right\"` to put the sidebar\n * on the right (e.g. a detail-panel layout).\n *\n * @example\n * <SidebarLayout sidebar={<MyNav />} storageKey=\"todo.sidebarWidth\">\n * <MyContent />\n * </SidebarLayout>\n */\nexport interface SidebarLayoutProps {\n /** Content of the left sidebar pane. */\n sidebar: ReactNode;\n /** Content of the main pane (opposite the sidebar). */\n children: ReactNode;\n /** Which side the sidebar sits on. Default `'left'`. When `'right'`, the\n * sidebar renders on the right with the resize handle on its left edge. */\n side?: 'left' | 'right';\n /** localStorage key to persist the sidebar width across reopens. When set,\n * the last dragged width is restored on mount. Omit for session-only width. */\n storageKey?: string;\n /** Initial sidebar width in px (used when nothing is persisted). Default 256. */\n defaultWidth?: number;\n /** Minimum sidebar width in px. Default 180. */\n minWidth?: number;\n /** Maximum sidebar width in px. Default 480. */\n maxWidth?: number;\n /** Extra classes for the outer flex row. */\n className?: string;\n /** Classes for the sidebar pane (background, border, …). The pane is a flex\n * column that scrolls its own overflow. Defaults to a light-grey,\n * right-bordered sidebar. */\n sidebarClassName?: string;\n /** Classes for the main content pane. Defaults to a white background. */\n contentClassName?: string;\n}\n\nconst clamp = (n: number, lo: number, hi: number) => Math.min(Math.max(n, lo), hi);\n\nexport default function SidebarLayout({\n sidebar,\n children,\n side = 'left',\n storageKey,\n defaultWidth = 256,\n minWidth = 180,\n maxWidth = 480,\n className = '',\n sidebarClassName = side === 'right'\n ? 'border-l border-gray-200 bg-gray-50'\n : 'border-r border-gray-200 bg-gray-50',\n contentClassName = 'bg-white',\n}: SidebarLayoutProps) {\n const sideRight = side === 'right';\n const [width, setWidth] = useState<number>(() => {\n if (storageKey && typeof window !== 'undefined') {\n const saved = window.localStorage.getItem(storageKey);\n const n = saved ? parseInt(saved, 10) : NaN;\n if (!Number.isNaN(n)) return clamp(n, minWidth, maxWidth);\n }\n return clamp(defaultWidth, minWidth, maxWidth);\n });\n\n const dragRef = useRef<{ startX: number; startWidth: number } | null>(null);\n\n const onMove = useCallback((e: PointerEvent) => {\n const d = dragRef.current;\n if (!d) return;\n // Right-side sidebar grows as the handle is dragged left → invert the delta.\n const delta = (e.clientX - d.startX) * (sideRight ? -1 : 1);\n setWidth(clamp(d.startWidth + delta, minWidth, maxWidth));\n }, [minWidth, maxWidth, sideRight]);\n\n const onUp = useCallback(() => {\n dragRef.current = null;\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n document.body.style.removeProperty('cursor');\n document.body.style.removeProperty('user-select');\n }, [onMove]);\n\n const startDrag = useCallback((e: ReactPointerEvent<HTMLDivElement>) => {\n e.preventDefault();\n dragRef.current = { startX: e.clientX, startWidth: width };\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n }, [width, onMove, onUp]);\n\n // Persist (debounced) once the width settles.\n useEffect(() => {\n if (!storageKey) return;\n const id = window.setTimeout(() => {\n try { window.localStorage.setItem(storageKey, String(Math.round(width))); } catch { /* ignore quota / privacy mode */ }\n }, 200);\n return () => window.clearTimeout(id);\n }, [width, storageKey]);\n\n // Drop listeners if we unmount mid-drag.\n useEffect(() => () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n }, [onMove, onUp]);\n\n const edge = sideRight ? 'left-0' : 'right-0';\n const sidebarPane = (\n <div className=\"relative flex h-full shrink-0 flex-col\" style={{ width }}>\n <div className={`flex h-full flex-col overflow-y-auto ${sidebarClassName}`}>\n {sidebar}\n </div>\n {/* Resize handle — pinned to the sidebar's inner edge, fixed while it scrolls. */}\n <div\n onPointerDown={startDrag}\n onDoubleClick={() => setWidth(clamp(defaultWidth, minWidth, maxWidth))}\n title=\"Drag to resize · double-click to reset\"\n className={`group/resize absolute inset-y-0 ${edge} z-10 w-2 cursor-col-resize`}\n >\n <div className={`absolute inset-y-0 ${edge} w-px bg-transparent transition-colors group-hover/resize:bg-[var(--accent-500,#3b82f6)]`} />\n </div>\n </div>\n );\n const contentPane = (\n <div className={`flex min-w-0 flex-1 flex-col ${contentClassName}`}>\n {children}\n </div>\n );\n\n return (\n <div className={`flex h-full w-full overflow-hidden ${className}`}>\n {sideRight ? (\n <>{contentPane}{sidebarPane}</>\n ) : (\n <>{sidebarPane}{contentPane}</>\n )}\n </div>\n );\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -869,6 +869,11 @@ interface StickyEntityRef {
|
|
|
869
869
|
snapshot?: unknown;
|
|
870
870
|
}
|
|
871
871
|
type StickyResolver = (prefix: string, number: string) => Promise<StickyEntityRef | null>;
|
|
872
|
+
/** Optional items in the desktop right-click menu that a consumer can hide via
|
|
873
|
+
* {@link DesktopHostConfig.hiddenContextMenuItems} — e.g. when they're surfaced
|
|
874
|
+
* under Preferences instead. `'customization'` is the Preferences/Customization
|
|
875
|
+
* shortcut, `'favorites'` the Favorites shortcut, `'about'` the About item. */
|
|
876
|
+
type DesktopContextMenuItem = 'customization' | 'favorites' | 'about';
|
|
872
877
|
interface DesktopHostConfig {
|
|
873
878
|
/** Product name shown in the About dialog and desktop context menu. */
|
|
874
879
|
productName?: string;
|
|
@@ -900,6 +905,9 @@ interface DesktopHostConfig {
|
|
|
900
905
|
saveSnap?: (snap: boolean) => void | Promise<void>;
|
|
901
906
|
/** Persists the user's notepad / sticky-note content. */
|
|
902
907
|
saveNotes?: (notes: unknown[]) => void | Promise<void>;
|
|
908
|
+
/** Desktop right-click menu items to hide (all shown by default). Pass keys
|
|
909
|
+
* here when the consumer surfaces them elsewhere — e.g. under Preferences. */
|
|
910
|
+
hiddenContextMenuItems?: DesktopContextMenuItem[];
|
|
903
911
|
}
|
|
904
912
|
declare function DesktopHostProvider({ value, children }: {
|
|
905
913
|
value: DesktopHostConfig;
|
|
@@ -1504,4 +1512,4 @@ declare function useNewHotkey(callback: () => void): void;
|
|
|
1504
1512
|
*/
|
|
1505
1513
|
declare function useEditHotkey(callback: (() => void) | null): void;
|
|
1506
1514
|
|
|
1507
|
-
export { ALT, ALT_SHIFT_D, ALT_SHIFT_E, ALT_SHIFT_N, BehaviorPanel, type BreadcrumbItem, Breadcrumbs, type BreadcrumbsProps, type BugReport, type BugReportConfig, BugReportConfigProvider, BugReportDetail, type BugReportExtraField, type BugReportExtraSelectField, BugReportProvider, type BugReportSubmission, type BugReportSubmitPayload, CMD_A, CMD_DOT, CMD_ENTER, CMD_K, CMD_S, CancelButton, type CellStyle, type ChangelogEntry, type ColumnDef, ConfirmProvider, CopyButton, Customization, type CustomizationOmitSection, type CustomizationProps, type CustomizationSection, DEV_BANNER_TEXT, Desktop, type DesktopHostConfig, DesktopHostProvider, DevIndicator, DocFavStar, ENTER, EditableGrid, type EditableGridProps, type EntityFetcher, EntityList, type EntityListColumn, type EntityListProps, GLASS_DIVIDER, GLASS_INPUT_BG, GlobalSearch, type GridColumn, HelpCenter, type HelpCenterDoc, type HelpCenterProps, Kanban, type KanbanColumn, type KanbanProps, Layout, type LayoutProps, ListFooter, MOD, Markdown, type MarkdownProps, Modal, ModalActions, NotificationBell, type NotificationsConfig, type PaginatedResponse, PopupMenu, PopupMenuDivider, PopupMenuItem, PopupMenuLabel, type ReportType, ResizableTable, SHIFT, type SearchConfig, type SearchProvider, type SearchResult, type SemanticGroup, type ShellAuth, ShellAuthProvider, ShellEntityFetcherProvider, type ShellNotification, type ShellPrefsAdapter, ShellPrefsProvider, ShortcutHelp, SidebarLayout, type SidebarLayoutProps, type SortState, SoundsPanel, StartMenu, StatusBadge, StatusBadgeProvider, type StickyEntityRef, type StickyResolver, SystemPreferences, type SystemPreferencesProps, type SystemPreferencesSection, type TodoProvider, type TodoTask, TopNav, type TopNavItem, type TopNavProps, VERSION, WidgetManager, WindowManagerProvider, WindowRegistry, WindowTitle, applyDevTitle, commitExposeHighlight, confirm, confirmDestructive, createWindowRegistry, exitExposeMode, formatDate, getActiveWindowRoute, getExposeHighlight, getWindowPosition, glassStyle, isDevEnv, isMac, openBugReportDialog, prompt, reportBug, setExposeHighlight, setShellApiClient, setShellAuthBridge, setShellNavIcons, setShellTodoProvider, setWindowDefaultPosition, setWindowPosition, subscribeExposeHighlight, toast, toggleExposeMode, useBugReport, useClickOutside, useColumnConfig, useDesktopHost, useEditHotkey, useInfiniteScroll, useLocalStoragePrefs, useModalActive, useNewHotkey, useShellAuth, useShellEntityFetcher, useShellPrefs, useSort, useTableNav, useWidgetSettings, useWindowManager, useWindowMenuItem, useWindowTitle };
|
|
1515
|
+
export { ALT, ALT_SHIFT_D, ALT_SHIFT_E, ALT_SHIFT_N, BehaviorPanel, type BreadcrumbItem, Breadcrumbs, type BreadcrumbsProps, type BugReport, type BugReportConfig, BugReportConfigProvider, BugReportDetail, type BugReportExtraField, type BugReportExtraSelectField, BugReportProvider, type BugReportSubmission, type BugReportSubmitPayload, CMD_A, CMD_DOT, CMD_ENTER, CMD_K, CMD_S, CancelButton, type CellStyle, type ChangelogEntry, type ColumnDef, ConfirmProvider, CopyButton, Customization, type CustomizationOmitSection, type CustomizationProps, type CustomizationSection, DEV_BANNER_TEXT, Desktop, type DesktopContextMenuItem, type DesktopHostConfig, DesktopHostProvider, DevIndicator, DocFavStar, ENTER, EditableGrid, type EditableGridProps, type EntityFetcher, EntityList, type EntityListColumn, type EntityListProps, GLASS_DIVIDER, GLASS_INPUT_BG, GlobalSearch, type GridColumn, HelpCenter, type HelpCenterDoc, type HelpCenterProps, Kanban, type KanbanColumn, type KanbanProps, Layout, type LayoutProps, ListFooter, MOD, Markdown, type MarkdownProps, Modal, ModalActions, NotificationBell, type NotificationsConfig, type PaginatedResponse, PopupMenu, PopupMenuDivider, PopupMenuItem, PopupMenuLabel, type ReportType, ResizableTable, SHIFT, type SearchConfig, type SearchProvider, type SearchResult, type SemanticGroup, type ShellAuth, ShellAuthProvider, ShellEntityFetcherProvider, type ShellNotification, type ShellPrefsAdapter, ShellPrefsProvider, ShortcutHelp, SidebarLayout, type SidebarLayoutProps, type SortState, SoundsPanel, StartMenu, StatusBadge, StatusBadgeProvider, type StickyEntityRef, type StickyResolver, SystemPreferences, type SystemPreferencesProps, type SystemPreferencesSection, type TodoProvider, type TodoTask, TopNav, type TopNavItem, type TopNavProps, VERSION, WidgetManager, WindowManagerProvider, WindowRegistry, WindowTitle, applyDevTitle, commitExposeHighlight, confirm, confirmDestructive, createWindowRegistry, exitExposeMode, formatDate, getActiveWindowRoute, getExposeHighlight, getWindowPosition, glassStyle, isDevEnv, isMac, openBugReportDialog, prompt, reportBug, setExposeHighlight, setShellApiClient, setShellAuthBridge, setShellNavIcons, setShellTodoProvider, setWindowDefaultPosition, setWindowPosition, subscribeExposeHighlight, toast, toggleExposeMode, useBugReport, useClickOutside, useColumnConfig, useDesktopHost, useEditHotkey, useInfiniteScroll, useLocalStoragePrefs, useModalActive, useNewHotkey, useShellAuth, useShellEntityFetcher, useShellPrefs, useSort, useTableNav, useWidgetSettings, useWindowManager, useWindowMenuItem, useWindowTitle };
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { formatDate } from './chunk-Y4QYGQKS.js';
|
|
2
2
|
export { formatDate } from './chunk-Y4QYGQKS.js';
|
|
3
|
-
import { subscribePomo, getPomoSnapshot } from './chunk-
|
|
4
|
-
export { setShellTodoProvider } from './chunk-
|
|
3
|
+
import { subscribePomo, getPomoSnapshot } from './chunk-5X5LQNOX.js';
|
|
4
|
+
export { setShellTodoProvider } from './chunk-5X5LQNOX.js';
|
|
5
5
|
import { useShellPrefs } from './chunk-36VM54SC.js';
|
|
6
6
|
export { ShellPrefsProvider, useLocalStoragePrefs, useShellPrefs } from './chunk-36VM54SC.js';
|
|
7
|
-
import { PREVIEW_OPENED_EVENT, openPreviewFile } from './chunk-
|
|
7
|
+
import { PREVIEW_OPENED_EVENT, openPreviewFile } from './chunk-4R4SXMDV.js';
|
|
8
|
+
export { Breadcrumbs } from './chunk-4R4SXMDV.js';
|
|
9
|
+
import { SidebarLayout } from './chunk-VGTEM5RZ.js';
|
|
10
|
+
export { SidebarLayout } from './chunk-VGTEM5RZ.js';
|
|
8
11
|
import { playNotification, playStartup, soundsEnabled, getSoundConfig, SOUND_PACK_KEYS, SOUND_PACKS, SOUND_TYPES, SOUND_TYPE_LABELS, setSoundForType, previewSound, setAllSounds, playLogout } from './chunk-D7PYW2QS.js';
|
|
9
12
|
import { setPdfPreview } from './chunk-K354WXU5.js';
|
|
10
13
|
import './chunk-KUIPWCTJ.js';
|
|
@@ -19,7 +22,7 @@ import { useAuth, useShellAuth } from './chunk-ADJ3CERD.js';
|
|
|
19
22
|
export { ShellAuthProvider, setShellAuthBridge, useShellAuth } from './chunk-ADJ3CERD.js';
|
|
20
23
|
import { glassStyle, startMenuCategories, navSections, isSection, GLASS_INPUT_BG, navIcons, sectionIcons } from './chunk-ZF6AYO4G.js';
|
|
21
24
|
export { GLASS_DIVIDER, GLASS_INPUT_BG, glassStyle, setShellNavIcons } from './chunk-ZF6AYO4G.js';
|
|
22
|
-
import { createContext, lazy, useState, useRef, useEffect, useCallback, useMemo,
|
|
25
|
+
import { createContext, lazy, useState, useRef, useEffect, useCallback, useMemo, useLayoutEffect, useContext, Suspense, isValidElement, cloneElement, Fragment as Fragment$1, useSyncExternalStore } from 'react';
|
|
23
26
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
24
27
|
import { Dialog, DialogBackdrop, DialogPanel, DialogTitle } from '@headlessui/react';
|
|
25
28
|
import { createPortal } from 'react-dom';
|
|
@@ -560,87 +563,6 @@ function HelpCenter({
|
|
|
560
563
|
] }) : /* @__PURE__ */ jsx("div", { className: "flex-1 flex items-center justify-center px-6 text-center", children: /* @__PURE__ */ jsx("p", { className: "text-sm text-gray-500", children: loading ? "Loading\u2026" : "Pick a help article from the left." }) }) })
|
|
561
564
|
] });
|
|
562
565
|
}
|
|
563
|
-
var clamp = (n, lo, hi) => Math.min(Math.max(n, lo), hi);
|
|
564
|
-
function SidebarLayout({
|
|
565
|
-
sidebar,
|
|
566
|
-
children,
|
|
567
|
-
side = "left",
|
|
568
|
-
storageKey,
|
|
569
|
-
defaultWidth = 256,
|
|
570
|
-
minWidth = 180,
|
|
571
|
-
maxWidth = 480,
|
|
572
|
-
className = "",
|
|
573
|
-
sidebarClassName = side === "right" ? "border-l border-gray-200 bg-gray-50" : "border-r border-gray-200 bg-gray-50",
|
|
574
|
-
contentClassName = "bg-white"
|
|
575
|
-
}) {
|
|
576
|
-
const sideRight = side === "right";
|
|
577
|
-
const [width, setWidth] = useState(() => {
|
|
578
|
-
if (storageKey && typeof window !== "undefined") {
|
|
579
|
-
const saved = window.localStorage.getItem(storageKey);
|
|
580
|
-
const n = saved ? parseInt(saved, 10) : NaN;
|
|
581
|
-
if (!Number.isNaN(n)) return clamp(n, minWidth, maxWidth);
|
|
582
|
-
}
|
|
583
|
-
return clamp(defaultWidth, minWidth, maxWidth);
|
|
584
|
-
});
|
|
585
|
-
const dragRef = useRef(null);
|
|
586
|
-
const onMove = useCallback((e) => {
|
|
587
|
-
const d = dragRef.current;
|
|
588
|
-
if (!d) return;
|
|
589
|
-
const delta = (e.clientX - d.startX) * (sideRight ? -1 : 1);
|
|
590
|
-
setWidth(clamp(d.startWidth + delta, minWidth, maxWidth));
|
|
591
|
-
}, [minWidth, maxWidth, sideRight]);
|
|
592
|
-
const onUp = useCallback(() => {
|
|
593
|
-
dragRef.current = null;
|
|
594
|
-
window.removeEventListener("pointermove", onMove);
|
|
595
|
-
window.removeEventListener("pointerup", onUp);
|
|
596
|
-
document.body.style.removeProperty("cursor");
|
|
597
|
-
document.body.style.removeProperty("user-select");
|
|
598
|
-
}, [onMove]);
|
|
599
|
-
const startDrag = useCallback((e) => {
|
|
600
|
-
e.preventDefault();
|
|
601
|
-
dragRef.current = { startX: e.clientX, startWidth: width };
|
|
602
|
-
window.addEventListener("pointermove", onMove);
|
|
603
|
-
window.addEventListener("pointerup", onUp);
|
|
604
|
-
document.body.style.cursor = "col-resize";
|
|
605
|
-
document.body.style.userSelect = "none";
|
|
606
|
-
}, [width, onMove, onUp]);
|
|
607
|
-
useEffect(() => {
|
|
608
|
-
if (!storageKey) return;
|
|
609
|
-
const id = window.setTimeout(() => {
|
|
610
|
-
try {
|
|
611
|
-
window.localStorage.setItem(storageKey, String(Math.round(width)));
|
|
612
|
-
} catch {
|
|
613
|
-
}
|
|
614
|
-
}, 200);
|
|
615
|
-
return () => window.clearTimeout(id);
|
|
616
|
-
}, [width, storageKey]);
|
|
617
|
-
useEffect(() => () => {
|
|
618
|
-
window.removeEventListener("pointermove", onMove);
|
|
619
|
-
window.removeEventListener("pointerup", onUp);
|
|
620
|
-
}, [onMove, onUp]);
|
|
621
|
-
const edge = sideRight ? "left-0" : "right-0";
|
|
622
|
-
const sidebarPane = /* @__PURE__ */ jsxs("div", { className: "relative flex h-full shrink-0 flex-col", style: { width }, children: [
|
|
623
|
-
/* @__PURE__ */ jsx("div", { className: `flex h-full flex-col overflow-y-auto ${sidebarClassName}`, children: sidebar }),
|
|
624
|
-
/* @__PURE__ */ jsx(
|
|
625
|
-
"div",
|
|
626
|
-
{
|
|
627
|
-
onPointerDown: startDrag,
|
|
628
|
-
onDoubleClick: () => setWidth(clamp(defaultWidth, minWidth, maxWidth)),
|
|
629
|
-
title: "Drag to resize \xB7 double-click to reset",
|
|
630
|
-
className: `group/resize absolute inset-y-0 ${edge} z-10 w-2 cursor-col-resize`,
|
|
631
|
-
children: /* @__PURE__ */ jsx("div", { className: `absolute inset-y-0 ${edge} w-px bg-transparent transition-colors group-hover/resize:bg-[var(--accent-500,#3b82f6)]` })
|
|
632
|
-
}
|
|
633
|
-
)
|
|
634
|
-
] });
|
|
635
|
-
const contentPane = /* @__PURE__ */ jsx("div", { className: `flex min-w-0 flex-1 flex-col ${contentClassName}`, children });
|
|
636
|
-
return /* @__PURE__ */ jsx("div", { className: `flex h-full w-full overflow-hidden ${className}`, children: sideRight ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
637
|
-
contentPane,
|
|
638
|
-
sidebarPane
|
|
639
|
-
] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
640
|
-
sidebarPane,
|
|
641
|
-
contentPane
|
|
642
|
-
] }) });
|
|
643
|
-
}
|
|
644
566
|
function TopNav({ items, activeKey, onSelect, brand, actions, className }) {
|
|
645
567
|
return /* @__PURE__ */ jsxs(
|
|
646
568
|
"div",
|
|
@@ -673,55 +595,6 @@ function TopNav({ items, activeKey, onSelect, brand, actions, className }) {
|
|
|
673
595
|
}
|
|
674
596
|
);
|
|
675
597
|
}
|
|
676
|
-
var DEFAULT_SEPARATOR = /* @__PURE__ */ jsx("svg", { className: "h-3.5 w-3.5 shrink-0 text-gray-300", viewBox: "0 0 20 20", fill: "currentColor", "aria-hidden": true, children: /* @__PURE__ */ jsx(
|
|
677
|
-
"path",
|
|
678
|
-
{
|
|
679
|
-
fillRule: "evenodd",
|
|
680
|
-
d: "M7.21 14.77a.75.75 0 0 1 .02-1.06L11.168 10 7.23 6.29a.75.75 0 1 1 1.04-1.08l4.5 4.25a.75.75 0 0 1 0 1.08l-4.5 4.25a.75.75 0 0 1-1.06-.02Z",
|
|
681
|
-
clipRule: "evenodd"
|
|
682
|
-
}
|
|
683
|
-
) });
|
|
684
|
-
function Breadcrumbs({ items, separator, maxItems = 0, className }) {
|
|
685
|
-
if (items.length === 0) return null;
|
|
686
|
-
const sep = separator ?? DEFAULT_SEPARATOR;
|
|
687
|
-
const crumbs = [];
|
|
688
|
-
const lastIndex = items.length - 1;
|
|
689
|
-
if (maxItems > 0 && items.length > maxItems && maxItems >= 2) {
|
|
690
|
-
const tailCount = Math.max(1, maxItems - 1);
|
|
691
|
-
crumbs.push({ kind: "item", item: items[0], isLast: false });
|
|
692
|
-
crumbs.push({ kind: "ellipsis" });
|
|
693
|
-
for (let i = items.length - tailCount; i <= lastIndex; i++) {
|
|
694
|
-
crumbs.push({ kind: "item", item: items[i], isLast: i === lastIndex });
|
|
695
|
-
}
|
|
696
|
-
} else {
|
|
697
|
-
items.forEach((item, i) => crumbs.push({ kind: "item", item, isLast: i === lastIndex }));
|
|
698
|
-
}
|
|
699
|
-
return /* @__PURE__ */ jsx("nav", { "aria-label": "Breadcrumb", className: `min-w-0 ${className ?? ""}`, children: /* @__PURE__ */ jsx("ol", { className: "flex items-center gap-1.5 text-sm", children: crumbs.map((crumb, i) => /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
700
|
-
i > 0 && /* @__PURE__ */ jsx("li", { "aria-hidden": true, className: "flex items-center", children: sep }),
|
|
701
|
-
/* @__PURE__ */ jsx("li", { className: "flex min-w-0 items-center", children: crumb.kind === "ellipsis" ? /* @__PURE__ */ jsx("span", { className: "px-0.5 text-gray-400 select-none", "aria-label": "Hidden crumbs", children: "\u2026" }) : crumb.isLast || !crumb.item.onClick ? /* @__PURE__ */ jsxs(
|
|
702
|
-
"span",
|
|
703
|
-
{
|
|
704
|
-
"aria-current": crumb.isLast ? "page" : void 0,
|
|
705
|
-
className: `inline-flex min-w-0 items-center gap-1 truncate ${crumb.isLast ? "font-medium text-gray-900" : "text-gray-500"}`,
|
|
706
|
-
children: [
|
|
707
|
-
crumb.item.icon,
|
|
708
|
-
/* @__PURE__ */ jsx("span", { className: "truncate", children: crumb.item.label })
|
|
709
|
-
]
|
|
710
|
-
}
|
|
711
|
-
) : /* @__PURE__ */ jsxs(
|
|
712
|
-
"button",
|
|
713
|
-
{
|
|
714
|
-
type: "button",
|
|
715
|
-
onClick: crumb.item.onClick,
|
|
716
|
-
className: "inline-flex min-w-0 items-center gap-1 truncate rounded px-1 -mx-1 text-gray-500 transition-colors hover:text-gray-900 hover:underline focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-400",
|
|
717
|
-
children: [
|
|
718
|
-
crumb.item.icon,
|
|
719
|
-
/* @__PURE__ */ jsx("span", { className: "truncate", children: crumb.item.label })
|
|
720
|
-
]
|
|
721
|
-
}
|
|
722
|
-
) })
|
|
723
|
-
] }, i)) }) });
|
|
724
|
-
}
|
|
725
598
|
function timeAgo(dateStr) {
|
|
726
599
|
const diff = Date.now() - new Date(dateStr).getTime();
|
|
727
600
|
const mins = Math.floor(diff / 6e4);
|
|
@@ -1562,7 +1435,7 @@ function WidgetManager({ open, onClose }) {
|
|
|
1562
1435
|
}
|
|
1563
1436
|
|
|
1564
1437
|
// src/version.ts
|
|
1565
|
-
var VERSION = "
|
|
1438
|
+
var VERSION = "1.1.0" ;
|
|
1566
1439
|
var APP_VERSION = VERSION;
|
|
1567
1440
|
|
|
1568
1441
|
// src/changelog.ts
|
|
@@ -1958,6 +1831,7 @@ function Desktop({ profile }) {
|
|
|
1958
1831
|
const allNotes = prefs.notepad_notes || [];
|
|
1959
1832
|
const stickyNotes = allNotes.filter((n) => n.sticky);
|
|
1960
1833
|
const host = useDesktopHost();
|
|
1834
|
+
const hiddenMenuItems = host.hiddenContextMenuItems ?? [];
|
|
1961
1835
|
const openStickyRef = async (prefix, number) => {
|
|
1962
1836
|
const refNum = `${prefix}#${number}`;
|
|
1963
1837
|
if (!host.stickyResolver) {
|
|
@@ -2880,22 +2754,22 @@ function Desktop({ profile }) {
|
|
|
2880
2754
|
] }),
|
|
2881
2755
|
"Manage Widgets\u2026"
|
|
2882
2756
|
] }),
|
|
2883
|
-
/* @__PURE__ */ jsx(PopupMenuDivider, {}),
|
|
2884
|
-
/* @__PURE__ */ jsxs(PopupMenuItem, { onClick: () => {
|
|
2757
|
+
!(hiddenMenuItems.includes("customization") && hiddenMenuItems.includes("favorites") && hiddenMenuItems.includes("about")) && /* @__PURE__ */ jsx(PopupMenuDivider, {}),
|
|
2758
|
+
!hiddenMenuItems.includes("customization") && /* @__PURE__ */ jsxs(PopupMenuItem, { onClick: () => {
|
|
2885
2759
|
setContextMenu(null);
|
|
2886
2760
|
openPage("/settings/customization");
|
|
2887
2761
|
}, children: [
|
|
2888
2762
|
/* @__PURE__ */ jsx("svg", { className: "h-4 w-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M9.53 16.122a3 3 0 00-5.78 1.128 2.25 2.25 0 01-2.4 2.245 4.5 4.5 0 008.4-2.245c0-.399-.078-.78-.22-1.128zm0 0a15.998 15.998 0 003.388-1.62m-5.043-.025a15.994 15.994 0 011.622-3.395m3.42 3.42a15.995 15.995 0 004.764-4.648l3.876-5.814a1.151 1.151 0 00-1.597-1.597L14.146 6.32a15.996 15.996 0 00-4.649 4.763m3.42 3.42a6.776 6.776 0 00-3.42-3.42" }) }),
|
|
2889
|
-
"
|
|
2763
|
+
"Preferences"
|
|
2890
2764
|
] }),
|
|
2891
|
-
/* @__PURE__ */ jsxs(PopupMenuItem, { onClick: () => {
|
|
2765
|
+
!hiddenMenuItems.includes("favorites") && /* @__PURE__ */ jsxs(PopupMenuItem, { onClick: () => {
|
|
2892
2766
|
setContextMenu(null);
|
|
2893
2767
|
openPage("/settings/favorites");
|
|
2894
2768
|
}, children: [
|
|
2895
2769
|
/* @__PURE__ */ jsx("svg", { className: "h-4 w-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M11.48 3.499a.562.562 0 011.04 0l2.125 5.111a.563.563 0 00.475.345l5.518.442c.499.04.701.663.321.988l-4.204 3.602a.563.563 0 00-.182.557l1.285 5.385a.562.562 0 01-.84.61l-4.725-2.885a.563.563 0 00-.586 0L6.982 20.54a.562.562 0 01-.84-.61l1.285-5.386a.562.562 0 00-.182-.557l-4.204-3.602a.563.563 0 01.321-.988l5.518-.442a.563.563 0 00.475-.345L11.48 3.5z" }) }),
|
|
2896
2770
|
"Favorites"
|
|
2897
2771
|
] }),
|
|
2898
|
-
/* @__PURE__ */ jsxs(PopupMenuItem, { onClick: () => {
|
|
2772
|
+
!hiddenMenuItems.includes("about") && /* @__PURE__ */ jsxs(PopupMenuItem, { onClick: () => {
|
|
2899
2773
|
setContextMenu(null);
|
|
2900
2774
|
setAboutOpen(true);
|
|
2901
2775
|
}, children: [
|
|
@@ -4379,7 +4253,7 @@ function MobileProfileSheet({ profile, user, onClose, onNavigate, onLogout }) {
|
|
|
4379
4253
|
/* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.324.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 011.37.49l1.296 2.247a1.125 1.125 0 01-.26 1.431l-1.003.827c-.293.24-.438.613-.431.992a6.759 6.759 0 010 .255c-.007.378.138.75.43.99l1.005.828c.424.35.534.954.26 1.43l-1.298 2.247a1.125 1.125 0 01-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.57 6.57 0 01-.22.128c-.331.183-.581.495-.644.869l-.213 1.28c-.09.543-.56.941-1.11.941h-2.594c-.55 0-1.02-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 01-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 01-1.369-.49l-1.297-2.247a1.125 1.125 0 01.26-1.431l1.004-.827c.292-.24.437-.613.43-.992a6.932 6.932 0 010-.255c.007-.378-.138-.75-.43-.99l-1.004-.828a1.125 1.125 0 01-.26-1.43l1.297-2.247a1.125 1.125 0 011.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.087.22-.128.332-.183.582-.495.644-.869l.214-1.281z" }),
|
|
4380
4254
|
/* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z" })
|
|
4381
4255
|
] }) }),
|
|
4382
|
-
/* @__PURE__ */ jsx("span", { className: "flex-1 text-sm font-medium text-gray-800", children: "
|
|
4256
|
+
/* @__PURE__ */ jsx("span", { className: "flex-1 text-sm font-medium text-gray-800", children: "Preferences" }),
|
|
4383
4257
|
/* @__PURE__ */ jsx("svg", { className: "h-4 w-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8.25 4.5l7.5 7.5-7.5 7.5" }) })
|
|
4384
4258
|
]
|
|
4385
4259
|
}
|
|
@@ -6727,6 +6601,6 @@ function useEditHotkey(callback) {
|
|
|
6727
6601
|
}, [callback, isActive]);
|
|
6728
6602
|
}
|
|
6729
6603
|
|
|
6730
|
-
export { ALT, ALT_SHIFT_D, ALT_SHIFT_E, ALT_SHIFT_N, BehaviorPanel,
|
|
6604
|
+
export { ALT, ALT_SHIFT_D, ALT_SHIFT_E, ALT_SHIFT_N, BehaviorPanel, BugReportConfigProvider, BugReportDetail, BugReportProvider, CMD_A, CMD_DOT, CMD_ENTER, CMD_K, CMD_S, Customization, DEV_BANNER_TEXT, Desktop, DesktopHostProvider, DevIndicator, ENTER, EntityList, GlobalSearch, HelpCenter, Kanban, Layout, ListFooter, MOD, Markdown, NotificationBell, ResizableTable, SHIFT, ShellEntityFetcherProvider, ShortcutHelp, SoundsPanel, StartMenu, StatusBadge, StatusBadgeProvider, SystemPreferences, TopNav, VERSION, WidgetManager, applyDevTitle, createWindowRegistry, isDevEnv, isMac, openBugReportDialog, reportBug, useBugReport, useClickOutside, useColumnConfig, useDesktopHost, useEditHotkey, useInfiniteScroll, useNewHotkey, useShellEntityFetcher, useSort, useTableNav };
|
|
6731
6605
|
//# sourceMappingURL=index.js.map
|
|
6732
6606
|
//# sourceMappingURL=index.js.map
|