@brftech/filex-core 0.13.1 → 0.13.2

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.
Files changed (49) hide show
  1. package/dist/{ArchiveViewer-Brzg_0Xj.js → ArchiveViewer-CxdOyBhs.js} +35 -36
  2. package/dist/ArchiveViewer-CxdOyBhs.js.map +1 -0
  3. package/dist/{CsvViewer-T7W9mqZB.js → CsvViewer-JG3nzTgf.js} +52 -53
  4. package/dist/CsvViewer-JG3nzTgf.js.map +1 -0
  5. package/dist/{DrawioViewer-DReOOHRc.js → DrawioViewer-BEYLdtPG.js} +22 -23
  6. package/dist/{DrawioViewer-DReOOHRc.js.map → DrawioViewer-BEYLdtPG.js.map} +1 -1
  7. package/dist/{EpubViewer-yf9zJXXg.js → EpubViewer-BwUDmJm4.js} +31 -32
  8. package/dist/EpubViewer-BwUDmJm4.js.map +1 -0
  9. package/dist/{IpynbViewer-Dt_l00CD.js → IpynbViewer-CuHQoAHU.js} +35 -35
  10. package/dist/IpynbViewer-CuHQoAHU.js.map +1 -0
  11. package/dist/{MermaidViewer-Nbv27ana.js → MermaidViewer-DLmijDXo.js} +47 -48
  12. package/dist/MermaidViewer-DLmijDXo.js.map +1 -0
  13. package/dist/{PsdViewer-1nRpsuvz.js → PsdViewer-D-FM4eNi.js} +38 -39
  14. package/dist/PsdViewer-D-FM4eNi.js.map +1 -0
  15. package/dist/{TiffViewer-Djawe0Rq.js → TiffViewer-DOw4z_dO.js} +36 -37
  16. package/dist/TiffViewer-DOw4z_dO.js.map +1 -0
  17. package/dist/{Viewer3D-D7EtANiH.js → Viewer3D-CJJJgkuv.js} +15 -16
  18. package/dist/{Viewer3D-D7EtANiH.js.map → Viewer3D-CJJJgkuv.js.map} +1 -1
  19. package/dist/filex-core.js +11942 -66
  20. package/dist/filex-core.js.map +1 -1
  21. package/dist/filex-core.umd.cjs +29 -29
  22. package/dist/filex-core.umd.cjs.map +1 -1
  23. package/dist/style.css +1 -1
  24. package/package.json +1 -1
  25. package/src/components/PresenceBar.vue +13 -5
  26. package/src/components/RecentlyOpened.vue +9 -1
  27. package/src/components/StarButton.vue +9 -1
  28. package/src/components/TagPicker.vue +9 -1
  29. package/src/modals/ConvertModal.vue +10 -2
  30. package/src/modals/PermissionsModal.vue +9 -1
  31. package/src/viewers/ArchiveViewer.vue +9 -1
  32. package/src/viewers/CsvViewer.vue +9 -1
  33. package/src/viewers/DrawioViewer.vue +9 -1
  34. package/src/viewers/EpubViewer.vue +9 -1
  35. package/src/viewers/IpynbViewer.vue +9 -1
  36. package/src/viewers/MermaidViewer.vue +10 -2
  37. package/src/viewers/PdfViewer.vue +9 -1
  38. package/src/viewers/PsdViewer.vue +9 -1
  39. package/src/viewers/TiffViewer.vue +9 -1
  40. package/src/viewers/Viewer3D.vue +10 -2
  41. package/dist/ArchiveViewer-Brzg_0Xj.js.map +0 -1
  42. package/dist/CsvViewer-T7W9mqZB.js.map +0 -1
  43. package/dist/EpubViewer-yf9zJXXg.js.map +0 -1
  44. package/dist/IpynbViewer-Dt_l00CD.js.map +0 -1
  45. package/dist/MermaidViewer-Nbv27ana.js.map +0 -1
  46. package/dist/PsdViewer-1nRpsuvz.js.map +0 -1
  47. package/dist/TiffViewer-Djawe0Rq.js.map +0 -1
  48. package/dist/index-DeVgQCwW.js +0 -11951
  49. package/dist/index-DeVgQCwW.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"filex-core.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
1
+ {"version":3,"file":"filex-core.js","sources":["../src/types/FileNode.ts","../src/composables/useFileApi.ts","../src/composables/useUploadChunked.ts","../src/composables/useSelection.ts","../src/composables/useKeyboardShortcuts.ts","../src/locales/tr.ts","../src/locales/en.ts","../src/locales/index.ts","../src/composables/useLocale.ts","../src/composables/usePendingOps.ts","../src/lib/realtime.ts","../src/composables/useRealtime.ts","../src/composables/useThumbs.ts","../src/composables/useMonacoLoader.ts","../src/components/PresenceBar.vue","../src/components/ContextMenu.vue","../src/components/Toolbar.vue","../src/components/TagPicker.vue","../src/components/RecentlyOpened.vue","../src/components/Breadcrumb.vue","../src/lib/fileIcons.ts","../src/lib/snippet.ts","../src/lib/dragGhost.ts","../src/components/StarButton.vue","../src/components/ListView.vue","../src/components/GridView.vue","../src/components/GalleryView.vue","../src/components/UploadProgress.vue","../src/components/PendingOpsTray.vue","../src/components/InspectorPanel.vue","../src/components/CommandPalette.vue","../src/modals/Modal.vue","../src/components/ShortcutsHelp.vue","../src/lib/themes.ts","../src/components/ThemeGallery.vue","../src/components/ShortcutSettings.vue","../src/modals/PreviewModal.vue","../src/components/QuickLook.vue","../src/components/OperationsCenter.vue","../src/composables/useOperations.ts","../src/components/OnboardingTour.vue","../src/components/TabBar.vue","../src/lib/e2ecrypto.ts","../src/lib/listing.ts","../src/components/SecondaryPane.vue","../src/composables/useTabs.ts","../src/components/EncryptedFolderModal.vue","../src/modals/NewFolderModal.vue","../src/modals/RenameModal.vue","../src/modals/DeleteConfirmModal.vue","../src/modals/ShareModal.vue","../src/modals/ConvertModal.vue","../src/modals/PermissionsModal.vue","../src/FileExplorer.vue"],"sourcesContent":["/**\n * FileNode — node shape returned by the manager endpoint.\n *\n * Backend `?q=index` (or `GET /api/files/manager?action=index`) returns:\n * { adapter, storages, dirname, files: FileNode[] }\n */\nexport interface FileNode {\n /** DB node ID — needed by the per-user meta routes (starred, tags,\n * recently-opened). Backend's projectFileNodes() emits it for every\n * row; only client-synthesized rows (e.g. multi-storage virtual\n * folders) lack one. */\n id?: number;\n /** Full adapter-qualified path: `local://receipts/2024/invoice.pdf` */\n path: string;\n /** Relative basename: `invoice.pdf` */\n basename: string;\n /** Adapter-stripped relative path: `receipts/2024/invoice.pdf` */\n relativePath?: string;\n /** `file` or `dir` */\n type: 'file' | 'dir';\n /** Extension (lowercased, no dot). Empty string = no extension. */\n extension?: string;\n /** Bytes. 0 = directory. */\n size?: number;\n /** Unix ms (backend \"last_modified\"). */\n last_modified?: number;\n /** MIME. */\n mime_type?: string;\n /** Optional thumbnail URL (backend may inline). */\n thumb_url?: string | null;\n /** Visibility: private | public. */\n visibility?: 'private' | 'public';\n /** File count for directories. */\n count?: number;\n /** Client-side tag (localStorage or backend). */\n starred?: boolean;\n /** Hex color tag. */\n color?: string | null;\n /** Server-side trash marker. */\n trashed?: boolean;\n /** RBAC effective level for the current user on this entry (backend\n * projectFileNodes emits it when a storage has RBAC on). '' / undefined =\n * ACL not enforced. Used to gate edit/manage affordances client-side. */\n perm?: 'none' | 'viewer' | 'editor' | 'owner';\n /* wiring:e2 — dir rows: true when the folder is E2E-encrypted (carries a\n * `.filex-e2e.json` marker). Drives the 🔒 badge in the listings. */\n e2e?: boolean;\n /** Generic — any additional fields the backend wants to inline. */\n [k: string]: unknown;\n}\n\nexport interface ShareInfo {\n uuid: string;\n url: string;\n password_pin?: string | null;\n expires_at?: string | null;\n max_downloads?: number | null;\n downloads?: number;\n created_at?: string;\n}\n\nexport interface UploadLimits {\n max_upload_mb: number;\n}\n\nexport type ExternalServiceState = 'ok' | 'error' | 'disabled' | 'unknown';\n\nexport interface ExternalServiceStatus {\n enabled: boolean;\n state: ExternalServiceState;\n url?: string;\n last_check?: string;\n detail?: string;\n}\n\nexport interface Capabilities {\n ffmpeg?: boolean;\n ghostscript?: boolean;\n libreoffice?: boolean;\n onlyoffice_url?: string | null;\n drawio_url?: string | null;\n convert_url?: string | null;\n max_chunk_mb?: number;\n upload_limit_mb?: number;\n external?: {\n onlyoffice?: ExternalServiceStatus;\n drawio?: ExternalServiceStatus;\n mermaid?: ExternalServiceStatus;\n };\n}\n\n/** Single source of truth for \"is the IdP/editor/diagram service ready?\".\n * A capability is usable only when both flags say so — `enabled=true` but\n * `state='error'` means an operator turned it on but a probe just failed,\n * and we'd rather hide the entry than offer a button that 500s on click.\n */\nexport function isExternalUsable(s: ExternalServiceStatus | undefined): boolean {\n return !!s && s.enabled && s.state === 'ok';\n}\n\nexport interface UploadInitResponse {\n uploadId: string;\n parts: Array<{ partNumber: number; presignedUrl: string }>;\n expiresAt: string;\n s3Key?: string;\n}\n\nexport interface UploadFinalizeResponse {\n s3Key: string;\n url?: string;\n}\n\nexport interface ArchiveEntry {\n name: string;\n size: number;\n isDir: boolean;\n lastModified?: number;\n}\n\nexport type ViewMode = 'list' | 'grid' | 'gallery'; /* wiring:d2 — üçüncü görünüm: galeri */\n\nexport interface ClipboardState {\n mode: 'cut' | 'copy' | null;\n items: FileNode[];\n sourcePath: string | null;\n}\n\n/** A soft-deleted node as returned by the filex trash listing endpoint. */\nexport interface TrashEntry {\n id: number;\n storage_id: number;\n storage_name?: string;\n path: string;\n name: string;\n size: number;\n mime?: string;\n deleted_at: string;\n ttl_days?: number | null;\n}\n","/**\n * useFileApi — backend wrapper for the manager + ancillary endpoints.\n *\n * Two URL strategies, picked at construction time:\n *\n * 1. NEW (RESTful): caller passes `apiBase: 'https://files.example.com'`.\n * The manager endpoint becomes `${apiBase}/api/files/manager` and\n * every action uses `?action=…&path=…` as a query parameter (still\n * Vuefinder-compatible — the same `?q=…` convention is accepted by\n * the new Go backend, but `action` is the canonical name in v0.1+).\n *\n * 2. LEGACY (Vuefinder-compat): caller passes `endpoint:\n * '/api/files/manager'` (and the rest of the per-route fields).\n * Used by `@brftech/file-explorer` 0.1.0 embedders that have a\n * Laravel/Filament backend already.\n *\n * Per-route fields (`uploadInit`, `shareCreate`, …) ALWAYS win over\n * the auto-derived `apiBase` URL — lets the caller mix and match.\n *\n * Auth normalisation is centralised here. The component code never\n * thinks about CSRF vs Bearer vs Basic — it just calls `index(path)`.\n */\n\nimport type { ExplorerConfig, AuthConfig, EndpointMap } from '../types/ExplorerConfig';\nimport type {\n FileNode,\n ShareInfo,\n UploadLimits,\n Capabilities,\n ArchiveEntry,\n TrashEntry,\n} from '../types/FileNode';\n\n/** Server-side PendingOp DTO (mirror of Modules\\FishApp\\Models\\PendingOp::toApiArray). */\nexport interface PendingOpDto {\n id: number;\n op_type: 'copy' | 'move' | 'delete';\n status: 'pending' | 'running' | 'done' | 'error';\n progress_total: number;\n progress_done: number;\n target_path: string | null;\n source_dir: string | null;\n source_count: number;\n error_message: string | null;\n started_at: string | null;\n finished_at: string | null;\n created_at: string | null;\n}\n\nexport interface ManagerResponse {\n adapter: string;\n storages: string[];\n dirname: string;\n read_only: boolean;\n /** RBAC effective level for the current user on this directory ('' when ACL\n * is not enforced on the storage). Gates the folder-level write actions. */\n perm?: 'none' | 'viewer' | 'editor' | 'owner';\n /* wiring:e2 — E2E-encrypted folder awareness: `e2e` is true when the listed\n * dir IS an encrypted root; `e2e_root` is the adapter-qualified path of the\n * nearest encrypted root covering this dir (set for the root itself AND for\n * every subfolder inside the subtree). Absent on plain folders / old\n * backends — consumers must stay undefined-safe. */\n e2e?: boolean;\n e2e_root?: string;\n files: FileNode[];\n}\n\n/** A single ACL grant row (RBAC permissions panel). */\nexport interface Grant {\n id: number;\n storage_id: number;\n path_prefix: string;\n user_id: number;\n level: 'viewer' | 'editor' | 'owner';\n user_email?: string;\n user_display_name?: string;\n inherited?: boolean;\n}\n\nexport interface PermissionsResponse {\n path: string;\n storage_rbac: boolean;\n direct: Grant[];\n inherited: Grant[];\n effective: string;\n}\n\nexport interface ResolveEmailResponse {\n found: boolean;\n user?: { id: number; email: string; display_name: string; role: string };\n}\n\nexport interface UserSuggestion {\n id: number;\n email: string;\n display_name: string;\n role: string;\n}\n\n/* === koru:k1 — version history (inspector panel) === */\n\n/** Mirrors backend `model.NodeVersion` (GET /api/files/versions?node_id=…). */\nexport interface NodeVersion {\n id: number;\n node_id: number;\n version_n: number;\n storage_key?: string;\n size: number;\n etag?: string;\n created_at: string;\n}\nexport interface UserSearchResponse {\n users: UserSuggestion[];\n}\n\n/* === calisma:d3 — node comments (inspector panel) === */\n\n/** Mirrors backend `model.NodeComment` (GET /api/files/comments?node_id=…). */\nexport interface NodeComment {\n id: number;\n node_id: number;\n user_id: number;\n body: string;\n created_at: string;\n updated_at?: string;\n /** Joined author display name (email fallback), filled by the backend. */\n author_name?: string;\n /** Whether the CURRENT caller may delete this row (author or admin). */\n can_delete?: boolean;\n}\n/* === /calisma:d3 === */\n\nexport interface InviteResponse {\n mode: 'granted' | 'user_created' | 'shared';\n user_id?: number;\n url?: string;\n temp_password?: string;\n emailed: boolean;\n}\n\n/* === bul:s3 — global search (GET /api/files/search) === */\n\nexport type GlobalSearchScope = 'name' | 'content' | 'all';\n\n/**\n * One hit from the dedicated files-search endpoint. The backend returns raw\n * node rows (`{results: [...]}`), so `path` is the IN-STORAGE relative path\n * (no `adapter://` prefix) and the storage comes back as a numeric\n * `storage_id`. `snippet`/`matched` are the v0.2 \"Bul\" contract additions —\n * older backends simply omit them, so every consumer must stay\n * undefined-safe.\n */\nexport interface GlobalSearchHit {\n id?: number;\n storage_id?: number;\n name?: string;\n path?: string;\n /** `file` | `dir` (backend NodeType). */\n type?: string;\n size?: number;\n mime?: string;\n /** Plain-text content snippet; matches wrapped in «» (never HTML). */\n snippet?: string;\n /** Where the hit matched: name | content | both. */\n matched?: 'name' | 'content' | 'both';\n [k: string]: unknown;\n}\n\n/**\n * Resolve a Vuefinder-compatible endpoint map from the user's config.\n * Either `apiBase` is set (auto-derive everything) or each route is\n * supplied explicitly (legacy). Mixed mode works too — explicit fields\n * trump the derived URL.\n */\nexport function resolveEndpoints(config: ExplorerConfig): EndpointMap {\n // `apiBase: ''` (empty string) is a *valid* relative-root prefix —\n // it produces URLs like `/api/files/copy`. Treat only `undefined`\n // as \"no apiBase, legacy explicit-only mode\". Falsy boolean checks\n // would silently drop relative-root callers and leave every derived\n // endpoint null → \"endpoint not configured\" UI dead-ends.\n const base =\n config.apiBase != null ? config.apiBase.replace(/\\/+$/, '') : null;\n\n function derive(path: string | undefined, autoSegment: string): string | null {\n if (path) return path;\n if (base === null) return null;\n return `${base}${autoSegment}`;\n }\n\n // Manager URL is mandatory — pick the explicit `endpoint` first, then\n // fall back to `${apiBase}/api/files/manager`.\n const manager =\n config.endpoint ??\n (base !== null ? `${base}/api/files/manager` : null);\n\n if (!manager) {\n throw new Error(\n \"[@brftech/filex-core] config requires either `apiBase` or `endpoint`\",\n );\n }\n\n return {\n manager,\n uploadInit: derive(config.uploadInit, '/api/files/upload/init'),\n uploadFinalize: derive(config.uploadFinalize, '/api/files/upload/finalize'),\n uploadAbort: derive(config.uploadAbort, '/api/files/upload/abort'),\n shareCreate: derive(config.shareCreate, '/api/files/share'),\n shareList: derive(config.shareList, '/api/files/share'),\n shareDelete: derive(config.shareDelete, '/api/files/share/{uuid}'),\n limits: derive(config.limits, '/api/files/limits'),\n capabilities: derive(config.capabilities, '/api/files/capabilities'),\n archiveList: derive(config.archiveList, '/api/files/archive/list'),\n archiveExtract: derive(config.archiveExtract, '/api/files/archive/extract'),\n archiveAdd: derive(config.archiveAdd, '/api/files/archive/add'),\n copy: derive(config.copy, '/api/files/copy'),\n moveAsync: derive(config.moveAsync, '/api/files/move'),\n deleteAsync: derive(config.deleteAsync, '/api/files/delete'),\n opsList: derive(config.opsList, '/api/files/ops'),\n opsShow: derive(config.opsShow, '/api/files/ops/{id}'),\n onlyOfficeConfig: derive(config.onlyOfficeConfig, '/api/files/onlyoffice/config'),\n saveText: derive(config.saveText, '/api/files/save-text'),\n restore: derive(config.restore, '/api/files/restore'),\n // filex trash: list soft-deleted nodes + restore one by node id.\n trashList: derive(config.trashList, '/api/files/manager/trash'),\n trashRestore: derive(config.trashRestore, '/api/files/manager/restore'),\n };\n}\n\n/**\n * Resolve a possibly-async bearer token to a string. Caller passes\n * `auth.token` here so the auth header is fresh on every request.\n */\nasync function resolveToken(t: string | (() => string | Promise<string>)): Promise<string> {\n if (typeof t === 'function') {\n const out = t();\n return out instanceof Promise ? await out : out;\n }\n return t;\n}\n\n/**\n * Normalise the legacy `{type: 'bearer'}` shape to the modern\n * `{kind: 'bearer'}` discriminator. Lets us write a single auth-header\n * builder downstream.\n */\nfunction normalizeAuth(auth: AuthConfig | undefined): { kind: 'bearer'; token: string | (() => string | Promise<string>) }\n | { kind: 'csrf'; csrf: string }\n | { kind: 'basic'; user: string; pass: string }\n | { kind: 'none' } {\n if (!auth) return { kind: 'none' };\n if ('kind' in auth) return auth;\n // Legacy shape — translate.\n if (auth.type === 'bearer') return { kind: 'bearer', token: auth.token };\n if (auth.type === 'csrf') return { kind: 'csrf', csrf: auth.csrf };\n return { kind: 'none' };\n}\n\nexport function useFileApi(config: ExplorerConfig) {\n const endpoints = resolveEndpoints(config);\n const authConf = normalizeAuth(config.auth);\n\n async function authHeaders(extra: Record<string, string> = {}): Promise<Record<string, string>> {\n const h: Record<string, string> = { Accept: 'application/json', ...extra };\n if (authConf.kind === 'bearer') {\n const token = await resolveToken(authConf.token);\n if (token) h.Authorization = `Bearer ${token}`;\n } else if (authConf.kind === 'csrf') {\n h['X-CSRF-TOKEN'] = authConf.csrf;\n h['X-Requested-With'] = 'XMLHttpRequest';\n } else if (authConf.kind === 'basic') {\n const creds = btoa(`${authConf.user}:${authConf.pass}`);\n h.Authorization = `Basic ${creds}`;\n }\n return h;\n }\n\n /**\n * Sync auth-header builder for callers that need headers in a\n * non-async context (XMLHttpRequest, OnlyOffice config endpoint\n * post-mounted PreviewModal). Function-token bearers are *resolved\n * lazily* via the async path; here we just include the cached value\n * if any. Component code should prefer the async `authHeaders()` —\n * this is a defensive escape hatch.\n */\n function authHeadersSync(extra: Record<string, string> = {}): Record<string, string> {\n const h: Record<string, string> = { Accept: 'application/json', ...extra };\n if (authConf.kind === 'bearer' && typeof authConf.token === 'string') {\n h.Authorization = `Bearer ${authConf.token}`;\n } else if (authConf.kind === 'csrf') {\n h['X-CSRF-TOKEN'] = authConf.csrf;\n h['X-Requested-With'] = 'XMLHttpRequest';\n } else if (authConf.kind === 'basic') {\n const creds = btoa(`${authConf.user}:${authConf.pass}`);\n h.Authorization = `Basic ${creds}`;\n }\n return h;\n }\n\n function credentialsMode(): RequestCredentials {\n return authConf.kind === 'csrf' ? 'include' : 'same-origin';\n }\n\n // Map an HTTP status to a short, human-readable message in the explorer's\n // locale. The raw JSON body is attached as `.detail` for debugging but never\n // shown in the toast (Burak: \"404/403 falan verince ham json görüyorum\").\n function statusMessage(status: number): string {\n const tr = (config.locale ?? 'tr') !== 'en';\n const m: Record<number, [string, string]> = {\n 400: ['Geçersiz istek', 'Bad request'],\n 401: ['Oturum gerekli, tekrar giriş yapın', 'Sign-in required'],\n 403: ['Bu işlem için yetkiniz yok', 'You are not allowed to do this'],\n 404: ['Bulunamadı', 'Not found'],\n 409: ['Zaten var / çakışma', 'Already exists / conflict'],\n 413: ['Dosya çok büyük', 'File too large'],\n 415: ['Bu dosya türü desteklenmiyor', 'Unsupported file type'],\n 422: ['Geçersiz veri', 'Invalid data'],\n 429: ['Çok fazla istek, biraz bekleyin', 'Too many requests'],\n 500: ['Sunucu hatası', 'Server error'],\n 501: ['Bu işlem desteklenmiyor', 'Not supported'],\n 503: ['Servis şu an kullanılamıyor', 'Service unavailable'],\n };\n const e = m[status];\n if (e) return tr ? e[0] : e[1];\n return tr ? `Hata (${status})` : `Error (${status})`;\n }\n\n async function jsonFetch<T>(url: string, init: RequestInit = {}): Promise<T> {\n const headers = {\n ...(await authHeaders()),\n ...((init.headers as Record<string, string> | undefined) ?? {}),\n };\n const res = await fetch(url, {\n ...init,\n headers,\n credentials: credentialsMode(),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n const err = new Error(statusMessage(res.status)) as Error & { status?: number; detail?: string };\n err.status = res.status;\n err.detail = text.slice(0, 300);\n throw err;\n }\n return res.json() as Promise<T>;\n }\n\n // --------------------------------------------------------------------\n // Permissions (RBAC) — derived from the manager endpoint by swapping the\n // trailing `/manager` for `/permissions`. Owner/admin only (backend gated).\n // --------------------------------------------------------------------\n function permissionsUrl(sub = ''): string {\n const base = endpoints.manager.replace(/\\/manager(\\?.*)?$/, '/permissions');\n return base + sub;\n }\n async function listPermissions(path: string): Promise<PermissionsResponse> {\n return jsonFetch<PermissionsResponse>(permissionsUrl() + '?path=' + encodeURIComponent(path));\n }\n async function resolveEmail(email: string): Promise<ResolveEmailResponse> {\n return jsonFetch<ResolveEmailResponse>(permissionsUrl('/resolve') + '?email=' + encodeURIComponent(email));\n }\n async function searchUsers(q: string): Promise<UserSearchResponse> {\n return jsonFetch<UserSearchResponse>(permissionsUrl('/users') + '?q=' + encodeURIComponent(q));\n }\n async function addPermission(body: { path: string; user_id: number; level: string; is_dir?: boolean }): Promise<unknown> {\n return jsonFetch(permissionsUrl(), { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) });\n }\n async function updatePermission(id: number, level: string): Promise<unknown> {\n return jsonFetch(permissionsUrl('/' + id), { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ level }) });\n }\n async function deletePermission(id: number): Promise<unknown> {\n return jsonFetch(permissionsUrl('/' + id), { method: 'DELETE' });\n }\n async function invitePermission(body: { path: string; email: string; level: string; create_user?: boolean; role?: string; is_dir?: boolean; locale?: string }): Promise<InviteResponse> {\n return jsonFetch<InviteResponse>(permissionsUrl('/invite'), { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) });\n }\n async function shareMail(body: { path: string; email?: string; emails?: string[]; url: string; pin?: string | null; expires_days?: number; locale?: string; is_dir?: boolean; size?: number; mode?: string }): Promise<{ emailed: boolean; sent?: string[]; failed?: string[] }> {\n return jsonFetch<{ emailed: boolean; sent?: string[]; failed?: string[] }>(permissionsUrl('/share-mail'), { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) });\n }\n\n // --------------------------------------------------------------------\n // Manager contract — supports both `?q=action` (legacy) and\n // `?action=action` (new) by emitting BOTH. Backends recognising one\n // ignore the other; new backends prefer `action`.\n // --------------------------------------------------------------------\n\n function qs(params: Record<string, string | number | boolean | undefined>): string {\n const sp = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) {\n if (v === undefined || v === null) continue;\n sp.set(k, String(v));\n }\n return sp.toString();\n }\n\n function managerUrl(action: string, params: Record<string, string | number | boolean | undefined> = {}): string {\n const sep = endpoints.manager.includes('?') ? '&' : '?';\n return `${endpoints.manager}${sep}${qs({ q: action, action, ...params })}`;\n }\n\n async function index(path: string): Promise<ManagerResponse> {\n return jsonFetch<ManagerResponse>(managerUrl('index', { path }));\n }\n\n async function search(path: string, filter: string): Promise<ManagerResponse> {\n return jsonFetch<ManagerResponse>(managerUrl('search', { path, filter }));\n }\n\n /* === bul:s3 — global \"search everywhere\" ===\n * Derived from the manager endpoint by swapping `/manager` for `/search`\n * (same trick permissionsUrl uses), so embedded proxies that forward the\n * whole /api/files/* subtree keep working. Errors and legacy backends\n * degrade to an empty result list — the palette just shows nothing. */\n async function globalSearch(\n query: string,\n opts: { limit?: number; scope?: GlobalSearchScope } = {},\n ): Promise<GlobalSearchHit[]> {\n const base = endpoints.manager.replace(/\\/manager(\\?.*)?$/, '/search');\n const sep = base.includes('?') ? '&' : '?';\n const url = `${base}${sep}${qs({ q: query, limit: opts.limit, scope: opts.scope })}`;\n const data = await jsonFetch<{ results?: GlobalSearchHit[] | null }>(url);\n return Array.isArray(data?.results) ? data.results : [];\n }\n\n async function subfolders(path: string): Promise<{ folders: FileNode[] }> {\n return jsonFetch<{ folders: FileNode[] }>(managerUrl('subfolders', { path }));\n }\n\n async function newFolder(path: string, name: string): Promise<ManagerResponse> {\n return jsonFetch<ManagerResponse>(managerUrl('newfolder'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path, name }),\n });\n }\n\n async function rename(path: string, item: string, name: string): Promise<ManagerResponse> {\n return jsonFetch<ManagerResponse>(managerUrl('rename'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path, item, name }),\n });\n }\n\n async function move(path: string, items: string[], target: string): Promise<ManagerResponse> {\n return jsonFetch<ManagerResponse>(managerUrl('move'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path, item: target, items: items.map((p) => ({ path: p })) }),\n });\n }\n\n async function deleteItems(path: string, items: string[]): Promise<ManagerResponse> {\n return jsonFetch<ManagerResponse>(managerUrl('delete'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path, items: items.map((p) => ({ path: p })) }),\n });\n }\n\n /** Server-side recursive copy (async — returns a PendingOp). */\n async function copy(source: string[], target: string): Promise<{ op: PendingOpDto }> {\n if (!endpoints.copy) throw new Error('copy endpoint not configured');\n return jsonFetch(endpoints.copy, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ source, target }),\n });\n }\n\n async function moveAsync(source: string[], target: string, sourceDir?: string): Promise<{ op: PendingOpDto }> {\n if (!endpoints.moveAsync) throw new Error('moveAsync endpoint not configured');\n return jsonFetch(endpoints.moveAsync, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ source, target, sourceDir }),\n });\n }\n\n async function deleteAsync(source: string[], sourceDir?: string): Promise<{ op: PendingOpDto }> {\n if (!endpoints.deleteAsync) throw new Error('deleteAsync endpoint not configured');\n return jsonFetch(endpoints.deleteAsync, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ source, sourceDir }),\n });\n }\n\n async function restore(source: string[]): Promise<{ ok: boolean; restored: number }> {\n if (!endpoints.restore) throw new Error('restore endpoint not configured');\n return jsonFetch(endpoints.restore, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ source }),\n });\n }\n\n /** filex trash listing — soft-deleted nodes across (or within) storages. */\n async function listTrash(storageName?: string): Promise<{ entries: TrashEntry[]; total: number }> {\n if (!endpoints.trashList) throw new Error('trashList endpoint not configured');\n const base = endpoints.trashList;\n const sep = base.includes('?') ? '&' : '?';\n const url = storageName ? `${base}${sep}storage=${encodeURIComponent(storageName)}` : base;\n return jsonFetch<{ entries: TrashEntry[]; total: number }>(url);\n }\n\n /**\n * Restore soft-deleted nodes by their node id. The filex backend restores\n * one node per call (`POST {node_id}`), so we fan out and tally successes.\n */\n async function restoreIds(ids: number[]): Promise<{ restored: number }> {\n const url = endpoints.trashRestore;\n if (!url) throw new Error('trashRestore endpoint not configured');\n let restored = 0;\n for (const id of ids) {\n try {\n await jsonFetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ node_id: id }),\n });\n restored++;\n } catch {\n /* skip individual failures; report the count that succeeded */\n }\n }\n return { restored };\n }\n\n /**\n * Legacy in-band multipart upload (small files / chunked endpoint\n * absent). XMLHttpRequest because fetch doesn't expose upload\n * progress on most browsers.\n */\n async function uploadMultipart(\n path: string,\n files: File[],\n onProgress?: (p: number) => void,\n ): Promise<ManagerResponse> {\n const fd = new FormData();\n fd.append('path', path);\n for (const f of files) {\n fd.append('file[]', f, f.name);\n }\n const headers = await authHeaders();\n return new Promise<ManagerResponse>((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open('POST', managerUrl('upload'));\n for (const [k, v] of Object.entries(headers)) {\n if (k === 'Content-Type') continue;\n xhr.setRequestHeader(k, v);\n }\n xhr.withCredentials = credentialsMode() === 'include';\n xhr.upload.onprogress = (ev) => {\n if (onProgress && ev.lengthComputable) {\n onProgress(Math.round((ev.loaded / ev.total) * 100));\n }\n };\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n resolve(JSON.parse(xhr.responseText));\n } catch (e) {\n reject(e);\n }\n } else {\n reject(new Error(`${xhr.status} ${xhr.statusText}: ${xhr.responseText.slice(0, 200)}`));\n }\n };\n xhr.onerror = () => reject(new Error('Network error'));\n xhr.send(fd);\n });\n }\n\n function downloadUrl(path: string): string {\n return managerUrl('download', { path });\n }\n\n function previewUrl(path: string): string {\n return managerUrl('preview', { path });\n }\n\n /**\n * Fetch a file body with the configured auth headers + credentials,\n * returning the raw blob plus a normalized object URL viewers can mount\n * directly. Used by the rich viewers (3D, EPUB, PDF, PSD, TIFF, …) which\n * need an `ArrayBuffer` or a `Blob`-backed `objectURL` rather than the\n * relative preview URL.\n *\n * Caller is responsible for revoking `url` (`URL.revokeObjectURL(url)`)\n * once the viewer unmounts to avoid leaking the blob.\n */\n async function fetchBlob(\n path: string,\n ): Promise<{ url: string; blob: Blob; mime: string }> {\n const headers = await authHeaders();\n const res = await fetch(previewUrl(path), {\n headers,\n credentials: credentialsMode(),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(\n `${res.status} ${res.statusText}${text ? ' — ' + text.slice(0, 200) : ''}`,\n );\n }\n const blob = await res.blob();\n const mime = blob.type || res.headers.get('content-type') || '';\n const url = URL.createObjectURL(blob);\n return { url, blob, mime };\n }\n\n /**\n * Like `fetchBlob` but returns the raw bytes — viewers that need\n * binary parsing (utif, ag-psd, pdfjs-dist) get the buffer directly\n * without the extra `Blob → arrayBuffer` round trip.\n */\n async function fetchArrayBuffer(path: string): Promise<ArrayBuffer> {\n const headers = await authHeaders();\n const res = await fetch(previewUrl(path), {\n headers,\n credentials: credentialsMode(),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(\n `${res.status} ${res.statusText}${text ? ' — ' + text.slice(0, 200) : ''}`,\n );\n }\n return res.arrayBuffer();\n }\n\n // --------------------------------------------------------------------\n // Peripheral endpoints\n // --------------------------------------------------------------------\n\n async function limits(): Promise<UploadLimits> {\n if (!endpoints.limits) return { max_upload_mb: 1024 };\n return jsonFetch<UploadLimits>(endpoints.limits);\n }\n\n async function capabilities(): Promise<Capabilities> {\n if (!endpoints.capabilities) {\n return {\n ffmpeg: false,\n ghostscript: false,\n libreoffice: false,\n max_chunk_mb: 5,\n upload_limit_mb: 1024,\n onlyoffice_url: config.onlyOfficeBase ?? null,\n drawio_url: config.drawioBase ?? null,\n convert_url: config.convertBase ?? null,\n };\n }\n return jsonFetch<Capabilities>(endpoints.capabilities);\n }\n\n async function createShare(payload: {\n path: string;\n password?: boolean;\n expires_at?: string | null;\n max_downloads?: number | null;\n // File-drop (public upload link) — kind:'drop' mints an upload link into a\n // folder instead of a download link; drop_settings carries the caps.\n kind?: string;\n max_uploads?: number | null;\n drop_settings?: Record<string, unknown> | null;\n }): Promise<{ share: ShareInfo & { url: string; path: string; filename: string; kind?: string } }> {\n if (!endpoints.shareCreate) throw new Error('shareCreate endpoint not configured');\n return jsonFetch(endpoints.shareCreate, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n });\n }\n\n async function listShares(path: string): Promise<{ shares: ShareInfo[] }> {\n if (!endpoints.shareList) return { shares: [] };\n const sep = endpoints.shareList.includes('?') ? '&' : '?';\n return jsonFetch(`${endpoints.shareList}${sep}path=${encodeURIComponent(path)}`);\n }\n\n async function revokeShare(uuid: string): Promise<{ success: boolean }> {\n if (!endpoints.shareDelete) throw new Error('shareDelete endpoint not configured');\n const url = endpoints.shareDelete.replace('{uuid}', encodeURIComponent(uuid));\n return jsonFetch(url, { method: 'DELETE' });\n }\n\n async function archiveList(path: string): Promise<{ entries: ArchiveEntry[] }> {\n if (!endpoints.archiveList) throw new Error('archiveList endpoint not configured');\n const raw = await jsonFetch<{ entries: Array<{ name: string; size: number; is_dir: boolean; mtime?: number }> }>(\n endpoints.archiveList,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path }),\n },\n );\n return {\n entries: raw.entries.map((e) => ({\n name: e.name,\n size: e.size,\n isDir: e.is_dir,\n lastModified: e.mtime,\n })),\n };\n }\n\n async function archiveExtract(path: string, members?: string[]): Promise<{ keys: string[]; count: number }> {\n if (!endpoints.archiveExtract) throw new Error('archiveExtract endpoint not configured');\n return jsonFetch(endpoints.archiveExtract, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path, members }),\n });\n }\n\n async function archiveAdd(path: string, files: Array<{ name: string; source: string }>): Promise<{ path: string }> {\n if (!endpoints.archiveAdd) throw new Error('archiveAdd endpoint not configured');\n return jsonFetch(endpoints.archiveAdd, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path, files }),\n });\n }\n\n /* === koru:k1 — version history (inspector panel) ===\n * Derived from the manager endpoint by swapping `/manager` for `/versions`\n * (same trick permissionsUrl/globalSearch use) so embedded proxies that\n * forward the whole /api/files/* subtree keep working.\n * GET /api/files/versions?node_id=N → {versions, node_id}\n * POST /api/files/versions/restore → {node_id, version_id, snapshot_current}\n * POST /api/files/versions/snapshot → {node_id} (may not exist on older backends)\n */\n function versionsUrl(sub = ''): string {\n const base = endpoints.manager.replace(/\\/manager(\\?.*)?$/, '/versions');\n return base + sub;\n }\n async function listVersions(nodeId: number): Promise<NodeVersion[]> {\n const data = await jsonFetch<{ versions?: NodeVersion[] | null }>(\n versionsUrl() + '?node_id=' + encodeURIComponent(String(nodeId)),\n );\n return Array.isArray(data?.versions) ? data.versions : [];\n }\n async function restoreVersion(\n nodeId: number,\n versionId: number,\n snapshotCurrent = true,\n ): Promise<void> {\n await jsonFetch(versionsUrl('/restore'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n node_id: nodeId,\n version_id: versionId,\n snapshot_current: snapshotCurrent,\n }),\n });\n }\n async function snapshotVersion(nodeId: number): Promise<void> {\n await jsonFetch(versionsUrl('/snapshot'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ node_id: nodeId }),\n });\n }\n /* === /koru:k1 === */\n\n /* === calisma:d3 — node comments (inspector panel) ===\n * Same manager-URL derivation trick as versions/permissions so embedded\n * proxies forwarding the whole /api/files/* subtree keep working.\n * GET /api/files/comments?node_id=N → {comments, node_id}\n * POST /api/files/comments → {node_id, body}\n * DELETE /api/files/comments/{id} → {ok}\n */\n function commentsUrl(sub = ''): string {\n const base = endpoints.manager.replace(/\\/manager(\\?.*)?$/, '/comments');\n return base + sub;\n }\n async function listComments(nodeId: number): Promise<NodeComment[]> {\n const data = await jsonFetch<{ comments?: NodeComment[] | null }>(\n commentsUrl() + '?node_id=' + encodeURIComponent(String(nodeId)),\n );\n return Array.isArray(data?.comments) ? data.comments : [];\n }\n async function addComment(nodeId: number, body: string): Promise<NodeComment> {\n const data = await jsonFetch<{ comment: NodeComment }>(commentsUrl(), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ node_id: nodeId, body }),\n });\n return data.comment;\n }\n async function deleteComment(id: number): Promise<void> {\n await jsonFetch(commentsUrl('/' + encodeURIComponent(String(id))), {\n method: 'DELETE',\n });\n }\n /* === /calisma:d3 === */\n\n // Mint a short-lived WebSocket auth ticket for the realtime layer. Derived\n // from the manager URL (so it flows through the same host proxy) and uses the\n // same auth/creds as every other call. Returns null on any failure (a backend\n // without the endpoint, a network error) so the caller falls back to polling.\n async function wsTicket(): Promise<{ ticket: string; ws_url: string } | null> {\n const url = endpoints.manager.replace(/\\/manager(\\?.*)?$/, '/ws-ticket');\n try {\n return await jsonFetch<{ ticket: string; ws_url: string }>(url, { method: 'POST' });\n } catch {\n return null;\n }\n }\n\n return {\n // Realtime\n wsTicket,\n // Manager\n index,\n search,\n globalSearch /* bul:s3 */,\n subfolders,\n newFolder,\n rename,\n move,\n copy,\n moveAsync,\n deleteAsync,\n deleteItems,\n restore,\n listTrash,\n restoreIds,\n uploadMultipart,\n downloadUrl,\n previewUrl,\n fetchBlob,\n fetchArrayBuffer,\n // Peripheral\n limits,\n capabilities,\n createShare,\n listShares,\n revokeShare,\n archiveList,\n archiveExtract,\n archiveAdd,\n // Version history (koru:k1 inspector)\n listVersions,\n restoreVersion,\n snapshotVersion,\n // Node comments (calisma:d3 inspector)\n listComments,\n addComment,\n deleteComment,\n // Permissions (RBAC panel)\n listPermissions,\n resolveEmail,\n searchUsers,\n addPermission,\n updatePermission,\n deletePermission,\n invitePermission,\n shareMail,\n // Internals (exposed for useUploadChunked + PreviewModal)\n endpoints,\n authHeaders,\n authHeadersSync,\n credentialsMode,\n jsonFetch,\n };\n}\n\nexport type FileApi = ReturnType<typeof useFileApi>;\n","/**\n * useUploadChunked — S3 multipart upload orchestrator for the browser.\n *\n * Contract (matches the standard /api/files/upload/{init,finalize,abort}):\n * 1. POST init {path, filename, size, mime}\n * → {uploadId, parts: [{partNumber, presignedUrl}], chunkBytes, totalParts}\n * 2. For each part: PUT <presignedUrl> <chunk bytes>, collect ETag header\n * 3. POST finalize {uploadId, parts: [{partNumber, etag}]}\n * → {s3Key, url, size}\n * Abort path: POST abort {uploadId} any time.\n *\n * We parallelize up to `parallelChunks` uploads (default 4). Progress is\n * reported as an aggregate percentage across all parts — individual part\n * percentages are tracked internally and summed.\n */\n\nimport type { ExplorerConfig } from '../types/ExplorerConfig';\nimport type { FileApi } from './useFileApi';\nimport type { UploadInitResponse, UploadFinalizeResponse } from '../types/FileNode';\n\nexport interface UploadJob {\n id: string; // local uuid\n file: File;\n path: string;\n uploadId?: string;\n totalBytes: number;\n uploadedBytes: number;\n percent: number;\n status: 'pending' | 'initializing' | 'uploading' | 'finalizing' | 'done' | 'error' | 'aborted';\n error?: string;\n cancel(): void;\n}\n\nexport interface UploadOptions {\n path: string;\n file: File;\n chunkSize?: number;\n parallelChunks?: number;\n onProgress?: (job: UploadJob) => void;\n onDone?: (job: UploadJob, result: UploadFinalizeResponse) => void;\n onError?: (job: UploadJob, err: Error) => void;\n}\n\nexport function useUploadChunked(config: ExplorerConfig, api: FileApi) {\n const DEFAULT_CHUNK = config.chunkSize ?? 5 * 1024 * 1024;\n const DEFAULT_PARALLEL = Math.max(1, Math.min(8, config.parallelChunks ?? 4));\n\n async function uploadFile(opts: UploadOptions): Promise<UploadFinalizeResponse> {\n const chunkSize = opts.chunkSize ?? DEFAULT_CHUNK;\n const parallel = opts.parallelChunks ?? DEFAULT_PARALLEL;\n\n const job: UploadJob = {\n id: crypto.randomUUID(),\n file: opts.file,\n path: opts.path,\n totalBytes: opts.file.size,\n uploadedBytes: 0,\n percent: 0,\n status: 'initializing',\n cancel: () => {}, // rebound below\n };\n\n let cancelled = false;\n const aborters: AbortController[] = [];\n job.cancel = () => {\n cancelled = true;\n for (const a of aborters) a.abort();\n };\n\n function report() {\n job.percent =\n job.totalBytes > 0\n ? Math.min(100, Math.round((job.uploadedBytes / job.totalBytes) * 100))\n : 0;\n opts.onProgress?.(job);\n }\n\n try {\n if (!api.endpoints.uploadInit) throw new Error('uploadInit not configured');\n // 1) init\n const init = await api.jsonFetch<UploadInitResponse & { chunkBytes?: number; totalParts?: number }>(\n api.endpoints.uploadInit,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n path: opts.path,\n filename: opts.file.name,\n size: opts.file.size,\n mime: opts.file.type || 'application/octet-stream',\n }),\n },\n );\n job.uploadId = init.uploadId;\n job.status = 'uploading';\n report();\n\n const actualChunk = init.chunkBytes ?? chunkSize;\n void actualChunk; // referenced below — keep TS happy with `chunkSize` shadow\n const partProgress = new Map<number, number>();\n\n // 2) upload parts in parallel windows\n const completed: Array<{ partNumber: number; etag: string }> = [];\n let cursor = 0;\n\n async function uploadPart(entry: { partNumber: number; presignedUrl: string }): Promise<void> {\n const idx = entry.partNumber - 1;\n const start = idx * (init.chunkBytes ?? chunkSize);\n const end = Math.min(start + (init.chunkBytes ?? chunkSize), opts.file.size);\n const blob = opts.file.slice(start, end);\n\n const ctl = new AbortController();\n aborters.push(ctl);\n\n await new Promise<void>((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open('PUT', entry.presignedUrl);\n xhr.upload.onprogress = (ev) => {\n if (ev.lengthComputable) {\n const prev = partProgress.get(entry.partNumber) ?? 0;\n const delta = ev.loaded - prev;\n partProgress.set(entry.partNumber, ev.loaded);\n job.uploadedBytes += delta;\n report();\n }\n };\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n const etag = (xhr.getResponseHeader('ETag') || xhr.getResponseHeader('etag') || '').trim();\n if (!etag) {\n reject(new Error('Missing ETag on S3 response'));\n return;\n }\n // Top off in case the last progress event under-reported.\n const blobSize = end - start;\n const prev = partProgress.get(entry.partNumber) ?? 0;\n if (prev < blobSize) {\n job.uploadedBytes += blobSize - prev;\n partProgress.set(entry.partNumber, blobSize);\n }\n completed.push({ partNumber: entry.partNumber, etag });\n resolve();\n } else {\n reject(\n new Error(`S3 PUT ${entry.partNumber} → ${xhr.status}: ${xhr.responseText.slice(0, 200)}`),\n );\n }\n };\n xhr.onerror = () => reject(new Error(`S3 PUT ${entry.partNumber} network error`));\n xhr.onabort = () => reject(new DOMException('Aborted', 'AbortError'));\n ctl.signal.addEventListener('abort', () => xhr.abort());\n xhr.send(blob);\n });\n }\n\n /**\n * Wrap `uploadPart` in a tiny exponential-backoff retry so a\n * single hiccup on the edge (intermittent TCP RST, transient\n * 5xx) doesn't kill the whole multipart session. Counter is\n * per-part — a flaky one doesn't burn the budget for healthy\n * neighbours. We DON'T retry user cancellations or AbortError.\n */\n const MAX_RETRIES = 2;\n async function uploadPartWithRetry(\n entry: { partNumber: number; presignedUrl: string },\n attempt = 0,\n ): Promise<void> {\n try {\n await uploadPart(entry);\n } catch (err) {\n if (cancelled) throw err;\n const e = err instanceof Error ? err : new Error(String(err));\n if (e.name === 'AbortError') throw e;\n if (attempt >= MAX_RETRIES) throw e;\n\n // Roll back any partial uploadedBytes so progress doesn't\n // double-count after the retry succeeds.\n const leaked = partProgress.get(entry.partNumber) ?? 0;\n if (leaked > 0) {\n job.uploadedBytes = Math.max(0, job.uploadedBytes - leaked);\n partProgress.delete(entry.partNumber);\n report();\n }\n\n // Exponential backoff with jitter — 500ms, 1s, 1.5s …\n const delay = 500 * (attempt + 1) + Math.floor(Math.random() * 250);\n await new Promise((r) => setTimeout(r, delay));\n return uploadPartWithRetry(entry, attempt + 1);\n }\n }\n\n async function worker() {\n while (!cancelled && cursor < init.parts.length) {\n const entry = init.parts[cursor++];\n await uploadPartWithRetry(entry);\n }\n }\n\n const workers: Promise<void>[] = [];\n for (let i = 0; i < parallel; i++) {\n workers.push(worker());\n }\n await Promise.all(workers);\n\n if (cancelled) {\n throw new DOMException('Aborted by user', 'AbortError');\n }\n\n // 3) finalize\n if (!api.endpoints.uploadFinalize) throw new Error('uploadFinalize not configured');\n job.status = 'finalizing';\n completed.sort((a, b) => a.partNumber - b.partNumber);\n const final = await api.jsonFetch<UploadFinalizeResponse>(api.endpoints.uploadFinalize, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ uploadId: init.uploadId, parts: completed }),\n });\n\n job.status = 'done';\n job.uploadedBytes = job.totalBytes;\n job.percent = 100;\n report();\n opts.onDone?.(job, final);\n return final;\n } catch (err) {\n const asError = err instanceof Error ? err : new Error(String(err));\n job.status = asError.name === 'AbortError' ? 'aborted' : 'error';\n job.error = asError.message;\n report();\n\n // Best-effort server-side cleanup\n if (job.uploadId && api.endpoints.uploadAbort && job.status === 'aborted') {\n try {\n await api.jsonFetch(api.endpoints.uploadAbort, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ uploadId: job.uploadId }),\n });\n } catch {\n /* swallow — DB row will expire, S3 TTL handles orphan parts */\n }\n }\n\n opts.onError?.(job, asError);\n throw asError;\n }\n }\n\n return { uploadFile };\n}\n","/**\n * useSelection — multi-select state with Ctrl/Shift semantics.\n *\n * click(path, {ctrl, shift})\n * no-mod → replace selection with [path]\n * ctrl → toggle path in selection\n * shift → range select from anchor to path\n */\n\nimport { ref, computed } from 'vue';\nimport type { FileNode } from '../types/FileNode';\n\nexport function useSelection(items: () => FileNode[]) {\n const selected = ref<Set<string>>(new Set());\n const anchor = ref<string | null>(null);\n\n function click(path: string, mod: { ctrl?: boolean; shift?: boolean } = {}) {\n if (mod.shift && anchor.value) {\n const list = items();\n const aIdx = list.findIndex((n) => n.path === anchor.value);\n const bIdx = list.findIndex((n) => n.path === path);\n if (aIdx === -1 || bIdx === -1) {\n selected.value = new Set([path]);\n anchor.value = path;\n return;\n }\n const [lo, hi] = aIdx < bIdx ? [aIdx, bIdx] : [bIdx, aIdx];\n const next = new Set<string>();\n for (let i = lo; i <= hi; i++) next.add(list[i].path);\n selected.value = next;\n return;\n }\n\n if (mod.ctrl) {\n const next = new Set(selected.value);\n if (next.has(path)) next.delete(path);\n else next.add(path);\n selected.value = next;\n anchor.value = path;\n return;\n }\n\n selected.value = new Set([path]);\n anchor.value = path;\n }\n\n function clear() {\n selected.value = new Set();\n anchor.value = null;\n }\n\n function selectAll() {\n selected.value = new Set(items().map((n) => n.path));\n }\n\n function has(path: string): boolean {\n return selected.value.has(path);\n }\n\n function add(path: string) {\n const next = new Set(selected.value);\n next.add(path);\n selected.value = next;\n }\n\n function remove(path: string) {\n const next = new Set(selected.value);\n next.delete(path);\n selected.value = next;\n }\n\n const size = computed(() => selected.value.size);\n const isEmpty = computed(() => selected.value.size === 0);\n\n const nodes = computed(() => {\n const list = items();\n return list.filter((n) => selected.value.has(n.path));\n });\n\n return { selected, anchor, click, clear, selectAll, has, add, remove, size, isEmpty, nodes };\n}\n","/**\n * useKeyboardShortcuts — binds FileExplorer's keyboard affordances.\n *\n * wiring:c2 — rewritten as a REGISTRY: every action is declared once\n * (id + default combo + i18n label + category) and the user may remap\n * the customizable ones. Overrides persist in localStorage under\n * `filex.shortcuts` as `{ \"<actionId>\": \"<combo>\" }` — only deviations\n * from the defaults are stored; an empty string means \"unbound\".\n *\n * Canonical combo format (also the display format): modifiers in\n * `Ctrl+Alt+Shift` order followed by a single key token, joined with\n * `+`. Key tokens: uppercase letters/digits, symbols as typed (`/`,\n * `?`), `F1`–`F12`, `Space`, `Enter`, `Esc`, `Del`, `Backspace`, `Tab`,\n * `Home`, `End`, `PgUp`, `PgDn` and arrows as `↑ ↓ ← →`. Meta (Cmd) is\n * folded into `Ctrl` so one saved combo works on macOS too. For\n * printable symbols Shift is omitted (`?` already encodes it).\n *\n * Activated whenever the explorer is mounted (only one instance per\n * page is expected). Skips events that originate inside form controls\n * so the user can type filenames in the search box, modals, etc.\n */\n\nimport { computed, onMounted, onBeforeUnmount, ref, type ComputedRef, type Ref } from 'vue';\n\nexport interface ShortcutHandlers {\n onDelete?: () => void;\n onRename?: () => void; // F2\n onSelectAll?: () => void; // Ctrl+A\n onCut?: () => void; // Ctrl+X\n onCopy?: () => void; // Ctrl+C\n onPaste?: () => void; // Ctrl+V\n onOpen?: () => void; // Enter\n onClose?: () => void; // Escape\n onFocusSearch?: () => void; // /\n onDuplicate?: () => void; // (unwired — kept for API compat)\n onPathJump?: () => void; // Cmd+K / Ctrl+K\n onGoUp?: () => void; // Alt+Up / Backspace (when nothing selected)\n onShowHelp?: () => void; // ? (Shift+/ on most layouts)\n onToggleInspector?: () => void; // i (koru:k1 details panel)\n onToggleHidden?: () => void; // Ctrl+Shift+. — dot-file visibility\n onQuickLook?: () => void; // Space (wiring:c2 quick-look overlay)\n /* wiring:d1 — tab strip actions */\n onTabNew?: () => void; // Ctrl+T\n onTabClose?: () => void; // Ctrl+W\n onTabNext?: () => void; // Ctrl+Tab\n onTabPrev?: () => void; // Ctrl+Shift+Tab\n /* /wiring:d1 */\n hasSelection?: () => boolean; // disambiguates Backspace\n}\n\n// --------------------------------------------------------------------\n// Registry\n// --------------------------------------------------------------------\n\n/** One remappable action in the shortcut registry. */\nexport interface ShortcutActionDef {\n /** Stable id — also the localStorage override key. */\n id: string;\n /** Default combo in canonical form. */\n defaultCombo: string;\n /**\n * Extra built-in combos that also trigger the action but are NOT\n * remappable (e.g. Backspace on go-up, which carries the\n * selection-dependent dual behaviour). Shown in the help sheet and\n * reserved in conflict detection.\n */\n fixedCombos?: string[];\n labelKey: string;\n groupKey: string;\n /** false → the combo can't be remapped (Esc). Default true. */\n customizable?: boolean;\n /** false → don't preventDefault on match (Enter / Esc). Default true. */\n prevent?: boolean;\n /** true → fires even when focus sits in a form control (Esc). */\n inForms?: boolean;\n}\n\n/** Registry order = help/settings display order. */\nexport const SHORTCUT_ACTIONS: ShortcutActionDef[] = [\n // Navigation\n { id: 'palette', defaultCombo: 'Ctrl+K', labelKey: 'shortcuts.palette', groupKey: 'shortcuts.group.nav' },\n { id: 'search', defaultCombo: '/', labelKey: 'shortcuts.search', groupKey: 'shortcuts.group.nav' },\n { id: 'go-up', defaultCombo: 'Alt+↑', fixedCombos: ['Backspace'], labelKey: 'shortcuts.go_up', groupKey: 'shortcuts.group.nav' },\n { id: 'open', defaultCombo: 'Enter', prevent: false, labelKey: 'shortcuts.open', groupKey: 'shortcuts.group.nav' },\n { id: 'quicklook', defaultCombo: 'Space', labelKey: 'shortcuts.quicklook', groupKey: 'shortcuts.group.nav' },\n { id: 'close', defaultCombo: 'Esc', customizable: false, prevent: false, inForms: true, labelKey: 'shortcuts.close', groupKey: 'shortcuts.group.nav' },\n { id: 'inspector', defaultCombo: 'I', labelKey: 'shortcuts.inspector', groupKey: 'shortcuts.group.nav' } /* koru:k1 */,\n { id: 'help', defaultCombo: '?', labelKey: 'shortcuts.help', groupKey: 'shortcuts.group.nav' },\n { id: 'toggle-hidden', defaultCombo: 'Ctrl+Shift+.', labelKey: 'shortcuts.toggle_hidden', groupKey: 'shortcuts.group.nav' },\n // Selection\n { id: 'select-all', defaultCombo: 'Ctrl+A', labelKey: 'shortcuts.select_all', groupKey: 'shortcuts.group.selection' },\n // File operations\n { id: 'rename', defaultCombo: 'F2', labelKey: 'shortcuts.rename', groupKey: 'shortcuts.group.file' },\n { id: 'delete', defaultCombo: 'Del', labelKey: 'shortcuts.delete', groupKey: 'shortcuts.group.file' },\n { id: 'cut', defaultCombo: 'Ctrl+X', labelKey: 'shortcuts.cut', groupKey: 'shortcuts.group.file' },\n { id: 'copy', defaultCombo: 'Ctrl+C', labelKey: 'shortcuts.copy', groupKey: 'shortcuts.group.file' },\n { id: 'paste', defaultCombo: 'Ctrl+V', labelKey: 'shortcuts.paste', groupKey: 'shortcuts.group.file' },\n /* wiring:d1 — tabs. Note: browsers reserve Ctrl+T/W/Tab in normal pages\n * (preventDefault can't stop them there); they work in webcomponent/PWA/\n * kiosk contexts and stay remappable through the settings modal. */\n { id: 'tab-new', defaultCombo: 'Ctrl+T', labelKey: 'shortcuts.tab_new', groupKey: 'shortcuts.group.tabs' },\n { id: 'tab-close', defaultCombo: 'Ctrl+W', labelKey: 'shortcuts.tab_close', groupKey: 'shortcuts.group.tabs' },\n { id: 'tab-next', defaultCombo: 'Ctrl+Tab', labelKey: 'shortcuts.tab_next', groupKey: 'shortcuts.group.tabs' },\n { id: 'tab-prev', defaultCombo: 'Ctrl+Shift+Tab', labelKey: 'shortcuts.tab_prev', groupKey: 'shortcuts.group.tabs' },\n /* /wiring:d1 */\n];\n\n/** action id → ShortcutHandlers callback name. */\nconst HANDLER_KEY: Record<string, keyof ShortcutHandlers> = {\n palette: 'onPathJump',\n search: 'onFocusSearch',\n 'go-up': 'onGoUp',\n open: 'onOpen',\n quicklook: 'onQuickLook',\n close: 'onClose',\n inspector: 'onToggleInspector',\n 'toggle-hidden': 'onToggleHidden',\n help: 'onShowHelp',\n 'select-all': 'onSelectAll',\n rename: 'onRename',\n delete: 'onDelete',\n cut: 'onCut',\n copy: 'onCopy',\n paste: 'onPaste',\n /* wiring:d1 */\n 'tab-new': 'onTabNew',\n 'tab-close': 'onTabClose',\n 'tab-next': 'onTabNext',\n 'tab-prev': 'onTabPrev',\n};\n\n// --------------------------------------------------------------------\n// Overrides (localStorage `filex.shortcuts`)\n// --------------------------------------------------------------------\n\nconst SHORTCUTS_LS_KEY = 'filex.shortcuts';\n\nfunction readOverrides(): Record<string, string> {\n try {\n const raw = localStorage.getItem(SHORTCUTS_LS_KEY);\n if (!raw) return {};\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== 'object') return {};\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(parsed as Record<string, unknown>)) {\n if (typeof v === 'string' && SHORTCUT_ACTIONS.some((a) => a.id === k)) out[k] = v;\n }\n return out;\n } catch {\n return {};\n }\n}\n\n// Module-level so the key handler, the \"?\" help sheet and the settings\n// modal all observe the same reactive mapping.\nconst overrides = ref<Record<string, string>>(readOverrides());\n\nfunction writeOverrides(): void {\n try {\n if (Object.keys(overrides.value).length === 0) localStorage.removeItem(SHORTCUTS_LS_KEY);\n else localStorage.setItem(SHORTCUTS_LS_KEY, JSON.stringify(overrides.value));\n } catch {\n /* private mode / quota */\n }\n}\n\nfunction defOf(id: string): ShortcutActionDef | undefined {\n return SHORTCUT_ACTIONS.find((a) => a.id === id);\n}\n\n/** Current combo for an action ('' = unbound). */\nexport function effectiveCombo(id: string): string {\n const o = overrides.value[id];\n if (o !== undefined) return o;\n return defOf(id)?.defaultCombo ?? '';\n}\n\n/** Set (or clear back to default) a user override. '' unbinds. */\nexport function setShortcutOverride(id: string, combo: string): void {\n const def = defOf(id);\n if (!def || def.customizable === false) return;\n const next = { ...overrides.value };\n if (combo === def.defaultCombo) delete next[id];\n else next[id] = combo;\n overrides.value = next;\n writeOverrides();\n}\n\nexport function resetShortcut(id: string): void {\n if (!(id in overrides.value)) return;\n const next = { ...overrides.value };\n delete next[id];\n overrides.value = next;\n writeOverrides();\n}\n\nexport function resetAllShortcuts(): void {\n overrides.value = {};\n writeOverrides();\n}\n\nexport interface ShortcutConflict {\n id: string;\n /** true → the clash is with a fixed (non-remappable) combo. */\n fixed: boolean;\n}\n\n/**\n * Does `combo` already trigger another action? Checks both effective\n * combos and the reserved fixed combos (Backspace, Esc). Returns null\n * when free.\n */\nexport function findShortcutConflict(combo: string, excludeId: string): ShortcutConflict | null {\n if (!combo) return null;\n for (const def of SHORTCUT_ACTIONS) {\n if (def.id === excludeId) continue;\n if (def.fixedCombos?.includes(combo)) return { id: def.id, fixed: true };\n if (effectiveCombo(def.id) === combo) return { id: def.id, fixed: def.customizable === false };\n }\n return null;\n}\n\n// --------------------------------------------------------------------\n// Event → canonical combo\n// --------------------------------------------------------------------\n\nconst KEY_TOKEN_MAP: Record<string, string> = {\n ' ': 'Space',\n Spacebar: 'Space',\n Escape: 'Esc',\n Delete: 'Del',\n ArrowUp: '↑',\n ArrowDown: '↓',\n ArrowLeft: '←',\n ArrowRight: '→',\n PageUp: 'PgUp',\n PageDown: 'PgDn',\n};\n\nconst MODIFIER_KEYS = new Set(['Control', 'Alt', 'Shift', 'Meta', 'AltGraph', 'CapsLock', 'NumLock', 'ScrollLock', 'Fn', 'Dead']);\n\nfunction keyToken(e: KeyboardEvent): string | null {\n const k = e.key;\n if (!k || MODIFIER_KEYS.has(k)) return null;\n const mapped = KEY_TOKEN_MAP[k];\n if (mapped) return mapped;\n if (k.length === 1) {\n const upper = k.toUpperCase();\n // Letters normalize to uppercase; symbols pass through as typed.\n return upper;\n }\n return k; // 'Enter', 'F2', 'Tab', 'Home', 'End', 'Backspace', …\n}\n\n/**\n * Canonical combo for a keyboard event, or null for a bare modifier\n * press. Meta folds into Ctrl; Shift is dropped for printable symbols\n * because the produced character already encodes it (`?` not `Shift+?`).\n */\nexport function comboFromEvent(e: KeyboardEvent): string | null {\n const key = keyToken(e);\n if (!key) return null;\n const parts: string[] = [];\n if (e.ctrlKey || e.metaKey) parts.push('Ctrl');\n if (e.altKey) parts.push('Alt');\n const printableSymbol = key.length === 1 && key.toUpperCase() === key.toLowerCase();\n if (e.shiftKey && !printableSymbol) parts.push('Shift');\n parts.push(key);\n return parts.join('+');\n}\n\n// --------------------------------------------------------------------\n// Reactive views (help sheet + settings modal)\n// --------------------------------------------------------------------\n\nexport interface ShortcutView {\n id: string;\n /** Current (possibly remapped) combo, '' = unbound. */\n combo: string;\n /** Non-remappable extra combos (display + reservation only). */\n fixedCombos: string[];\n /** Display combos: [combo, ...fixedCombos] minus empties. */\n keys: string[];\n labelKey: string;\n groupKey: string;\n customizable: boolean;\n overridden: boolean;\n}\n\n/** Reactive, override-aware view of the registry (registry order). */\nexport function useShortcutList(): ComputedRef<ShortcutView[]> {\n return computed(() =>\n SHORTCUT_ACTIONS.map((def) => {\n const combo = effectiveCombo(def.id);\n const fixed = def.fixedCombos ?? [];\n return {\n id: def.id,\n combo,\n fixedCombos: fixed,\n keys: [combo, ...fixed].filter((c) => !!c),\n labelKey: def.labelKey,\n groupKey: def.groupKey,\n customizable: def.customizable !== false,\n overridden: overrides.value[def.id] !== undefined,\n };\n }),\n );\n}\n\n/**\n * @deprecated Legacy static cheat-sheet shape (pre-registry). Kept for\n * API compatibility; use `useShortcutList()` for the live, remap-aware\n * list.\n */\nexport interface ShortcutDef {\n keys: string[];\n labelKey: string;\n groupKey: string;\n}\n\n/** @deprecated See {@link useShortcutList}. Defaults only. */\nexport const SHORTCUTS: ShortcutDef[] = SHORTCUT_ACTIONS.map((def) => ({\n keys: [def.defaultCombo, ...(def.fixedCombos ?? [])].filter((c) => !!c),\n labelKey: def.labelKey,\n groupKey: def.groupKey,\n}));\n\n// --------------------------------------------------------------------\n// Binding\n// --------------------------------------------------------------------\n\nexport function useKeyboardShortcuts(rootEl: Ref<HTMLElement | null>, handlers: ShortcutHandlers) {\n // combo → action def, rebuilt when overrides change.\n const comboMap = computed(() => {\n const m = new Map<string, ShortcutActionDef>();\n for (const def of SHORTCUT_ACTIONS) {\n const c = effectiveCombo(def.id);\n if (c) m.set(c, def);\n }\n return m;\n });\n\n function onKey(e: KeyboardEvent) {\n const root = rootEl.value;\n if (!root) return;\n\n /* ui-fix — while a context menu is open, global shortcuts stay quiet\n * (except Esc, which the menu scopes itself). Otherwise e.g. Delete\n * opens a modal UNDER the menu backdrop and the UI wedges: the\n * backdrop intercepts every click on the new dialog. */\n if (e.key !== 'Escape' && document.querySelector('.fe-ctx-backdrop')) return;\n\n // Skip when the event originates inside a form control — don't\n // want `Delete` while editing a filename, `/` while typing in the\n // search box, etc. Escape always goes through so modals can close.\n const target = e.target as HTMLElement | null;\n const inForm = !!(\n target &&\n (target.tagName === 'INPUT' ||\n target.tagName === 'TEXTAREA' ||\n target.tagName === 'SELECT' ||\n target.isContentEditable)\n );\n\n const combo = comboFromEvent(e);\n if (!combo) return;\n\n // Backspace keeps its FIXED dual behaviour: delete when something is\n // selected (file-manager convention), parent-dir navigation otherwise.\n // Not remappable — the selection-dependent branch doesn't fit the\n // one-combo-one-action registry model.\n if (combo === 'Backspace') {\n if (inForm) return;\n if (handlers.hasSelection?.() && handlers.onDelete) {\n e.preventDefault();\n handlers.onDelete();\n } else if (handlers.onGoUp) {\n e.preventDefault();\n handlers.onGoUp();\n }\n return;\n }\n\n const def = comboMap.value.get(combo);\n if (!def) return;\n if (inForm && !def.inForms) return;\n // Space on a focused button/link must keep its native activation\n // (quick-look would otherwise fire alongside the click).\n if (\n combo === 'Space' &&\n target &&\n typeof target.closest === 'function' &&\n target.closest('button, a, select, summary, [role=\"button\"], [role=\"menuitem\"]')\n ) {\n return;\n }\n const fn = handlers[HANDLER_KEY[def.id]] as (() => void) | undefined;\n if (!fn) return;\n if (def.prevent !== false) e.preventDefault();\n fn();\n }\n\n onMounted(() => window.addEventListener('keydown', onKey));\n onBeforeUnmount(() => window.removeEventListener('keydown', onKey));\n}\n","/** Turkish UI strings. */\nexport const tr: Record<string, string> = {\n 'toolbar.new_folder': 'Yeni Klasör',\n 'toolbar.upload': 'Yükle',\n 'toolbar.search': 'Ara',\n 'toolbar.search.placeholder': 'Dosya adı…',\n 'toolbar.view.list': 'Liste',\n 'toolbar.view.grid': 'Izgara',\n 'toolbar.refresh': 'Yenile',\n 'toolbar.go_up': 'Üst Klasör',\n\n 'ctx.open': 'Aç',\n 'ctx.preview': 'Önizle',\n 'ctx.download': 'İndir',\n 'ctx.convert': 'Dönüştür',\n 'ctx.rename': 'Yeniden Adlandır',\n 'ctx.delete': 'Sil',\n 'ctx.delete_perm': 'Kalıcı Olarak Sil',\n 'ctx.restore': 'Geri Getir',\n 'ctx.share': 'Paylaş',\n 'ctx.move': 'Taşı',\n 'ctx.copy': 'Kopyala',\n 'ctx.cut': 'Kes',\n 'ctx.show_hidden': 'Gizli dosyaları göster',\n 'ctx.hide_hidden': 'Gizli dosyaları gizle',\n 'ctx.paste': 'Yapıştır',\n 'ctx.info': 'Bilgi',\n 'ctx.duplicate': 'Kopyasını Oluştur',\n 'ctx.new_file': 'Yeni Dosya',\n\n 'modal.delete.title': 'Silinsin mi?',\n 'modal.delete.message': '{count} öğe çöpe atılacak.',\n 'modal.delete.confirm': 'Çöpe At',\n 'modal.delete.cancel': 'Vazgeç',\n\n 'modal.rename.title': 'Yeniden Adlandır',\n 'modal.rename.save': 'Kaydet',\n 'modal.rename.cancel': 'Vazgeç',\n\n 'modal.newfolder.title': 'Yeni Klasör',\n 'modal.newfolder.placeholder': 'Klasör adı',\n 'modal.newfolder.create': 'Oluştur',\n 'modal.newfolder.cancel': 'Vazgeç',\n\n 'modal.share.title': 'Paylaşım Linki',\n 'modal.share.pin': 'PIN koruması',\n 'modal.share.expires': 'Son kullanma',\n 'modal.share.max_downloads': 'İndirme limiti',\n 'modal.share.create': 'Paylaş',\n 'modal.share.cancel': 'Vazgeç',\n 'modal.share.copy': 'Kopyala',\n 'modal.share.url_copied': 'Link kopyalandı',\n 'modal.share.pin_copied': 'PIN kopyalandı',\n 'modal.share.cli_copied': 'CLI komutu kopyalandı',\n\n 'upload.progress': 'Yükleniyor',\n 'upload.done': 'Tamamlandı',\n 'upload.error': 'Hata',\n 'upload.failed': '“{name}” yüklenemedi',\n 'upload.aborted': 'İptal edildi',\n 'upload.cancel': 'İptal',\n\n 'empty.folder': 'Bu klasör boş',\n 'empty.search': 'Sonuç bulunamadı',\n 'loading': 'Yükleniyor…',\n\n 'notFound.title': 'Klasör bulunamadı',\n 'notFound.desc': 'Bu klasör mevcut değil, taşınmış ya da erişim yetkiniz yok.',\n 'notFound.goRoot': 'Kök klasöre dön',\n\n 'col.name': 'Ad',\n 'col.size': 'Boyut',\n 'col.modified': 'Tarih',\n 'col.type': 'Tür',\n\n 'unit.bytes': 'B',\n 'unit.kb': 'KB',\n 'unit.mb': 'MB',\n 'unit.gb': 'GB',\n 'unit.tb': 'TB',\n\n 'breadcrumb.root': 'Kök',\n 'breadcrumb.copy_path': 'Yolu Kopyala',\n 'breadcrumb.go_to_path': 'Yola Git',\n 'breadcrumb.path_placeholder': 'fileman/foo/bar',\n\n 'ops.copy': 'Kopyalanıyor',\n 'ops.move': 'Taşınıyor',\n 'ops.delete': 'Siliniyor',\n 'ops.queued': 'sırada',\n 'ops.done': 'tamamlandı',\n 'ops.error': 'hata',\n\n 'node.trash': 'Çöp Kutusu',\n\n // ——— Zengin önizleyici chrome ———\n 'viewer.open_in_new_tab': 'Yeni Sekmede Aç',\n 'viewer.loading': 'Yükleniyor…',\n 'viewer.failed_to_load': 'Dosya yüklenemedi',\n 'viewer.peer_not_installed': 'Bu dosya tipi için opsiyonel kütüphane kurulu değil. Peer dependency yükle veya İndir düğmesini kullan.',\n 'viewer.format_unsupported_3d': 'Bu 3B format tarayıcı önizlemesinde desteklenmiyor (model-viewer yalnızca .glb / .gltf / .usdz okur). Lütfen indirip yerel bir araçta açın.',\n 'viewer.zoom_in': 'Yakınlaştır',\n 'viewer.zoom_out': 'Uzaklaştır',\n 'viewer.fit_width': 'Sayfa genişliğine sığdır',\n 'viewer.next_page': 'Sonraki sayfa',\n 'viewer.prev_page': 'Önceki sayfa',\n 'viewer.page_n_of_m': 'Sayfa {n} / {m}',\n 'viewer.tags': 'Etiketler',\n 'viewer.layers': 'Katmanlar',\n 'viewer.toc': 'İçindekiler',\n 'viewer.font_smaller': 'Yazıyı küçült',\n 'viewer.font_larger': 'Yazıyı büyüt',\n 'viewer.search': 'Ara',\n 'viewer.download': 'İndir',\n 'viewer.saving': 'Kaydediliyor…',\n 'viewer.save': 'Kaydet (Ctrl+S)',\n 'viewer.saved': 'Kaydedildi',\n 'viewer.save_error': 'Hata',\n 'viewer.editor_loading': 'Editör yükleniyor…',\n 'viewer.no_preview': 'Bu dosya tipi için önizleme henüz yok.',\n 'viewer.edit': 'Düzenle',\n 'viewer.close': 'Kapat',\n 'presence.expand': 'İsimleri göster',\n 'presence.collapse': 'Küçült',\n 'viewer.save_annotations': 'Açıklamaları kaydet',\n 'viewer.annotations_on': 'Açıklamalar: açık',\n 'viewer.annotations_off': 'Açıklamalar: kapalı',\n 'viewer.read_only': 'Salt okunur',\n 'viewer.csv_first_row_header': 'İlk satır başlık olsun',\n 'viewer.csv_filter': 'Satır filtrele…',\n 'viewer.epub_prev': 'Önceki',\n 'viewer.epub_next': 'Sonraki',\n 'viewer.drawio.disabled': 'diagrams.net editörü bu filex kurulumunda yapılandırılmamış — yönetici FILEX_DRAWIO_URL\\'yi ayarlamalı.',\n 'viewer.archive.entries': '{n} dosya',\n 'viewer.archive.empty': 'Arşiv boş.',\n 'viewer.archive.error': 'Arşiv okunamadı.',\n 'viewer.name': 'Ad',\n 'viewer.size': 'Boyut',\n\n // ——— cila:a — sıralama / tarih grupları / yoğunluk ———\n 'col.sort': 'Sırala',\n 'group.today': 'Bugün',\n 'group.yesterday': 'Dün',\n 'group.this_week': 'Bu Hafta',\n 'group.this_month': 'Bu Ay',\n 'group.no_date': 'Tarihsiz',\n 'toolbar.density.compact': 'Sıkışık görünüm',\n 'toolbar.density.comfortable': 'Rahat görünüm',\n\n // ——— cila:c — komut paleti + kısayol yardımı + breadcrumb ———\n 'palette.placeholder': 'Dosya, klasör veya komut ara…',\n 'palette.files': 'Dosyalar',\n 'palette.commands': 'Komutlar',\n 'palette.goto': 'Yola git',\n 'palette.empty': 'Sonuç bulunamadı',\n 'palette.hint': '↑↓ gezin · Enter seç · Esc kapat',\n 'cmd.view_toggle': 'Görünümü değiştir (liste ⇄ ızgara)',\n 'cmd.trash': 'Çöp kutusunu aç',\n 'shortcuts.title': 'Klavye Kısayolları',\n 'shortcuts.group.nav': 'Gezinme',\n 'shortcuts.group.selection': 'Seçim',\n 'shortcuts.group.file': 'Dosya işlemleri',\n 'shortcuts.palette': 'Komut paleti',\n 'shortcuts.search': 'Aramaya odaklan',\n 'shortcuts.go_up': 'Üst klasöre çık',\n 'shortcuts.open': 'Seçili öğeyi aç',\n 'shortcuts.close': 'Kapat / vazgeç',\n 'shortcuts.toggle_hidden': 'Gizli dosyaları göster/gizle',\n 'shortcuts.help': 'Bu yardım penceresi',\n 'shortcuts.select_all': 'Tümünü seç',\n 'shortcuts.rename': 'Yeniden adlandır',\n 'shortcuts.delete': 'Sil',\n 'shortcuts.cut': 'Kes',\n 'shortcuts.copy': 'Kopyala',\n 'shortcuts.paste': 'Yapıştır',\n 'breadcrumb.more': 'Aradaki klasörler',\n\n // ——— State screens + undo snackbar + connection badge (cila:b) ———\n 'empty.hint': 'Dosyaları buraya sürükleyip bırakın',\n 'empty.upload': 'Dosya yükle',\n 'empty.search.title': 'Aramanla eşleşen dosya yok',\n 'empty.search.hint': 'Farklı bir arama terimi deneyin',\n 'empty.trash.title': 'Çöp kutusu boş',\n 'error.title': 'Liste yüklenemedi',\n 'error.retry': 'Yeniden dene',\n 'toast.undo': 'Geri Al',\n 'toast.undone': 'Geri alındı',\n 'toast.undo_failed': 'Geri alınamadı',\n 'toast.renamed': 'Yeniden adlandırıldı',\n 'toast.moved': 'Taşındı',\n 'toast.trashed': 'Çöpe taşındı',\n 'conn.offline': 'Canlı bağlantı yok — değişiklikler gecikebilir',\n 'conn.tooltip': 'Sunucuyla canlı bağlantı kurulamadı; liste belirli aralıklarla otomatik yenilenir. Bağlantı geri gelince bu uyarı kaybolur.',\n\n /* === bul:s3 === */\n 'palette.everywhere': 'Her yerde',\n 'palette.searching': 'Aranıyor…',\n 'palette.saved': 'Kayıtlı aramalar',\n 'palette.save': 'Aramayı kaydet',\n 'palette.saved.delete': 'Kayıtlı aramayı sil',\n 'search.in_content': 'İçerikte',\n\n /* === bag:b4 === */\n 'toolbar.more': 'Diğer işlemler',\n 'toolbar.search.close': 'Aramayı kapat',\n 'sheet.menu': 'İşlemler',\n 'sheet.close': 'Kapat',\n\n /* === koru:k1 === */\n 'toolbar.inspector': 'Ayrıntılar',\n 'ctx.details': 'Ayrıntılar',\n 'shortcuts.inspector': 'Ayrıntılar panelini aç/kapat',\n 'inspector.title': 'Ayrıntılar',\n 'inspector.close': 'Kapat',\n 'inspector.section.general': 'Genel',\n 'inspector.section.versions': 'Sürümler',\n 'inspector.section.permissions': 'İzinler',\n 'inspector.section.shares': 'Paylaşımlar',\n 'inspector.path': 'Yol',\n 'inspector.size': 'Boyut',\n 'inspector.modified': 'Değiştirilme',\n 'inspector.mime': 'MIME türü',\n 'inspector.etag': 'ETag',\n 'inspector.copy': 'Kopyala',\n 'inspector.copied': 'Kopyalandı',\n 'inspector.error': 'Yüklenemedi',\n 'inspector.items_summary': '{n} öğe, toplam {size}',\n 'inspector.folder_items': '{n} öğe',\n 'inspector.versions.empty': 'Sürüm geçmişi yok',\n 'inspector.versions.v': 'Sürüm {n}',\n 'inspector.versions.restore': 'Geri yükle',\n 'inspector.versions.restore_confirm': 'Bu sürüm geri yüklensin mi?',\n 'inspector.versions.snapshot_current': 'Önce şimdiki halin sürümünü al',\n 'inspector.versions.confirm': 'Onayla',\n 'inspector.versions.cancel': 'Vazgeç',\n 'inspector.versions.take_snapshot': 'Şimdiki halin sürümünü al',\n 'inspector.versions.restored': 'Sürüm geri yüklendi',\n 'inspector.versions.snapshotted': 'Sürüm alındı',\n 'inspector.versions.unsupported': 'Sunucu bu işlemi desteklemiyor',\n 'inspector.perm.none': 'Erişim yok',\n 'inspector.perm.viewer': 'Görüntüleyen',\n 'inspector.perm.editor': 'Düzenleyen',\n 'inspector.perm.owner': 'Sahip',\n 'inspector.perm.manage': 'İzinleri yönet',\n 'inspector.shares.empty': 'Paylaşım linki yok',\n 'inspector.shares.copy': 'Linki kopyala',\n\n /* wiring:c1 — tema galerisi */\n 'theme.menu': 'Tema',\n 'theme.title': 'Tema Galerisi',\n 'theme.hint': 'Tema yalnız renk paletini değiştirir; açık/koyu mod ayrı çalışmaya devam eder.',\n 'theme.reset': 'Varsayılana dön',\n 'theme.close': 'Kapat',\n 'theme.selected': 'Seçili',\n 'theme.name.default': 'Varsayılan',\n 'theme.name.night': 'Gece Mavisi',\n 'theme.name.forest': 'Orman',\n 'theme.name.amber': 'Kehribar',\n 'theme.name.lilac': 'Leylak',\n 'theme.name.contrast': 'Yüksek Kontrast',\n 'theme.name.gray': 'Yumuşak Gri',\n 'theme.name.terminal': 'Terminal Yeşili',\n /* === wiring:c2 — özelleştirilebilir kısayollar + hızlı bakış === */\n 'shortcuts.quicklook': 'Hızlı bakış',\n 'shortcuts.customize': 'Özelleştir',\n 'shortcuts.settings.menu': 'Kısayollar',\n 'shortcuts.settings.title': 'Kısayol Ayarları',\n 'shortcuts.settings.hint': 'Bir kısayolu değiştirmek için \"Değiştir\"e basıp yeni tuş kombinasyonuna basın. Değişiklikler yalnızca bu tarayıcıda saklanır.',\n 'shortcuts.settings.change': 'Değiştir',\n 'shortcuts.settings.capture': 'Tuşlara basın… (Esc iptal)',\n 'shortcuts.settings.reset': 'Varsayılana dön',\n 'shortcuts.settings.reset_all': 'Tümünü sıfırla',\n 'shortcuts.settings.unbound': 'Atanmadı',\n 'shortcuts.settings.fixed': 'Sabit',\n 'shortcuts.settings.customized': 'Özelleştirildi',\n 'shortcuts.settings.conflict': 'kombinasyonu \"{name}\" kısayolunda kullanılıyor.',\n 'shortcuts.settings.conflict_fixed': 'kombinasyonu \"{name}\" sabit kısayoluna ayrılmış — kullanılamaz.',\n 'shortcuts.settings.conflict_take': 'Eskisini boşa çıkar ve ata',\n 'shortcuts.settings.conflict_cancel': 'Vazgeç',\n 'quicklook.hint_close': 'kapat',\n 'quicklook.hint_nav': 'önceki/sonraki',\n 'quicklook.hint_open': 'aç',\n /* === /wiring:c2 === */\n /* === wiring:c3 — işlem merkezi === */\n 'opc.title': 'İşlemler',\n 'opc.aria_badge': '{n} işlem — işlem merkezini aç/kapat',\n 'opc.close': 'Kapat',\n 'opc.active': 'Sürüyor',\n 'opc.history': 'Geçmiş',\n 'opc.clear': 'Temizle',\n 'opc.empty': 'İşlem yok',\n 'opc.cancel': 'İptal',\n 'opc.retry': 'Yeniden dene',\n 'opc.dismiss': 'Kapat',\n 'opc.queued': 'Sırada',\n 'opc.percent': '%{n}',\n 'opc.status.running': 'Sürüyor',\n 'opc.status.done': 'Bitti',\n 'opc.status.error': 'Hata',\n 'opc.status.aborted': 'İptal edildi',\n 'opc.kind.upload': 'Yükleme',\n 'opc.kind.copy': 'Kopyalama',\n 'opc.kind.move': 'Taşıma',\n 'opc.kind.delete': 'Silme',\n 'opc.kind.convert': 'Dönüştürme',\n 'opc.kind.archive': 'Arşiv',\n /* === wiring:c4 — onboarding turu + erişilebilirlik + hata kartı === */\n 'tour.aria': 'Tanıtım turu',\n 'tour.restart': 'Turu tekrar başlat',\n 'tour.skip': 'Turu atla',\n 'tour.back': 'Geri',\n 'tour.next': 'İleri',\n 'tour.done': 'Bitti',\n 'tour.progress': '{n} / {m}',\n 'tour.step.nav.title': 'Depo ve klasörler',\n 'tour.step.nav.desc':\n 'Bulunduğun konum burada görünür. Kırıntı çubuğundaki adımlara tıklayarak üst klasörlere ve depo köküne dönebilirsin.',\n 'tour.step.upload.title': 'Dosya yükle',\n 'tour.step.upload.desc':\n 'Bu düğmeyle dosya seçebilirsin; dosyaları doğrudan pencereye sürükleyip bırakmak da çalışır.',\n 'tour.step.search.title': 'Arama',\n 'tour.step.search.desc':\n 'Bu kutu bulunduğun klasörü filtreler. Ctrl+K komut paleti ile tüm depolarda arama yapabilir ve komut çalıştırabilirsin.',\n 'tour.step.view.title': 'Görünümü değiştir',\n 'tour.step.view.desc':\n 'Liste ve ızgara görünümü arasında geçiş yapabilirsin; seçimin hatırlanır.',\n 'tour.step.share.title': 'Paylaşım',\n 'tour.step.share.desc':\n 'Bir dosyaya sağ tıklayıp \"Paylaş / İzinler\" ile bağlantı oluşturabilir, PIN ve son kullanma süresi ekleyebilirsin.',\n 'tour.step.help.title': 'Kısayollar',\n 'tour.step.help.desc':\n '? tuşu kısayol kartını, Ctrl+K komut paletini açar. Bu turu menüdeki \"Turu tekrar başlat\" ile dilediğinde yeniden izleyebilirsin.',\n 'error.hint': 'Bağlantı ya da sunucu kaynaklı geçici bir sorun olabilir. Yeniden deneyin.',\n 'error.details': 'Teknik ayrıntılar',\n 'col.star': 'Yıldız',\n 'toolbar.view_label': 'Görünüm',\n 'list.aria': 'Dosya listesi',\n 'grid.aria': 'Dosya ızgarası',\n\n /* === wiring:d1 — sekmeler + split panel === */\n 'tabs.strip': 'Sekmeler',\n 'tabs.new': 'Yeni sekme',\n 'tabs.close': 'Sekmeyi kapat',\n 'tabs.split': 'Görünümü böl',\n 'tabs.split_off': 'Bölmeyi kapat',\n 'ctx.open_new_tab': 'Yeni sekmede aç',\n 'shortcuts.group.tabs': 'Sekmeler',\n 'shortcuts.tab_new': 'Yeni sekme',\n 'shortcuts.tab_close': 'Sekmeyi kapat',\n 'shortcuts.tab_next': 'Sonraki sekme',\n 'shortcuts.tab_prev': 'Önceki sekme',\n 'cmd.tab_new': 'Yeni sekme aç',\n 'cmd.split_toggle': 'Görünümü böl / birleştir',\n 'split.pane': 'İkincil panel',\n 'split.close': 'Yan paneli kapat',\n 'split.error': 'Liste yüklenemedi',\n 'split.retry': 'Yeniden dene',\n 'split.copy_queued': 'Kopyalama kuyruğa alındı',\n 'split.cross_copy': 'Depolar farklı — kopyalama kuyruğa alındı',\n 'split.cross_failed': 'Depolar arası kopyalama bu sunucuda desteklenmiyor',\n /* === /wiring:d1 === */\n /* wiring:d2 — galeri görünümü */\n 'toolbar.view.gallery': 'Galeri',\n 'gallery.aria': 'Dosya galerisi',\n /* /wiring:d2 */\n /* wiring:d3 — Yorumlar (inspector node comments) */\n 'inspector.section.comments': 'Yorumlar',\n 'inspector.comments.empty': 'Henüz yorum yok.',\n 'inspector.comments.placeholder': 'Yorum yaz…',\n 'inspector.comments.send': 'Gönder',\n 'inspector.comments.delete': 'Yorumu sil',\n /* wiring:e2 — uçtan uca şifreli klasörler */\n 'e2e.create.title': 'Şifreli klasör oluştur',\n 'e2e.create.option': 'Şifreli klasör oluştur…',\n 'e2e.create.pw_placeholder': 'Klasör parolası (en az 8 karakter)',\n 'e2e.create.pw2_placeholder': 'Parolayı tekrar girin',\n 'e2e.create.warn_title': 'GERİ DÖNÜŞÜ YOK',\n 'e2e.create.warn_body':\n 'Dosyalar yalnız bu parolayla açılır. Parola sunucuda TUTULMAZ; unutursanız içerik sonsuza dek kaybolur. Kurtarma yolu yoktur — yönetici dahil kimse açamaz.',\n 'e2e.create.ack': 'Anladım: parolayı kaybedersem verilerim kurtarılamaz.',\n 'e2e.create.ack_required': 'Devam etmek için uyarıyı onaylayın.',\n 'e2e.create.pw_short': 'Parola en az 8 karakter olmalı.',\n 'e2e.create.pw_mismatch': 'Parolalar birbirini tutmuyor.',\n 'e2e.create.bad_name': 'Geçersiz klasör adı.',\n 'e2e.create.create': 'Şifreli klasörü oluştur',\n 'e2e.create.busy': 'Oluşturuluyor…',\n 'e2e.create.done': 'Şifreli klasör oluşturuldu',\n 'e2e.create.failed': 'Şifreli klasör oluşturulamadı',\n 'e2e.create.nested': 'Şifreli klasörün içine ikinci bir şifreli klasör açılamaz.',\n 'e2e.locked.title': 'Bu klasör uçtan uca şifreli',\n 'e2e.locked.hint': 'İçeriği görmek için klasör parolasını girin. Parola yalnız bu sekmede, bellekte tutulur.',\n 'e2e.locked.pw_placeholder': 'Klasör parolası',\n 'e2e.locked.unlock': 'Kilidi aç',\n 'e2e.locked.busy': 'Doğrulanıyor…',\n 'e2e.unlock.wrong': 'Parola yanlış.',\n 'e2e.unlock.marker_missing': 'Şifre dosyası (.filex-e2e.json) okunamadı.',\n 'e2e.strip.label': 'Şifreli klasör — kilit açık',\n 'e2e.strip.lock': 'Kilitle',\n 'e2e.locked_toast': 'Klasör kilitlendi',\n 'e2e.upload.too_big': '200 MB üstü dosyalar şifreli klasöre yüklenemez (MVP sınırı)',\n 'e2e.upload.locked': 'Önce klasörün kilidini açın',\n 'e2e.decrypting': 'Çözülüyor…',\n 'e2e.decrypt_failed': 'Dosya çözülemedi (parola değişmiş ya da dosya bozulmuş olabilir).',\n 'e2e.download.failed': 'Şifreli dosya indirilemedi.',\n /* /wiring:e2 */\n};\n","/** English UI strings. */\nexport const en: Record<string, string> = {\n 'toolbar.new_folder': 'New Folder',\n 'toolbar.upload': 'Upload',\n 'toolbar.search': 'Search',\n 'toolbar.search.placeholder': 'File name…',\n 'toolbar.view.list': 'List',\n 'toolbar.view.grid': 'Grid',\n 'toolbar.refresh': 'Refresh',\n 'toolbar.go_up': 'Up one level',\n\n 'ctx.open': 'Open',\n 'ctx.preview': 'Preview',\n 'ctx.download': 'Download',\n 'ctx.convert': 'Convert',\n 'ctx.rename': 'Rename',\n 'ctx.delete': 'Delete',\n 'ctx.delete_perm': 'Delete Permanently',\n 'ctx.restore': 'Restore',\n 'ctx.share': 'Share',\n 'ctx.move': 'Move',\n 'ctx.copy': 'Copy',\n 'ctx.cut': 'Cut',\n 'ctx.show_hidden': 'Show hidden files',\n 'ctx.hide_hidden': 'Hide hidden files',\n 'ctx.paste': 'Paste',\n 'ctx.info': 'Info',\n 'ctx.duplicate': 'Duplicate',\n 'ctx.new_file': 'New File',\n\n 'modal.delete.title': 'Delete?',\n 'modal.delete.message': '{count} item(s) will be moved to trash.',\n 'modal.delete.confirm': 'Move to Trash',\n 'modal.delete.cancel': 'Cancel',\n\n 'modal.rename.title': 'Rename',\n 'modal.rename.save': 'Save',\n 'modal.rename.cancel': 'Cancel',\n\n 'modal.newfolder.title': 'New Folder',\n 'modal.newfolder.placeholder': 'Folder name',\n 'modal.newfolder.create': 'Create',\n 'modal.newfolder.cancel': 'Cancel',\n\n 'modal.share.title': 'Share Link',\n 'modal.share.pin': 'PIN protected',\n 'modal.share.expires': 'Expires at',\n 'modal.share.max_downloads': 'Download limit',\n 'modal.share.create': 'Share',\n 'modal.share.cancel': 'Cancel',\n 'modal.share.copy': 'Copy',\n 'modal.share.url_copied': 'Link copied',\n 'modal.share.pin_copied': 'PIN copied',\n 'modal.share.cli_copied': 'CLI command copied',\n\n 'upload.progress': 'Uploading',\n 'upload.done': 'Done',\n 'upload.error': 'Error',\n 'upload.failed': 'Could not upload “{name}”',\n 'upload.aborted': 'Aborted',\n 'upload.cancel': 'Cancel',\n\n 'empty.folder': 'This folder is empty',\n 'empty.search': 'No results',\n 'loading': 'Loading…',\n\n 'notFound.title': 'Folder not found',\n 'notFound.desc': 'This folder does not exist, was moved, or you do not have access to it.',\n 'notFound.goRoot': 'Go to root folder',\n\n 'col.name': 'Name',\n 'col.size': 'Size',\n 'col.modified': 'Modified',\n 'col.type': 'Type',\n\n 'unit.bytes': 'B',\n 'unit.kb': 'KB',\n 'unit.mb': 'MB',\n 'unit.gb': 'GB',\n 'unit.tb': 'TB',\n\n 'breadcrumb.root': 'Root',\n 'breadcrumb.copy_path': 'Copy Path',\n 'breadcrumb.go_to_path': 'Go To Path',\n 'breadcrumb.path_placeholder': 'fileman/foo/bar',\n\n 'ops.copy': 'Copying',\n 'ops.move': 'Moving',\n 'ops.delete': 'Deleting',\n 'ops.queued': 'queued',\n 'ops.done': 'done',\n 'ops.error': 'error',\n\n 'node.trash': 'Trash',\n\n // ——— Rich viewer chrome ———\n 'viewer.open_in_new_tab': 'Open in New Tab',\n 'viewer.loading': 'Loading…',\n 'viewer.failed_to_load': 'Failed to load file',\n 'viewer.peer_not_installed': 'Optional viewer library is not installed. Install the peer dependency or use the download button.',\n 'viewer.format_unsupported_3d': 'This 3D format is not supported in the browser preview (model-viewer only reads .glb / .gltf / .usdz). Please download and open with a local tool.',\n 'viewer.zoom_in': 'Zoom in',\n 'viewer.zoom_out': 'Zoom out',\n 'viewer.fit_width': 'Fit width',\n 'viewer.next_page': 'Next page',\n 'viewer.prev_page': 'Previous page',\n 'viewer.page_n_of_m': 'Page {n} of {m}',\n 'viewer.tags': 'Tags',\n 'viewer.layers': 'Layers',\n 'viewer.toc': 'Contents',\n 'viewer.font_smaller': 'Smaller text',\n 'viewer.font_larger': 'Larger text',\n 'viewer.search': 'Search',\n 'viewer.download': 'Download',\n 'viewer.saving': 'Saving…',\n 'viewer.save': 'Save (Ctrl+S)',\n 'viewer.saved': 'Saved',\n 'viewer.save_error': 'Error',\n 'viewer.editor_loading': 'Loading editor…',\n 'viewer.no_preview': 'No preview for this file type yet.',\n 'viewer.edit': 'Edit',\n 'viewer.close': 'Close',\n 'presence.expand': 'Show names',\n 'presence.collapse': 'Collapse',\n 'viewer.save_annotations': 'Save annotations',\n 'viewer.annotations_on': 'Annotations: on',\n 'viewer.annotations_off': 'Annotations: off',\n 'viewer.read_only': 'Read only',\n 'viewer.csv_first_row_header': 'First row as header',\n 'viewer.csv_filter': 'Filter rows…',\n 'viewer.epub_prev': 'Previous',\n 'viewer.epub_next': 'Next',\n 'viewer.drawio.disabled': 'diagrams.net embed is not configured for this filex instance — operator must wire FILEX_DRAWIO_URL to enable the editor.',\n 'viewer.archive.entries': '{n} files',\n 'viewer.archive.empty': 'Archive is empty.',\n 'viewer.archive.error': 'Could not read archive contents.',\n 'viewer.name': 'Name',\n 'viewer.size': 'Size',\n\n // ——— cila:a — sorting / date groups / density ———\n 'col.sort': 'Sort',\n 'group.today': 'Today',\n 'group.yesterday': 'Yesterday',\n 'group.this_week': 'This Week',\n 'group.this_month': 'This Month',\n 'group.no_date': 'No date',\n 'toolbar.density.compact': 'Compact view',\n 'toolbar.density.comfortable': 'Comfortable view',\n\n // ——— cila:c — command palette + shortcuts help + breadcrumb ———\n 'palette.placeholder': 'Search files, folders or commands…',\n 'palette.files': 'Files',\n 'palette.commands': 'Commands',\n 'palette.goto': 'Go to path',\n 'palette.empty': 'No results',\n 'palette.hint': '↑↓ navigate · Enter select · Esc close',\n 'cmd.view_toggle': 'Toggle view (list ⇄ grid)',\n 'cmd.trash': 'Open trash',\n 'shortcuts.title': 'Keyboard Shortcuts',\n 'shortcuts.group.nav': 'Navigation',\n 'shortcuts.group.selection': 'Selection',\n 'shortcuts.group.file': 'File operations',\n 'shortcuts.palette': 'Command palette',\n 'shortcuts.search': 'Focus search',\n 'shortcuts.go_up': 'Go up one level',\n 'shortcuts.open': 'Open selected item',\n 'shortcuts.close': 'Close / cancel',\n 'shortcuts.toggle_hidden': 'Show/hide hidden files',\n 'shortcuts.help': 'This help dialog',\n 'shortcuts.select_all': 'Select all',\n 'shortcuts.rename': 'Rename',\n 'shortcuts.delete': 'Delete',\n 'shortcuts.cut': 'Cut',\n 'shortcuts.copy': 'Copy',\n 'shortcuts.paste': 'Paste',\n 'breadcrumb.more': 'Hidden folders',\n\n // ——— State screens + undo snackbar + connection badge (cila:b) ———\n 'empty.hint': 'Drag and drop files here',\n 'empty.upload': 'Upload files',\n 'empty.search.title': 'No files match your search',\n 'empty.search.hint': 'Try a different search term',\n 'empty.trash.title': 'Trash is empty',\n 'error.title': 'Could not load this folder',\n 'error.retry': 'Try again',\n 'toast.undo': 'Undo',\n 'toast.undone': 'Undone',\n 'toast.undo_failed': 'Could not undo',\n 'toast.renamed': 'Renamed',\n 'toast.moved': 'Moved',\n 'toast.trashed': 'Moved to trash',\n 'conn.offline': 'No live connection — changes may be delayed',\n 'conn.tooltip': 'Live connection to the server is unavailable; the list refreshes periodically. This notice disappears once the connection is back.',\n\n /* === bul:s3 === */\n 'palette.everywhere': 'Everywhere',\n 'palette.searching': 'Searching…',\n 'palette.saved': 'Saved searches',\n 'palette.save': 'Save search',\n 'palette.saved.delete': 'Delete saved search',\n 'search.in_content': 'In content',\n\n /* === bag:b4 === */\n 'toolbar.more': 'More actions',\n 'toolbar.search.close': 'Close search',\n 'sheet.menu': 'Actions',\n 'sheet.close': 'Close',\n\n /* === koru:k1 === */\n 'toolbar.inspector': 'Details',\n 'ctx.details': 'Details',\n 'shortcuts.inspector': 'Toggle details panel',\n 'inspector.title': 'Details',\n 'inspector.close': 'Close',\n 'inspector.section.general': 'General',\n 'inspector.section.versions': 'Versions',\n 'inspector.section.permissions': 'Permissions',\n 'inspector.section.shares': 'Shares',\n 'inspector.path': 'Path',\n 'inspector.size': 'Size',\n 'inspector.modified': 'Modified',\n 'inspector.mime': 'MIME type',\n 'inspector.etag': 'ETag',\n 'inspector.copy': 'Copy',\n 'inspector.copied': 'Copied',\n 'inspector.error': 'Could not load',\n 'inspector.items_summary': '{n} items, {size} total',\n 'inspector.folder_items': '{n} items',\n 'inspector.versions.empty': 'No version history',\n 'inspector.versions.v': 'Version {n}',\n 'inspector.versions.restore': 'Restore',\n 'inspector.versions.restore_confirm': 'Restore this version?',\n 'inspector.versions.snapshot_current': 'Snapshot the current state first',\n 'inspector.versions.confirm': 'Confirm',\n 'inspector.versions.cancel': 'Cancel',\n 'inspector.versions.take_snapshot': 'Snapshot current state',\n 'inspector.versions.restored': 'Version restored',\n 'inspector.versions.snapshotted': 'Snapshot taken',\n 'inspector.versions.unsupported': 'The server does not support this operation',\n 'inspector.perm.none': 'No access',\n 'inspector.perm.viewer': 'Viewer',\n 'inspector.perm.editor': 'Editor',\n 'inspector.perm.owner': 'Owner',\n 'inspector.perm.manage': 'Manage permissions',\n 'inspector.shares.empty': 'No share links',\n 'inspector.shares.copy': 'Copy link',\n\n /* wiring:c1 — theme gallery */\n 'theme.menu': 'Theme',\n 'theme.title': 'Theme Gallery',\n 'theme.hint': 'Themes only change the color palette; light/dark mode still applies separately.',\n 'theme.reset': 'Reset to default',\n 'theme.close': 'Close',\n 'theme.selected': 'Selected',\n 'theme.name.default': 'Default',\n 'theme.name.night': 'Night Blue',\n 'theme.name.forest': 'Forest',\n 'theme.name.amber': 'Amber',\n 'theme.name.lilac': 'Lilac',\n 'theme.name.contrast': 'High Contrast',\n 'theme.name.gray': 'Soft Gray',\n 'theme.name.terminal': 'Terminal Green',\n /* === wiring:c2 — customizable shortcuts + quick look === */\n 'shortcuts.quicklook': 'Quick look',\n 'shortcuts.customize': 'Customize',\n 'shortcuts.settings.menu': 'Shortcuts',\n 'shortcuts.settings.title': 'Shortcut Settings',\n 'shortcuts.settings.hint': 'To remap a shortcut, press \"Change\" and then the new key combination. Changes are stored in this browser only.',\n 'shortcuts.settings.change': 'Change',\n 'shortcuts.settings.capture': 'Press keys… (Esc cancels)',\n 'shortcuts.settings.reset': 'Reset to default',\n 'shortcuts.settings.reset_all': 'Reset all',\n 'shortcuts.settings.unbound': 'Not set',\n 'shortcuts.settings.fixed': 'Fixed',\n 'shortcuts.settings.customized': 'Customized',\n 'shortcuts.settings.conflict': 'is already used by \"{name}\".',\n 'shortcuts.settings.conflict_fixed': 'is reserved by the fixed shortcut \"{name}\" — it cannot be used.',\n 'shortcuts.settings.conflict_take': 'Unassign old and use here',\n 'shortcuts.settings.conflict_cancel': 'Cancel',\n 'quicklook.hint_close': 'close',\n 'quicklook.hint_nav': 'previous/next',\n 'quicklook.hint_open': 'open',\n /* === /wiring:c2 === */\n /* === wiring:c3 — operations center === */\n 'opc.title': 'Operations',\n 'opc.aria_badge': '{n} operations — toggle operations center',\n 'opc.close': 'Close',\n 'opc.active': 'In progress',\n 'opc.history': 'History',\n 'opc.clear': 'Clear',\n 'opc.empty': 'No operations',\n 'opc.cancel': 'Cancel',\n 'opc.retry': 'Retry',\n 'opc.dismiss': 'Dismiss',\n 'opc.queued': 'Queued',\n 'opc.percent': '{n}%',\n 'opc.status.running': 'In progress',\n 'opc.status.done': 'Done',\n 'opc.status.error': 'Failed',\n 'opc.status.aborted': 'Cancelled',\n 'opc.kind.upload': 'Upload',\n 'opc.kind.copy': 'Copy',\n 'opc.kind.move': 'Move',\n 'opc.kind.delete': 'Delete',\n 'opc.kind.convert': 'Convert',\n 'opc.kind.archive': 'Archive',\n /* === wiring:c4 — onboarding tour + accessibility + error card === */\n 'tour.aria': 'Onboarding tour',\n 'tour.restart': 'Restart the tour',\n 'tour.skip': 'Skip tour',\n 'tour.back': 'Back',\n 'tour.next': 'Next',\n 'tour.done': 'Done',\n 'tour.progress': '{n} / {m}',\n 'tour.step.nav.title': 'Storages & folders',\n 'tour.step.nav.desc':\n 'Your current location lives here. Click any crumb to jump back to parent folders or the storage root.',\n 'tour.step.upload.title': 'Upload files',\n 'tour.step.upload.desc':\n 'Pick files with this button — or simply drag & drop them anywhere in the window.',\n 'tour.step.search.title': 'Search',\n 'tour.step.search.desc':\n 'This box filters the current folder. The Ctrl+K command palette searches across all storages and runs commands.',\n 'tour.step.view.title': 'Switch views',\n 'tour.step.view.desc':\n 'Toggle between the list and grid layout; your choice is remembered.',\n 'tour.step.share.title': 'Sharing',\n 'tour.step.share.desc':\n 'Right-click any file and use \"Share / Permissions\" to create a link with an optional PIN and expiry.',\n 'tour.step.help.title': 'Shortcuts',\n 'tour.step.help.desc':\n 'Press ? for the shortcut cheat-sheet and Ctrl+K for the command palette. Replay this tour any time via \"Restart the tour\" in the menu.',\n 'error.hint': 'This may be a temporary network or server problem. Please try again.',\n 'error.details': 'Technical details',\n 'col.star': 'Star',\n 'toolbar.view_label': 'View',\n 'list.aria': 'File list',\n 'grid.aria': 'File grid',\n\n /* === wiring:d1 — tabs + split pane === */\n 'tabs.strip': 'Tabs',\n 'tabs.new': 'New tab',\n 'tabs.close': 'Close tab',\n 'tabs.split': 'Split view',\n 'tabs.split_off': 'Close split',\n 'ctx.open_new_tab': 'Open in new tab',\n 'shortcuts.group.tabs': 'Tabs',\n 'shortcuts.tab_new': 'New tab',\n 'shortcuts.tab_close': 'Close tab',\n 'shortcuts.tab_next': 'Next tab',\n 'shortcuts.tab_prev': 'Previous tab',\n 'cmd.tab_new': 'Open a new tab',\n 'cmd.split_toggle': 'Toggle split view',\n 'split.pane': 'Secondary pane',\n 'split.close': 'Close the side pane',\n 'split.error': 'Could not load the listing',\n 'split.retry': 'Retry',\n 'split.copy_queued': 'Copy queued',\n 'split.cross_copy': 'Different storages — copy queued instead',\n 'split.cross_failed': 'Cross-storage copy is not supported by this server',\n /* === /wiring:d1 === */\n /* wiring:d2 — gallery view */\n 'toolbar.view.gallery': 'Gallery',\n 'gallery.aria': 'File gallery',\n /* /wiring:d2 */\n /* wiring:d3 — inspector node comments */\n 'inspector.section.comments': 'Comments',\n 'inspector.comments.empty': 'No comments yet.',\n 'inspector.comments.placeholder': 'Write a comment…',\n 'inspector.comments.send': 'Send',\n 'inspector.comments.delete': 'Delete comment',\n /* wiring:e2 — end-to-end encrypted folders */\n 'e2e.create.title': 'Create encrypted folder',\n 'e2e.create.option': 'Create encrypted folder…',\n 'e2e.create.pw_placeholder': 'Folder password (min 8 characters)',\n 'e2e.create.pw2_placeholder': 'Repeat the password',\n 'e2e.create.warn_title': 'NO WAY BACK',\n 'e2e.create.warn_body':\n 'Files open ONLY with this password. The password is NEVER stored on the server; if you forget it the content is lost forever. There is no recovery — not even an admin can open it.',\n 'e2e.create.ack': 'I understand: if I lose the password my data cannot be recovered.',\n 'e2e.create.ack_required': 'Please confirm the warning to continue.',\n 'e2e.create.pw_short': 'Password must be at least 8 characters.',\n 'e2e.create.pw_mismatch': 'Passwords do not match.',\n 'e2e.create.bad_name': 'Invalid folder name.',\n 'e2e.create.create': 'Create encrypted folder',\n 'e2e.create.busy': 'Creating…',\n 'e2e.create.done': 'Encrypted folder created',\n 'e2e.create.failed': 'Could not create the encrypted folder',\n 'e2e.create.nested': 'You cannot create an encrypted folder inside another one.',\n 'e2e.locked.title': 'This folder is end-to-end encrypted',\n 'e2e.locked.hint': 'Enter the folder password to see its contents. The password stays in this tab’s memory only.',\n 'e2e.locked.pw_placeholder': 'Folder password',\n 'e2e.locked.unlock': 'Unlock',\n 'e2e.locked.busy': 'Verifying…',\n 'e2e.unlock.wrong': 'Wrong password.',\n 'e2e.unlock.marker_missing': 'Could not read the key file (.filex-e2e.json).',\n 'e2e.strip.label': 'Encrypted folder — unlocked',\n 'e2e.strip.lock': 'Lock',\n 'e2e.locked_toast': 'Folder locked',\n 'e2e.upload.too_big': 'Files over 200 MB cannot be uploaded to an encrypted folder (MVP limit)',\n 'e2e.upload.locked': 'Unlock the folder first',\n 'e2e.decrypting': 'Decrypting…',\n 'e2e.decrypt_failed': 'Could not decrypt the file (password changed or file corrupted).',\n 'e2e.download.failed': 'Could not download the encrypted file.',\n /* /wiring:e2 */\n};\n","/**\n * Locale message catalogue. The string-table is intentionally tiny — no\n * external i18n library, just a `t(key, vars?)` helper exposed via\n * `useLocale`.\n */\nimport { tr } from './tr';\nimport { en } from './en';\nimport type { LocaleCode } from '../types/ExplorerConfig';\n\nexport const messages: Record<LocaleCode, Record<string, string>> = { tr, en };\n\nexport { tr, en };\n","/**\n * useLocale — tr/en string table with a tiny `t()` helper.\n *\n * No i18n library — the catalogue is small enough to ship inline (see\n * src/locales).\n */\n\nimport { computed, type Ref } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { messages } from '../locales';\n\nexport function useLocale(localeRef: Ref<LocaleCode> | (() => LocaleCode)) {\n const lookup = computed(() => {\n const code = typeof localeRef === 'function' ? localeRef() : localeRef.value;\n return messages[code] ?? messages.tr;\n });\n\n function t(key: string, vars: Record<string, string | number> = {}): string {\n const raw = lookup.value[key] ?? key;\n return Object.entries(vars).reduce(\n (acc, [k, v]) => acc.replaceAll(`{${k}}`, String(v)),\n raw,\n );\n }\n\n function formatSize(bytes: number | undefined | null): string {\n if (bytes == null || bytes < 0) return '—';\n // A real zero (empty file / empty folder) is information, not absence.\n if (bytes === 0) return `0 ${t('unit.bytes')}`;\n const units: Array<[number, string]> = [\n [1024 ** 4, 'unit.tb'],\n [1024 ** 3, 'unit.gb'],\n [1024 ** 2, 'unit.mb'],\n [1024, 'unit.kb'],\n [1, 'unit.bytes'],\n ];\n for (const [div, key] of units) {\n if (bytes >= div) {\n const val = bytes / div;\n const rounded = val >= 100 ? Math.round(val) : val.toFixed(val >= 10 ? 1 : 2);\n return `${rounded} ${t(key)}`;\n }\n }\n return `${bytes} ${t('unit.bytes')}`;\n }\n\n /**\n * Render a FileNode's basename with locale-aware overrides:\n * - `.trash` directory → \"Çöp Kutusu\" / \"Trash\"\n * - Trash entries are stored as `<Ymd-His>-<rand>__<original>` so\n * listings inside .trash/ would otherwise show timestamps. Strip\n * that prefix so the user sees the original basename.\n */\n function nodeDisplayName(node: { basename: string }): string {\n if (node.basename === '.trash') return t('node.trash');\n const m = node.basename.match(/^\\d{8}-\\d{6}-[A-Za-z0-9]+__(.+)$/);\n if (m) return m[1];\n return node.basename;\n }\n\n return { t, formatSize, nodeDisplayName };\n}\n","/**\n * usePendingOps — track async copy/move/delete operations.\n *\n * Backend POST /files/{copy,move,delete} returns `{op}` immediately\n * (status='pending') and the actual S3 work runs in a worker. The\n * client polls `/files/ops` every 2s while there's anything still\n * pending or running so the user gets live feedback (\"3/5 kopyalandı\").\n *\n * Polling is reference-counted: callers `register(op)` after starting a\n * new op; an interval ticks while the registered set has any non-\n * terminal entries. Terminal ops (done/error) stay in the local cache\n * for `RETAIN_MS` so the UI can flash a final state before they fade\n * out, then a sweep removes them.\n */\n\nimport { computed, ref, onBeforeUnmount } from 'vue';\nimport type { ExplorerConfig } from '../types/ExplorerConfig';\nimport type { FileApi } from './useFileApi';\n\nexport interface PendingOp {\n id: number;\n op_type: 'copy' | 'move' | 'delete';\n status: 'pending' | 'running' | 'done' | 'error';\n progress_total: number;\n progress_done: number;\n target_path: string | null;\n source_dir: string | null;\n source_count: number;\n error_message: string | null;\n started_at: string | null;\n finished_at: string | null;\n created_at: string | null;\n}\n\nconst POLL_MS = 2000;\nconst RETAIN_MS = 8000;\n\n/**\n * normalizeOp maps the backend ops row (`{kind,total,done,failed,error,dest,\n * status:'ok'|'failed'|'partial'|…}`) onto the PendingOp contract the tray\n * renders (`{op_type,progress_total,progress_done,error_message,status:'done'|\n * 'error'|…}`). Without this the tray showed \"undefined/undefined\" for a\n * running op (progress_* were undefined) and never treated an 'ok'/'failed'\n * row as terminal. Tolerant of an already-normalized shape (idempotent).\n */\nfunction normalizeOp(raw: Record<string, unknown>): PendingOp {\n const num = (...vals: unknown[]): number => {\n for (const v of vals) if (typeof v === 'number') return v;\n return 0;\n };\n const str = (...vals: unknown[]): string | null => {\n for (const v of vals) if (typeof v === 'string' && v !== '') return v;\n return null;\n };\n const rawStatus = String(raw.status ?? 'pending');\n const status: PendingOp['status'] =\n rawStatus === 'ok' || rawStatus === 'done'\n ? 'done'\n : rawStatus === 'failed' || rawStatus === 'partial' || rawStatus === 'error'\n ? 'error'\n : rawStatus === 'running'\n ? 'running'\n : 'pending';\n const sources = Array.isArray(raw.sources) ? raw.sources : [];\n const opType = str(raw.op_type, raw.kind) ?? 'delete';\n return {\n id: num(raw.id),\n op_type: (opType === 'copy' || opType === 'move' ? opType : 'delete') as PendingOp['op_type'],\n status,\n progress_total: num(raw.progress_total, raw.total, sources.length),\n progress_done: num(raw.progress_done, raw.done),\n target_path: str(raw.target_path, raw.dest),\n source_dir: str(raw.source_dir),\n source_count: num(raw.source_count, sources.length),\n error_message: str(raw.error_message, raw.error),\n started_at: str(raw.started_at),\n finished_at: str(raw.finished_at),\n created_at: str(raw.created_at),\n };\n}\n\nexport interface UsePendingOpsOptions {\n /** Called once an op flips into a terminal state (done|error). */\n onSettled?: (op: PendingOp) => void;\n}\n\nexport function usePendingOps(\n config: ExplorerConfig,\n api: FileApi,\n opts: UsePendingOpsOptions = {},\n) {\n void config; // kept for future per-instance config knobs\n const ops = ref<PendingOp[]>([]);\n const announced = new Set<number>();\n const settledAt = new Map<number, number>();\n // First poll after mount returns the server's recent-history window\n // (last 5 min of done/error rows). Mark them announced silently and\n // skip the callback so we don't double-fire toasts on F5.\n let firstPollDone = false;\n\n const hasActive = computed(() =>\n ops.value.some((o) => o.status === 'pending' || o.status === 'running'),\n );\n\n let timer: ReturnType<typeof setInterval> | undefined;\n\n function startPolling() {\n if (timer) return;\n if (!api.endpoints.opsList) return;\n timer = setInterval(() => {\n void poll();\n }, POLL_MS);\n // Kick a poll right away.\n void poll();\n }\n\n function stopPolling() {\n if (timer) {\n clearInterval(timer);\n timer = undefined;\n }\n }\n\n async function poll(): Promise<void> {\n if (!api.endpoints.opsList) return;\n try {\n const res = await api.jsonFetch<{ ops: Record<string, unknown>[] }>(api.endpoints.opsList);\n const incoming = (res.ops || []).map(normalizeOp);\n\n for (const op of incoming) {\n if ((op.status === 'done' || op.status === 'error') && !announced.has(op.id)) {\n announced.add(op.id);\n settledAt.set(op.id, Date.now());\n if (firstPollDone) {\n opts.onSettled?.(op);\n }\n }\n }\n\n // Filter incoming: pending/running always; settled only if user\n // is currently seeing them in the local tray.\n const localIds = new Set(ops.value.map((o) => o.id));\n const visibleIncoming = incoming.filter((op) => {\n if (op.status === 'pending' || op.status === 'running') return true;\n if (!firstPollDone) return false;\n return localIds.has(op.id);\n });\n\n const visibleIds = new Set(visibleIncoming.map((o) => o.id));\n const local = ops.value.filter((o) => !visibleIds.has(o.id));\n const merged = [...visibleIncoming, ...local];\n\n firstPollDone = true;\n\n // Sweep: drop terminal ops past RETAIN_MS.\n const now = Date.now();\n const after = merged.filter((o) => {\n if (o.status === 'pending' || o.status === 'running') return true;\n const at = settledAt.get(o.id);\n return at !== undefined && now - at < RETAIN_MS;\n });\n ops.value = after;\n\n if (!hasActive.value && after.length === 0) {\n stopPolling();\n }\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[usePendingOps] poll failed:', err);\n }\n }\n\n function register(raw: PendingOp | Record<string, unknown>): void {\n const op = normalizeOp(raw as Record<string, unknown>);\n const exists = ops.value.some((o) => o.id === op.id);\n if (!exists) {\n ops.value = [op, ...ops.value];\n }\n startPolling();\n }\n\n function dismiss(id: number): void {\n ops.value = ops.value.filter((o) => o.id !== id);\n settledAt.delete(id);\n }\n\n onBeforeUnmount(() => {\n stopPolling();\n });\n\n return {\n ops,\n hasActive,\n register,\n dismiss,\n poll,\n startPolling,\n stopPolling,\n };\n}\n","// Realtime (WebSocket) client for filex live collaboration, bundled into the\n// core explorer so EVERY consumer — the native panel AND the vendored\n// webcomponent embedded in host apps — gets live folder updates + presence.\n//\n// Auth: the browser's native WebSocket can't set an Authorization header and,\n// when embedded, connects cross-origin to fm.brf.sh. So instead of a header we\n// fetch a short-lived, single-use TICKET through the host's normal API (which\n// injects the real token server-side) and open `wss://…/api/ws?ticket=<t>`.\n// The durable token never reaches the browser.\n//\n// Degradation: if the ticket or the socket is unavailable (old backend, blocked\n// upgrade, unsupported env), `onFallback(true)` fires so the consumer can fall\n// back to plain API polling. The page always keeps working — every send is\n// guarded, connect() is wrapped, reconnects are capped.\n\nexport interface PresenceUser {\n id: number;\n /** Stable identity key from the server (user id + optional per-end-user\n * presence key). Distinguishes end users sharing one proxy token — use it\n * for list keys and colours instead of `id`. */\n uid?: string;\n name: string;\n file?: string;\n}\n\nexport interface ChangeMessage {\n type: 'change';\n path: string;\n action: string; // create | delete | rename | move | upload | modify\n name?: string;\n new_name?: string;\n}\n\nexport interface PresenceMessage {\n type: 'presence';\n path: string;\n users: PresenceUser[];\n}\n\nexport interface WsTicket {\n ticket: string;\n ws_url: string;\n}\n\nexport interface RealtimeHandlers {\n onChange?: (msg: ChangeMessage) => void;\n onPresence?: (msg: PresenceMessage) => void;\n onStatus?: (connected: boolean) => void;\n /** Fires true when the live socket is unavailable (consumer should poll),\n * false when a live socket is (re)established. */\n onFallback?: (active: boolean) => void;\n}\n\nexport interface RealtimeOptions {\n /** Fetch a fresh ticket (single-use) via the host API. null → no live socket. */\n getTicket: () => Promise<WsTicket | null>;\n handlers: RealtimeHandlers;\n}\n\nconst PING_INTERVAL_MS = 25_000;\nconst MAX_BACKOFF_MS = 15_000;\nconst MAX_RETRIES = 6;\n\nexport class RealtimeClient {\n private ws: WebSocket | null = null;\n private opts: RealtimeOptions;\n private closed = false;\n private connecting = false;\n private retries = 0;\n private fallback = false;\n private pingTimer: ReturnType<typeof setInterval> | null = null;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n\n // Last-known intent, replayed on (re)connect.\n private currentPath: string | null = null;\n private currentFocus: string | null = null;\n\n constructor(opts: RealtimeOptions) {\n this.opts = opts;\n void this.connect();\n }\n\n /** Subscribe to a folder (\"<adapter>://<dir>\"). Swaps the active room and\n * resets focus. Passing null unsubscribes (drive list / trash have no room). */\n subscribe(path: string | null): void {\n this.currentPath = path;\n this.currentFocus = null;\n if (path) this.send({ type: 'subscribe', path });\n }\n\n /** Report the file the user is focused on (or null to clear). */\n setFocus(file: string | null): void {\n this.currentFocus = file;\n this.send({ type: 'focus', file });\n }\n\n /** Tear down permanently — call on unmount. */\n close(): void {\n this.closed = true;\n this.clearTimers();\n this.dropSocket();\n }\n\n private async connect(): Promise<void> {\n if (this.closed || this.connecting || this.ws) return;\n this.connecting = true;\n let ticket: WsTicket | null = null;\n try {\n ticket = await this.opts.getTicket();\n } catch {\n ticket = null;\n }\n this.connecting = false;\n if (this.closed) return;\n if (!ticket || !ticket.ticket || !ticket.ws_url) {\n this.fail();\n return;\n }\n\n const sep = ticket.ws_url.includes('?') ? '&' : '?';\n let ws: WebSocket;\n try {\n ws = new WebSocket(`${ticket.ws_url}${sep}ticket=${encodeURIComponent(ticket.ticket)}`);\n } catch {\n this.fail();\n return;\n }\n this.ws = ws;\n\n ws.onopen = () => {\n this.retries = 0;\n this.setFallback(false);\n this.opts.handlers.onStatus?.(true);\n if (this.currentPath) this.send({ type: 'subscribe', path: this.currentPath });\n if (this.currentFocus !== null) this.send({ type: 'focus', file: this.currentFocus });\n this.startPing();\n };\n\n ws.onmessage = (ev: MessageEvent) => {\n let msg: unknown;\n try {\n msg = JSON.parse(typeof ev.data === 'string' ? ev.data : '');\n } catch {\n return;\n }\n const m = msg as { type?: string };\n if (m?.type === 'change') this.opts.handlers.onChange?.(msg as ChangeMessage);\n else if (m?.type === 'presence') this.opts.handlers.onPresence?.(msg as PresenceMessage);\n // pong / error frames are intentionally ignored by the UI.\n };\n\n ws.onerror = () => {\n // onclose fires next; reconnect is handled there.\n };\n\n ws.onclose = () => {\n this.stopPing();\n this.ws = null;\n this.opts.handlers.onStatus?.(false);\n this.fail();\n };\n }\n\n // fail schedules a capped reconnect; after MAX_RETRIES it gives up on the live\n // socket and flips to fallback (polling) mode.\n private fail(): void {\n if (this.closed || this.reconnectTimer) return;\n if (this.retries >= MAX_RETRIES) {\n this.setFallback(true);\n return;\n }\n const delay = Math.min(1000 * 2 ** this.retries, MAX_BACKOFF_MS);\n this.retries += 1;\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n void this.connect();\n }, delay);\n }\n\n private setFallback(active: boolean): void {\n if (this.fallback === active) return;\n this.fallback = active;\n this.opts.handlers.onFallback?.(active);\n }\n\n private send(obj: unknown): void {\n const ws = this.ws;\n if (!ws || ws.readyState !== WebSocket.OPEN) return;\n try {\n ws.send(JSON.stringify(obj));\n } catch {\n /* a failed send just means a missed live update */\n }\n }\n\n private startPing(): void {\n this.stopPing();\n this.pingTimer = setInterval(() => this.send({ type: 'ping' }), PING_INTERVAL_MS);\n }\n\n private stopPing(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = null;\n }\n }\n\n private dropSocket(): void {\n if (this.ws) {\n try {\n this.ws.onclose = null; // suppress reconnect\n this.ws.close();\n } catch {\n /* ignore */\n }\n this.ws = null;\n }\n }\n\n private clearTimers(): void {\n this.stopPing();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n}\n","// useRealtime wires the folder-scoped live-collaboration layer (RealtimeClient)\n// into the explorer: it turns change events into a debounced soft reload, tracks\n// per-folder presence, and — when no live socket is available — falls back to\n// plain API polling so embedded/offline consumers still get near-live updates.\n//\n// The explorer calls start()/stop() on mount/unmount, subscribe() on folder\n// navigation, and setFocus() on selection; it binds presenceUsers into the UI.\n\nimport { ref, type Ref } from 'vue';\nimport { RealtimeClient, type PresenceUser, type PresenceMessage } from '../lib/realtime';\n\nconst RELOAD_DEBOUNCE_MS = 200;\nconst POLL_INTERVAL_MS = 12_000;\n\nexport interface RealtimeApi {\n wsTicket: () => Promise<{ ticket: string; ws_url: string } | null>;\n}\n\nexport function useRealtime(api: RealtimeApi, opts: { reload: () => void }) {\n const presenceUsers: Ref<PresenceUser[]> = ref([]);\n const connected = ref(false);\n // True while the live socket is unavailable and the polling fallback is\n // active — the explorer surfaces a small \"no live connection\" badge from it.\n // Stays false during ordinary reconnect attempts, so brief blips don't flash\n // the badge; only a genuinely given-up socket (RealtimeClient onFallback)\n // flips it.\n const degraded = ref(false);\n\n let client: RealtimeClient | null = null;\n let pendingSubscribe: string | null = null;\n let reloadTimer: ReturnType<typeof setTimeout> | null = null;\n let pollTimer: ReturnType<typeof setInterval> | null = null;\n\n function debouncedReload(): void {\n // A burst of change frames (e.g. a multi-file upload) collapses into one\n // soft reload of the current folder.\n if (reloadTimer) clearTimeout(reloadTimer);\n reloadTimer = setTimeout(() => {\n reloadTimer = null;\n opts.reload();\n }, RELOAD_DEBOUNCE_MS);\n }\n\n function onPresence(msg: PresenceMessage): void {\n // Ignore late frames for a folder we've already navigated away from.\n if (pendingSubscribe && msg.path && msg.path !== pendingSubscribe) return;\n presenceUsers.value = Array.isArray(msg.users) ? msg.users : [];\n }\n\n function onFallback(active: boolean): void {\n degraded.value = active;\n if (active) {\n // No live socket → poll the listing; presence isn't available here.\n presenceUsers.value = [];\n if (!pollTimer) pollTimer = setInterval(() => opts.reload(), POLL_INTERVAL_MS);\n } else if (pollTimer) {\n clearInterval(pollTimer);\n pollTimer = null;\n }\n }\n\n function start(): void {\n if (client) return;\n client = new RealtimeClient({\n getTicket: () => api.wsTicket(),\n handlers: {\n onChange: debouncedReload,\n onPresence,\n onFallback,\n onStatus: (c) => {\n connected.value = c;\n },\n },\n });\n }\n\n function subscribe(wire: string | null): void {\n presenceUsers.value = []; // drop the previous folder's roster immediately\n pendingSubscribe = wire;\n client?.subscribe(wire);\n }\n\n function setFocus(file: string | null): void {\n client?.setFocus(file);\n }\n\n function stop(): void {\n if (reloadTimer) {\n clearTimeout(reloadTimer);\n reloadTimer = null;\n }\n if (pollTimer) {\n clearInterval(pollTimer);\n pollTimer = null;\n }\n client?.close();\n client = null;\n degraded.value = false;\n }\n\n return { presenceUsers, connected, degraded, start, subscribe, setFocus, stop };\n}\n","// useThumbs — authenticated thumbnail loader for the grid view.\n//\n// The backend emits `thumb_url` as a ROOT-RELATIVE path (\"/api/files/thumb/{id}\").\n// A plain `<img src>` only works for the native same-origin SPA: an embedded\n// webcomponent resolves it against the HOST page's origin (work.brf.sh → 404)\n// and, even with the URL fixed, `<img>` cannot carry the bearer header a\n// proxied host (fishapp PWA) requires. So thumbs are fetched through the same\n// auth machinery as every API call (headers + credentials), cached as object\n// URLs, and handed to the grid; a failed fetch falls back to the file icon.\n\nimport { ref } from 'vue';\nimport type { FileNode } from '../types/FileNode';\n\ninterface ThumbApiSlice {\n authHeaders: (extra?: Record<string, string>) => Promise<Record<string, string>>;\n credentialsMode: () => RequestCredentials;\n}\n\n/** Cap the object-URL cache; beyond it oldest entries are revoked. Thumbs are\n * small (~KBs) so this is generous while still bounding a long session. */\nconst MAX_CACHED = 500;\n\nexport function useThumbs(apiBase: string | undefined, api: ThumbApiSlice) {\n const urls = ref<Record<string, string>>({});\n const order: string[] = [];\n const failed = new Set<string>();\n const pending = new Set<string>();\n\n function resolveUrl(raw: string): string {\n if (/^https?:\\/\\//i.test(raw)) return raw;\n const base = (apiBase || '').replace(/\\/+$/, '');\n return base && raw.startsWith('/') ? base + raw : raw;\n }\n\n /** Reactive: returns the loaded object URL for the node's thumb, kicking off\n * the fetch on first sight. null = not (yet) available → show the icon. */\n function src(n: FileNode): string | null {\n const raw = n.thumb_url;\n if (!raw) return null;\n const got = urls.value[raw];\n if (got) return got;\n if (!failed.has(raw) && !pending.has(raw)) void load(raw);\n return null;\n }\n\n async function load(raw: string): Promise<void> {\n pending.add(raw);\n try {\n const res = await fetch(resolveUrl(raw), {\n headers: await api.authHeaders({ Accept: '*/*' }),\n credentials: api.credentialsMode(),\n });\n if (!res.ok) throw new Error(String(res.status));\n const blob = await res.blob();\n if (order.length >= MAX_CACHED) {\n const evict = order.shift();\n if (evict && urls.value[evict]) {\n URL.revokeObjectURL(urls.value[evict]);\n const next = { ...urls.value };\n delete next[evict];\n urls.value = next;\n }\n }\n order.push(raw);\n urls.value = { ...urls.value, [raw]: URL.createObjectURL(blob) };\n } catch {\n // 404 (thumb evicted server-side) or auth hiccup — icon fallback, and we\n // don't retry within this session to avoid hammering.\n failed.add(raw);\n } finally {\n pending.delete(raw);\n }\n }\n\n return { src };\n}\n","/**\n * useMonacoLoader — fire-and-forget Monaco preloader.\n *\n * The preview/edit flow wants Monaco when available (best-in-class\n * editor) and highlight.js for read-only syntax colour as a graceful\n * fallback. Monaco is heavy (~5 MB), so we kick off the dynamic import\n * at module-init time — by the time the user clicks \"edit\" on a code\n * file (typically several seconds in), the chunk is already cached.\n *\n * - `monacoPromise` resolves to the Monaco namespace, or `null`\n * if the package is not installed (peer\n * missing) / load fails.\n * - `highlightPromise` resolves to the highlight.js export, or\n * `null` similarly.\n * - `getMonaco()` returns the cached module synchronously\n * (after `await monacoPromise`) so a click\n * handler doesn't re-trigger the import.\n *\n * Both modules are externalized in the bundler config — the consumer\n * either declares them as direct deps (Monaco UX) or doesn't (the\n * highlight.js read-only path takes over). No build-time hard dep here.\n */\n\nlet monacoPromise: Promise<unknown | null> | null = null;\nlet highlightPromise: Promise<unknown | null> | null = null;\nlet monacoCached: unknown | null = null;\nlet highlightCached: unknown | null = null;\n\n/**\n * Kick off the Monaco import the first time someone calls\n * `preloadEditor()` (typically the FileExplorer onMounted hook). Cheap\n * to call repeatedly — only the first call actually triggers the\n * dynamic import.\n */\nexport function preloadEditor(): void {\n if (!monacoPromise) {\n monacoPromise = import(/* @vite-ignore */ 'monaco-editor')\n .then((mod) => {\n monacoCached = (mod as { default?: unknown }).default ?? mod;\n return monacoCached;\n })\n .catch(() => {\n monacoCached = null;\n return null;\n });\n }\n if (!highlightPromise) {\n highlightPromise = import(/* @vite-ignore */ 'highlight.js')\n .then((mod) => {\n highlightCached = (mod as { default?: unknown }).default ?? mod;\n return highlightCached;\n })\n .catch(() => {\n highlightCached = null;\n return null;\n });\n }\n}\n\n/**\n * Resolve Monaco. If preload hasn't been kicked off yet, this triggers\n * it (and pays the load cost on the spot). Returns `null` when the\n * package isn't installed.\n */\nexport async function ensureMonaco(): Promise<unknown | null> {\n if (!monacoPromise) preloadEditor();\n return monacoPromise!;\n}\n\nexport async function ensureHighlight(): Promise<unknown | null> {\n if (!highlightPromise) preloadEditor();\n return highlightPromise!;\n}\n\n/** Synchronous cached lookup — null if Monaco not yet ready or absent. */\nexport function getMonaco(): unknown | null {\n return monacoCached;\n}\n\nexport function getHighlight(): unknown | null {\n return highlightCached;\n}\n\n/**\n * Composable wrapper — components that want reactive \"is Monaco ready\n * yet?\" semantics can read the resolved promise. The implementation is\n * intentionally tiny: components don't need anything fancier than\n * `await ensureMonaco()` inside the click handler.\n */\nexport function useMonacoLoader() {\n preloadEditor();\n return {\n ensureMonaco,\n ensureHighlight,\n getMonaco,\n getHighlight,\n };\n}\n","<script setup lang=\"ts\">\n// PresenceBar — compact avatar strip showing who else is viewing the current\n// folder, and (as a small badge) which file each person is focused on. The\n// server already excludes the recipient from the roster (presence answers\n// \"who ELSE is here\"); the optional selfId filter remains as a belt-and-braces\n// for older backends. Purely presentational; the live data comes from the\n// realtime presence stream.\n\nimport { computed, ref } from 'vue';\nimport type { PresenceUser } from '../lib/realtime';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\n\nconst props = defineProps<{\n users: PresenceUser[];\n selfId?: number | null;\n locale?: LocaleCode;\n}>();\n\nconst { t } = useLocale(() => props.locale ?? 'tr');\n\nconst others = computed(() =>\n (props.users ?? []).filter((u) => props.selfId == null || u.id !== props.selfId),\n);\n\n// Compact (avatar strip) ⇄ expanded (scrollable name chips). With many users\n// the strip collapses to \"+N\", so the expanded mode is how you actually READ\n// who is here; the choice sticks for the session via localStorage.\nconst EXPAND_KEY = 'filex.presence.expanded';\nconst expanded = ref<boolean>((() => {\n try {\n return localStorage.getItem(EXPAND_KEY) === '1';\n } catch {\n return false;\n }\n})());\nfunction toggleExpanded(): void {\n expanded.value = !expanded.value;\n try {\n localStorage.setItem(EXPAND_KEY, expanded.value ? '1' : '0');\n } catch {\n /* private mode — session-only */\n }\n}\n\n// Stable key per identity: end users behind one shared proxy token have the\n// same numeric id but distinct server-issued uids.\nfunction keyOf(u: PresenceUser): string {\n return u.uid ?? String(u.id);\n}\n\nfunction initials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '?';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n}\n\n// Deterministic hue per identity so the same person keeps the same colour.\nfunction hue(u: PresenceUser): number {\n const s = keyOf(u);\n let h = 0;\n for (let i = 0; i < s.length; i++) h = (h * 31 + s.charCodeAt(i)) >>> 0;\n return h % 360;\n}\n\nfunction label(u: PresenceUser): string {\n return u.file ? `${u.name} · ${u.file}` : u.name;\n}\n</script>\n\n<template>\n <div v-if=\"others.length\" class=\"fx-presence\" :class=\"{ 'fx-presence--wide': expanded }\">\n <!-- Expanded: every user as an avatar+name chip in a horizontally\n scrollable row — names stay fully readable however many join. -->\n <div v-if=\"expanded\" class=\"fx-presence-chips\">\n <span\n v-for=\"u in others\"\n :key=\"keyOf(u)\"\n class=\"fx-presence-chip\"\n :title=\"label(u)\"\n >\n <span\n class=\"fx-presence-avatar\"\n :style=\"{ backgroundColor: `hsl(${hue(u)} 60% 45%)` }\"\n >\n {{ initials(u.name) }}\n <span v-if=\"u.file\" class=\"fx-presence-dot\" aria-hidden=\"true\"></span>\n </span>\n <span class=\"fx-presence-chip-name\">{{ u.name }}</span>\n <span v-if=\"u.file\" class=\"fx-presence-chip-file\">· {{ u.file }}</span>\n </span>\n </div>\n\n <!-- Compact: the classic overlapping avatar strip. -->\n <template v-else>\n <div class=\"fx-presence-avatars\" :title=\"others.map(label).join(', ')\">\n <span\n v-for=\"u in others.slice(0, 5)\"\n :key=\"keyOf(u)\"\n class=\"fx-presence-avatar\"\n :style=\"{ backgroundColor: `hsl(${hue(u)} 60% 45%)` }\"\n :title=\"label(u)\"\n >\n {{ initials(u.name) }}\n <span v-if=\"u.file\" class=\"fx-presence-dot\" aria-hidden=\"true\"></span>\n </span>\n <span v-if=\"others.length > 5\" class=\"fx-presence-more\">+{{ others.length - 5 }}</span>\n </div>\n <span class=\"fx-presence-text\" :title=\"others.map(label).join(', ')\">\n {{ others.length === 1 ? others[0].name : `${others.length} kişi` }}\n <template v-if=\"others.length === 1 && others[0].file\">\n · <span class=\"fx-presence-file\">{{ others[0].file }}</span>\n </template>\n </span>\n </template>\n\n <button\n type=\"button\"\n class=\"fx-presence-toggle\"\n :title=\"expanded ? t('presence.collapse') : t('presence.expand')\"\n :aria-expanded=\"expanded\"\n @click=\"toggleExpanded\"\n >{{ expanded ? '‹' : '›' }}</button>\n </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n this CSS does not match the one Vue stamps onto the DOM — so every rule\n here silently stopped applying. Measured in the desktop app: the share\n dialog had `position: static`, no background and no radius, i.e. raw\n unstyled HTML, in EVERY embedded surface.\n Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n there is nothing here that can leak into a host page. */\n.fx-presence {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n max-width: 100%;\n}\n.fx-presence-avatars {\n display: inline-flex;\n align-items: center;\n}\n.fx-presence-avatar {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.5rem;\n height: 1.5rem;\n margin-left: -0.4rem;\n border-radius: 9999px;\n border: 2px solid var(--fx-presence-ring, #ffffff);\n color: #fff;\n font-size: 0.6rem;\n font-weight: 600;\n line-height: 1;\n user-select: none;\n}\n.fx-presence-avatar:first-child {\n margin-left: 0;\n}\n.fx-presence-dot {\n position: absolute;\n right: -1px;\n bottom: -1px;\n width: 0.5rem;\n height: 0.5rem;\n border-radius: 9999px;\n background: #22c55e; /* green — actively focused on a file */\n border: 1.5px solid var(--fx-presence-ring, #ffffff);\n}\n.fx-presence-more {\n margin-left: 0.15rem;\n font-size: 0.7rem;\n color: rgb(113 113 122); /* zinc-500 */\n}\n.fx-presence--wide {\n flex: 1 1 auto;\n min-width: 0;\n}\n.fx-presence-chips {\n display: flex;\n align-items: center;\n gap: 0.4rem;\n overflow-x: auto;\n min-width: 0;\n padding-bottom: 2px; /* keep the scrollbar off the chips */\n scrollbar-width: thin;\n}\n.fx-presence-chip {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n flex: 0 0 auto;\n padding: 0.15rem 0.5rem 0.15rem 0.2rem;\n border-radius: 9999px;\n background: rgb(244 244 245); /* zinc-100 */\n font-size: 0.75rem;\n color: rgb(63 63 70); /* zinc-700 */\n white-space: nowrap;\n}\n.fx-presence-chip .fx-presence-avatar {\n margin-left: 0;\n}\n.fx-presence-chip-name {\n font-weight: 500;\n}\n.fx-presence-chip-file {\n color: rgb(113 113 122); /* zinc-500 */\n max-width: 12rem;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.fx-presence-toggle {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.25rem;\n height: 1.25rem;\n border: none;\n border-radius: 9999px;\n background: transparent;\n color: rgb(113 113 122); /* zinc-500 */\n font-size: 0.9rem;\n line-height: 1;\n cursor: pointer;\n}\n.fx-presence-toggle:hover {\n background: rgb(228 228 231); /* zinc-200 */\n color: rgb(63 63 70);\n}\n.dark .fx-presence-chip {\n background: rgb(39 39 42); /* zinc-800 */\n color: rgb(212 212 216); /* zinc-300 */\n}\n.dark .fx-presence-toggle:hover {\n background: rgb(39 39 42);\n color: rgb(212 212 216);\n}\n.fx-presence-text {\n font-size: 0.75rem;\n color: rgb(113 113 122); /* zinc-500 */\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 14rem;\n}\n.fx-presence-file {\n color: rgb(82 82 91); /* zinc-600 */\n font-weight: 500;\n}\n.dark .fx-presence-avatar,\n.dark .fx-presence-dot {\n --fx-presence-ring: #18181b; /* zinc-900 */\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * ContextMenu — Teleport-based menu.\n *\n * Teleported under <body> so no parent (Ionic <ion-page>, Filament's\n * transformed flex containers, panel sidebars, …) can shift the\n * `position: fixed` backdrop off-window.\n */\nimport { ref, computed, onMounted, onBeforeUnmount, nextTick } from 'vue';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport type { FileNode } from '../types/FileNode';\nimport { useLocale } from '../composables/useLocale';\n\nexport interface ContextAction {\n key: string;\n label: string;\n icon?: string;\n danger?: boolean;\n disabled?: boolean;\n hidden?: boolean;\n divider?: boolean;\n}\n\nconst props = defineProps<{\n locale: LocaleCode;\n actions: ContextAction[];\n /**\n * Resolved theme. Teleported into <body> we lose the `.fe` parent\n * that scopes CSS vars, so we tag the backdrop with the current\n * theme so variables.css can re-apply dark overrides outside the\n * explorer tree.\n */\n theme?: ThemeMode;\n /**\n * bag:b4 — bottom-sheet presentation for coarse-pointer (touch)\n * contexts. When true the menu renders as a full-width sheet sliding\n * up from the bottom edge (grab handle, ≥44px touch targets; closed\n * by overlay tap, dragging the handle down, or Esc). The position\n * passed to show() is ignored. When absent/false the classic anchored\n * menu renders — desktop right-click behavior is untouched.\n */\n sheet?: boolean;\n}>();\n\nconst emit = defineEmits<{\n (e: 'select', action: ContextAction, target: FileNode[]): void;\n}>();\n\nconst { t } = useLocale(() => props.locale); // bag:b4 — sheet aria labels need t()\n\nconst open = ref(false);\nconst x = ref(0);\nconst y = ref(0);\nconst targetNodes = ref<FileNode[]>([]);\nconst menuEl = ref<HTMLElement | null>(null);\n\n/* wiring:c4 — where the pointer opened the menu; kept separate from x/y so\n * the edge-flip can re-anchor ABOVE/LEFT of the cursor instead of merely\n * clamping (a clamp near the bottom edge used to leave the menu covering\n * the clicked row). */\nlet anchorX = 0;\nlet anchorY = 0;\n/* wiring:c4 — focus restore: whatever had focus before the menu opened gets\n * it back on hide, so keyboard users don't fall back to <body>. */\nlet prevFocus: HTMLElement | null = null;\n\nasync function show(ev: { clientX: number; clientY: number }, nodes: FileNode[]) {\n prevFocus = (document.activeElement as HTMLElement | null) ?? null; /* wiring:c4 */\n open.value = true;\n x.value = ev.clientX;\n y.value = ev.clientY;\n anchorX = ev.clientX; /* wiring:c4 */\n anchorY = ev.clientY; /* wiring:c4 */\n targetNodes.value = nodes;\n // After the menu renders, clamp it inside the viewport so a click near the\n // bottom/right edge doesn't push the menu off-screen (it opens down-right\n // from the cursor by default).\n await nextTick();\n if (props.sheet) {\n // bag:b4 — sheet mode: no anchoring; focus the panel so Esc closes it\n // without requiring a prior click inside.\n sheetEl.value?.focus();\n return;\n }\n clampToViewport();\n focusItem(0); /* wiring:c4 — keyboard nav starts on the first item */\n}\n\nfunction clampToViewport() {\n const el = menuEl.value;\n if (!el || typeof window === 'undefined') return;\n const rect = el.getBoundingClientRect();\n const margin = 8;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n /* wiring:c4 — edge flip: overflowing the bottom/right edge re-anchors the\n * menu above/left of the cursor when there's room; clamping stays as the\n * fallback for tiny viewports. */\n if (anchorY + rect.height > vh - margin) {\n const flipped = anchorY - rect.height;\n y.value = flipped >= margin ? flipped : Math.max(margin, vh - rect.height - margin);\n }\n if (anchorX + rect.width > vw - margin) {\n const flipped = anchorX - rect.width;\n x.value = flipped >= margin ? flipped : Math.max(margin, vw - rect.width - margin);\n }\n}\n\nfunction hide() {\n open.value = false;\n /* bag:b4 — reset any in-flight sheet drag so reopening starts clean. */\n sheetDragging.value = false;\n sheetDragY.value = 0;\n /* wiring:c4 — give focus back to the opener (row/card/⋯ button). */\n prevFocus?.focus?.();\n prevFocus = null;\n}\n\n/* === wiring:c4 — keyboard navigation (menu + sheet) ===\n * Arrow keys cycle through enabled items, Home/End jump, Enter/Space\n * activate the focused <button> natively, Esc closes (see onKey). Disabled\n * buttons are unfocusable, so the query skips them by construction. */\nfunction menuItems(): HTMLElement[] {\n const host = props.sheet ? sheetEl.value : menuEl.value;\n if (!host) return [];\n return Array.from(\n host.querySelectorAll<HTMLElement>('.fe-ctx__item:not(:disabled)'),\n );\n}\n\nfunction focusItem(idx: number) {\n const items = menuItems();\n if (items.length === 0) return;\n const i = ((idx % items.length) + items.length) % items.length;\n items[i]?.focus();\n}\n\nfunction moveFocus(delta: number) {\n const items = menuItems();\n if (items.length === 0) return;\n const active = document.activeElement as HTMLElement | null;\n const cur = active ? items.indexOf(active) : -1;\n if (cur === -1) {\n focusItem(delta > 0 ? 0 : items.length - 1);\n return;\n }\n focusItem(cur + delta);\n}\n/* === /wiring:c4 === */\n\n/* bag:b4 — sheet drag-to-dismiss. Bound to the grab handle only, so the\n * scrollable item list keeps its native touch scrolling. Dragging past the\n * threshold closes; anything less snaps back. */\nconst sheetEl = ref<HTMLElement | null>(null);\nconst sheetDragging = ref(false);\nconst sheetDragY = ref(0);\nlet sheetDragStart = 0;\n\nfunction onSheetDragStart(e: TouchEvent) {\n const t0 = e.touches[0];\n if (!t0) return;\n sheetDragging.value = true;\n sheetDragStart = t0.clientY;\n sheetDragY.value = 0;\n}\nfunction onSheetDragMove(e: TouchEvent) {\n if (!sheetDragging.value) return;\n const t0 = e.touches[0];\n if (!t0) return;\n sheetDragY.value = Math.max(0, t0.clientY - sheetDragStart);\n}\nfunction onSheetDragEnd() {\n if (!sheetDragging.value) return;\n const shouldClose = sheetDragY.value > 72;\n sheetDragging.value = false;\n if (shouldClose) {\n hide();\n } else {\n sheetDragY.value = 0;\n }\n}\nconst sheetStyle = computed(() =>\n sheetDragY.value > 0\n ? { transform: `translateY(${sheetDragY.value}px)`, transition: 'none' }\n : undefined,\n);\n/* /bag:b4 */\n\nfunction pick(a: ContextAction) {\n if (a.disabled) return;\n emit('select', a, targetNodes.value);\n hide();\n}\n\nfunction onKey(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n // Scoped close: Esc with the menu open closes ONLY the menu — the\n // explorer's global onClose (which also dismisses modals/toasts)\n // shouldn't fire underneath.\n e.stopPropagation();\n hide();\n return;\n }\n if (e.key === 'Enter' || e.key === ' ') {\n // Native button activation handles the pick; stop the bubble so the\n // explorer's global Enter=open shortcut doesn't double-fire and pop\n // the preview modal on top of the chosen action.\n e.stopPropagation();\n return;\n }\n /* wiring:c4 — arrow-key navigation; stopPropagation keeps the explorer's\n * global shortcut handler (Enter=open, Backspace=up…) out of the loop\n * while the menu is up. */\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n e.stopPropagation();\n moveFocus(1);\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n e.stopPropagation();\n moveFocus(-1);\n } else if (e.key === 'Home') {\n e.preventDefault();\n focusItem(0);\n } else if (e.key === 'End') {\n e.preventDefault();\n focusItem(-1);\n } else if (e.key === 'Tab') {\n // A menu is not a tab-stop container — Tab closes it (WAI-ARIA menu\n // pattern) instead of tabbing behind the backdrop.\n e.preventDefault();\n hide();\n }\n}\n\n/* wiring:c4 — hidden-entry filtering used to leave orphaned separators\n * (leading/trailing/doubled) when the entries around a divider were hidden\n * by RBAC or selection shape. Collapse them here so every visible divider\n * actually separates two groups. */\nconst visibleActions = computed(() => {\n const vis = props.actions.filter((a) => !a.hidden);\n const out: ContextAction[] = [];\n for (const a of vis) {\n if (a.divider && (out.length === 0 || out[out.length - 1].divider)) continue;\n out.push(a);\n }\n while (out.length > 0 && out[out.length - 1].divider) out.pop();\n return out;\n});\n\nconst prefersDark = ref(false);\nlet mq: MediaQueryList | undefined;\nfunction syncPrefersDark(e?: MediaQueryListEvent | MediaQueryList) {\n prefersDark.value = !!(e && 'matches' in e && e.matches);\n}\nonMounted(() => {\n if (typeof window === 'undefined') return;\n mq = window.matchMedia('(prefers-color-scheme: dark)');\n syncPrefersDark(mq);\n mq.addEventListener?.('change', syncPrefersDark);\n});\nonBeforeUnmount(() => {\n mq?.removeEventListener?.('change', syncPrefersDark);\n});\n\nconst themeClass = computed(() => {\n const t = props.theme || 'auto';\n return `fe-ctx-backdrop--theme-${t}`;\n});\n\ndefineExpose({ show, hide });\n</script>\n\n<template>\n <Teleport to=\"body\">\n <transition :name=\"sheet ? 'fe-sheet' : 'fe-ctx'\">\n <div\n v-if=\"open\"\n class=\"fe-ctx-backdrop\"\n :class=\"[themeClass, { 'fe-ctx-backdrop--sheet': sheet }]\"\n :data-prefers-dark=\"prefersDark ? '1' : '0'\"\n @click=\"hide\"\n @contextmenu.prevent=\"hide\"\n @keydown=\"onKey\"\n >\n <!-- bag:b4 — bottom-sheet variant (coarse pointer / touch) -->\n <div\n v-if=\"sheet\"\n ref=\"sheetEl\"\n class=\"fe-sheet\"\n role=\"menu\"\n :aria-label=\"t('sheet.menu')\"\n tabindex=\"-1\"\n :style=\"sheetStyle\"\n @click.stop\n >\n <div\n class=\"fe-sheet__handle\"\n role=\"button\"\n tabindex=\"0\"\n :aria-label=\"t('sheet.close')\"\n @click=\"hide\"\n @keydown.enter.prevent=\"hide\"\n @touchstart.passive=\"onSheetDragStart\"\n @touchmove.passive=\"onSheetDragMove\"\n @touchend=\"onSheetDragEnd\"\n @touchcancel=\"onSheetDragEnd\"\n />\n <div class=\"fe-sheet__items\">\n <template v-for=\"(a, i) in visibleActions\" :key=\"a.key || i\">\n <div v-if=\"a.divider\" class=\"fe-ctx__sep\" role=\"separator\" />\n <button\n v-else\n type=\"button\"\n class=\"fe-ctx__item fe-sheet__item\"\n :class=\"{ 'is-danger': a.danger, 'is-disabled': a.disabled }\"\n :disabled=\"a.disabled\"\n role=\"menuitem\"\n @click=\"pick(a)\"\n >\n <span v-if=\"a.icon\" class=\"fe-ctx__icon\" aria-hidden=\"true\">{{ a.icon }}</span>\n <span class=\"fe-ctx__label\">{{ a.label }}</span>\n </button>\n </template>\n </div>\n </div>\n <div\n v-else\n ref=\"menuEl\"\n class=\"fe-ctx\"\n role=\"menu\"\n aria-orientation=\"vertical\"\n :aria-label=\"t('sheet.menu') /* wiring:c4 */\"\n :style=\"{ top: y + 'px', left: x + 'px' }\"\n @click.stop\n >\n <template v-for=\"(a, i) in visibleActions\" :key=\"a.key || i\">\n <div v-if=\"a.divider\" class=\"fe-ctx__sep\" role=\"separator\" />\n <button\n v-else\n type=\"button\"\n class=\"fe-ctx__item\"\n :class=\"{ 'is-danger': a.danger, 'is-disabled': a.disabled }\"\n :disabled=\"a.disabled\"\n role=\"menuitem\"\n @click=\"pick(a)\"\n >\n <span v-if=\"a.icon\" class=\"fe-ctx__icon\" aria-hidden=\"true\">{{ a.icon }}</span>\n <span class=\"fe-ctx__label\">{{ a.label }}</span>\n </button>\n </template>\n </div>\n </div>\n </transition>\n </Teleport>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Toolbar — selection-aware action row.\n *\n * Layout:\n * - No selection → [📁 Yeni Klasör] [search | ⬆ ↻] [☰ ▦]\n * - 1 file selected → [👁 ⬇ 🔗 ✎ 🗑] [search | ⬆ ↻] [☰ ▦]\n * - 1 folder selected → [↗ ✎ 🗑] [search | ⬆ ↻] [☰ ▦]\n * - Multi selection → [✂ ❐ 🗑] [search | ⬆ ↻] [☰ ▦]\n *\n * Presentational only — all logic (rename, share, …) lives in\n * FileExplorer.vue, which listens for `action` emits.\n */\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport type { ViewMode } from '../types/FileNode';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport ContextMenu, { type ContextAction } from './ContextMenu.vue';\nimport { useLocale } from '../composables/useLocale';\n\nexport type SelectionMode = 'none' | 'single-file' | 'single-dir' | 'multi';\n\nconst props = defineProps<{\n viewMode: ViewMode;\n searchQuery: string;\n /**\n * Tells the toolbar which action set to render (a `.trash/` listing\n * gets a restore-only menu instead of cut/copy/etc).\n */\n trashActive: boolean;\n /**\n * The action list to render, supplied by FileExplorer. This is the SAME\n * list the right-click context menu renders for the current selection, so\n * the two menus can never drift apart. Dividers/hidden entries are filtered\n * out here (the toolbar is a flat row).\n */\n actions: ContextAction[];\n /** Current selection metadata — toolbar uses this to pick its mode. */\n selectionMode?: SelectionMode;\n /** True when clipboard has cut/copy items, so we can enable Paste. */\n pasteEnabled?: boolean;\n /** True when the universal converter (FILEX_CONVERT_URL) is available. */\n convertEnabled?: boolean;\n /**\n * True when the current dir has a parent the user can step up to.\n * Hidden at storage root because there's nothing above it.\n */\n canGoUp?: boolean;\n /**\n * Multi-storage virtual root marker — when true, mutation buttons\n * (New Folder / Upload / Paste) are hidden because there's no real\n * backend folder to write to.\n */\n atVirtualRoot?: boolean;\n /**\n * RBAC: false hides the write affordances (New Folder / Upload / Paste) when\n * the current user lacks edit on this directory. Undefined = no RBAC gating\n * (backward-compatible for embedders that don't pass it).\n */\n canWrite?: boolean;\n locale: LocaleCode;\n /**\n * bag:b4 — narrow/embed mini mode. When true the toolbar collapses to\n * [↑?] [🔍] [⬆] [⋯]: secondary actions (New Folder, Refresh, density,\n * view switcher, selection actions, Paste) move into the \"⋯\" overflow\n * menu and search expands from an icon to a full-width input. When\n * absent/false the classic wide layout renders unchanged.\n */\n narrow?: boolean;\n /**\n * bag:b4 — resolved theme, forwarded to the teleported overflow menu\n * (which loses the `.fe` variable scope under <body>).\n */\n theme?: ThemeMode;\n /* koru:k1 — inspector (details panel) toggle state, for the pressed style. */\n inspectorOpen?: boolean;\n}>();\n\nconst emit = defineEmits<{\n (e: 'update:viewMode', v: ViewMode): void;\n (e: 'update:searchQuery', v: string): void;\n (e: 'new-folder'): void;\n (e: 'upload'): void;\n (e: 'refresh'): void;\n (e: 'go-up'): void;\n (e: 'action', key: string): void;\n (e: 'open-recents'): void;\n (e: 'update:density', v: Density): void;\n (e: 'toggle-inspector'): void /* koru:k1 */;\n (e: 'open-theme'): void /* wiring:c1 — tema galerisi */;\n (e: 'open-shortcut-settings'): void /* wiring:c2 */;\n}>();\n\n// Density toggle — the toolbar owns the persisted preference; the parent\n// only mirrors the value into a root class so both views pick it up.\nexport type Density = 'comfortable' | 'compact';\nconst DENSITY_LS_KEY = 'filex.density';\nconst density = ref<Density>(\n (() => {\n try {\n return localStorage.getItem(DENSITY_LS_KEY) === 'compact' ? 'compact' : 'comfortable';\n } catch {\n return 'comfortable';\n }\n })(),\n);\nonMounted(() => emit('update:density', density.value));\n\nfunction toggleDensity() {\n density.value = density.value === 'compact' ? 'comfortable' : 'compact';\n try {\n localStorage.setItem(DENSITY_LS_KEY, density.value);\n } catch {\n /* quota */\n }\n emit('update:density', density.value);\n}\n\nconst { t } = useLocale(() => props.locale);\n\nconst searchEl = ref<HTMLInputElement | null>(null);\nconst localSearch = ref(props.searchQuery);\n\nwatch(() => props.searchQuery, (v) => {\n localSearch.value = v;\n});\n\nlet debounce: ReturnType<typeof setTimeout> | undefined;\nfunction onSearchInput(ev: Event) {\n const v = (ev.target as HTMLInputElement).value;\n localSearch.value = v;\n if (debounce) clearTimeout(debounce);\n debounce = setTimeout(() => emit('update:searchQuery', v), 200);\n}\n\nasync function focusSearch() {\n /* bag:b4 — in narrow mode the input is collapsed behind the icon. */\n if (props.narrow && !searchOpen.value) {\n searchOpen.value = true;\n await nextTick();\n }\n searchEl.value?.focus();\n searchEl.value?.select();\n}\n\ndefineExpose({ focusSearch });\n\nconst mode = computed<SelectionMode>(() => props.selectionMode ?? 'none');\n\n// The visible action buttons = the shared list from FileExplorer, minus\n// dividers and hidden entries (the toolbar is a flat row, not a dropdown).\n// Disabled entries render greyed-out. Because this is the SAME list the\n// context menu uses, the two menus are guaranteed to match.\nconst toolbarItems = computed(() => props.actions.filter((a) => !a.divider && !a.hidden));\n\n/* === ui-fix — wide-mode action folding ===============================\n * Long selection-action rows used to wrap the whole toolbar and push the\n * search / view controls onto a second line. The row is now single-line:\n * actions that do not fit fold into a \"⋯\" menu. Widths come from a\n * hidden measurement strip (all actions always rendered there), so the\n * calculation never mutates what it measures. */\nconst primaryEl = ref<HTMLElement | null>(null);\nconst measureEl = ref<HTMLElement | null>(null);\nconst wideMoreBtnEl = ref<HTMLElement | null>(null);\nconst wideMoreRef = ref<InstanceType<typeof ContextMenu> | null>(null);\nconst visibleActionCount = ref(Number.MAX_SAFE_INTEGER);\nconst visibleToolbarItems = computed(() => toolbarItems.value.slice(0, visibleActionCount.value));\nconst overflowToolbarItems = computed(() => toolbarItems.value.slice(visibleActionCount.value));\nconst WIDE_MORE_BTN_W = 40;\n\nfunction recalcFold() {\n if (props.narrow) return;\n const cont = primaryEl.value;\n const meas = measureEl.value;\n if (!cont || !meas) {\n visibleActionCount.value = toolbarItems.value.length;\n return;\n }\n const gap = parseFloat(getComputedStyle(cont).gap) || 8;\n let fixed = 0;\n for (const child of Array.from(cont.children) as HTMLElement[]) {\n if (child === meas || child === wideMoreBtnEl.value) continue;\n if (child.classList.contains('fe-btn--fold')) continue;\n if (child.offsetWidth > 0) fixed += child.offsetWidth + gap;\n }\n const widths = (Array.from(meas.children) as HTMLElement[]).map((c) => c.offsetWidth + gap);\n const total = widths.reduce((s, w) => s + w, 0);\n const avail = cont.clientWidth - fixed;\n if (total <= avail) {\n visibleActionCount.value = widths.length;\n return;\n }\n let used = WIDE_MORE_BTN_W + gap;\n let count = 0;\n for (const w of widths) {\n if (used + w > avail) break;\n used += w;\n count += 1;\n }\n visibleActionCount.value = count;\n}\n\nlet foldRo: ResizeObserver | undefined;\nonMounted(() => {\n if (typeof ResizeObserver !== 'undefined' && primaryEl.value) {\n foldRo = new ResizeObserver(() => recalcFold());\n foldRo.observe(primaryEl.value);\n }\n void nextTick(recalcFold);\n});\nonBeforeUnmount(() => foldRo?.disconnect());\nwatch(\n () => [toolbarItems.value, props.narrow, props.trashActive, mode.value] as const,\n () => void nextTick(recalcFold),\n { deep: false },\n);\n\nfunction openWideMore() {\n const r = wideMoreBtnEl.value?.getBoundingClientRect();\n wideMoreRef.value?.show({ clientX: r ? r.right : 0, clientY: r ? r.bottom + 4 : 0 } as MouseEvent, []);\n}\n/* === /ui-fix ========================================================= */\n\nfunction fire(key: string) {\n emit('action', key);\n}\n\n/* === bag:b4 — narrow-mode state: expandable search + \"⋯\" overflow menu === */\n\nconst searchOpen = ref(false);\n// Leaving narrow mode discards the transient expanded-search state so the\n// wide layout always comes back exactly as it was.\nwatch(\n () => props.narrow,\n (n) => {\n if (!n) searchOpen.value = false;\n },\n);\n\nasync function openSearch() {\n searchOpen.value = true;\n await nextTick();\n searchEl.value?.focus();\n}\nfunction closeSearch() {\n // Keep the query (it still filters the listing); the icon shows an\n // active state while a query is set.\n searchOpen.value = false;\n}\n\n// Coarse-pointer detection — the overflow menu renders as a bottom sheet on\n// touch devices, matching the file context menu.\nconst coarse = ref(false);\nlet coarseMq: MediaQueryList | undefined;\nfunction syncCoarse(e?: MediaQueryListEvent | MediaQueryList) {\n coarse.value = !!(e && 'matches' in e && e.matches);\n}\nonMounted(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n coarseMq = window.matchMedia('(pointer: coarse)');\n syncCoarse(coarseMq);\n coarseMq.addEventListener?.('change', syncCoarse);\n});\nonBeforeUnmount(() => {\n coarseMq?.removeEventListener?.('change', syncCoarse);\n});\n\nconst moreBtnEl = ref<HTMLElement | null>(null);\nconst moreRef = ref<InstanceType<typeof ContextMenu> | null>(null);\n\n// Everything the wide toolbar renders as standalone buttons, folded into one\n// action list: folder-level writes (New Folder / Paste), the shared\n// selection actions, then the view utilities (Refresh / density / view mode).\nconst moreActions = computed<ContextAction[]>(() => {\n const list: ContextAction[] = [];\n const writable =\n !props.trashActive && !props.atVirtualRoot && props.canWrite !== false;\n if (mode.value === 'none' && writable) {\n list.push({ key: 'new-folder', label: t('toolbar.new_folder'), icon: '📁' });\n if (props.pasteEnabled) list.push({ key: 'paste', label: t('ctx.paste'), icon: '📋' });\n }\n list.push(...toolbarItems.value);\n if (list.length) list.push({ divider: true, key: 'bag-sep', label: '' });\n list.push({ key: 'refresh', label: t('toolbar.refresh'), icon: '↻' });\n list.push({\n key: 'density',\n label:\n density.value === 'compact'\n ? t('toolbar.density.comfortable')\n : t('toolbar.density.compact'),\n icon: '⇅',\n });\n /* wiring:d2 — dar mod ⋯ menüsü: aktif olmayan İKİ görünüm de listelenir\n (list/grid/gallery); eski tekli toggle üç modda eksik kalıyordu. */\n if (props.viewMode !== 'list') list.push({ key: 'view-list', label: t('toolbar.view.list'), icon: '☰' });\n if (props.viewMode !== 'grid') list.push({ key: 'view-grid', label: t('toolbar.view.grid'), icon: '▦' });\n if (props.viewMode !== 'gallery') list.push({ key: 'view-gallery', label: t('toolbar.view.gallery'), icon: '▣' });\n /* /wiring:d2 */\n /* koru:k1 — inspector toggle also reachable from the narrow overflow menu */\n list.push({ key: 'inspector', label: t('toolbar.inspector'), icon: 'ℹ' });\n /* wiring:c1 — tema galerisi de dar modda ⋯ menüsünden açılır */\n list.push({ key: 'theme', label: t('theme.menu'), icon: '🎨' });\n list.push({ key: 'shortcut-settings', label: t('shortcuts.settings.menu'), icon: '⌨' }) /* wiring:c2 */;\n list.push({ key: 'tour', label: t('tour.restart'), icon: '🎓' }); /* wiring:c4 */\n return list;\n});\n\nfunction openMore() {\n const r = moreBtnEl.value?.getBoundingClientRect();\n moreRef.value?.show({ clientX: r ? r.right : 0, clientY: r ? r.bottom + 4 : 0 }, []);\n}\n\nfunction onMoreSelect(a: ContextAction) {\n switch (a.key) {\n case 'new-folder':\n emit('new-folder');\n break;\n case 'refresh':\n emit('refresh');\n break;\n case 'density':\n toggleDensity();\n break;\n case 'view-list':\n emit('update:viewMode', 'list');\n break;\n case 'view-grid':\n emit('update:viewMode', 'grid');\n break;\n case 'view-gallery' /* wiring:d2 */:\n emit('update:viewMode', 'gallery');\n break;\n case 'inspector' /* koru:k1 */:\n emit('toggle-inspector');\n break;\n case 'theme' /* wiring:c1 */:\n emit('open-theme');\n break;\n case 'shortcut-settings' /* wiring:c2 */:\n emit('open-shortcut-settings');\n break;\n case 'tour' /* wiring:c4 — bubbles to the FileExplorer root listener */:\n moreBtnEl.value?.dispatchEvent(new CustomEvent('fe:tour-restart', { bubbles: true }));\n break;\n default:\n fire(a.key);\n }\n}\n\n/* === /bag:b4 === */\n</script>\n\n<template>\n <div\n class=\"fe-toolbar\"\n :class=\"{\n 'fe-toolbar--narrow': narrow /* bag:b4 */,\n 'fe-toolbar--searching': narrow && searchOpen /* bag:b4 */,\n }\"\n >\n <!-- bag:b4 — wide layout, untouched; renders exactly as before when not narrow -->\n <template v-if=\"!narrow\">\n <div ref=\"primaryEl\" class=\"fe-toolbar__primary\">\n <button\n v-if=\"canGoUp\"\n type=\"button\"\n class=\"fe-btn fe-btn--icon-only\"\n :title=\"t('toolbar.go_up')\"\n :aria-label=\"t('toolbar.go_up')\"\n @click=\"emit('go-up')\"\n >\n <span class=\"fe-icon\">↑</span>\n </button>\n\n <button\n v-if=\"mode === 'none' && !trashActive && !atVirtualRoot && canWrite !== false\"\n type=\"button\"\n class=\"fe-btn fe-btn--primary\"\n :title=\"t('toolbar.new_folder')\"\n @click=\"emit('new-folder')\"\n >\n <span class=\"fe-icon\">📁</span>\n <span class=\"fe-btn__label\">{{ t('toolbar.new_folder') }}</span>\n </button>\n\n <button\n v-for=\"a in visibleToolbarItems\"\n :key=\"a.key\"\n type=\"button\"\n class=\"fe-btn fe-btn--fold\"\n :class=\"{ 'fe-btn--danger': a.danger, 'is-disabled': a.disabled }\"\n :disabled=\"a.disabled\"\n :title=\"a.label\"\n @click=\"fire(a.key)\"\n >\n <span class=\"fe-icon\">{{ a.icon }}</span>\n <span class=\"fe-btn__label\">{{ a.label }}</span>\n </button>\n\n <!-- ui-fix — sığmayan aksiyonlar tek satırı korumak için ⋯ menüsüne\n katlanır (arama/görünüm kontrolleri artık alt satıra düşmez). -->\n <button\n v-if=\"overflowToolbarItems.length > 0\"\n ref=\"wideMoreBtnEl\"\n type=\"button\"\n class=\"fe-btn fe-btn--icon-only\"\n :title=\"t('toolbar.more')\"\n :aria-label=\"t('toolbar.more')\"\n aria-haspopup=\"menu\"\n @click=\"openWideMore\"\n >\n <span class=\"fe-icon\">⋯</span>\n </button>\n\n <!-- Görünmez ölçüm şeridi: TÜM aksiyonlar her zaman burada render\n edilir; katlama hesabı gerçek genişliklerden yapılır. -->\n <div ref=\"measureEl\" class=\"fe-toolbar__measure\" aria-hidden=\"true\">\n <button\n v-for=\"a in toolbarItems\"\n :key=\"'m-' + a.key\"\n type=\"button\"\n class=\"fe-btn\"\n tabindex=\"-1\"\n >\n <span class=\"fe-icon\">{{ a.icon }}</span>\n <span class=\"fe-btn__label\">{{ a.label }}</span>\n </button>\n </div>\n\n <button\n v-if=\"pasteEnabled && mode === 'none' && !trashActive && !atVirtualRoot && canWrite !== false\"\n type=\"button\"\n class=\"fe-btn\"\n :title=\"t('ctx.paste')\"\n @click=\"fire('paste')\"\n >\n <span class=\"fe-icon\">📋</span>\n <span class=\"fe-btn__label\">{{ t('ctx.paste') }}</span>\n </button>\n </div>\n\n <div class=\"fe-toolbar__spacer\" />\n\n <div class=\"fe-toolbar__search-group\">\n <div class=\"fe-search\">\n <input\n ref=\"searchEl\"\n type=\"search\"\n class=\"fe-search__input\"\n :placeholder=\"t('toolbar.search.placeholder')\"\n :value=\"localSearch\"\n :aria-label=\"t('toolbar.search') /* wiring:c4 — was hardcoded EN */\"\n @input=\"onSearchInput\"\n />\n </div>\n <button\n v-if=\"!atVirtualRoot && canWrite !== false\"\n type=\"button\"\n class=\"fe-btn fe-btn--icon-only\"\n :title=\"t('toolbar.upload')\"\n :aria-label=\"t('toolbar.upload') /* wiring:c4 */\"\n @click=\"emit('upload')\"\n >\n <span class=\"fe-icon\" aria-hidden=\"true\">⬆</span>\n </button>\n <button\n type=\"button\"\n class=\"fe-btn fe-btn--icon-only\"\n :title=\"t('toolbar.refresh')\"\n :aria-label=\"t('toolbar.refresh') /* wiring:c4 */\"\n @click=\"emit('refresh')\"\n >\n <span class=\"fe-icon\" aria-hidden=\"true\">↻</span>\n </button>\n </div>\n\n <button\n type=\"button\"\n class=\"fe-btn fe-btn--icon-only fe-toolbar__density\"\n :class=\"{ 'is-active': density === 'compact' }\"\n :aria-pressed=\"density === 'compact'\"\n :aria-label=\"density === 'compact' ? t('toolbar.density.comfortable') : t('toolbar.density.compact')\"\n :title=\"density === 'compact' ? t('toolbar.density.comfortable') : t('toolbar.density.compact')\"\n @click=\"toggleDensity\"\n >\n <!-- Row-spacing glyph: tight rows when compact is ON, airy rows otherwise. -->\n <svg\n v-if=\"density === 'compact'\"\n class=\"fe-ficon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M4 6.5h16M4 10.5h16M4 14.5h16M4 18.5h16\" />\n </svg>\n <svg\n v-else\n class=\"fe-ficon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M4 5.5h16M4 12h16M4 18.5h16\" />\n </svg>\n </button>\n\n <!-- koru:k1 — inspector (details panel) toggle -->\n <button\n type=\"button\"\n class=\"fe-btn fe-btn--icon-only fe-toolbar__inspector\"\n :class=\"{ 'is-active': inspectorOpen }\"\n :aria-pressed=\"!!inspectorOpen\"\n :title=\"t('toolbar.inspector')\"\n :aria-label=\"t('toolbar.inspector')\"\n @click=\"emit('toggle-inspector')\"\n >\n <svg\n class=\"fe-ficon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M12 11v5\" />\n <circle cx=\"12\" cy=\"7.6\" r=\"1\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n </button>\n\n <!-- wiring:c1 — tema galerisi (palet ikonu) -->\n <button\n type=\"button\"\n class=\"fe-btn fe-btn--icon-only fe-toolbar__theme\"\n :title=\"t('theme.menu')\"\n :aria-label=\"t('theme.menu')\"\n @click=\"emit('open-theme')\"\n >\n <svg\n class=\"fe-ficon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M12 3a9 9 0 1 0 0 18h1.4a2.1 2.1 0 0 0 1.5-3.6 2.1 2.1 0 0 1 1.5-3.6H19a2 2 0 0 0 2-2A9 9 0 0 0 12 3z\" />\n <circle cx=\"7.8\" cy=\"10.2\" r=\"1.15\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"11.6\" cy=\"7.2\" r=\"1.15\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"16\" cy=\"8.6\" r=\"1.15\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n </button>\n <!-- /wiring:c1 -->\n\n <div class=\"fe-toolbar__view\" role=\"tablist\" :aria-label=\"t('toolbar.view_label') /* wiring:c4 — was hardcoded EN */\">\n <button\n type=\"button\"\n class=\"fe-btn fe-btn--icon-only\"\n :class=\"{ 'is-active': viewMode === 'list' }\"\n role=\"tab\"\n :aria-selected=\"viewMode === 'list'\"\n :title=\"t('toolbar.view.list')\"\n :aria-label=\"t('toolbar.view.list') /* wiring:c4 */\"\n @click=\"emit('update:viewMode', 'list')\"\n >\n <span class=\"fe-icon\" aria-hidden=\"true\">☰</span>\n </button>\n <button\n type=\"button\"\n class=\"fe-btn fe-btn--icon-only\"\n :class=\"{ 'is-active': viewMode === 'grid' }\"\n role=\"tab\"\n :aria-selected=\"viewMode === 'grid'\"\n :title=\"t('toolbar.view.grid')\"\n :aria-label=\"t('toolbar.view.grid') /* wiring:c4 */\"\n @click=\"emit('update:viewMode', 'grid')\"\n >\n <span class=\"fe-icon\" aria-hidden=\"true\">▦</span>\n </button>\n <!-- wiring:d2 — üçüncü görünüm: galeri -->\n <button\n type=\"button\"\n class=\"fe-btn fe-btn--icon-only\"\n :class=\"{ 'is-active': viewMode === 'gallery' }\"\n role=\"tab\"\n :aria-selected=\"viewMode === 'gallery'\"\n :title=\"t('toolbar.view.gallery')\"\n :aria-label=\"t('toolbar.view.gallery')\"\n @click=\"emit('update:viewMode', 'gallery')\"\n >\n <span class=\"fe-icon\" aria-hidden=\"true\">▣</span>\n </button>\n <!-- /wiring:d2 -->\n </div>\n </template>\n\n <!-- bag:b4 — narrow layout: [↑?] ... [🔍] [⬆] [⋯], search expands full-width -->\n <template v-else>\n <template v-if=\"searchOpen\">\n <div class=\"fe-search fe-search--full\">\n <input\n ref=\"searchEl\"\n type=\"search\"\n class=\"fe-search__input\"\n :placeholder=\"t('toolbar.search.placeholder')\"\n :value=\"localSearch\"\n :aria-label=\"t('toolbar.search')\"\n @input=\"onSearchInput\"\n @keydown.esc.stop.prevent=\"closeSearch\"\n />\n </div>\n <button\n type=\"button\"\n class=\"fe-btn fe-btn--icon-only\"\n :title=\"t('toolbar.search.close')\"\n :aria-label=\"t('toolbar.search.close')\"\n @click=\"closeSearch\"\n >\n <span class=\"fe-icon\">✕</span>\n </button>\n </template>\n <template v-else>\n <button\n v-if=\"canGoUp\"\n type=\"button\"\n class=\"fe-btn fe-btn--icon-only\"\n :title=\"t('toolbar.go_up')\"\n :aria-label=\"t('toolbar.go_up')\"\n @click=\"emit('go-up')\"\n >\n <span class=\"fe-icon\">↑</span>\n </button>\n\n <div class=\"fe-toolbar__spacer\" />\n\n <button\n type=\"button\"\n class=\"fe-btn fe-btn--icon-only fe-toolbar__search-toggle\"\n :class=\"{ 'is-active': !!localSearch }\"\n :title=\"t('toolbar.search')\"\n :aria-label=\"t('toolbar.search')\"\n @click=\"openSearch\"\n >\n <span class=\"fe-icon\">🔍</span>\n </button>\n <button\n v-if=\"!atVirtualRoot && canWrite !== false\"\n type=\"button\"\n class=\"fe-btn fe-btn--icon-only\"\n :title=\"t('toolbar.upload')\"\n :aria-label=\"t('toolbar.upload')\"\n @click=\"emit('upload')\"\n >\n <span class=\"fe-icon\">⬆</span>\n </button>\n <button\n ref=\"moreBtnEl\"\n type=\"button\"\n class=\"fe-btn fe-btn--icon-only fe-toolbar__more\"\n :title=\"t('toolbar.more')\"\n :aria-label=\"t('toolbar.more')\"\n aria-haspopup=\"menu\"\n @click=\"openMore\"\n >\n <span class=\"fe-icon\">⋯</span>\n </button>\n </template>\n\n <ContextMenu\n ref=\"moreRef\"\n :locale=\"locale\"\n :theme=\"theme || 'auto'\"\n :sheet=\"coarse\"\n :actions=\"moreActions\"\n @select=\"onMoreSelect\"\n />\n </template>\n\n <!-- ui-fix — wide modda katlanan aksiyonların ⋯ menüsü -->\n <ContextMenu\n v-if=\"!narrow\"\n ref=\"wideMoreRef\"\n :locale=\"locale\"\n :theme=\"theme || 'auto'\"\n :sheet=\"false\"\n :actions=\"overflowToolbarItems\"\n @select=\"(a) => fire(a.key)\"\n />\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * TagPicker — small chip list with add/remove for a node.\n *\n * Reads `GET /api/files/manager/tags?node_id=…` on mount, writes the\n * full new array via `POST /api/files/manager/tags`.\n *\n * Tag colors are deterministic: hash(name) → palette index. Consumers\n * can override with the `palette` prop.\n */\nimport { ref, watch, onMounted, computed } from 'vue';\n\nconst props = defineProps<{\n nodeId: number;\n apiBase?: string;\n authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n /** Credentials mode, from the explorer's auth kind. ⚠ Defaults to\n * 'same-origin': a credentialed cross-origin request cannot be answered\n * with ACAO:* , so hardcoding 'include' broke this call in every embed\n * served from a different origin to the API. */\n authCredentials?: RequestCredentials;\n /** Optional list of palette swatches; one is picked per tag deterministically. */\n palette?: string[];\n}>();\n\nconst emit = defineEmits<{\n (e: 'change', tags: string[]): void;\n (e: 'error', message: string): void;\n}>();\n\nconst tags = ref<string[]>([]);\nconst loading = ref(false);\nconst adding = ref(false);\nconst newTag = ref('');\n\nconst palette = computed(() => props.palette ?? [\n '#ef4444', '#f59e0b', '#10b981', '#3b82f6',\n '#8b5cf6', '#ec4899', '#14b8a6', '#f97316',\n]);\n\nfunction colorFor(tag: string): string {\n let h = 0;\n for (let i = 0; i < tag.length; i++) h = (h * 31 + tag.charCodeAt(i)) | 0;\n const arr = palette.value;\n return arr[Math.abs(h) % arr.length];\n}\n\nasync function buildHeaders(extra: Record<string, string> = {}): Promise<Record<string, string>> {\n return { ...(await (props.authHeaders ?? (() => ({})))()), ...extra };\n}\n\nasync function load() {\n loading.value = true;\n try {\n const base = props.apiBase ?? '';\n const res = await fetch(`${base}/api/files/manager/tags?node_id=${props.nodeId}`, {\n headers: await buildHeaders(),\n credentials: props.authCredentials ?? 'same-origin',\n });\n if (res.ok) {\n const body = await res.json();\n tags.value = Array.isArray(body.tags) ? body.tags : [];\n }\n } catch (err) {\n emit('error', err instanceof Error ? err.message : String(err));\n } finally {\n loading.value = false;\n }\n}\n\nasync function persist(next: string[]) {\n const previous = [...tags.value];\n tags.value = next;\n try {\n const base = props.apiBase ?? '';\n const res = await fetch(`${base}/api/files/manager/tags`, {\n method: 'POST',\n headers: await buildHeaders({ 'Content-Type': 'application/json' }),\n credentials: props.authCredentials ?? 'same-origin',\n body: JSON.stringify({ node_id: props.nodeId, tags: next }),\n });\n if (!res.ok) throw new Error(`tag save failed: ${res.status}`);\n emit('change', next);\n } catch (err) {\n tags.value = previous;\n emit('error', err instanceof Error ? err.message : String(err));\n }\n}\n\nfunction add() {\n const v = newTag.value.trim();\n if (!v || tags.value.includes(v)) {\n newTag.value = '';\n adding.value = false;\n return;\n }\n persist([...tags.value, v]);\n newTag.value = '';\n adding.value = false;\n}\n\nfunction remove(tag: string) {\n persist(tags.value.filter((t) => t !== tag));\n}\n\nonMounted(load);\nwatch(() => props.nodeId, load);\n</script>\n\n<template>\n <div class=\"filex-tag-picker\" :class=\"{ 'is-loading': loading }\">\n <span\n v-for=\"tag in tags\"\n :key=\"tag\"\n class=\"filex-tag\"\n :style=\"{ '--filex-tag-color': colorFor(tag) }\"\n >\n {{ tag }}\n <button class=\"filex-tag-x\" type=\"button\" @click=\"remove(tag)\" aria-label=\"Remove tag\">×</button>\n </span>\n\n <form v-if=\"adding\" class=\"filex-tag-add\" @submit.prevent=\"add\">\n <input\n v-model=\"newTag\"\n autofocus\n placeholder=\"tag name\"\n @blur=\"add\"\n @keydown.escape=\"adding = false; newTag = ''\"\n />\n </form>\n <button v-else class=\"filex-tag-add-btn\" type=\"button\" @click=\"adding = true\">+ Add tag</button>\n </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n this CSS does not match the one Vue stamps onto the DOM — so every rule\n here silently stopped applying. Measured in the desktop app: the share\n dialog had `position: static`, no background and no radius, i.e. raw\n unstyled HTML, in EVERY embedded surface.\n Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n there is nothing here that can leak into a host page. */\n.filex-tag-picker {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n align-items: center;\n}\n.filex-tag-picker.is-loading {\n opacity: 0.6;\n pointer-events: none;\n}\n.filex-tag {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n border-radius: 999px;\n padding: 2px 10px;\n font-size: 12px;\n font-weight: 500;\n color: #fff;\n background: var(--filex-tag-color);\n}\n.filex-tag-x {\n background: transparent;\n border: none;\n color: rgba(255, 255, 255, 0.85);\n cursor: pointer;\n padding: 0 2px;\n font-size: 14px;\n line-height: 1;\n}\n.filex-tag-x:hover {\n color: #fff;\n}\n.filex-tag-add input {\n border: 1px solid var(--filex-border, #d1d5db);\n border-radius: 12px;\n padding: 2px 10px;\n font-size: 12px;\n width: 110px;\n}\n.filex-tag-add-btn {\n border: 1px dashed var(--filex-border, #d1d5db);\n background: transparent;\n border-radius: 999px;\n padding: 2px 10px;\n font-size: 12px;\n color: var(--filex-text-muted, #6b7280);\n cursor: pointer;\n}\n.filex-tag-add-btn:hover {\n border-color: var(--filex-accent, #6366f1);\n color: var(--filex-accent, #6366f1);\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * RecentlyOpened — drop-down/sidebar tray of the user's recently-opened\n * files. Backed by `GET /api/files/manager/recent?limit=20`.\n */\nimport { ref, onMounted, watch } from 'vue';\n\ninterface RecentNode {\n id: number;\n storage_id: number;\n path: string;\n name: string;\n mime?: string;\n last_opened?: string;\n}\n\nconst props = defineProps<{\n apiBase?: string;\n authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n /** Credentials mode, from the explorer's auth kind. ⚠ Defaults to\n * 'same-origin': a credentialed cross-origin request cannot be answered\n * with ACAO:* , so hardcoding 'include' broke this call in every embed\n * served from a different origin to the API. */\n authCredentials?: RequestCredentials;\n limit?: number;\n /** Optional refresh trigger — incrementing this re-fetches. */\n refreshKey?: number | string;\n}>();\n\nconst emit = defineEmits<{\n (e: 'open', node: RecentNode): void;\n (e: 'error', message: string): void;\n}>();\n\nconst items = ref<RecentNode[]>([]);\nconst loading = ref(false);\n\nasync function load() {\n loading.value = true;\n try {\n const headers = await (props.authHeaders ?? (() => ({})))();\n const base = props.apiBase ?? '';\n const limit = props.limit ?? 20;\n const res = await fetch(`${base}/api/files/manager/recent?limit=${limit}`, {\n headers,\n credentials: props.authCredentials ?? 'same-origin',\n });\n if (res.ok) {\n const body = await res.json();\n items.value = Array.isArray(body.entries) ? body.entries : (Array.isArray(body) ? body : []);\n }\n } catch (err) {\n emit('error', err instanceof Error ? err.message : String(err));\n } finally {\n loading.value = false;\n }\n}\n\nfunction fmtTime(s?: string): string {\n if (!s) return '';\n const t = new Date(s).getTime();\n if (Number.isNaN(t)) return '';\n const diff = Date.now() - t;\n if (diff < 60_000) return 'just now';\n if (diff < 3_600_000) return `${Math.floor(diff / 60_000)}m ago`;\n if (diff < 86_400_000) return `${Math.floor(diff / 3_600_000)}h ago`;\n return `${Math.floor(diff / 86_400_000)}d ago`;\n}\n\nonMounted(load);\nwatch(() => props.refreshKey, load);\n</script>\n\n<template>\n <div class=\"filex-recent\">\n <header>\n <h3>Recently opened</h3>\n <button class=\"filex-recent-refresh\" type=\"button\" @click=\"load\" :disabled=\"loading\">\n ↻\n </button>\n </header>\n\n <ul v-if=\"items.length\">\n <li v-for=\"n in items\" :key=\"n.id\">\n <button type=\"button\" @click=\"emit('open', n)\" class=\"filex-recent-item\">\n <span class=\"filex-recent-name\">{{ n.name }}</span>\n <span class=\"filex-recent-meta\">{{ fmtTime(n.last_opened) }}</span>\n </button>\n </li>\n </ul>\n <p v-else-if=\"!loading\" class=\"filex-recent-empty\">Nothing here yet.</p>\n <p v-else class=\"filex-recent-empty\">Loading…</p>\n </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n this CSS does not match the one Vue stamps onto the DOM — so every rule\n here silently stopped applying. Measured in the desktop app: the share\n dialog had `position: static`, no background and no radius, i.e. raw\n unstyled HTML, in EVERY embedded surface.\n Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n there is nothing here that can leak into a host page. */\n.filex-recent {\n background: var(--fe-bg-elev, var(--filex-bg-card, #ffffff));\n border: 1px solid var(--fe-border, var(--filex-border, #e5e7eb));\n border-radius: 8px;\n padding: 12px;\n font-size: 13px;\n}\n.filex-recent header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n.filex-recent h3 {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--fe-text, var(--filex-text, #111827));\n}\n.filex-recent-refresh {\n background: transparent;\n border: none;\n color: var(--fe-text-muted, var(--filex-text-muted, #9ca3af));\n cursor: pointer;\n font-size: 14px;\n padding: 2px 6px;\n}\n.filex-recent ul {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n.filex-recent-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n background: transparent;\n border: none;\n padding: 6px 8px;\n cursor: pointer;\n border-radius: 4px;\n text-align: left;\n}\n.filex-recent-item:hover {\n background: var(--fe-bg-hover, var(--filex-bg-soft, #f3f4f6));\n}\n.filex-recent-name {\n color: var(--fe-text, var(--filex-text, #111827));\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.filex-recent-meta {\n color: var(--fe-text-muted, var(--filex-text-muted, #9ca3af));\n font-size: 11px;\n margin-left: 8px;\n flex-shrink: 0;\n}\n.filex-recent-empty {\n color: var(--fe-text-muted, var(--filex-text-muted, #9ca3af));\n margin: 4px 0 0;\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * Breadcrumb — adapter-aware path crumbs.\n *\n * Dirname arrives as `<adapter>://<rel>` (e.g. `s3-test://aa/bb`). The\n * first crumb is ALWAYS the storage root — its label is the adapter\n * name itself (`s3-test`) and clicking it lands you at `<adapter>://`,\n * NOT at the first sub-folder you happened to be inside. The remaining\n * crumbs walk down the path one segment at a time.\n *\n * Examples:\n * `s3-test://` → [s3-test]\n * `s3-test://aa` → [s3-test] › [aa]\n * `s3-test://aa/bb` → [s3-test] › [aa] › [bb]\n *\n * `rootLabel` overrides the adapter name when the embedder wants a\n * branded label ('Files', 'My Drive', etc). Defaults to the adapter.\n *\n * The ✏ button swaps the crumbs for a free-form input; Enter\n * navigates, Escape cancels.\n */\nimport { computed, nextTick, onBeforeUnmount, ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\n\nconst props = defineProps<{\n dirname: string;\n adapter: string;\n rootLabel: string;\n locale: LocaleCode;\n /**\n * Multi-storage mode — when true the breadcrumb prepends a global\n * \"/\" crumb so the user can pop all the way back to the storage\n * picker. Storage name then occupies crumb #1 instead of #0.\n */\n multiStorageRoot?: boolean;\n /**\n * Root confinement (qualified `<adapter>://<rel>`). When set the breadcrumb\n * treats this folder as `/`: crumbs above it are hidden, the root crumb is\n * the confined folder's own name, and the ✏ path editor shows/accepts paths\n * relative to it (`/`, `/sub`). Pairs with FileExplorer's rootPath clamp.\n */\n rootPath?: string;\n}>();\n\n// Confined root parsed into its adapter-relative form (\"projeler/acme\") and\n// the trailing folder name used as the \"/\" crumb label.\nconst confinedRel = computed(() => {\n if (!props.rootPath) return '';\n const r = props.rootPath;\n const i = r.indexOf('://');\n return (i >= 0 ? r.slice(i + 3) : r).replace(/^\\/+|\\/+$/g, '');\n});\nconst floorLabel = computed(() => {\n const rel = confinedRel.value;\n if (!rel) return props.rootLabel || props.adapter;\n const parts = rel.split('/');\n return parts[parts.length - 1] || (props.rootLabel || props.adapter);\n});\n\nconst { t } = useLocale(() => props.locale);\n\nconst emit = defineEmits<{\n (e: 'navigate', adapterPath: string): void;\n (e: 'copy-path', adapterPath: string): void;\n (e: 'crumb-context', payload: { x: number; y: number; adapterPath: string; label: string }): void;\n (e: 'crumb-drop', adapterPath: string, ev: DragEvent): void;\n}>();\n\ninterface Crumb {\n label: string;\n adapterPath: string;\n}\n\nconst crumbs = computed<Crumb[]>(() => {\n const adapterPrefix = `${props.adapter}://`;\n const raw = props.dirname.startsWith(adapterPrefix)\n ? props.dirname.slice(adapterPrefix.length)\n : props.dirname;\n const parts = raw.split('/').filter(Boolean);\n\n const out: Crumb[] = [];\n\n // Confined: the root folder is the top crumb (its own name), and only the\n // path BELOW it is walked — segments above the confinement are never shown.\n if (props.rootPath) {\n const floor = confinedRel.value;\n const cur = raw.replace(/^\\/+|\\/+$/g, '');\n const below = floor && (cur === floor || cur.startsWith(floor + '/'))\n ? cur.slice(floor.length).replace(/^\\/+/, '')\n : '';\n out.push({ label: floorLabel.value, adapterPath: props.rootPath });\n let acc = floor;\n for (const part of below.split('/').filter(Boolean)) {\n acc = acc ? `${acc}/${part}` : part;\n out.push({ label: part === '.trash' ? t('node.trash') : part, adapterPath: `${adapterPrefix}${acc}` });\n }\n return out;\n }\n\n if (props.multiStorageRoot) {\n // Global \"/\" crumb — clicking it pops back to the storage picker\n // (FileExplorer treats the empty string as the virtual root).\n out.push({ label: '/', adapterPath: '' });\n if (props.adapter) {\n // Storage segment — wire form `<adapter>://` lands at storage\n // root regardless of where we are now.\n out.push({ label: props.rootLabel || props.adapter, adapterPath: adapterPrefix });\n }\n } else {\n // Single-storage mode: the storage name IS the root, no \"/\"\n // above it.\n out.push({\n label: props.rootLabel || props.adapter,\n adapterPath: adapterPrefix,\n });\n }\n\n let acc = '';\n for (const part of parts) {\n acc = acc ? `${acc}/${part}` : part;\n const label = part === '.trash' ? t('node.trash') : part;\n out.push({ label, adapterPath: `${adapterPrefix}${acc}` });\n }\n return out;\n});\n\n// ------------------------------------------------------------------\n// Overflow collapse (cila:c / I5) — when the trail grows past the\n// threshold, show `root › … › parent › current`; the middle crumbs move\n// into a dropdown. Visible crumbs keep their full click/drag-drop/context\n// behavior; dropdown entries only navigate.\n// ------------------------------------------------------------------\nconst OVERFLOW_THRESHOLD = 4;\nconst collapsed = computed(() => crumbs.value.length > OVERFLOW_THRESHOLD);\nconst leadCrumbs = computed<Crumb[]>(() =>\n collapsed.value ? crumbs.value.slice(0, 1) : crumbs.value,\n);\nconst middleCrumbs = computed<Crumb[]>(() =>\n collapsed.value ? crumbs.value.slice(1, -2) : [],\n);\nconst tailCrumbs = computed<Crumb[]>(() =>\n collapsed.value ? crumbs.value.slice(-2) : [],\n);\n\nconst overflowOpen = ref(false);\nconst moreWrapEl = ref<HTMLElement | null>(null);\n\nfunction onOverflowPick(crumb: Crumb) {\n overflowOpen.value = false;\n emit('navigate', crumb.adapterPath);\n}\n\nfunction onDocClick(e: MouseEvent) {\n const wrap = moreWrapEl.value;\n if (wrap && e.target instanceof Node && wrap.contains(e.target)) return;\n overflowOpen.value = false;\n}\n\nfunction onDocKeydown(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n e.stopPropagation();\n overflowOpen.value = false;\n }\n}\n\nwatch(overflowOpen, (v) => {\n if (v) {\n document.addEventListener('click', onDocClick, true);\n document.addEventListener('keydown', onDocKeydown, true);\n } else {\n document.removeEventListener('click', onDocClick, true);\n document.removeEventListener('keydown', onDocKeydown, true);\n }\n});\n// Navigation rebuilds the trail — a stale open menu would list crumbs of\n// the previous folder.\nwatch(crumbs, () => {\n overflowOpen.value = false;\n});\nonBeforeUnmount(() => {\n document.removeEventListener('click', onDocClick, true);\n document.removeEventListener('keydown', onDocKeydown, true);\n});\n\nfunction onClick(crumb: Crumb) {\n emit('navigate', crumb.adapterPath);\n}\n\nfunction onContext(ev: MouseEvent, crumb: Crumb) {\n ev.preventDefault();\n ev.stopPropagation();\n emit('crumb-context', {\n x: ev.clientX,\n y: ev.clientY,\n adapterPath: crumb.adapterPath,\n label: crumb.label,\n });\n}\n\nfunction onCrumbDragOver(ev: DragEvent) {\n if (!ev.dataTransfer?.types.includes('application/x-brf-files')) return;\n ev.preventDefault();\n ev.stopPropagation();\n if (ev.dataTransfer) ev.dataTransfer.dropEffect = 'move';\n}\n\nfunction onCrumbDrop(ev: DragEvent, crumb: Crumb) {\n if (!ev.dataTransfer?.types.includes('application/x-brf-files')) return;\n ev.preventDefault();\n ev.stopPropagation();\n emit('crumb-drop', crumb.adapterPath, ev);\n}\n\nconst editing = ref(false);\nconst pathDraft = ref('');\nconst pathInput = ref<HTMLInputElement | null>(null);\n\nfunction startEdit() {\n const adapterPrefix = `${props.adapter}://`;\n const rel = props.dirname.startsWith(adapterPrefix)\n ? props.dirname.slice(adapterPrefix.length)\n : props.dirname;\n // Confined: edit relative to the root folder — `/` is the root, `/sub` below.\n if (props.rootPath) {\n const floor = confinedRel.value;\n const cur = rel.replace(/^\\/+|\\/+$/g, '');\n const below = floor && (cur === floor || cur.startsWith(floor + '/'))\n ? cur.slice(floor.length).replace(/^\\/+/, '')\n : '';\n pathDraft.value = below ? `/${below}` : '/';\n editing.value = true;\n void nextTick(() => {\n pathInput.value?.focus();\n pathInput.value?.select();\n });\n return;\n }\n // Multi-storage: show `/<storage>/<rel>` so the user can edit the\n // whole tree (`/main/foo`, `/s3-test/example`, just `/` for root).\n if (props.multiStorageRoot) {\n if (!props.adapter) {\n pathDraft.value = '/';\n } else {\n const trimmed = rel.replace(/^\\/+|\\/+$/g, '');\n pathDraft.value = trimmed\n ? `/${props.adapter}/${trimmed}`\n : `/${props.adapter}`;\n }\n } else {\n pathDraft.value = rel;\n }\n editing.value = true;\n void nextTick(() => {\n pathInput.value?.focus();\n pathInput.value?.select();\n });\n}\n\nfunction submitPath() {\n const raw = pathDraft.value.trim();\n editing.value = false;\n\n // Confined: the typed path is relative to the root folder; prepend the floor.\n if (props.rootPath) {\n const sub = raw.replace(/^\\/+|\\/+$/g, '');\n const floor = confinedRel.value;\n const rel = sub ? (floor ? `${floor}/${sub}` : sub) : floor;\n emit('navigate', rel ? `${props.adapter}://${rel}` : `${props.adapter}://`);\n return;\n }\n\n if (props.multiStorageRoot) {\n // Strip leading/trailing slashes. First segment = storage.\n const clean = raw.replace(/^\\/+|\\/+$/g, '');\n if (!clean) {\n // navigate to global root by emitting empty wire path; the\n // FileExplorer treats it as virtual storage list.\n emit('navigate', '');\n return;\n }\n const slash = clean.indexOf('/');\n const adapter = slash === -1 ? clean : clean.slice(0, slash);\n const rel = slash === -1 ? '' : clean.slice(slash + 1);\n emit('navigate', rel ? `${adapter}://${rel}` : `${adapter}://`);\n return;\n }\n\n const v = raw.replace(/^\\/+|\\/+$/g, '');\n if (!v) return;\n emit('navigate', `${props.adapter}://${v}`);\n}\n\nfunction cancelEdit() {\n editing.value = false;\n}\n</script>\n\n<template>\n <nav class=\"fe-breadcrumb\" aria-label=\"Breadcrumb\">\n <template v-if=\"!editing\">\n <button\n v-for=\"(c, i) in leadCrumbs\"\n :key=\"c.adapterPath\"\n class=\"fe-breadcrumb__crumb\"\n :class=\"{ 'is-last': !collapsed && i === leadCrumbs.length - 1 }\"\n type=\"button\"\n :aria-current=\"!collapsed && i === leadCrumbs.length - 1 ? 'page' : undefined\"\n @click=\"onClick(c)\"\n @contextmenu=\"onContext($event, c)\"\n @dragover=\"onCrumbDragOver\"\n @drop=\"onCrumbDrop($event, c)\"\n >\n <span>{{ c.label }}</span>\n <span v-if=\"collapsed || i < leadCrumbs.length - 1\" class=\"fe-breadcrumb__sep\" aria-hidden=\"true\">›</span>\n </button>\n <span v-if=\"middleCrumbs.length\" ref=\"moreWrapEl\" class=\"fe-breadcrumb__more-wrap\">\n <button\n type=\"button\"\n class=\"fe-breadcrumb__more\"\n aria-haspopup=\"menu\"\n :aria-expanded=\"overflowOpen\"\n :aria-label=\"t('breadcrumb.more')\"\n :title=\"t('breadcrumb.more')\"\n @click=\"overflowOpen = !overflowOpen\"\n >…</button>\n <span class=\"fe-breadcrumb__sep\" aria-hidden=\"true\">›</span>\n <div v-if=\"overflowOpen\" class=\"fe-breadcrumb__menu\" role=\"menu\">\n <button\n v-for=\"c in middleCrumbs\"\n :key=\"c.adapterPath\"\n type=\"button\"\n class=\"fe-breadcrumb__menu-item\"\n role=\"menuitem\"\n @click=\"onOverflowPick(c)\"\n >{{ c.label }}</button>\n </div>\n </span>\n <button\n v-for=\"(c, i) in tailCrumbs\"\n :key=\"c.adapterPath\"\n class=\"fe-breadcrumb__crumb\"\n :class=\"{ 'is-last': i === tailCrumbs.length - 1 }\"\n type=\"button\"\n :aria-current=\"i === tailCrumbs.length - 1 ? 'page' : undefined\"\n @click=\"onClick(c)\"\n @contextmenu=\"onContext($event, c)\"\n @dragover=\"onCrumbDragOver\"\n @drop=\"onCrumbDrop($event, c)\"\n >\n <span>{{ c.label }}</span>\n <span v-if=\"i < tailCrumbs.length - 1\" class=\"fe-breadcrumb__sep\" aria-hidden=\"true\">›</span>\n </button>\n <button\n type=\"button\"\n class=\"fe-breadcrumb__edit\"\n :title=\"t('breadcrumb.go_to_path')\"\n :aria-label=\"t('breadcrumb.go_to_path')\"\n @click=\"startEdit\"\n >✏</button>\n </template>\n <template v-else>\n <input\n ref=\"pathInput\"\n v-model=\"pathDraft\"\n type=\"text\"\n class=\"fe-breadcrumb__input\"\n :placeholder=\"t('breadcrumb.path_placeholder')\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n @keydown.enter.prevent=\"submitPath\"\n @keydown.escape.prevent=\"cancelEdit\"\n @blur=\"cancelEdit\"\n />\n </template>\n </nav>\n</template>\n","/**\n * fileIcons — extension/type → inline SVG icon mapping.\n *\n * Replaces the old emoji maps in GridView/ListView with a minimalist\n * line-icon set. Icons are hand-drawn 24×24 strokes on `currentColor`;\n * each family gets an accent via `--fe-icon-<family>` (variables.css),\n * applied through the `fe-ficon--<family>` class in base.css.\n *\n * Scope: file-TYPE icons only. Action emojis (trash/star/…) and the\n * special `.trash` / storage rows stay emoji — see the views.\n */\n\nexport type IconFamily =\n | 'folder'\n | 'image'\n | 'video'\n | 'audio'\n | 'pdf'\n | 'doc'\n | 'sheet'\n | 'slides'\n | 'archive'\n | 'code'\n | 'text'\n | 'unknown';\n\nconst EXT_FAMILIES: Record<string, IconFamily> = {};\n\nfunction reg(family: IconFamily, exts: string[]) {\n for (const e of exts) EXT_FAMILIES[e] = family;\n}\n\nreg('image', ['jpg', 'jpeg', 'png', 'webp', 'gif', 'bmp', 'avif', 'heic', 'svg', 'ico', 'tiff', 'tif']);\nreg('video', ['mp4', 'webm', 'mov', 'mkv', 'avi', 'ogv', 'm4v']);\nreg('audio', ['mp3', 'wav', 'flac', 'ogg', 'm4a', 'aac', 'opus']);\nreg('pdf', ['pdf']);\nreg('doc', ['doc', 'docx', 'odt', 'rtf']);\nreg('sheet', ['xls', 'xlsx', 'ods', 'csv']);\nreg('slides', ['ppt', 'pptx', 'odp']);\nreg('archive', ['zip', 'tar', 'gz', 'bz2', '7z', 'rar', 'xz', 'zst']);\nreg('code', [\n 'js', 'ts', 'jsx', 'tsx', 'mjs', 'cjs', 'vue', 'py', 'go', 'rs', 'php', 'rb',\n 'java', 'kt', 'swift', 'c', 'cpp', 'h', 'hpp', 'cs', 'css', 'scss', 'less',\n 'html', 'htm', 'json', 'yml', 'yaml', 'xml', 'sh', 'bash', 'ps1', 'sql', 'toml',\n]);\nreg('text', ['txt', 'md', 'markdown', 'log', 'ini', 'conf', 'cfg', 'env']);\n\n/** Pick the icon family for a listing node. */\nexport function iconFamilyFor(node: {\n type?: string;\n extension?: string | null;\n}): IconFamily {\n if (node.type === 'dir') return 'folder';\n const ext = (node.extension || '').toLowerCase();\n return EXT_FAMILIES[ext] ?? 'unknown';\n}\n\n// Shared fragments. The document families reuse one sheet-with-fold base so\n// the set reads as one system; media families get standalone shapes.\nconst FILE_BASE =\n '<path d=\"M6.5 3h7L18.5 8v11.5a1.5 1.5 0 0 1-1.5 1.5H6.5A1.5 1.5 0 0 1 5 19.5v-15A1.5 1.5 0 0 1 6.5 3z\"/>' +\n '<path d=\"M13.5 3v5h5\"/>';\n\nconst GLYPHS: Record<IconFamily, string> = {\n // Folder is the one \"filled\" member — a soft currentColor wash keeps it\n // visually anchored without breaking the line style.\n folder:\n '<path d=\"M3 7a2 2 0 0 1 2-2h4.2l2 2.4H19a2 2 0 0 1 2 2V17a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\" fill=\"currentColor\" fill-opacity=\"0.14\"/>',\n image:\n '<rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\"/>' +\n '<circle cx=\"8.6\" cy=\"10\" r=\"1.6\"/>' +\n '<path d=\"M5.2 16.6l4.3-4.3 3 3 2.4-2.4 3.9 3.7\"/>',\n video:\n '<rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\"/>' +\n '<path d=\"M10.2 9.3v5.4l4.8-2.7z\" fill=\"currentColor\" stroke=\"none\"/>',\n audio:\n '<path d=\"M9 17.5V7.2l9-2.2v10.4\"/>' +\n '<circle cx=\"6.8\" cy=\"17.6\" r=\"2.2\"/>' +\n '<circle cx=\"15.8\" cy=\"15.5\" r=\"2.2\"/>',\n pdf:\n FILE_BASE +\n '<rect x=\"7.5\" y=\"12\" width=\"9\" height=\"5\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.14\"/>',\n doc:\n FILE_BASE +\n '<path d=\"M8.5 13h7M8.5 16h7\"/>',\n sheet:\n FILE_BASE +\n '<path d=\"M8 12.5h8M8 15.5h8M8 18h8M12 12.5V18\"/>',\n slides:\n FILE_BASE +\n '<rect x=\"8\" y=\"12.5\" width=\"8\" height=\"5\" rx=\"0.8\"/>',\n archive:\n FILE_BASE +\n '<path d=\"M10 3v1.6M10 6.6v1.6M10 10.2v1.6\"/>' +\n '<rect x=\"8.6\" y=\"14\" width=\"2.8\" height=\"3.4\" rx=\"0.8\"/>',\n code:\n FILE_BASE +\n '<path d=\"M10.4 12.5L8.3 15l2.1 2.5M13.6 12.5l2.1 2.5-2.1 2.5\"/>',\n text:\n FILE_BASE +\n '<path d=\"M8.5 12h7M8.5 15h7M8.5 18h4.5\"/>',\n unknown:\n FILE_BASE +\n '<path d=\"M10.3 13.1a1.8 1.8 0 1 1 2.5 1.9c-.6.3-.8.7-.8 1.4\"/>' +\n '<circle cx=\"12\" cy=\"18.4\" r=\"0.9\" fill=\"currentColor\" stroke=\"none\"/>',\n};\n\nconst SVG_CACHE = new Map<IconFamily, string>();\n\n/** Inline SVG markup for a family (safe static strings — v-html friendly). */\nexport function iconSvg(family: IconFamily): string {\n let svg = SVG_CACHE.get(family);\n if (!svg) {\n svg =\n `<svg class=\"fe-ficon fe-ficon--${family}\" viewBox=\"0 0 24 24\" fill=\"none\" ` +\n 'stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" ' +\n 'stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">' +\n `${GLYPHS[family]}</svg>`;\n SVG_CACHE.set(family, svg);\n }\n return svg;\n}\n\n/** Convenience: node → SVG markup in one call. */\nexport function fileIconSvg(node: { type?: string; extension?: string | null }): string {\n return iconSvg(iconFamilyFor(node));\n}\n","/* bul:s3 */\n/**\n * Snippet segment parser — the search backend returns content snippets as\n * PLAIN TEXT with matched words wrapped in «guillemets» (contract: no HTML\n * ever crosses the wire). The UI renders highlights by splitting the string\n * into segments and emitting each one as a TEXT node (a <mark> wrapper for\n * matches) — never via innerHTML, so a file whose content contains markup\n * can't inject anything into the page.\n */\n\nexport interface SnippetSegment {\n /** Literal text of this segment. Always rendered as a text node. */\n text: string;\n /** True when the segment was «wrapped» — render inside <mark>. */\n match: boolean;\n}\n\n/**\n * Split a `«»`-annotated snippet into render segments. An unpaired `«`\n * degrades gracefully: the rest of the string is treated as plain text.\n */\nexport function snippetSegments(snippet: string): SnippetSegment[] {\n const out: SnippetSegment[] = [];\n if (!snippet) return out;\n const re = /«([^«»]*)»/g;\n let last = 0;\n let m: RegExpExecArray | null;\n while ((m = re.exec(snippet)) !== null) {\n if (m.index > last) out.push({ text: snippet.slice(last, m.index), match: false });\n if (m[1]) out.push({ text: m[1], match: true });\n last = m.index + m[0].length;\n }\n if (last < snippet.length) out.push({ text: snippet.slice(last), match: false });\n return out;\n}\n\n/** Matched-in values the search contract allows on a hit. */\nexport type SearchMatched = 'name' | 'content' | 'both';\n\n/** True when the hit matched (at least partly) inside file CONTENT. */\nexport function matchedInContent(matched: unknown): boolean {\n return matched === 'content' || matched === 'both';\n}\n","/**\n * dragGhost — wiring:c4 custom HTML5 drag image.\n *\n * The browser default drag image (a translucent snapshot of the row/card)\n * reads poorly for multi-selection drags. This builds a small pill with the\n * dragged item's name and, for multi-drags, a count badge, parks it\n * off-screen (setDragImage requires a rendered element), and removes it on\n * the next tick. Purely visual — the dataTransfer payload is untouched.\n *\n * Styled by `.fe-dragghost` in base.css via the `--fe-*` tokens published\n * at :root (and re-published at `.dark`/html level for dark hosts), so it\n * matches the active theme even though it's appended to <body>.\n */\nexport function applyDragGhost(ev: DragEvent, name: string, count: number): void {\n const dt = ev.dataTransfer;\n if (!dt || typeof document === 'undefined' || typeof dt.setDragImage !== 'function') return;\n try {\n const el = document.createElement('div');\n el.className = 'fe-dragghost';\n const label = document.createElement('span');\n label.className = 'fe-dragghost__name';\n label.textContent = name;\n el.appendChild(label);\n if (count > 1) {\n const badge = document.createElement('span');\n badge.className = 'fe-dragghost__badge';\n badge.textContent = String(count);\n el.appendChild(badge);\n }\n el.style.position = 'fixed';\n el.style.top = '-1000px';\n el.style.left = '-1000px';\n document.body.appendChild(el);\n dt.setDragImage(el, 14, 14);\n // The engine snapshots the element synchronously during dragstart —\n // safe to drop it right after.\n setTimeout(() => el.remove(), 0);\n } catch {\n /* non-critical visual nicety — native ghost remains */\n }\n}\n","<script setup lang=\"ts\">\n/**\n * StarButton — toggleable star indicator for a node.\n *\n * Backed by the `node_meta key=\"starred\"` server-side row (see\n * `POST /api/files/manager/star`). Optimistic update — flips the local\n * state immediately and rolls back on API error.\n */\nimport { ref, watch } from 'vue';\n\nconst props = defineProps<{\n starred: boolean;\n nodeId: number;\n apiBase?: string;\n /** Auth header builder injected by the parent file explorer. */\n authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n /** Credentials mode, from the explorer's auth kind. ⚠ Defaults to\n * 'same-origin': a credentialed cross-origin request cannot be answered\n * with ACAO:* , so hardcoding 'include' broke this call in every embed\n * served from a different origin to the API. */\n authCredentials?: RequestCredentials;\n /** Compact mode for grid view (no label, just the icon). */\n compact?: boolean;\n}>();\n\nconst emit = defineEmits<{\n (e: 'change', value: boolean): void;\n (e: 'error', message: string): void;\n}>();\n\nconst local = ref(props.starred);\nwatch(() => props.starred, (v) => { local.value = v; });\n\nasync function toggle() {\n const next = !local.value;\n local.value = next; // optimistic\n try {\n const headers = {\n 'Content-Type': 'application/json',\n ...(await (props.authHeaders ?? (() => ({})))()),\n };\n const base = props.apiBase ?? '';\n const res = await fetch(`${base}/api/files/manager/star`, {\n method: 'POST',\n headers,\n credentials: props.authCredentials ?? 'same-origin',\n body: JSON.stringify({ node_id: props.nodeId, starred: next }),\n });\n if (!res.ok) throw new Error(`star toggle failed: ${res.status}`);\n emit('change', next);\n } catch (err) {\n local.value = !next; // rollback\n emit('error', err instanceof Error ? err.message : String(err));\n }\n}\n</script>\n\n<template>\n <button\n type=\"button\"\n class=\"filex-star-btn\"\n :class=\"{ 'is-starred': local, 'is-compact': compact }\"\n :aria-pressed=\"local\"\n :title=\"local ? 'Unstar' : 'Star'\"\n @click.stop=\"toggle\"\n >\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n <path\n :fill=\"local ? 'currentColor' : 'none'\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linejoin=\"round\"\n d=\"M12 2.5l3.09 6.26 6.91 1-5 4.87 1.18 6.87L12 18.27l-6.18 3.23L7 14.63 2 9.76l6.91-1z\"\n />\n </svg>\n <span v-if=\"!compact\" class=\"filex-star-label\">{{ local ? 'Starred' : 'Star' }}</span>\n </button>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n this CSS does not match the one Vue stamps onto the DOM — so every rule\n here silently stopped applying. Measured in the desktop app: the share\n dialog had `position: static`, no background and no radius, i.e. raw\n unstyled HTML, in EVERY embedded surface.\n Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n there is nothing here that can leak into a host page. */\n.filex-star-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 6px;\n padding: 4px 8px;\n color: var(--filex-text-muted, #9ca3af);\n cursor: pointer;\n transition: color 120ms, background 120ms;\n}\n.filex-star-btn:hover {\n color: var(--filex-accent-amber, #f59e0b);\n background: var(--filex-bg-soft, rgba(0, 0, 0, 0.04));\n}\n.filex-star-btn.is-starred {\n color: var(--filex-accent-amber, #f59e0b);\n}\n.filex-star-btn.is-compact {\n padding: 4px;\n}\n.filex-star-label {\n font-size: 13px;\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * ListView — tabular layout (name / size / modified).\n *\n * Selection + context menu + double-click open are caller-owned — we\n * just emit the events and let FileExplorer.vue handle them uniformly\n * across List and Grid.\n */\nimport { computed, ref } from 'vue';\nimport type { FileNode } from '../types/FileNode';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { fileIconSvg } from '../lib/fileIcons';\nimport { matchedInContent, snippetSegments } from '../lib/snippet'; /* bul:s3 */\nimport { applyDragGhost } from '../lib/dragGhost'; /* wiring:c4 */\nimport StarButton from './StarButton.vue';\n\nconst props = defineProps<{\n files: FileNode[];\n selected: Set<string>;\n /** Paths that were cut → dim them so the user sees the pending move. */\n clipped?: Set<string>;\n /**\n * Show each row's parent directory under the basename. Caller flips\n * this on while a search filter is active so the user can tell\n * `invoice.pdf` (in 2024/) apart from `invoice.pdf` (in 2025/) when\n * both match the same query.\n */\n showParentPath?: boolean;\n locale: LocaleCode;\n loading?: boolean;\n /** Set of node IDs flagged starred by the user — render an inline\n * filled star indicator and let the user toggle it from the row. */\n starredIds?: Set<number>;\n /** Backend base URL + auth header builder forwarded to StarButton\n * so it can POST /api/files/manager/star on click. Optional —\n * embedders without auth wire-up pass nothing and the star column\n * hides itself. */\n apiBase?: string;\n authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n authCredentials?: RequestCredentials;\n}>();\n\nconst emit = defineEmits<{\n (e: 'click-row', node: FileNode, mod: { ctrl: boolean; shift: boolean }): void;\n (e: 'dbl-row', node: FileNode): void;\n (e: 'context-row', node: FileNode, ev: MouseEvent): void;\n (e: 'item-drag-start', node: FileNode, ev: DragEvent): void;\n (e: 'item-drop-into', target: FileNode, ev: DragEvent): void;\n (e: 'star-change', node: FileNode, value: boolean): void;\n}>();\n\nconst { t, formatSize, nodeDisplayName } = useLocale(() => props.locale);\n\nfunction isSelected(n: FileNode): boolean {\n return props.selected.has(n.path);\n}\n\nfunction onRowClick(n: FileNode, ev: MouseEvent) {\n emit('click-row', n, { ctrl: ev.ctrlKey || ev.metaKey, shift: ev.shiftKey });\n}\n\nfunction onRowDbl(n: FileNode) {\n emit('dbl-row', n);\n}\n\nfunction onRowCtx(n: FileNode, ev: MouseEvent) {\n // Stop bubbling so the root `@contextmenu` handler doesn't fire and\n // clear the selection we just set.\n ev.preventDefault();\n ev.stopPropagation();\n emit('context-row', n, ev);\n}\n\nfunction onItemDragStart(n: FileNode, ev: DragEvent) {\n /* wiring:c4 — custom ghost (name + multi-select count badge). Visual\n * only; the payload/selection logic stays in FileExplorer. */\n applyDragGhost(\n ev,\n nodeDisplayName(n),\n props.selected.has(n.path) ? props.selected.size : 1,\n );\n emit('item-drag-start', n, ev);\n}\n\n/* wiring:c4 — droptarget highlight: the folder row currently hovered by an\n * internal drag gets `.is-droptarget`. Purely visual — the accept/deny\n * decision below is untouched (files never preventDefault, so the browser\n * shows the native no-drop cursor on invalid targets). */\nconst dropTargetPath = ref<string | null>(null);\n\nfunction onItemDragOver(n: FileNode, ev: DragEvent) {\n if (n.type !== 'dir') return;\n if (!ev.dataTransfer?.types.includes('application/x-brf-files')) return;\n ev.preventDefault();\n ev.stopPropagation();\n if (ev.dataTransfer) ev.dataTransfer.dropEffect = 'move';\n dropTargetPath.value = n.path; /* wiring:c4 */\n}\n\n/* wiring:c4 */\nfunction onItemDragLeave(n: FileNode) {\n if (dropTargetPath.value === n.path) dropTargetPath.value = null;\n}\n\nfunction onItemDrop(n: FileNode, ev: DragEvent) {\n dropTargetPath.value = null; /* wiring:c4 */\n if (n.type !== 'dir') return;\n if (!ev.dataTransfer?.types.includes('application/x-brf-files')) return;\n ev.preventDefault();\n ev.stopPropagation();\n emit('item-drop-into', n, ev);\n}\n\nlet pressTimer: ReturnType<typeof setTimeout> | undefined;\nlet pressTarget: FileNode | null = null;\n\nfunction onTouchStart(n: FileNode, ev: TouchEvent) {\n pressTarget = n;\n if (pressTimer) clearTimeout(pressTimer);\n pressTimer = setTimeout(() => {\n if (pressTarget) {\n const t0 = ev.touches[0];\n emit('context-row', pressTarget, {\n clientX: t0.clientX,\n clientY: t0.clientY,\n preventDefault: () => {},\n } as unknown as MouseEvent);\n }\n }, 500);\n}\n\nfunction cancelPress() {\n if (pressTimer) clearTimeout(pressTimer);\n pressTarget = null;\n}\n\n// Special rows keep their emoji (trash/storage are not file-TYPE icons);\n// everything else renders the SVG icon set from lib/fileIcons.\nfunction specialEmojiFor(n: FileNode): string | null {\n if (n.basename === '.trash') return '🗑';\n if (n.mime_type === 'inode/storage') return '💾';\n if (n.type === 'dir' && n.e2e === true) return '🔒'; /* wiring:e2 — şifreli klasör rozeti */\n return null;\n}\n\nfunction isPinnedSpecial(n: FileNode): boolean {\n return n.basename === '.trash' || n.mime_type === 'inode/storage';\n}\n\nfunction displayDate(ms: number | undefined): string {\n if (!ms) return '—';\n const d = new Date(ms * (ms < 1e12 ? 1000 : 1));\n return d.toLocaleString();\n}\n\nfunction parentDir(path: string): string {\n const stripped = path.replace(/^[a-z][a-z0-9+.-]*:\\/\\//i, '');\n const idx = stripped.lastIndexOf('/');\n if (idx === -1) return '';\n return stripped.slice(0, idx);\n}\n\n/* bul:s3 — search-result enrichment. The v0.2 backend inlines `snippet`\n * (plain text, «» highlights) + `matched` on search hits; regular listings\n * never carry them, so presence-gating keeps normal rows untouched and an\n * older backend simply renders nothing extra. */\nfunction rowSnippet(n: FileNode): string {\n const s = (n as Record<string, unknown>).snippet;\n return typeof s === 'string' ? s : '';\n}\n\nfunction rowInContent(n: FileNode): boolean {\n return matchedInContent((n as Record<string, unknown>).matched);\n}\n\n// ------------------------------------------------------------------\n// Column sorting — local to the list view. Default (null) keeps the\n// backend order, i.e. exactly the pre-existing behavior.\n// ------------------------------------------------------------------\n\ntype SortKey = 'name' | 'size' | 'modified';\nconst SORT_LS_KEY = 'filex.list-sort';\n\nconst sortKey = ref<SortKey | null>(null);\nconst sortDir = ref<'asc' | 'desc'>('asc');\ntry {\n const raw = localStorage.getItem(SORT_LS_KEY);\n if (raw) {\n const p = JSON.parse(raw) as { key?: unknown; dir?: unknown };\n if (p.key === 'name' || p.key === 'size' || p.key === 'modified') sortKey.value = p.key;\n if (p.dir === 'asc' || p.dir === 'desc') sortDir.value = p.dir;\n }\n} catch {\n /* private mode / bad JSON */\n}\n\n// Dates default to newest-first, the others to ascending.\nfunction defaultDir(key: SortKey): 'asc' | 'desc' {\n return key === 'modified' ? 'desc' : 'asc';\n}\n\n// Click cycle per column: default direction → flipped → back to backend order.\nfunction toggleSort(key: SortKey) {\n if (sortKey.value !== key) {\n sortKey.value = key;\n sortDir.value = defaultDir(key);\n } else if (sortDir.value === defaultDir(key)) {\n sortDir.value = sortDir.value === 'asc' ? 'desc' : 'asc';\n } else {\n sortKey.value = null;\n }\n try {\n localStorage.setItem(\n SORT_LS_KEY,\n JSON.stringify({ key: sortKey.value, dir: sortDir.value }),\n );\n } catch {\n /* quota */\n }\n}\n\nfunction ariaSort(key: SortKey): 'ascending' | 'descending' | 'none' {\n if (sortKey.value !== key) return 'none';\n return sortDir.value === 'asc' ? 'ascending' : 'descending';\n}\n\nfunction modifiedMs(n: FileNode): number | null {\n const v = n.last_modified;\n if (!v) return null;\n return v * (v < 1e12 ? 1000 : 1);\n}\n\nconst rows = computed(() => {\n const key = sortKey.value;\n if (!key) return props.files;\n // Virtual rows (.trash / storage drives) stay pinned on top in their\n // original order; only real entries take part in the sort.\n const pinned: FileNode[] = [];\n const rest: FileNode[] = [];\n for (const n of props.files) (isPinnedSpecial(n) ? pinned : rest).push(n);\n const dir = sortDir.value === 'asc' ? 1 : -1;\n rest.sort((a, b) => {\n if (key === 'name') {\n return (\n dir *\n a.basename.localeCompare(b.basename, undefined, { numeric: true, sensitivity: 'base' })\n );\n }\n if (key === 'size') return dir * ((a.size ?? -1) - (b.size ?? -1));\n const am = modifiedMs(a);\n const bm = modifiedMs(b);\n // Undated rows go last in both directions so date groups stay clean.\n if (am == null && bm == null) return 0;\n if (am == null) return 1;\n if (bm == null) return -1;\n return dir * (am - bm);\n });\n return [...pinned, ...rest];\n});\n\n// ------------------------------------------------------------------\n// Date grouping — only while sorted by modified date. Rows are split\n// into contiguous segments so the row markup below stays untouched.\n// ------------------------------------------------------------------\n\ninterface Segment {\n id: string;\n /** null = no header (ungrouped mode, or the pinned virtual rows). */\n label: string | null;\n nodes: FileNode[];\n}\n\nconst monthFmt = computed(\n () =>\n new Intl.DateTimeFormat(props.locale === 'tr' ? 'tr-TR' : 'en-US', {\n month: 'long',\n year: 'numeric',\n }),\n);\n\nfunction bucketFor(ms: number | null): { id: string; label: string } {\n if (ms == null) return { id: 'none', label: t('group.no_date') };\n const d = new Date(ms);\n const now = new Date();\n const dayStart = (x: Date) => new Date(x.getFullYear(), x.getMonth(), x.getDate()).getTime();\n const today = dayStart(now);\n const day = dayStart(d);\n const DAY = 86_400_000;\n // Future stamps (clock skew) read best as \"today\".\n if (day >= today) return { id: 'today', label: t('group.today') };\n if (day === today - DAY) return { id: 'yesterday', label: t('group.yesterday') };\n if (day > today - 7 * DAY) return { id: 'week', label: t('group.this_week') };\n if (d.getFullYear() === now.getFullYear() && d.getMonth() === now.getMonth()) {\n return { id: 'month', label: t('group.this_month') };\n }\n return { id: `m-${d.getFullYear()}-${d.getMonth()}`, label: monthFmt.value.format(d) };\n}\n\nconst segments = computed<Segment[]>(() => {\n const list = rows.value;\n if (sortKey.value !== 'modified') return [{ id: 'all', label: null, nodes: list }];\n const out: Segment[] = [];\n let cur: Segment | null = null;\n for (const n of list) {\n const b = isPinnedSpecial(n) ? { id: 'pinned', label: null } : bucketFor(modifiedMs(n));\n if (!cur || cur.id !== b.id) {\n cur = { id: b.id, label: b.label, nodes: [] };\n out.push(cur);\n }\n cur.nodes.push(n);\n }\n return out;\n});\n</script>\n\n<template>\n <!-- wiring:c4 — grid semantics: container role + localized labels; rows\n carry aria-selected below. Structure/layout untouched. -->\n <div\n class=\"fe-list\"\n :class=\"{ 'is-loading': loading, 'has-star-col': !!apiBase || apiBase === '' }\"\n role=\"grid\"\n :aria-label=\"t('list.aria')\"\n :aria-busy=\"loading ? 'true' : undefined\"\n >\n <div class=\"fe-list__head\" role=\"row\">\n <div class=\"fe-list__col fe-list__col--star\" role=\"columnheader\" :aria-label=\"t('col.star') /* wiring:c4 */\"></div>\n <div class=\"fe-list__col fe-list__col--name\" role=\"columnheader\" :aria-sort=\"ariaSort('name')\">\n <button type=\"button\" class=\"fe-list__sort\" :title=\"t('col.sort')\" @click=\"toggleSort('name')\">\n {{ t('col.name') }}\n <span v-if=\"sortKey === 'name'\" class=\"fe-list__sort-arrow\" aria-hidden=\"true\">{{ sortDir === 'asc' ? '↑' : '↓' }}</span>\n </button>\n </div>\n <div class=\"fe-list__col fe-list__col--size\" role=\"columnheader\" :aria-sort=\"ariaSort('size')\">\n <button type=\"button\" class=\"fe-list__sort\" :title=\"t('col.sort')\" @click=\"toggleSort('size')\">\n {{ t('col.size') }}\n <span v-if=\"sortKey === 'size'\" class=\"fe-list__sort-arrow\" aria-hidden=\"true\">{{ sortDir === 'asc' ? '↑' : '↓' }}</span>\n </button>\n </div>\n <div class=\"fe-list__col fe-list__col--mod\" role=\"columnheader\" :aria-sort=\"ariaSort('modified')\">\n <button type=\"button\" class=\"fe-list__sort\" :title=\"t('col.sort')\" @click=\"toggleSort('modified')\">\n {{ t('col.modified') }}\n <span v-if=\"sortKey === 'modified'\" class=\"fe-list__sort-arrow\" aria-hidden=\"true\">{{ sortDir === 'asc' ? '↑' : '↓' }}</span>\n </button>\n </div>\n </div>\n <div class=\"fe-list__body\" role=\"rowgroup\">\n <template v-for=\"seg in segments\" :key=\"seg.id\">\n <div v-if=\"seg.label\" class=\"fe-list__group\" role=\"presentation\">{{ seg.label }}</div>\n <div\n v-for=\"n in seg.nodes\"\n :key=\"n.path\"\n class=\"fe-list__row\"\n :class=\"{\n 'is-selected': isSelected(n),\n 'is-dir': n.type === 'dir',\n 'is-trash': n.trashed,\n 'is-clipped': clipped?.has(n.path),\n 'is-droptarget': dropTargetPath === n.path /* wiring:c4 */,\n }\"\n role=\"row\"\n tabindex=\"0\"\n :aria-selected=\"isSelected(n) ? 'true' : 'false'\"\n :aria-label=\"nodeDisplayName(n) /* wiring:c4 */\"\n :data-fe-path=\"n.path /* wiring:d1 — orta-tık yeni sekme delegasyonu */\"\n draggable=\"true\"\n @click=\"onRowClick(n, $event)\"\n @dblclick=\"onRowDbl(n)\"\n @contextmenu=\"onRowCtx(n, $event)\"\n @dragstart=\"onItemDragStart(n, $event)\"\n @dragover=\"onItemDragOver(n, $event)\"\n @dragleave=\"onItemDragLeave(n) /* wiring:c4 */\"\n @drop=\"onItemDrop(n, $event)\"\n @touchstart.passive=\"onTouchStart(n, $event)\"\n @touchend=\"cancelPress\"\n @touchmove=\"cancelPress\"\n >\n <div class=\"fe-list__col fe-list__col--star\" role=\"gridcell\" @click.stop>\n <StarButton\n v-if=\"typeof n.id === 'number' && n.type === 'file'\"\n :starred=\"!!starredIds?.has(n.id)\"\n :node-id=\"n.id\"\n :api-base=\"apiBase\"\n :auth-headers=\"authHeaders\"\n :auth-credentials=\"authCredentials\"\n compact\n @change=\"(val: boolean) => emit('star-change', n, val)\"\n />\n </div>\n <div class=\"fe-list__col fe-list__col--name\" role=\"gridcell\">\n <span v-if=\"specialEmojiFor(n)\" class=\"fe-list__icon\" aria-hidden=\"true\">{{ specialEmojiFor(n) }}</span>\n <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n <span v-else class=\"fe-list__icon fe-list__icon--svg\" aria-hidden=\"true\" v-html=\"fileIconSvg(n)\"></span>\n <div class=\"fe-list__name-wrap\">\n <span class=\"fe-list__name\" :title=\"n.basename\">\n {{ nodeDisplayName(n) }}\n <!-- bul:s3 — content-match badge -->\n <span v-if=\"rowInContent(n)\" class=\"fe-list__badge\">{{ t('search.in_content') }}</span>\n </span>\n <span\n v-if=\"showParentPath\"\n class=\"fe-list__parent\"\n :title=\"parentDir(n.path)\"\n >{{ parentDir(n.path) || '—' }}</span>\n <!-- bul:s3 — content snippet («» → <mark> via TEXT segments, no innerHTML) -->\n <span v-if=\"rowSnippet(n)\" class=\"fe-list__snippet\">\n <template v-for=\"(seg, si) in snippetSegments(rowSnippet(n))\" :key=\"si\">\n <mark v-if=\"seg.match\" class=\"fe-list__mark\">{{ seg.text }}</mark>\n <template v-else>{{ seg.text }}</template>\n </template>\n </span>\n </div>\n </div>\n <div class=\"fe-list__col fe-list__col--size\" role=\"gridcell\">\n {{ formatSize(n.size) }}\n </div>\n <div class=\"fe-list__col fe-list__col--mod\" role=\"gridcell\">\n {{ displayDate(n.last_modified) }}\n </div>\n </div>\n </template>\n <div v-if=\"!loading && rows.length === 0\" class=\"fe-list__empty\">\n {{ t('empty.folder') }}\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * GridView — card grid. Thumbnails preferred, fall back to icon.\n */\nimport { ref } from 'vue'; /* wiring:c4 */\nimport type { FileNode } from '../types/FileNode';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { fileIconSvg } from '../lib/fileIcons';\nimport { snippetSegments } from '../lib/snippet'; /* bul:s3 */\nimport { applyDragGhost } from '../lib/dragGhost'; /* wiring:c4 */\n\nconst props = defineProps<{\n files: FileNode[];\n selected: Set<string>;\n clipped?: Set<string>;\n showParentPath?: boolean;\n locale: LocaleCode;\n loading?: boolean;\n /** Authenticated thumb resolver (useThumbs.src). Raw `thumb_url` is\n * root-relative and unauthenticated — a bare <img src> only works for the\n * native same-origin SPA, so embedded hosts NEED this. null = icon. */\n thumbSrc?: (n: FileNode) => string | null;\n}>();\n\nconst emit = defineEmits<{\n (e: 'click-card', node: FileNode, mod: { ctrl: boolean; shift: boolean }): void;\n (e: 'dbl-card', node: FileNode): void;\n (e: 'context-card', node: FileNode, ev: MouseEvent): void;\n (e: 'item-drag-start', node: FileNode, ev: DragEvent): void;\n (e: 'item-drop-into', target: FileNode, ev: DragEvent): void;\n}>();\n\nconst { t, formatSize, nodeDisplayName } = useLocale(() => props.locale);\n\n// Prefer the authenticated resolver when the host wired one; otherwise fall\n// back to the raw URL (legacy same-origin behavior).\nfunction thumbOf(n: FileNode): string | null {\n return props.thumbSrc ? props.thumbSrc(n) : (n.thumb_url ?? null);\n}\n\nfunction isSelected(n: FileNode): boolean {\n return props.selected.has(n.path);\n}\n\nfunction onClick(n: FileNode, ev: MouseEvent) {\n emit('click-card', n, { ctrl: ev.ctrlKey || ev.metaKey, shift: ev.shiftKey });\n}\n\nfunction onDbl(n: FileNode) {\n emit('dbl-card', n);\n}\n\nfunction onCtx(n: FileNode, ev: MouseEvent) {\n ev.preventDefault();\n ev.stopPropagation();\n emit('context-card', n, ev);\n}\n\nfunction onItemDragStart(n: FileNode, ev: DragEvent) {\n /* wiring:c4 — custom ghost (name + multi-select count badge), visual only. */\n applyDragGhost(\n ev,\n nodeDisplayName(n),\n props.selected.has(n.path) ? props.selected.size : 1,\n );\n emit('item-drag-start', n, ev);\n}\n\n/* wiring:c4 — droptarget highlight, mirrors ListView (visual layer only). */\nconst dropTargetPath = ref<string | null>(null);\n\nfunction onItemDragOver(n: FileNode, ev: DragEvent) {\n if (n.type !== 'dir') return;\n if (!ev.dataTransfer?.types.includes('application/x-brf-files')) return;\n ev.preventDefault();\n ev.stopPropagation();\n if (ev.dataTransfer) ev.dataTransfer.dropEffect = 'move';\n dropTargetPath.value = n.path; /* wiring:c4 */\n}\n\n/* wiring:c4 */\nfunction onItemDragLeave(n: FileNode) {\n if (dropTargetPath.value === n.path) dropTargetPath.value = null;\n}\n\nfunction onItemDrop(n: FileNode, ev: DragEvent) {\n dropTargetPath.value = null; /* wiring:c4 */\n if (n.type !== 'dir') return;\n if (!ev.dataTransfer?.types.includes('application/x-brf-files')) return;\n ev.preventDefault();\n ev.stopPropagation();\n emit('item-drop-into', n, ev);\n}\n\nlet pressTimer: ReturnType<typeof setTimeout> | undefined;\nlet pressTarget: FileNode | null = null;\nfunction onTouchStart(n: FileNode, ev: TouchEvent) {\n pressTarget = n;\n if (pressTimer) clearTimeout(pressTimer);\n pressTimer = setTimeout(() => {\n if (pressTarget) {\n const t0 = ev.touches[0];\n emit('context-card', pressTarget, {\n clientX: t0.clientX,\n clientY: t0.clientY,\n preventDefault: () => {},\n } as unknown as MouseEvent);\n }\n }, 500);\n}\nfunction cancelPress() {\n if (pressTimer) clearTimeout(pressTimer);\n pressTarget = null;\n}\n\nfunction parentDir(path: string): string {\n const stripped = path.replace(/^[a-z][a-z0-9+.-]*:\\/\\//i, '');\n const idx = stripped.lastIndexOf('/');\n if (idx === -1) return '';\n return stripped.slice(0, idx);\n}\n\n// Special rows keep their emoji (trash/storage are not file-TYPE icons);\n// everything else renders the SVG icon set from lib/fileIcons.\nfunction specialEmojiFor(n: FileNode): string | null {\n if (n.basename === '.trash') return '🗑';\n if (n.mime_type === 'inode/storage') return '💾';\n if (n.type === 'dir' && n.e2e === true) return '🔒'; /* wiring:e2 — şifreli klasör rozeti */\n return null;\n}\n\n/* bul:s3 — search-result enrichment, same presence-gating as ListView:\n * only search hits carry `snippet`, so normal listings render nothing. */\nfunction cardSnippet(n: FileNode): string {\n const s = (n as Record<string, unknown>).snippet;\n return typeof s === 'string' ? s : '';\n}\n\n// Plain-text form for the title attribute — same parser as the render\n// path, guillemets dropped (no separate sanitize route).\nfunction snippetTitle(snippet: string): string {\n return snippetSegments(snippet)\n .map((seg) => seg.text)\n .join('');\n}\n</script>\n\n<template>\n <!-- wiring:c4 — listbox semantics (multi-selectable cards as options);\n localized label + busy state. Structure/layout untouched. -->\n <div\n class=\"fe-grid\"\n :class=\"{ 'is-loading': loading }\"\n role=\"listbox\"\n aria-multiselectable=\"true\"\n :aria-label=\"t('grid.aria')\"\n :aria-busy=\"loading ? 'true' : undefined\"\n >\n <div\n v-for=\"n in files\"\n :key=\"n.path\"\n class=\"fe-grid__card\"\n :class=\"{\n 'is-selected': isSelected(n),\n 'is-dir': n.type === 'dir',\n 'is-trash': n.trashed,\n 'is-clipped': clipped?.has(n.path),\n 'is-droptarget': dropTargetPath === n.path /* wiring:c4 */,\n }\"\n tabindex=\"0\"\n role=\"option\"\n :aria-selected=\"isSelected(n) ? 'true' : 'false'\"\n :aria-label=\"nodeDisplayName(n) /* wiring:c4 */\"\n :data-fe-path=\"n.path /* wiring:d1 — orta-tık yeni sekme delegasyonu */\"\n draggable=\"true\"\n @click=\"onClick(n, $event)\"\n @dblclick=\"onDbl(n)\"\n @contextmenu=\"onCtx(n, $event)\"\n @dragstart=\"onItemDragStart(n, $event)\"\n @dragover=\"onItemDragOver(n, $event)\"\n @dragleave=\"onItemDragLeave(n) /* wiring:c4 */\"\n @drop=\"onItemDrop(n, $event)\"\n @touchstart.passive=\"onTouchStart(n, $event)\"\n @touchend=\"cancelPress\"\n @touchmove=\"cancelPress\"\n >\n <div class=\"fe-grid__thumb\">\n <!--\n draggable=\"false\" — HTML5 image drag dataTransfer adds 'Files'\n MIME, which trips the parent's upload handler; without this\n the user dragging an item with a thumbnail re-uploads it.\n Parent card stays draggable=true so internal move works.\n -->\n <img\n v-if=\"thumbOf(n)\"\n :src=\"thumbOf(n)!\"\n :alt=\"n.basename\"\n loading=\"lazy\"\n draggable=\"false\"\n />\n <span v-else-if=\"specialEmojiFor(n)\" class=\"fe-grid__icon\">{{ specialEmojiFor(n) }}</span>\n <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n <span v-else class=\"fe-grid__icon fe-grid__icon--svg\" v-html=\"fileIconSvg(n)\"></span>\n </div>\n <div class=\"fe-grid__label\" :title=\"n.basename\">\n {{ nodeDisplayName(n) }}\n </div>\n <div\n v-if=\"showParentPath\"\n class=\"fe-grid__parent\"\n :title=\"parentDir(n.path)\"\n >{{ parentDir(n.path) || '—' }}</div>\n <div class=\"fe-grid__meta\">\n {{ formatSize(n.size) }}\n </div>\n <!-- bul:s3 — content snippet («» → <mark> via TEXT segments, no innerHTML) -->\n <div v-if=\"cardSnippet(n)\" class=\"fe-grid__snippet\" :title=\"snippetTitle(cardSnippet(n))\">\n <template v-for=\"(seg, si) in snippetSegments(cardSnippet(n))\" :key=\"si\">\n <mark v-if=\"seg.match\" class=\"fe-grid__mark\">{{ seg.text }}</mark>\n <template v-else>{{ seg.text }}</template>\n </template>\n </div>\n </div>\n <div v-if=\"!loading && files.length === 0\" class=\"fe-grid__empty\">\n {{ t('empty.folder') }}\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n// (unscoped styles by design — see base.css wiring:d2 block; SFC scoped\n// styles are banned for webcomponent data-v hash mismatch reasons.)\n/**\n * GalleryView — wiring:d2. Third view mode: large-thumbnail gallery for\n * visual browsing (photos/videos). Derived from GridView (same props/emits,\n * same listbox a11y, same selection/drag/touch contract) but renders big\n * square tiles: thumbnail (or SVG file-type icon fallback) with the name\n * below and size+date revealed on hover/focus. GridView itself is untouched.\n */\nimport { ref } from 'vue';\nimport type { FileNode } from '../types/FileNode';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { fileIconSvg } from '../lib/fileIcons';\nimport { applyDragGhost } from '../lib/dragGhost';\n\nconst props = defineProps<{\n files: FileNode[];\n selected: Set<string>;\n clipped?: Set<string>;\n showParentPath?: boolean;\n locale: LocaleCode;\n loading?: boolean;\n /** Authenticated thumb resolver (useThumbs.src) — same contract as\n * GridView: raw `thumb_url` is root-relative and unauthenticated, so\n * embedded hosts NEED this. null = icon fallback. */\n thumbSrc?: (n: FileNode) => string | null;\n}>();\n\nconst emit = defineEmits<{\n (e: 'click-card', node: FileNode, mod: { ctrl: boolean; shift: boolean }): void;\n (e: 'dbl-card', node: FileNode): void;\n (e: 'context-card', node: FileNode, ev: MouseEvent): void;\n (e: 'item-drag-start', node: FileNode, ev: DragEvent): void;\n (e: 'item-drop-into', target: FileNode, ev: DragEvent): void;\n}>();\n\nconst { t, formatSize, nodeDisplayName } = useLocale(() => props.locale);\n\nfunction thumbOf(n: FileNode): string | null {\n return props.thumbSrc ? props.thumbSrc(n) : (n.thumb_url ?? null);\n}\n\nfunction isSelected(n: FileNode): boolean {\n return props.selected.has(n.path);\n}\n\nfunction onClick(n: FileNode, ev: MouseEvent) {\n emit('click-card', n, { ctrl: ev.ctrlKey || ev.metaKey, shift: ev.shiftKey });\n}\n\nfunction onDbl(n: FileNode) {\n emit('dbl-card', n);\n}\n\nfunction onCtx(n: FileNode, ev: MouseEvent) {\n ev.preventDefault();\n ev.stopPropagation();\n emit('context-card', n, ev);\n}\n\nfunction onItemDragStart(n: FileNode, ev: DragEvent) {\n applyDragGhost(\n ev,\n nodeDisplayName(n),\n props.selected.has(n.path) ? props.selected.size : 1,\n );\n emit('item-drag-start', n, ev);\n}\n\n// Drop-target highlight — mirrors GridView (visual layer only).\nconst dropTargetPath = ref<string | null>(null);\n\nfunction onItemDragOver(n: FileNode, ev: DragEvent) {\n if (n.type !== 'dir') return;\n if (!ev.dataTransfer?.types.includes('application/x-brf-files')) return;\n ev.preventDefault();\n ev.stopPropagation();\n if (ev.dataTransfer) ev.dataTransfer.dropEffect = 'move';\n dropTargetPath.value = n.path;\n}\n\nfunction onItemDragLeave(n: FileNode) {\n if (dropTargetPath.value === n.path) dropTargetPath.value = null;\n}\n\nfunction onItemDrop(n: FileNode, ev: DragEvent) {\n dropTargetPath.value = null;\n if (n.type !== 'dir') return;\n if (!ev.dataTransfer?.types.includes('application/x-brf-files')) return;\n ev.preventDefault();\n ev.stopPropagation();\n emit('item-drop-into', n, ev);\n}\n\n// Long-press → context menu, same as GridView (touch parity).\nlet pressTimer: ReturnType<typeof setTimeout> | undefined;\nlet pressTarget: FileNode | null = null;\nfunction onTouchStart(n: FileNode, ev: TouchEvent) {\n pressTarget = n;\n if (pressTimer) clearTimeout(pressTimer);\n pressTimer = setTimeout(() => {\n if (pressTarget) {\n const t0 = ev.touches[0];\n emit('context-card', pressTarget, {\n clientX: t0.clientX,\n clientY: t0.clientY,\n preventDefault: () => {},\n } as unknown as MouseEvent);\n }\n }, 500);\n}\nfunction cancelPress() {\n if (pressTimer) clearTimeout(pressTimer);\n pressTarget = null;\n}\n\nfunction parentDir(path: string): string {\n const stripped = path.replace(/^[a-z][a-z0-9+.-]*:\\/\\//i, '');\n const idx = stripped.lastIndexOf('/');\n if (idx === -1) return '';\n return stripped.slice(0, idx);\n}\n\n// Special rows keep their emoji (trash/storage are not file-TYPE icons).\nfunction specialEmojiFor(n: FileNode): string | null {\n if (n.basename === '.trash') return '🗑';\n if (n.mime_type === 'inode/storage') return '💾';\n if (n.type === 'dir' && n.e2e === true) return '🔒'; /* wiring:e2 — şifreli klasör rozeti */\n return null;\n}\n\nfunction displayDate(ms: number | undefined): string {\n if (!ms) return '';\n const d = new Date(ms * (ms < 1e12 ? 1000 : 1));\n return d.toLocaleString();\n}\n\n// Hover meta line: size for files, entry count (when known) for dirs.\nfunction metaFor(n: FileNode): string {\n const date = displayDate(n.last_modified);\n const size = n.type === 'dir' ? '' : formatSize(n.size);\n return [size, date].filter((s) => !!s).join(' · ');\n}\n</script>\n\n<template>\n <div\n class=\"fe-gal\"\n :class=\"{ 'is-loading': loading }\"\n role=\"listbox\"\n aria-multiselectable=\"true\"\n :aria-label=\"t('gallery.aria')\"\n :aria-busy=\"loading ? 'true' : undefined\"\n >\n <div\n v-for=\"n in files\"\n :key=\"n.path\"\n class=\"fe-gal__card\"\n :class=\"{\n 'is-selected': isSelected(n),\n 'is-dir': n.type === 'dir',\n 'is-trash': n.trashed,\n 'is-clipped': clipped?.has(n.path),\n 'is-droptarget': dropTargetPath === n.path,\n }\"\n tabindex=\"0\"\n role=\"option\"\n :aria-selected=\"isSelected(n) ? 'true' : 'false'\"\n :aria-label=\"nodeDisplayName(n)\"\n draggable=\"true\"\n @click=\"onClick(n, $event)\"\n @dblclick=\"onDbl(n)\"\n @contextmenu=\"onCtx(n, $event)\"\n @dragstart=\"onItemDragStart(n, $event)\"\n @dragover=\"onItemDragOver(n, $event)\"\n @dragleave=\"onItemDragLeave(n)\"\n @drop=\"onItemDrop(n, $event)\"\n @touchstart.passive=\"onTouchStart(n, $event)\"\n @touchend=\"cancelPress\"\n @touchmove=\"cancelPress\"\n >\n <div class=\"fe-gal__thumb\">\n <!-- draggable=\"false\" for the same reason as GridView: HTML5 image\n drag adds a 'Files' MIME to dataTransfer, which would trip the\n parent's upload handler on internal drags. -->\n <img\n v-if=\"thumbOf(n)\"\n :src=\"thumbOf(n)!\"\n :alt=\"n.basename\"\n loading=\"lazy\"\n draggable=\"false\"\n />\n <span v-else-if=\"specialEmojiFor(n)\" class=\"fe-gal__icon\">{{ specialEmojiFor(n) }}</span>\n <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n <span v-else class=\"fe-gal__icon fe-gal__icon--svg\" v-html=\"fileIconSvg(n)\"></span>\n <div class=\"fe-gal__meta\" aria-hidden=\"true\">\n <span v-if=\"metaFor(n)\" class=\"fe-gal__meta-line\">{{ metaFor(n) }}</span>\n <span\n v-if=\"showParentPath && parentDir(n.path)\"\n class=\"fe-gal__meta-line fe-gal__meta-line--path\"\n :title=\"parentDir(n.path)\"\n >{{ parentDir(n.path) }}</span>\n </div>\n </div>\n <div class=\"fe-gal__label\" :title=\"n.basename\">\n {{ nodeDisplayName(n) }}\n </div>\n </div>\n <div v-if=\"!loading && files.length === 0\" class=\"fe-gal__empty\">\n {{ t('empty.folder') }}\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * UploadProgress — renderless upload publisher (wiring:c3).\n *\n * Historically this drew its own floating bottom-right footer. Since the\n * unified operations center it renders NOTHING: it reconciles the host's\n * `jobs` list into the shared useOperations store, and the visible UI is\n * OperationsCenter's badge + panel. The original emit contract is kept —\n * cancel/dismiss (and the new retry) still bubble to the host, which owns\n * the actual upload machinery. Mount it exactly as before; just pass the\n * store via `center`.\n */\nimport { watch } from 'vue';\nimport type { UploadJob } from '../composables/useUploadChunked';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport type { OperationsStore, OperationStatus } from '../composables/useOperations';\n\nconst props = defineProps<{\n jobs: UploadJob[];\n /** Kept for mount compatibility — strings now render in OperationsCenter. */\n locale: LocaleCode;\n center: OperationsStore;\n}>();\n\nconst emit = defineEmits<{\n (e: 'cancel', job: UploadJob): void;\n (e: 'dismiss', job: UploadJob): void;\n (e: 'retry', job: UploadJob): void;\n}>();\n\nfunction mapStatus(s: UploadJob['status']): OperationStatus {\n if (s === 'done') return 'done';\n if (s === 'error') return 'error';\n if (s === 'aborted') return 'aborted';\n return 'running'; // pending | initializing | uploading | finalizing\n}\n\nwatch(\n () => props.jobs,\n (jobs) => {\n props.center.sync(\n 'upload',\n jobs.map((j) => ({\n input: {\n id: j.id,\n kind: 'upload' as const,\n name: j.file.name,\n percent: j.totalBytes > 0 || j.status === 'done' ? j.percent : null,\n status: mapStatus(j.status),\n error: j.error ?? null,\n uploadedBytes: j.uploadedBytes,\n totalBytes: j.totalBytes,\n cancellable: j.status === 'uploading' || j.status === 'initializing',\n retryable: j.status === 'error',\n },\n actions: {\n cancel: () => emit('cancel', j),\n dismiss: () => emit('dismiss', j),\n retry: () => emit('retry', j),\n },\n })),\n );\n },\n { immediate: true },\n);\n</script>\n\n<template>\n <i v-if=\"false\" />\n</template>\n","<script setup lang=\"ts\">\n/**\n * PendingOpsTray — renderless ops-queue publisher (wiring:c3).\n *\n * Historically a bottom-left toast list for queued copy/move/delete. Since\n * the unified operations center it renders NOTHING: it reconciles the\n * usePendingOps rows into the shared useOperations store; OperationsCenter\n * draws them. Terminal-state lingering (\"bitti\" flash → history) and sticky\n * errors are handled by the store — note usePendingOps sweeps terminal rows\n * after its RETAIN window, which the store treats as \"move to history\"\n * (errors stay pinned until the user dismisses them).\n *\n * Queue ops are not client-retryable: the normalized PendingOp no longer\n * carries the source list, so a failed op only offers dismiss.\n */\nimport { watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport type { PendingOp } from '../composables/usePendingOps';\nimport type { OperationsStore, OperationStatus } from '../composables/useOperations';\n\nconst props = defineProps<{\n ops: PendingOp[];\n /** Kept for mount compatibility — strings now render in OperationsCenter. */\n locale: LocaleCode;\n center: OperationsStore;\n}>();\n\nconst emit = defineEmits<{\n (e: 'dismiss', id: number): void;\n}>();\n\nfunction mapStatus(op: PendingOp): OperationStatus {\n if (op.status === 'done') return 'done';\n if (op.status === 'error') return 'error';\n return 'running'; // pending | running\n}\n\nfunction percentOf(op: PendingOp): number | null {\n if (op.status === 'done') return 100;\n if (op.progress_total <= 0) return null;\n return Math.min(100, Math.round((op.progress_done / op.progress_total) * 100));\n}\n\nwatch(\n () => props.ops,\n (ops) => {\n props.center.sync(\n 'ops',\n ops.map((op) => ({\n input: {\n id: op.id,\n kind: op.op_type,\n name: op.target_path || op.source_dir || '',\n percent: percentOf(op),\n status: mapStatus(op),\n error: op.error_message,\n queued: op.status === 'pending',\n doneCount: op.progress_done,\n totalCount: op.progress_total,\n cancellable: false,\n retryable: false,\n },\n actions: {\n dismiss: () => emit('dismiss', op.id),\n },\n })),\n );\n },\n { immediate: true },\n);\n</script>\n\n<template>\n <i v-if=\"false\" />\n</template>\n","<script setup lang=\"ts\">\n/**\n * InspectorPanel — koru:k1 details (\"Ayrıntılar\") side panel.\n *\n * Rendered as a flex sibling of `.fe__body` (right side, ~300px). In\n * `fe--narrow` embeds it becomes a full-size overlay with its own close\n * button (Esc handled by FileExplorer's shortcut chain).\n *\n * Sections:\n * - Genel : icon/thumb, name, path (copy), size, modified, mime, etag.\n * Multi-select → \"N items, total X\" summary; no selection →\n * current-folder summary.\n * - Sürümler : version history via GET /api/files/versions?node_id=…\n * + restore (with optional snapshot-current) + snapshot-now.\n * The section hides silently when the backend gates the\n * endpoint (401/403) or doesn't ship it (404).\n * - İzinler : effective RBAC level badge + \"manage\" (opens the existing\n * PermissionsModal through the host). Only when ACL is\n * enforced on the storage (perm is a non-empty string).\n * - Paylaşımlar: existing share links (GET /api/files/share?path=…) with\n * copy buttons. Hidden silently when the list call fails\n * (viewer-level users get 403 by design).\n *\n * The panel is mounted with v-if by the host — closed state leaves zero DOM.\n */\nimport { computed, ref, watch } from 'vue';\nimport type { FileApi, NodeVersion } from '../composables/useFileApi';\nimport type { FileNode, ShareInfo } from '../types/FileNode';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { fileIconSvg } from '../lib/fileIcons';\n\nconst props = defineProps<{\n api: FileApi;\n /** Current selection (empty array → current-folder summary). */\n nodes: FileNode[];\n /** Display label of the folder being viewed (for the no-selection state). */\n dirLabel: string;\n /** Number of entries in the folder being viewed. */\n dirCount: number;\n /** RBAC effective level of the current dir ('' = ACL not enforced). */\n dirPerm?: string;\n locale: LocaleCode;\n /** Narrow/embed mode → full-size overlay presentation. */\n narrow?: boolean;\n /** Authenticated thumbnail resolver (useThumbs.src). Optional. */\n thumbSrc?: (n: FileNode) => string | null;\n}>();\n\nconst emit = defineEmits<{\n (e: 'close'): void;\n (e: 'manage-permissions', node: FileNode): void;\n (e: 'toast', message: string): void;\n /** Fired after a successful restore/snapshot so the host can reload. */\n (e: 'changed'): void;\n}>();\n\nconst { t, formatSize, nodeDisplayName } = useLocale(() => props.locale);\n\n// ── selection shape ──────────────────────────────────────────────────\nconst single = computed<FileNode | null>(() =>\n props.nodes.length === 1 ? props.nodes[0] : null,\n);\nconst isMulti = computed(() => props.nodes.length > 1);\nconst isFile = computed(() => single.value?.type === 'file');\nconst nodeId = computed<number | null>(() =>\n typeof single.value?.id === 'number' ? (single.value.id as number) : null,\n);\nconst multiTotal = computed(() =>\n props.nodes.reduce((acc, n) => acc + (typeof n.size === 'number' ? n.size : 0), 0),\n);\nconst etag = computed<string | null>(() => {\n const v = single.value?.etag;\n return typeof v === 'string' && v !== '' ? v : null;\n});\nconst thumb = computed<string | null>(() =>\n single.value && isFile.value && props.thumbSrc ? props.thumbSrc(single.value) : null,\n);\n\nfunction shortHash(h: string): string {\n return h.length > 12 ? `${h.slice(0, 12)}…` : h;\n}\n\nfunction formatDate(ms: number | undefined): string {\n if (!ms) return '—';\n try {\n return new Date(ms).toLocaleString(props.locale === 'en' ? 'en-GB' : 'tr-TR', {\n dateStyle: 'medium',\n timeStyle: 'short',\n });\n } catch {\n return new Date(ms).toISOString();\n }\n}\n\nfunction formatDateStr(s: string | undefined | null): string {\n if (!s) return '—';\n const ms = Date.parse(s);\n return Number.isNaN(ms) ? s : formatDate(ms);\n}\n\nasync function copyText(text: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(text);\n emit('toast', t('inspector.copied'));\n } catch {\n emit('toast', text);\n }\n}\n\n// ── RBAC (İzinler) ───────────────────────────────────────────────────\n// Effective level for the selected item: its own perm, else the dir's.\n// A non-empty string means ACL is enforced → section shows.\nconst effectivePerm = computed<string>(() => {\n if (!single.value) return '';\n // Backends may send '' when ACL is off — widen past the declared union.\n const own = single.value.perm as string | undefined;\n if (typeof own === 'string' && own !== '') return own;\n return props.dirPerm || '';\n});\nconst canManagePerms = computed(\n () => effectivePerm.value === 'editor' || effectivePerm.value === 'owner',\n);\nfunction permLabel(level: string): string {\n return t(`inspector.perm.${level}`) === `inspector.perm.${level}`\n ? level\n : t(`inspector.perm.${level}`);\n}\n\n// ── versions state ───────────────────────────────────────────────────\ntype SectionState = 'idle' | 'loading' | 'ok' | 'hidden' | 'error';\nconst versionsState = ref<SectionState>('idle');\nconst versions = ref<NodeVersion[]>([]);\nconst confirmVersionId = ref<number | null>(null);\nconst snapshotFirst = ref(true);\nconst versionBusy = ref(false);\n\n// ── shares state ─────────────────────────────────────────────────────\nconst sharesState = ref<SectionState>('idle');\nconst shares = ref<ShareInfo[]>([]);\n\n// Race guard: only the latest refresh may write state.\nlet refreshSeq = 0;\n\nasync function refresh(): Promise<void> {\n const seq = ++refreshSeq;\n confirmVersionId.value = null;\n versions.value = [];\n shares.value = [];\n\n // Versions — single file with a backend node id only.\n if (single.value && isFile.value && nodeId.value != null) {\n versionsState.value = 'loading';\n void loadVersions(seq);\n } else {\n versionsState.value = 'hidden';\n }\n\n // Shares — any single selection (files and folders both shareable).\n if (single.value) {\n sharesState.value = 'loading';\n const path = single.value.path;\n try {\n const { shares: list } = await props.api.listShares(path);\n if (seq !== refreshSeq) return;\n shares.value = Array.isArray(list) ? list : [];\n sharesState.value = 'ok';\n } catch {\n if (seq !== refreshSeq) return;\n // 403 = viewer-level user (by design), anything else — auxiliary\n // info, hide silently rather than alarm.\n sharesState.value = 'hidden';\n }\n } else {\n sharesState.value = 'hidden';\n }\n}\n\nasync function loadVersions(seq: number): Promise<void> {\n const id = nodeId.value;\n if (id == null) return;\n try {\n const list = await props.api.listVersions(id);\n if (seq !== refreshSeq) return;\n versions.value = list;\n versionsState.value = 'ok';\n } catch (err) {\n if (seq !== refreshSeq) return;\n const status = (err as { status?: number }).status;\n // Gated (401/403) or absent (404) endpoint → section silently hidden.\n if (status === 401 || status === 403 || status === 404) {\n versionsState.value = 'hidden';\n } else {\n versionsState.value = 'error';\n }\n }\n}\n\nfunction askRestore(v: NodeVersion): void {\n confirmVersionId.value = v.id;\n snapshotFirst.value = true;\n}\n\nasync function confirmRestore(v: NodeVersion): Promise<void> {\n const id = nodeId.value;\n if (id == null || versionBusy.value) return;\n versionBusy.value = true;\n try {\n await props.api.restoreVersion(id, v.id, snapshotFirst.value);\n emit('toast', t('inspector.versions.restored'));\n confirmVersionId.value = null;\n emit('changed');\n await loadVersions(++refreshSeq);\n } catch (err) {\n emit('toast', (err as Error).message);\n } finally {\n versionBusy.value = false;\n }\n}\n\nasync function takeSnapshot(): Promise<void> {\n const id = nodeId.value;\n if (id == null || versionBusy.value) return;\n versionBusy.value = true;\n try {\n await props.api.snapshotVersion(id);\n emit('toast', t('inspector.versions.snapshotted'));\n await loadVersions(++refreshSeq);\n } catch (err) {\n const status = (err as { status?: number }).status;\n // Older backends don't ship POST /versions/snapshot yet.\n if (status === 404 || status === 405 || status === 501) {\n emit('toast', t('inspector.versions.unsupported'));\n } else {\n emit('toast', (err as Error).message);\n }\n } finally {\n versionBusy.value = false;\n }\n}\n\nwatch(\n () => props.nodes.map((n) => n.path).join('\u0000'),\n () => void refresh(),\n { immediate: true },\n);\n\n/* === calisma:d3 — Yorumlar (node comments) ===\n * Flat chronological thread per node (files AND folders — every backend\n * row carries an id). Loaded through its own watcher + seq guard so the\n * existing refresh() stays untouched. Add/delete are NOT optimistic: the\n * list re-fetches after each successful API round-trip. The section hides\n * silently when the backend gates (401/403) or lacks (404) the endpoint.\n */\nimport type { NodeComment } from '../composables/useFileApi';\n\nconst commentsState = ref<SectionState>('hidden');\nconst comments = ref<NodeComment[]>([]);\nconst commentDraft = ref('');\nconst commentBusy = ref(false);\nconst commentNodeId = computed<number | null>(() =>\n typeof single.value?.id === 'number' ? (single.value.id as number) : null,\n);\nlet commentSeq = 0;\n\nasync function loadComments(): Promise<void> {\n const seq = ++commentSeq;\n const id = commentNodeId.value;\n if (id == null) {\n commentsState.value = 'hidden';\n comments.value = [];\n return;\n }\n commentsState.value = comments.value.length > 0 ? 'ok' : 'loading';\n try {\n const list = await props.api.listComments(id);\n if (seq !== commentSeq) return;\n comments.value = list;\n commentsState.value = 'ok';\n } catch (err) {\n if (seq !== commentSeq) return;\n comments.value = [];\n const status = (err as { status?: number }).status;\n commentsState.value =\n status === 401 || status === 403 || status === 404 ? 'hidden' : 'error';\n }\n}\n\nasync function sendComment(): Promise<void> {\n const id = commentNodeId.value;\n const body = commentDraft.value.trim();\n if (id == null || body === '' || commentBusy.value) return;\n commentBusy.value = true;\n try {\n await props.api.addComment(id, body);\n commentDraft.value = '';\n await loadComments();\n } catch (err) {\n emit('toast', (err as Error).message);\n } finally {\n commentBusy.value = false;\n }\n}\n\nasync function removeComment(c: NodeComment): Promise<void> {\n if (commentBusy.value) return;\n commentBusy.value = true;\n try {\n await props.api.deleteComment(c.id);\n await loadComments();\n } catch (err) {\n emit('toast', (err as Error).message);\n } finally {\n commentBusy.value = false;\n }\n}\n\n/** Relative \"3 minutes ago\" stamp via Intl (locale-aware, no i18n keys). */\nfunction relativeTime(iso: string): string {\n const ms = Date.parse(iso);\n if (Number.isNaN(ms)) return iso;\n const diffS = Math.round((ms - Date.now()) / 1000);\n const abs = Math.abs(diffS);\n const units: Array<[Intl.RelativeTimeFormatUnit, number]> = [\n ['year', 31536000],\n ['month', 2592000],\n ['day', 86400],\n ['hour', 3600],\n ['minute', 60],\n ];\n try {\n const rtf = new Intl.RelativeTimeFormat(\n props.locale === 'en' ? 'en' : 'tr',\n { numeric: 'auto' },\n );\n for (const [unit, secs] of units) {\n if (abs >= secs) return rtf.format(Math.trunc(diffS / secs), unit);\n }\n return rtf.format(diffS, 'second');\n } catch {\n return formatDateStr(iso);\n }\n}\n\nwatch(\n () => commentNodeId.value,\n () => {\n comments.value = [];\n commentDraft.value = '';\n void loadComments();\n },\n { immediate: true },\n);\n/* === /calisma:d3 === */\n</script>\n\n<template>\n <aside\n class=\"fe-inspector\"\n :class=\"{ 'fe-inspector--overlay': narrow }\"\n role=\"complementary\"\n :aria-label=\"t('inspector.title')\"\n >\n <header class=\"fe-inspector__head\">\n <h2 class=\"fe-inspector__title\">{{ t('inspector.title') }}</h2>\n <button\n type=\"button\"\n class=\"fe-inspector__close\"\n :title=\"t('inspector.close')\"\n :aria-label=\"t('inspector.close')\"\n @click=\"emit('close')\"\n >×</button>\n </header>\n\n <div class=\"fe-inspector__scroll\">\n <!-- ══ Genel ══ -->\n <section class=\"fe-inspector__section\">\n <h3 class=\"fe-inspector__heading\">{{ t('inspector.section.general') }}</h3>\n\n <!-- Multi selection → summary -->\n <div v-if=\"isMulti\" class=\"fe-inspector__hero\">\n <span class=\"fe-inspector__bigicon\" v-html=\"fileIconSvg({ type: 'dir' })\"></span>\n <p class=\"fe-inspector__name\">\n {{ t('inspector.items_summary', { n: nodes.length, size: formatSize(multiTotal) }) }}\n </p>\n </div>\n\n <!-- Single selection → full meta -->\n <template v-else-if=\"single\">\n <div class=\"fe-inspector__hero\">\n <img\n v-if=\"thumb\"\n class=\"fe-inspector__thumb\"\n :src=\"thumb\"\n alt=\"\"\n aria-hidden=\"true\"\n />\n <span\n v-else\n class=\"fe-inspector__bigicon\"\n v-html=\"fileIconSvg(single)\"\n ></span>\n <p class=\"fe-inspector__name\" :title=\"single.basename\">\n {{ nodeDisplayName(single) }}\n </p>\n </div>\n\n <dl class=\"fe-inspector__meta\">\n <div class=\"fe-inspector__row\">\n <dt>{{ t('inspector.path') }}</dt>\n <dd class=\"fe-inspector__pathcell\">\n <span class=\"fe-inspector__path\" :title=\"single.path\">{{ single.path }}</span>\n <button\n type=\"button\"\n class=\"fe-inspector__copy\"\n :title=\"t('inspector.copy')\"\n :aria-label=\"t('inspector.copy')\"\n @click=\"copyText(single.path)\"\n >⧉</button>\n </dd>\n </div>\n <div v-if=\"isFile\" class=\"fe-inspector__row\">\n <dt>{{ t('inspector.size') }}</dt>\n <dd>{{ formatSize(typeof single.size === 'number' ? single.size : null) }}</dd>\n </div>\n <div class=\"fe-inspector__row\">\n <dt>{{ t('inspector.modified') }}</dt>\n <dd>{{ formatDate(single.last_modified) }}</dd>\n </div>\n <div v-if=\"isFile && single.mime_type\" class=\"fe-inspector__row\">\n <dt>{{ t('inspector.mime') }}</dt>\n <dd class=\"fe-inspector__mime\">{{ single.mime_type }}</dd>\n </div>\n <div v-if=\"etag\" class=\"fe-inspector__row\">\n <dt>{{ t('inspector.etag') }}</dt>\n <dd class=\"fe-inspector__pathcell\">\n <span class=\"fe-inspector__path\" :title=\"etag\">{{ shortHash(etag) }}</span>\n <button\n type=\"button\"\n class=\"fe-inspector__copy\"\n :title=\"t('inspector.copy')\"\n :aria-label=\"t('inspector.copy')\"\n @click=\"copyText(etag)\"\n >⧉</button>\n </dd>\n </div>\n </dl>\n </template>\n\n <!-- No selection → current folder summary -->\n <div v-else class=\"fe-inspector__hero\">\n <span class=\"fe-inspector__bigicon\" v-html=\"fileIconSvg({ type: 'dir' })\"></span>\n <p class=\"fe-inspector__name\" :title=\"dirLabel\">{{ dirLabel }}</p>\n <p class=\"fe-inspector__sub\">{{ t('inspector.folder_items', { n: dirCount }) }}</p>\n </div>\n </section>\n\n <!-- ══ Sürümler ══ -->\n <section\n v-if=\"versionsState === 'ok' || versionsState === 'error'\"\n class=\"fe-inspector__section\"\n >\n <h3 class=\"fe-inspector__heading\">{{ t('inspector.section.versions') }}</h3>\n\n <p v-if=\"versionsState === 'error'\" class=\"fe-inspector__empty\">\n {{ t('inspector.error') }}\n </p>\n <template v-else>\n <p v-if=\"versions.length === 0\" class=\"fe-inspector__empty\">\n {{ t('inspector.versions.empty') }}\n </p>\n <ul v-else class=\"fe-inspector__versions\">\n <li v-for=\"v in versions\" :key=\"v.id\" class=\"fe-inspector__version\">\n <div class=\"fe-inspector__version-main\">\n <span class=\"fe-inspector__version-n\">\n {{ t('inspector.versions.v', { n: v.version_n }) }}\n </span>\n <span class=\"fe-inspector__version-meta\">\n {{ formatDateStr(v.created_at) }} · {{ formatSize(v.size) }}\n </span>\n </div>\n <div v-if=\"confirmVersionId === v.id\" class=\"fe-inspector__confirm\">\n <p class=\"fe-inspector__confirm-q\">{{ t('inspector.versions.restore_confirm') }}</p>\n <label class=\"fe-inspector__check\">\n <input v-model=\"snapshotFirst\" type=\"checkbox\" />\n {{ t('inspector.versions.snapshot_current') }}\n </label>\n <div class=\"fe-inspector__confirm-actions\">\n <button\n type=\"button\"\n class=\"fe-btn fe-btn--primary fe-btn--sm\"\n :disabled=\"versionBusy\"\n @click=\"confirmRestore(v)\"\n >{{ t('inspector.versions.confirm') }}</button>\n <button\n type=\"button\"\n class=\"fe-btn fe-btn--sm\"\n :disabled=\"versionBusy\"\n @click=\"confirmVersionId = null\"\n >{{ t('inspector.versions.cancel') }}</button>\n </div>\n </div>\n <button\n v-else\n type=\"button\"\n class=\"fe-btn fe-btn--sm\"\n :disabled=\"versionBusy\"\n @click=\"askRestore(v)\"\n >{{ t('inspector.versions.restore') }}</button>\n </li>\n </ul>\n <button\n type=\"button\"\n class=\"fe-btn fe-btn--sm fe-inspector__snapshot\"\n :disabled=\"versionBusy\"\n @click=\"takeSnapshot\"\n >{{ t('inspector.versions.take_snapshot') }}</button>\n </template>\n </section>\n\n <!-- ══ İzinler ══ -->\n <section v-if=\"single && effectivePerm\" class=\"fe-inspector__section\">\n <h3 class=\"fe-inspector__heading\">{{ t('inspector.section.permissions') }}</h3>\n <div class=\"fe-inspector__permrow\">\n <span\n class=\"fe-inspector__badge\"\n :class=\"`fe-inspector__badge--${effectivePerm}`\"\n >{{ permLabel(effectivePerm) }}</span>\n <button\n v-if=\"canManagePerms\"\n type=\"button\"\n class=\"fe-btn fe-btn--sm\"\n @click=\"emit('manage-permissions', single)\"\n >{{ t('inspector.perm.manage') }}</button>\n </div>\n </section>\n\n <!-- ══ Paylaşımlar ══ -->\n <section v-if=\"sharesState === 'ok'\" class=\"fe-inspector__section\">\n <h3 class=\"fe-inspector__heading\">{{ t('inspector.section.shares') }}</h3>\n <p v-if=\"shares.length === 0\" class=\"fe-inspector__empty\">\n {{ t('inspector.shares.empty') }}\n </p>\n <ul v-else class=\"fe-inspector__shares\">\n <li v-for=\"s in shares\" :key=\"s.uuid\" class=\"fe-inspector__share\">\n <span class=\"fe-inspector__share-url\" :title=\"s.url\">{{ s.url }}</span>\n <span v-if=\"s.password_pin\" class=\"fe-inspector__badge fe-inspector__badge--pin\">PIN</span>\n <span v-if=\"s.expires_at\" class=\"fe-inspector__share-exp\">\n {{ formatDateStr(s.expires_at) }}\n </span>\n <button\n type=\"button\"\n class=\"fe-inspector__copy\"\n :title=\"t('inspector.shares.copy')\"\n :aria-label=\"t('inspector.shares.copy')\"\n @click=\"copyText(s.url)\"\n >⧉</button>\n </li>\n </ul>\n </section>\n\n <!-- ══ calisma:d3 — Yorumlar ══ -->\n <section\n v-if=\"commentsState === 'ok' || commentsState === 'error'\"\n class=\"fe-inspector__section\"\n >\n <h3 class=\"fe-inspector__heading\">\n {{ t('inspector.section.comments') }}\n <span\n v-if=\"comments.length > 0\"\n class=\"fe-inspector__countbadge\"\n >{{ comments.length }}</span>\n </h3>\n\n <p v-if=\"commentsState === 'error'\" class=\"fe-inspector__empty\">\n {{ t('inspector.error') }}\n </p>\n <template v-else>\n <p v-if=\"comments.length === 0\" class=\"fe-inspector__empty\">\n {{ t('inspector.comments.empty') }}\n </p>\n <ul v-else class=\"fe-inspector__comments\">\n <li v-for=\"c in comments\" :key=\"c.id\" class=\"fe-inspector__comment\">\n <div class=\"fe-inspector__comment-top\">\n <span class=\"fe-inspector__comment-author\" :title=\"c.author_name\">\n {{ c.author_name || '—' }}\n </span>\n <span class=\"fe-inspector__comment-time\" :title=\"formatDateStr(c.created_at)\">\n {{ relativeTime(c.created_at) }}\n </span>\n <button\n v-if=\"c.can_delete\"\n type=\"button\"\n class=\"fe-inspector__comment-del\"\n :disabled=\"commentBusy\"\n :title=\"t('inspector.comments.delete')\"\n :aria-label=\"t('inspector.comments.delete')\"\n @click=\"removeComment(c)\"\n >×</button>\n </div>\n <p class=\"fe-inspector__comment-body\">{{ c.body }}</p>\n </li>\n </ul>\n <form class=\"fe-inspector__comment-form\" @submit.prevent=\"sendComment\">\n <input\n v-model=\"commentDraft\"\n type=\"text\"\n class=\"fe-inspector__comment-input\"\n maxlength=\"5000\"\n :placeholder=\"t('inspector.comments.placeholder')\"\n :aria-label=\"t('inspector.comments.placeholder')\"\n :disabled=\"commentBusy\"\n />\n <button\n type=\"submit\"\n class=\"fe-btn fe-btn--primary fe-btn--sm\"\n :disabled=\"commentBusy || commentDraft.trim() === ''\"\n >{{ t('inspector.comments.send') }}</button>\n </form>\n </template>\n </section>\n <!-- ══ /calisma:d3 ══ -->\n </div>\n </aside>\n</template>\n","<script setup lang=\"ts\">\n/**\n * CommandPalette — Ctrl/Cmd+K quick launcher.\n *\n * Sources (no new backend calls — everything comes from props):\n * 1. Files/folders of the CURRENT listing (`files` prop), filtered by a\n * tiny scored-includes matcher (no fuzzy-search dependency).\n * 2. Commands mapped 1:1 onto existing FileExplorer actions, surfaced as\n * individual emits so the host wires each to code it already has.\n * 3. Path jump: any query containing `/` offers a \"go to path\" entry.\n *\n * Keyboard: ↑/↓ move, Enter selects, Esc closes; the listener sits on the\n * document in CAPTURE phase so it wins over useKeyboardShortcuts' window\n * handler (otherwise Enter would also fire the explorer's own onOpen).\n *\n * bul:s3 additions:\n * 4. \"Everywhere\" group — ≥3-char queries also hit the global files-search\n * endpoint (debounced 250ms, max 8 rows) via the `globalSearch` prop.\n * Content matches get an \"İçerikte\" badge + a «»-highlighted snippet\n * rendered as pure text nodes (no innerHTML).\n * 5. Saved searches — localStorage-backed (`filex.saved-searches`, max 10);\n * \"save current query\" command + per-row delete.\n */\nimport { computed, nextTick, onBeforeUnmount, ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport type { FileNode, ViewMode } from '../types/FileNode';\nimport type { GlobalSearchHit } from '../composables/useFileApi';\nimport { matchedInContent, snippetSegments } from '../lib/snippet';\nimport { useLocale } from '../composables/useLocale';\n\nconst props = defineProps<{\n open: boolean;\n locale: LocaleCode;\n files: FileNode[];\n viewMode: ViewMode;\n /** Gates the mutating commands (new folder / upload). */\n canWrite?: boolean;\n /** Gates the \"up one level\" command. */\n canGoUp?: boolean;\n /* bul:s3 — global search callback; absent = older host, group hidden. */\n globalSearch?: (q: string) => Promise<GlobalSearchHit[]>;\n /* wiring:d1 — false hides the split command (narrow embeds). */\n splitEnabled?: boolean;\n}>();\n\nconst emit = defineEmits<{\n (e: 'close'): void;\n (e: 'open-node', node: FileNode): void;\n (e: 'navigate', path: string): void;\n (e: 'new-folder'): void;\n (e: 'upload'): void;\n (e: 'toggle-view'): void;\n (e: 'open-trash'): void;\n (e: 'refresh'): void;\n (e: 'go-up'): void;\n /* bul:s3 — an \"everywhere\" hit was chosen. */\n (e: 'open-hit', hit: GlobalSearchHit): void;\n /* wiring:int — settings surfaces reachable from anywhere via the palette */\n (e: 'open-theme'): void;\n (e: 'open-shortcut-settings'): void;\n (e: 'start-tour'): void;\n /* wiring:d1 — tab / split commands */\n (e: 'tab-new'): void;\n (e: 'split-toggle'): void;\n}>();\n\nconst { t, nodeDisplayName } = useLocale(() => props.locale);\n\nconst query = ref('');\nconst active = ref(0);\nconst inputEl = ref<HTMLInputElement | null>(null);\nconst listEl = ref<HTMLElement | null>(null);\n\ntype PaletteItem =\n | { kind: 'goto'; id: string; label: string; icon: string; path: string }\n | { kind: 'file'; id: string; label: string; icon: string; node: FileNode }\n | { kind: 'command'; id: string; label: string; icon: string; command: string }\n /* bul:s3 — everywhere hit / saved search / save-current-query. */\n | { kind: 'hit'; id: string; label: string; icon: string; hit: GlobalSearchHit; crumb: string; inContent: boolean; snippet: string }\n | { kind: 'saved'; id: string; label: string; icon: string; query: string }\n | { kind: 'save'; id: string; label: string; icon: string; query: string };\n\n/* bul:s3 — narrowed aliases so the template doesn't need kind-guards. */\ntype HitItem = Extract<PaletteItem, { kind: 'hit' }>;\ntype SavedGroupItem = Extract<PaletteItem, { kind: 'saved' | 'save' }>;\n\n/**\n * Scored includes: -1 = no match; otherwise earlier + prefix matches rank\n * higher and shorter names get a small edge. Good enough without a fuzzy\n * dependency.\n */\nfunction matchScore(label: string, q: string): number {\n if (!q) return 0;\n const n = label.toLocaleLowerCase();\n const s = q.toLocaleLowerCase();\n const i = n.indexOf(s);\n if (i === -1) return -1;\n let sc = 100 - Math.min(i, 50);\n if (i === 0) sc += 40;\n sc -= Math.min(n.length, 40) / 4;\n return sc;\n}\n\nconst gotoItems = computed<PaletteItem[]>(() => {\n const q = query.value.trim();\n if (!q.includes('/')) return [];\n const clean = q.replace(/^\\/+|\\/+$/g, '');\n if (!clean) return [];\n return [\n { kind: 'goto', id: `goto:${clean}`, label: `${t('palette.goto')}: ${clean}`, icon: '➜', path: clean },\n ];\n});\n\nconst fileItems = computed<PaletteItem[]>(() => {\n const q = query.value.trim();\n const scored = props.files\n .map((f) => ({ f, name: nodeDisplayName(f), s: matchScore(nodeDisplayName(f), q) }))\n .filter((r) => r.s >= 0);\n if (q) scored.sort((a, b) => b.s - a.s);\n return scored.slice(0, 8).map((r) => ({\n kind: 'file' as const,\n id: `file:${r.f.path}`,\n label: r.name,\n icon: r.f.type === 'dir' ? '📁' : '📄',\n node: r.f,\n }));\n});\n\nconst commandItems = computed<PaletteItem[]>(() => {\n const q = query.value.trim();\n const defs: Array<{ command: string; label: string; icon: string; enabled: boolean }> = [\n { command: 'new-folder', label: t('toolbar.new_folder'), icon: '📁', enabled: props.canWrite !== false },\n { command: 'upload', label: t('toolbar.upload'), icon: '⬆', enabled: props.canWrite !== false },\n { command: 'toggle-view', label: t('cmd.view_toggle'), icon: props.viewMode === 'list' ? '▦' : props.viewMode === 'grid' ? '▣' : '☰', enabled: true /* wiring:d2 — sıradaki mod ikonu (list→grid→galeri→list) */ },\n { command: 'open-trash', label: t('cmd.trash'), icon: '🗑', enabled: true },\n { command: 'refresh', label: t('toolbar.refresh'), icon: '⟳', enabled: true },\n { command: 'go-up', label: t('toolbar.go_up'), icon: '↑', enabled: props.canGoUp !== false },\n /* wiring:int */\n { command: 'open-theme', label: t('theme.menu'), icon: '🎨', enabled: true },\n { command: 'open-shortcut-settings', label: t('shortcuts.settings.menu'), icon: '⌨', enabled: true },\n { command: 'start-tour', label: t('tour.restart'), icon: '🎓', enabled: true },\n /* wiring:d1 — sekme + split */\n { command: 'tab-new', label: t('cmd.tab_new'), icon: '⧉', enabled: true },\n { command: 'split-toggle', label: t('cmd.split_toggle'), icon: '◫', enabled: props.splitEnabled !== false },\n ];\n return defs\n .filter((d) => d.enabled && matchScore(d.label, q) >= 0)\n .map((d) => ({ kind: 'command' as const, id: `cmd:${d.command}`, label: d.label, icon: d.icon, command: d.command }));\n});\n\n/* === bul:s3 — \"everywhere\" global search ================================ */\n\nconst EVERYWHERE_MIN_CHARS = 3;\nconst EVERYWHERE_LIMIT = 8;\nconst EVERYWHERE_DEBOUNCE_MS = 250;\n\nconst everywhere = ref<GlobalSearchHit[]>([]);\nconst everywhereLoading = ref(false);\nlet everywhereTimer: ReturnType<typeof setTimeout> | undefined;\nlet everywhereSeq = 0;\n\nfunction scheduleEverywhere(q: string) {\n if (everywhereTimer) clearTimeout(everywhereTimer);\n const fn = props.globalSearch;\n if (!fn || q.length < EVERYWHERE_MIN_CHARS) {\n everywhere.value = [];\n everywhereLoading.value = false;\n return;\n }\n everywhereLoading.value = true;\n everywhereTimer = setTimeout(async () => {\n const seq = ++everywhereSeq;\n try {\n const hits = await fn(q);\n if (seq !== everywhereSeq) return; // stale response — a newer query won\n everywhere.value = Array.isArray(hits) ? hits.slice(0, EVERYWHERE_LIMIT) : [];\n } catch {\n if (seq === everywhereSeq) everywhere.value = [];\n } finally {\n if (seq === everywhereSeq) everywhereLoading.value = false;\n }\n }, EVERYWHERE_DEBOUNCE_MS);\n}\n\n/** Parent-path crumb for a hit row (storage label when the hit carries one). */\nfunction hitCrumb(h: GlobalSearchHit): string {\n const rel = String(h.path ?? '').replace(/^\\/+|\\/+$/g, '');\n const slash = rel.lastIndexOf('/');\n const parent = slash === -1 ? '' : rel.slice(0, slash);\n const storage =\n (typeof h.storage === 'string' && h.storage) ||\n (typeof h.storage_name === 'string' && h.storage_name) ||\n '';\n if (storage && parent) return `${storage}/${parent}`;\n if (storage) return storage;\n return parent || '/';\n}\n\nconst hitItems = computed<HitItem[]>(() =>\n everywhere.value.map((h) => ({\n kind: 'hit' as const,\n id: `hit:${h.storage_id ?? ''}:${h.path ?? ''}:${h.id ?? ''}`,\n label: String(h.name ?? h.path ?? ''),\n icon: h.type === 'dir' ? '📁' : '📄',\n hit: h,\n crumb: hitCrumb(h),\n inContent: matchedInContent(h.matched),\n snippet: typeof h.snippet === 'string' ? h.snippet : '',\n })),\n);\n\n/* === bul:s3 — saved searches (localStorage) ============================= */\n\nconst SAVED_LS_KEY = 'filex.saved-searches';\nconst SAVED_MAX = 10;\n\nconst savedSearches = ref<string[]>([]);\n\nfunction readSavedSearches(): string[] {\n try {\n const raw = localStorage.getItem(SAVED_LS_KEY);\n if (!raw) return [];\n const parsed: unknown = JSON.parse(raw);\n if (!Array.isArray(parsed)) return [];\n return parsed.filter((x): x is string => typeof x === 'string' && x.trim() !== '').slice(0, SAVED_MAX);\n } catch {\n return [];\n }\n}\n\nfunction writeSavedSearches(list: string[]) {\n savedSearches.value = list.slice(0, SAVED_MAX);\n try {\n localStorage.setItem(SAVED_LS_KEY, JSON.stringify(savedSearches.value));\n } catch {\n /* private mode / quota — the in-memory list still works this session */\n }\n}\n\nfunction saveSearch(q: string) {\n const clean = q.trim();\n if (!clean) return;\n const list = savedSearches.value.filter((s) => s !== clean);\n list.unshift(clean); // newest first; cap enforced by writeSavedSearches\n writeSavedSearches(list);\n}\n\nfunction removeSavedSearch(q: string) {\n writeSavedSearches(savedSearches.value.filter((s) => s !== q));\n if (active.value >= flat.value.length) active.value = Math.max(0, flat.value.length - 1);\n}\n\nconst savedItems = computed<SavedGroupItem[]>(() => {\n const q = query.value.trim();\n const out: SavedGroupItem[] = [];\n // \"Save this query\" command — only when there IS a query and it isn't saved yet.\n if (q && !savedSearches.value.includes(q)) {\n out.push({ kind: 'save', id: `save:${q}`, label: `${t('palette.save')}: ${q}`, icon: '💾', query: q });\n }\n const scored = savedSearches.value\n .map((s) => ({ s, sc: matchScore(s, q) }))\n .filter((r) => r.sc >= 0 || !q);\n for (const r of scored) {\n out.push({ kind: 'saved', id: `saved:${r.s}`, label: r.s, icon: '🔖', query: r.s });\n }\n return out;\n});\n\n/* ======================================================================== */\n\nconst flat = computed<PaletteItem[]>(() => [\n ...gotoItems.value,\n ...fileItems.value,\n ...hitItems.value,\n ...savedItems.value,\n ...commandItems.value,\n]);\nconst fileOffset = computed(() => gotoItems.value.length);\nconst hitOffset = computed(() => fileOffset.value + fileItems.value.length);\nconst savedOffset = computed(() => hitOffset.value + hitItems.value.length);\nconst cmdOffset = computed(() => savedOffset.value + savedItems.value.length);\n\nwatch(query, (q) => {\n active.value = 0;\n scheduleEverywhere(q.trim()); /* bul:s3 */\n});\n\nfunction move(delta: number) {\n const n = flat.value.length;\n if (!n) return;\n active.value = (active.value + delta + n) % n;\n void nextTick(() => {\n listEl.value?.querySelector('.is-active')?.scrollIntoView({ block: 'nearest' });\n });\n}\n\nfunction choose(item?: PaletteItem) {\n const it = item ?? flat.value[active.value];\n if (!it) return;\n /* bul:s3 — saved-search rows keep the palette OPEN: picking one re-runs\n * the palette with that query; saving just persists it. */\n if (it.kind === 'saved') {\n query.value = it.query;\n void nextTick(() => inputEl.value?.focus());\n return;\n }\n if (it.kind === 'save') {\n saveSearch(it.query);\n void nextTick(() => inputEl.value?.focus());\n return;\n }\n emit('close');\n if (it.kind === 'hit') {\n emit('open-hit', it.hit);\n return;\n }\n if (it.kind === 'file') {\n emit('open-node', it.node);\n } else if (it.kind === 'goto') {\n emit('navigate', it.path);\n } else {\n switch (it.command) {\n case 'new-folder': emit('new-folder'); break;\n case 'upload': emit('upload'); break;\n case 'toggle-view': emit('toggle-view'); break;\n case 'open-trash': emit('open-trash'); break;\n case 'refresh': emit('refresh'); break;\n case 'go-up': emit('go-up'); break;\n /* wiring:int */\n case 'open-theme': emit('open-theme'); break;\n case 'open-shortcut-settings': emit('open-shortcut-settings'); break;\n case 'start-tour': emit('start-tour'); break;\n /* wiring:d1 */\n case 'tab-new': emit('tab-new'); break;\n case 'split-toggle': emit('split-toggle'); break;\n }\n }\n}\n\nfunction onDocKeydown(e: KeyboardEvent) {\n if (!props.open) return;\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n e.stopPropagation();\n move(1);\n break;\n case 'ArrowUp':\n e.preventDefault();\n e.stopPropagation();\n move(-1);\n break;\n case 'Enter':\n e.preventDefault();\n e.stopPropagation();\n choose();\n break;\n case 'Escape':\n e.preventDefault();\n e.stopPropagation();\n emit('close');\n break;\n }\n}\n\nwatch(\n () => props.open,\n (v) => {\n if (v) {\n query.value = '';\n active.value = 0;\n /* bul:s3 — fresh session state for the new groups. */\n everywhere.value = [];\n everywhereLoading.value = false;\n savedSearches.value = readSavedSearches();\n document.addEventListener('keydown', onDocKeydown, true);\n void nextTick(() => inputEl.value?.focus());\n } else {\n if (everywhereTimer) clearTimeout(everywhereTimer); /* bul:s3 */\n document.removeEventListener('keydown', onDocKeydown, true);\n }\n },\n);\n\nonBeforeUnmount(() => {\n if (everywhereTimer) clearTimeout(everywhereTimer); /* bul:s3 */\n document.removeEventListener('keydown', onDocKeydown, true);\n});\n</script>\n\n<template>\n <transition name=\"fe-modal\">\n <div\n v-if=\"open\"\n class=\"fe-modal__backdrop fe-cmdp__backdrop\"\n role=\"presentation\"\n @click=\"emit('close')\"\n >\n <div\n class=\"fe-cmdp\"\n role=\"dialog\"\n aria-modal=\"true\"\n :aria-label=\"t('palette.placeholder')\"\n @click.stop\n >\n <div class=\"fe-cmdp__inputwrap\">\n <svg\n class=\"fe-cmdp__glyph\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"7\" cy=\"7\" r=\"4.5\" />\n <path d=\"m10.5 10.5 3.5 3.5\" />\n </svg>\n <input\n ref=\"inputEl\"\n v-model=\"query\"\n type=\"text\"\n class=\"fe-cmdp__input\"\n :placeholder=\"t('palette.placeholder')\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n />\n </div>\n\n <div ref=\"listEl\" class=\"fe-cmdp__list\" role=\"listbox\">\n <button\n v-for=\"(it, i) in gotoItems\"\n :key=\"it.id\"\n type=\"button\"\n class=\"fe-cmdp__item\"\n :class=\"{ 'is-active': i === active }\"\n role=\"option\"\n :aria-selected=\"i === active\"\n @mouseenter=\"active = i\"\n @click=\"choose(it)\"\n >\n <span class=\"fe-cmdp__icon\" aria-hidden=\"true\">{{ it.icon }}</span>\n <span class=\"fe-cmdp__label\">{{ it.label }}</span>\n </button>\n\n <template v-if=\"fileItems.length\">\n <div class=\"fe-cmdp__group\">{{ t('palette.files') }}</div>\n <button\n v-for=\"(it, i) in fileItems\"\n :key=\"it.id\"\n type=\"button\"\n class=\"fe-cmdp__item\"\n :class=\"{ 'is-active': fileOffset + i === active }\"\n role=\"option\"\n :aria-selected=\"fileOffset + i === active\"\n @mouseenter=\"active = fileOffset + i\"\n @click=\"choose(it)\"\n >\n <span class=\"fe-cmdp__icon\" aria-hidden=\"true\">{{ it.icon }}</span>\n <span class=\"fe-cmdp__label\">{{ it.label }}</span>\n </button>\n </template>\n\n <!-- bul:s3 — \"Everywhere\" global-search hits -->\n <template v-if=\"hitItems.length || everywhereLoading\">\n <div class=\"fe-cmdp__group\">{{ t('palette.everywhere') }}</div>\n <div v-if=\"everywhereLoading && !hitItems.length\" class=\"fe-cmdp__loading\">\n {{ t('palette.searching') }}\n </div>\n <button\n v-for=\"(it, i) in hitItems\"\n :key=\"it.id\"\n type=\"button\"\n class=\"fe-cmdp__item fe-cmdp__item--hit\"\n :class=\"{ 'is-active': hitOffset + i === active }\"\n role=\"option\"\n :aria-selected=\"hitOffset + i === active\"\n @mouseenter=\"active = hitOffset + i\"\n @click=\"choose(it)\"\n >\n <span class=\"fe-cmdp__icon\" aria-hidden=\"true\">{{ it.icon }}</span>\n <span class=\"fe-cmdp__hitbody\">\n <span class=\"fe-cmdp__hitline\">\n <span class=\"fe-cmdp__label\">{{ it.label }}</span>\n <span v-if=\"it.inContent\" class=\"fe-cmdp__badge\">{{ t('search.in_content') }}</span>\n </span>\n <span v-if=\"it.crumb\" class=\"fe-cmdp__crumb\" :title=\"it.crumb\">{{ it.crumb }}</span>\n <!-- Snippet: «»-highlights become <mark> via TEXT segments — never innerHTML. -->\n <span v-if=\"it.snippet\" class=\"fe-cmdp__snippet\">\n <template v-for=\"(seg, si) in snippetSegments(it.snippet)\" :key=\"si\">\n <mark v-if=\"seg.match\" class=\"fe-cmdp__mark\">{{ seg.text }}</mark>\n <template v-else>{{ seg.text }}</template>\n </template>\n </span>\n </span>\n </button>\n </template>\n\n <!-- bul:s3 — saved searches -->\n <template v-if=\"savedItems.length\">\n <div class=\"fe-cmdp__group\">{{ t('palette.saved') }}</div>\n <div\n v-for=\"(it, i) in savedItems\"\n :key=\"it.id\"\n class=\"fe-cmdp__item fe-cmdp__item--saved\"\n :class=\"{ 'is-active': savedOffset + i === active }\"\n role=\"option\"\n :aria-selected=\"savedOffset + i === active\"\n tabindex=\"-1\"\n @mouseenter=\"active = savedOffset + i\"\n @click=\"choose(it)\"\n @keydown.enter.prevent=\"choose(it)\"\n >\n <span class=\"fe-cmdp__icon\" aria-hidden=\"true\">{{ it.icon }}</span>\n <span class=\"fe-cmdp__label\">{{ it.label }}</span>\n <button\n v-if=\"it.kind === 'saved'\"\n type=\"button\"\n class=\"fe-cmdp__del\"\n :title=\"t('palette.saved.delete')\"\n :aria-label=\"t('palette.saved.delete')\"\n @click.stop=\"removeSavedSearch(it.query)\"\n >🗑</button>\n </div>\n </template>\n\n <template v-if=\"commandItems.length\">\n <div class=\"fe-cmdp__group\">{{ t('palette.commands') }}</div>\n <button\n v-for=\"(it, i) in commandItems\"\n :key=\"it.id\"\n type=\"button\"\n class=\"fe-cmdp__item\"\n :class=\"{ 'is-active': cmdOffset + i === active }\"\n role=\"option\"\n :aria-selected=\"cmdOffset + i === active\"\n @mouseenter=\"active = cmdOffset + i\"\n @click=\"choose(it)\"\n >\n <span class=\"fe-cmdp__icon\" aria-hidden=\"true\">{{ it.icon }}</span>\n <span class=\"fe-cmdp__label\">{{ it.label }}</span>\n </button>\n </template>\n\n <div v-if=\"flat.length === 0 && !everywhereLoading\" class=\"fe-cmdp__empty\">\n {{ t('palette.empty') }}\n </div>\n </div>\n\n <div class=\"fe-cmdp__hint\">{{ t('palette.hint') }}</div>\n </div>\n </div>\n </transition>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Modal — tiny headless wrapper. Backdrop + centered card + ESC + autofocus.\n */\nimport { watch, onBeforeUnmount, ref } from 'vue';\n\nconst props = defineProps<{\n open: boolean;\n title?: string;\n size?: 'sm' | 'md' | 'lg' | 'xl';\n closeOnBackdrop?: boolean;\n /** When true, drop the dialog chrome (backdrop tint, header, footer,\n * centered card with border-radius) and render the slot full-bleed.\n * Used by the standalone /files/edit route where the browser tab IS\n * the container — a modal frame on top of it just steals real estate\n * from the editor. ESC + emit('close') still wire through so the\n * parent route can window.close() the tab. */\n chromeless?: boolean;\n /** Explicit theme. When set the modal stamps the appropriate\n * `.fe--theme-{light,dark}` class on its `.fe` backdrop so the CSS\n * variable cascade matches the host shell regardless of OS\n * preference (Modal is a portal-shaped descendant of `<body>`\n * rather than a child of the parent component, so plain DOM\n * inheritance isn't always enough). */\n theme?: 'light' | 'dark' | 'auto';\n}>();\n\nconst emit = defineEmits<{\n (e: 'close'): void;\n}>();\n\nconst cardEl = ref<HTMLElement | null>(null);\n\n/* wiring:c4 — a11y: unique title id for aria-labelledby + focus restore.\n * The element focused before the modal opened gets focus back on close so\n * keyboard users return to where they were instead of <body>. */\nlet modalSeq = 0;\nconst titleId = `fe-modal-title-${++modalSeq}-${Math.random().toString(36).slice(2, 7)}`;\nlet prevFocus: HTMLElement | null = null;\n\nconst FOCUSABLE =\n 'input:not([disabled]),select:not([disabled]),textarea:not([disabled]),' +\n 'button:not([disabled]),a[href],[tabindex]:not([tabindex=\"-1\"])';\n\nwatch(\n () => props.open,\n (v) => {\n if (v) {\n prevFocus = (document.activeElement as HTMLElement | null) ?? null; /* wiring:c4 */\n document.addEventListener('keydown', onKey);\n setTimeout(() => {\n const focusable = cardEl.value?.querySelector<HTMLElement>(FOCUSABLE);\n focusable?.focus();\n }, 30);\n } else {\n document.removeEventListener('keydown', onKey);\n /* wiring:c4 — return focus to the opener. */\n prevFocus?.focus?.();\n prevFocus = null;\n }\n },\n);\n\nonBeforeUnmount(() => document.removeEventListener('keydown', onKey));\n\nfunction onKey(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n emit('close');\n return;\n }\n /* wiring:c4 — focus trap: Tab cycles inside the card (WAI-ARIA dialog).\n * Without it, Tab walked out into the host page behind the backdrop. */\n if (e.key === 'Tab' && cardEl.value) {\n const nodes = Array.from(cardEl.value.querySelectorAll<HTMLElement>(FOCUSABLE)).filter(\n (el) => el.offsetParent !== null || el === document.activeElement,\n );\n if (nodes.length === 0) return;\n const first = nodes[0];\n const last = nodes[nodes.length - 1];\n const active = document.activeElement as HTMLElement | null;\n if (e.shiftKey && (active === first || !cardEl.value.contains(active))) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && (active === last || !cardEl.value.contains(active))) {\n e.preventDefault();\n first.focus();\n }\n }\n}\n\nfunction onBackdrop() {\n if (props.closeOnBackdrop !== false) emit('close');\n}\n</script>\n\n<template>\n <transition name=\"fe-modal\">\n <div\n v-if=\"open\"\n class=\"fe fe-modal__backdrop\"\n :class=\"[\n { 'fe-modal__backdrop--chromeless': chromeless },\n theme === 'light' ? 'fe--theme-light' : '',\n theme === 'dark' ? 'fe--theme-dark' : '',\n ]\"\n role=\"presentation\"\n @click=\"onBackdrop\"\n >\n <div\n ref=\"cardEl\"\n class=\"fe-modal__card\"\n :class=\"[\n `fe-modal__card--${size || 'md'}`,\n chromeless && 'fe-modal__card--chromeless',\n ]\"\n role=\"dialog\"\n aria-modal=\"true\"\n :aria-labelledby=\"title && !chromeless ? titleId : undefined\"\n :aria-label=\"!title || chromeless ? title || undefined : undefined\"\n @click.stop\n >\n <header v-if=\"title && !chromeless\" class=\"fe-modal__head\">\n <h2 :id=\"titleId\" class=\"fe-modal__title\">{{ title }}</h2>\n <button\n type=\"button\"\n class=\"fe-modal__close\"\n aria-label=\"Close\"\n @click=\"emit('close')\"\n >×</button>\n </header>\n <div class=\"fe-modal__body\">\n <slot />\n </div>\n <footer v-if=\"$slots.actions && !chromeless\" class=\"fe-modal__actions\">\n <slot name=\"actions\" />\n </footer>\n </div>\n </div>\n </transition>\n</template>\n","<script setup lang=\"ts\">\n/**\n * ShortcutsHelp — \"?\" cheat-sheet modal.\n *\n * wiring:c2 — renders the live shortcut registry (useShortcutList) so\n * user remaps show up here too, grouped by section. Unbound actions are\n * listed with an \"unassigned\" chip. The footer carries a \"Customize\"\n * button that asks the host to open ShortcutSettings. Modal.vue\n * supplies Esc handling, backdrop, focus and the close button.\n */\nimport { computed } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { useShortcutList, type ShortcutView } from '../composables/useKeyboardShortcuts';\nimport Modal from '../modals/Modal.vue';\n\nconst props = defineProps<{\n open: boolean;\n locale: LocaleCode;\n}>();\n\nconst emit = defineEmits<{\n (e: 'close'): void;\n (e: 'customize'): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst list = useShortcutList();\n\nconst groups = computed(() => {\n const order: string[] = [];\n const map = new Map<string, ShortcutView[]>();\n for (const s of list.value) {\n if (!map.has(s.groupKey)) {\n map.set(s.groupKey, []);\n order.push(s.groupKey);\n }\n map.get(s.groupKey)!.push(s);\n }\n return order.map((key) => ({ key, items: map.get(key)! }));\n});\n</script>\n\n<template>\n <Modal :open=\"open\" :title=\"t('shortcuts.title')\" size=\"md\" @close=\"emit('close')\">\n <div class=\"fe-shortcuts\">\n <section v-for=\"g in groups\" :key=\"g.key\" class=\"fe-shortcuts__group\">\n <h3 class=\"fe-shortcuts__heading\">{{ t(g.key) }}</h3>\n <div class=\"fe-shortcuts__table\">\n <div v-for=\"s in g.items\" :key=\"s.id\" class=\"fe-shortcuts__row\">\n <span class=\"fe-shortcuts__keys\">\n <template v-if=\"s.keys.length === 0\">\n <span class=\"fe-shortcuts__unbound\">{{ t('shortcuts.settings.unbound') }}</span>\n </template>\n <template v-for=\"(combo, i) in s.keys\" v-else :key=\"combo\">\n <kbd class=\"fe-kbd\">{{ combo }}</kbd>\n <span v-if=\"i < s.keys.length - 1\" class=\"fe-shortcuts__or\" aria-hidden=\"true\">/</span>\n </template>\n </span>\n <span class=\"fe-shortcuts__desc\">\n {{ t(s.labelKey) }}\n <span\n v-if=\"s.overridden\"\n class=\"fe-shortcuts__custom\"\n :title=\"t('shortcuts.settings.customized')\"\n >●</span>\n </span>\n </div>\n </div>\n </section>\n </div>\n <template #actions>\n <button type=\"button\" class=\"fe-btn fe-btn--primary\" @click=\"emit('customize')\">\n ⌨ {{ t('shortcuts.customize') }}\n </button>\n <button type=\"button\" class=\"fe-btn\" @click=\"emit('close')\">{{ t('viewer.close') }}</button>\n </template>\n </Modal>\n</template>\n","/**\n * themes.ts — wiring:c1 theme registry + application engine.\n *\n * A \"theme\" is a palette-only preset: a map of `--fe-*` CSS custom\n * properties in TWO variants (light + dark). Picking a theme is fully\n * independent from the light/dark MODE — the mode (config.theme prop /\n * OS preference) keeps deciding which variant of the selected theme is\n * active, exactly like the stock palette in styles/variables.css.\n *\n * Application strategy (two cooperating layers):\n *\n * 1. Inline `--fe-*` variables on the explorer ROOT element\n * (`applyThemeToEl`) — the documented \"consumer overrides by setting\n * --fe-* on a higher scope\" philosophy, resolved to the currently\n * active variant. Covers the whole `.fe` subtree, works in embeds\n * without touching the host page's own theme.\n *\n * 2. A singleton injected `<style data-filex-theme>` (`syncThemeStyle`)\n * that mirrors variables.css' EXACT selector cascade with the\n * selected theme's values. This is required because some surfaces\n * re-declare the variables on themselves and would otherwise shadow\n * the inherited inline values back to the stock palette:\n * - the Teleport-ed context menu backdrop (`.fe-ctx-backdrop…`\n * lives under <body>, outside the root element entirely), and\n * - modal backdrops, which carry their own `.fe` /\n * `.fe--theme-dark` classes (dark-mode selectors like\n * `.dark .fe` re-set the tokens on those descendants).\n * Because the injected element is appended to <head> at runtime it\n * always comes AFTER the bundled stylesheet, so equal-specificity\n * rules win by source order — the same mechanism variables.css uses\n * internally. No `!important` needed.\n *\n * The `default` theme applies NOTHING (inline vars removed, style\n * element emptied) so host-level `--fe-*` overrides keep working\n * untouched — its token maps below exist only to render the gallery\n * preview card.\n *\n * Persistence: localStorage `filex.theme` (absent/invalid → default),\n * shared reactively across every explorer instance on the page and\n * synced across tabs via the `storage` event.\n *\n * All palettes were contrast-checked (WCAG 2.1): text/bg ≥ 7:1,\n * text on elevated/hover/selected surfaces + muted text + text-on-primary\n * ≥ 4.5:1, primary & danger vs bg ≥ 3:1 — in BOTH variants.\n */\n\nimport { ref, type Ref } from 'vue';\n\n/** Map of `--fe-*` custom property → value. */\nexport type ThemeTokenMap = Record<string, string>;\n\nexport interface ThemeDef {\n /** Stable id — persisted in localStorage, never shown to users. */\n id: string;\n /** i18n catalogue key for the display name (tr + en). */\n nameKey: string;\n /** Palette applied when the resolved mode is light. */\n light: ThemeTokenMap;\n /** Palette applied when the resolved mode is dark. */\n dark: ThemeTokenMap;\n}\n\nexport const THEME_LS_KEY = 'filex.theme';\nexport const DEFAULT_THEME_ID = 'default';\n\n/* ------------------------------------------------------------------ */\n/* Registry */\n/* ------------------------------------------------------------------ */\n\nexport const THEMES: ThemeDef[] = [\n {\n // Stock palette — the maps duplicate variables.css ONLY for the\n // gallery preview; applying this theme clears all overrides.\n id: DEFAULT_THEME_ID,\n nameKey: 'theme.name.default',\n light: {\n '--fe-bg': '#ffffff',\n '--fe-bg-elev': '#f7f8fa',\n '--fe-bg-hover': '#edf0f5',\n '--fe-bg-selected': '#dfe8ff',\n '--fe-border': '#e2e6ed',\n '--fe-border-strong': '#c7ced9',\n '--fe-text': '#1a1e27',\n '--fe-text-muted': '#5a6475',\n '--fe-text-on-primary': '#ffffff',\n '--fe-primary': '#3b82f6',\n '--fe-primary-hover': '#2563eb',\n '--fe-danger': '#dc2626',\n '--fe-danger-hover': '#b91c1c',\n },\n dark: {\n '--fe-bg': '#0f1419',\n '--fe-bg-elev': '#161c25',\n '--fe-bg-hover': '#1f2733',\n '--fe-bg-selected': '#23324a',\n '--fe-border': '#2a323e',\n '--fe-border-strong': '#3a4453',\n '--fe-text': '#e5e9f0',\n '--fe-text-muted': '#8b95a7',\n '--fe-text-on-primary': '#ffffff',\n '--fe-primary': '#60a5fa',\n '--fe-primary-hover': '#3b82f6',\n '--fe-danger': '#f87171',\n '--fe-danger-hover': '#ef4444',\n },\n },\n {\n // Gece Mavisi — deep indigo/navy.\n id: 'night',\n nameKey: 'theme.name.night',\n light: {\n '--fe-bg': '#f6f8fd',\n '--fe-bg-elev': '#edf1fa',\n '--fe-bg-hover': '#e2e9f7',\n '--fe-bg-selected': '#d2ddf4',\n '--fe-border': '#d6deee',\n '--fe-border-strong': '#aebfda',\n '--fe-text': '#151f38',\n '--fe-text-muted': '#49587a',\n '--fe-text-on-primary': '#ffffff',\n '--fe-primary': '#2c4a9e',\n '--fe-primary-hover': '#213a80',\n '--fe-danger': '#c62828',\n '--fe-danger-hover': '#a51f1f',\n },\n dark: {\n '--fe-bg': '#0a1024',\n '--fe-bg-elev': '#111a35',\n '--fe-bg-hover': '#1a2547',\n '--fe-bg-selected': '#243665',\n '--fe-border': '#26335a',\n '--fe-border-strong': '#3c4e84',\n '--fe-text': '#dfe6f7',\n '--fe-text-muted': '#96a5cc',\n '--fe-text-on-primary': '#050b26',\n '--fe-primary': '#6d8dfc',\n '--fe-primary-hover': '#5273f2',\n '--fe-danger': '#f87171',\n '--fe-danger-hover': '#ef4444',\n },\n },\n {\n // Orman — calm greens.\n id: 'forest',\n nameKey: 'theme.name.forest',\n light: {\n '--fe-bg': '#f5faf5',\n '--fe-bg-elev': '#eaf3eb',\n '--fe-bg-hover': '#dcecdf',\n '--fe-bg-selected': '#c8e2ce',\n '--fe-border': '#d2e2d4',\n '--fe-border-strong': '#a2c3a8',\n '--fe-text': '#182b1d',\n '--fe-text-muted': '#42604a',\n '--fe-text-on-primary': '#ffffff',\n '--fe-primary': '#2b7a41',\n '--fe-primary-hover': '#226334',\n '--fe-danger': '#c62828',\n '--fe-danger-hover': '#a51f1f',\n },\n dark: {\n '--fe-bg': '#0d1611',\n '--fe-bg-elev': '#132019',\n '--fe-bg-hover': '#1b2d23',\n '--fe-bg-selected': '#264532',\n '--fe-border': '#28402f',\n '--fe-border-strong': '#3e5f49',\n '--fe-text': '#dcebe0',\n '--fe-text-muted': '#93b09b',\n '--fe-text-on-primary': '#04180b',\n '--fe-primary': '#54c17a',\n '--fe-primary-hover': '#3fae66',\n '--fe-danger': '#f87171',\n '--fe-danger-hover': '#ef4444',\n },\n },\n {\n // Kehribar — warm amber/bronze.\n id: 'amber',\n nameKey: 'theme.name.amber',\n light: {\n '--fe-bg': '#fdf9f0',\n '--fe-bg-elev': '#f7efdd',\n '--fe-bg-hover': '#f0e3c8',\n '--fe-bg-selected': '#ead6ab',\n '--fe-border': '#e6dabf',\n '--fe-border-strong': '#c6b184',\n '--fe-text': '#33270f',\n '--fe-text-muted': '#655631',\n '--fe-text-on-primary': '#ffffff',\n '--fe-primary': '#9a4b00',\n '--fe-primary-hover': '#7c3c00',\n '--fe-danger': '#c62828',\n '--fe-danger-hover': '#a51f1f',\n },\n dark: {\n '--fe-bg': '#191307',\n '--fe-bg-elev': '#231a0c',\n '--fe-bg-hover': '#2f2312',\n '--fe-bg-selected': '#44331b',\n '--fe-border': '#3b2e17',\n '--fe-border-strong': '#5b4a29',\n '--fe-text': '#f2e7d4',\n '--fe-text-muted': '#bda887',\n '--fe-text-on-primary': '#2a1c02',\n '--fe-primary': '#f5a524',\n '--fe-primary-hover': '#ffb84d',\n '--fe-danger': '#f87171',\n '--fe-danger-hover': '#ef4444',\n },\n },\n {\n // Leylak — soft purple.\n id: 'lilac',\n nameKey: 'theme.name.lilac',\n light: {\n '--fe-bg': '#faf7fd',\n '--fe-bg-elev': '#f2ecfa',\n '--fe-bg-hover': '#e8ddf5',\n '--fe-bg-selected': '#dccaf0',\n '--fe-border': '#e1d6ee',\n '--fe-border-strong': '#bda6d9',\n '--fe-text': '#241a33',\n '--fe-text-muted': '#584871',\n '--fe-text-on-primary': '#ffffff',\n '--fe-primary': '#7231e0',\n '--fe-primary-hover': '#5f21c4',\n '--fe-danger': '#c62828',\n '--fe-danger-hover': '#a51f1f',\n },\n dark: {\n '--fe-bg': '#130f1c',\n '--fe-bg-elev': '#1b1527',\n '--fe-bg-hover': '#261d37',\n '--fe-bg-selected': '#37294f',\n '--fe-border': '#302546',\n '--fe-border-strong': '#4b3a6d',\n '--fe-text': '#e9e2f5',\n '--fe-text-muted': '#a999c5',\n '--fe-text-on-primary': '#180d33',\n '--fe-primary': '#b197fa',\n '--fe-primary-hover': '#9c7cf4',\n '--fe-danger': '#f87171',\n '--fe-danger-hover': '#ef4444',\n },\n },\n {\n // Yüksek Kontrast — black/white with strong borders, saturated accents.\n id: 'contrast',\n nameKey: 'theme.name.contrast',\n light: {\n '--fe-bg': '#ffffff',\n '--fe-bg-elev': '#f2f2f2',\n '--fe-bg-hover': '#e0e0e0',\n '--fe-bg-selected': '#c9dcff',\n '--fe-border': '#5c5c5c',\n '--fe-border-strong': '#000000',\n '--fe-text': '#000000',\n '--fe-text-muted': '#3d3d3d',\n '--fe-text-on-primary': '#ffffff',\n '--fe-primary': '#003d99',\n '--fe-primary-hover': '#002a6b',\n '--fe-danger': '#a80000',\n '--fe-danger-hover': '#7d0000',\n '--fe-shadow': '0 0 0 1px #000000, 0 10px 32px rgba(0, 0, 0, 0.25)',\n '--fe-shadow-sm': '0 0 0 1px #000000',\n },\n dark: {\n '--fe-bg': '#000000',\n '--fe-bg-elev': '#0d0d0d',\n '--fe-bg-hover': '#212121',\n '--fe-bg-selected': '#003d80',\n '--fe-border': '#8f8f8f',\n '--fe-border-strong': '#ffffff',\n '--fe-text': '#ffffff',\n '--fe-text-muted': '#d6d6d6',\n '--fe-text-on-primary': '#001430',\n '--fe-primary': '#7ab8ff',\n '--fe-primary-hover': '#9ccaff',\n '--fe-danger': '#ff7575',\n '--fe-danger-hover': '#ff9999',\n '--fe-shadow': '0 0 0 1px #ffffff, 0 12px 32px rgba(0, 0, 0, 0.65)',\n '--fe-shadow-sm': '0 0 0 1px #ffffff',\n },\n },\n {\n // Yumuşak Gri — desaturated, quiet neutral.\n id: 'gray',\n nameKey: 'theme.name.gray',\n light: {\n '--fe-bg': '#f7f7f8',\n '--fe-bg-elev': '#efeff1',\n '--fe-bg-hover': '#e4e4e7',\n '--fe-bg-selected': '#d6d7db',\n '--fe-border': '#dfdfe2',\n '--fe-border-strong': '#b9b9c0',\n '--fe-text': '#26272b',\n '--fe-text-muted': '#585a63',\n '--fe-text-on-primary': '#ffffff',\n '--fe-primary': '#4b4b54',\n '--fe-primary-hover': '#38383f',\n '--fe-danger': '#c62828',\n '--fe-danger-hover': '#a51f1f',\n },\n dark: {\n '--fe-bg': '#131316',\n '--fe-bg-elev': '#1b1b1f',\n '--fe-bg-hover': '#26262b',\n '--fe-bg-selected': '#35353c',\n '--fe-border': '#2d2d33',\n '--fe-border-strong': '#4a4a52',\n '--fe-text': '#e6e6e9',\n '--fe-text-muted': '#a4a4ad',\n '--fe-text-on-primary': '#17171b',\n '--fe-primary': '#b0b0ba',\n '--fe-primary-hover': '#c4c4cd',\n '--fe-danger': '#f87171',\n '--fe-danger-hover': '#ef4444',\n },\n },\n {\n // Terminal Yeşili — phosphor green, monospace face for the full CRT vibe.\n id: 'terminal',\n nameKey: 'theme.name.terminal',\n light: {\n '--fe-bg': '#f3f9f4',\n '--fe-bg-elev': '#e5f2e8',\n '--fe-bg-hover': '#d5ead9',\n '--fe-bg-selected': '#bce3c6',\n '--fe-border': '#cbe2d1',\n '--fe-border-strong': '#94c2a0',\n '--fe-text': '#0c2913',\n '--fe-text-muted': '#31573c',\n '--fe-text-on-primary': '#ffffff',\n '--fe-primary': '#116b33',\n '--fe-primary-hover': '#0c5427',\n '--fe-danger': '#c62828',\n '--fe-danger-hover': '#a51f1f',\n '--fe-font': 'ui-monospace, \"SF Mono\", Consolas, Menlo, monospace',\n },\n dark: {\n '--fe-bg': '#050d07',\n '--fe-bg-elev': '#0a1710',\n '--fe-bg-hover': '#112418',\n '--fe-bg-selected': '#1a3a26',\n '--fe-border': '#1c3a2a',\n '--fe-border-strong': '#316144',\n '--fe-text': '#4fdd8b',\n '--fe-text-muted': '#38a668',\n '--fe-text-on-primary': '#03180a',\n '--fe-primary': '#25c95e',\n '--fe-primary-hover': '#4fdd8b',\n '--fe-danger': '#ff6b62',\n '--fe-danger-hover': '#ff8d86',\n '--fe-font': 'ui-monospace, \"SF Mono\", Consolas, Menlo, monospace',\n },\n },\n];\n\nexport function themeById(id: string | null | undefined): ThemeDef | undefined {\n return THEMES.find((t) => t.id === id);\n}\n\n/** Every token key ANY theme touches — used to fully clear inline overrides\n * when switching themes (a theme that skips a token must not inherit the\n * previous theme's value for it). */\nconst ALL_TOKEN_KEYS: string[] = Array.from(\n new Set(THEMES.flatMap((t) => [...Object.keys(t.light), ...Object.keys(t.dark)])),\n);\n\n/* ------------------------------------------------------------------ */\n/* Shared reactive state + persistence */\n/* ------------------------------------------------------------------ */\n\nfunction readStoredThemeId(): string {\n try {\n const v = localStorage.getItem(THEME_LS_KEY);\n return v && themeById(v) ? v : DEFAULT_THEME_ID;\n } catch {\n return DEFAULT_THEME_ID;\n }\n}\n\n// Module-level singleton so every explorer instance on the page follows the\n// same selection instantly.\nconst themeId: Ref<string> = ref(\n typeof window === 'undefined' ? DEFAULT_THEME_ID : readStoredThemeId(),\n);\n\nexport function setTheme(id: string): void {\n const valid = themeById(id) ? id : DEFAULT_THEME_ID;\n themeId.value = valid;\n try {\n if (valid === DEFAULT_THEME_ID) localStorage.removeItem(THEME_LS_KEY);\n else localStorage.setItem(THEME_LS_KEY, valid);\n } catch {\n /* quota / private mode */\n }\n}\n\n/** Reactive handle for components: `{ themeId, setTheme }`. */\nexport function useThemeState(): { themeId: Ref<string>; setTheme: (id: string) => void } {\n return { themeId, setTheme };\n}\n\n// Cross-tab sync — another tab changing the preference updates this one live.\nif (typeof window !== 'undefined') {\n try {\n window.addEventListener('storage', (e) => {\n if (e.key !== THEME_LS_KEY) return;\n themeId.value = e.newValue && themeById(e.newValue) ? e.newValue : DEFAULT_THEME_ID;\n });\n } catch {\n /* non-browser env */\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Application — layer 1: inline vars on the explorer root */\n/* ------------------------------------------------------------------ */\n\n/**\n * Set (or clear, for the default theme) the selected theme's tokens as\n * inline CSS variables on the explorer root element, resolved to the\n * active variant. Inline style wins over every stylesheet rule, so the\n * root subtree is always correct regardless of host CSS.\n */\nexport function applyThemeToEl(el: HTMLElement, id: string, dark: boolean): void {\n for (const key of ALL_TOKEN_KEYS) el.style.removeProperty(key);\n if (id === DEFAULT_THEME_ID) return;\n const theme = themeById(id);\n if (!theme) return;\n const map = dark ? theme.dark : theme.light;\n for (const [key, value] of Object.entries(map)) el.style.setProperty(key, value);\n}\n\n/* ------------------------------------------------------------------ */\n/* Application — layer 2: injected stylesheet for shadowed surfaces */\n/* ------------------------------------------------------------------ */\n\nconst STYLE_ATTR = 'data-filex-theme';\n\nfunction cssDecls(map: ThemeTokenMap): string {\n return Object.entries(map)\n .map(([k, v]) => `${k}:${v};`)\n .join('');\n}\n\n/**\n * Generate a stylesheet that mirrors styles/variables.css' selector\n * cascade 1:1 (light base → explicit-dark selectors → prefers-dark media\n * block) with the theme's palette. Appended after the bundled CSS it\n * overrides every surface — teleported context menus, modal backdrops —\n * in whichever mode they resolve to, without JS having to track them.\n */\nexport function generateThemeCss(theme: ThemeDef): string {\n const light = cssDecls(theme.light);\n const dark = cssDecls(theme.dark);\n const darkSelectors = [\n '.fe--theme-dark',\n \":root[data-theme='dark'] .fe\",\n '.fe.fe--theme-dark',\n ':root.dark',\n '.dark',\n ':root.dark .fe',\n '.dark .fe',\n '.fe-ctx-backdrop--theme-dark',\n \".fe-ctx-backdrop--theme-auto[data-prefers-dark='1']\",\n ].join(',');\n const autoDarkSelectors = [\n '.fe:not(.fe--theme-light)',\n '.fe-ctx-backdrop--theme-auto:not(.fe-ctx-backdrop--theme-light)',\n ].join(',');\n return (\n `/* filex theme: ${theme.id} */` +\n `:root,.fe{${light}}` +\n `${darkSelectors}{${dark}}` +\n `@media (prefers-color-scheme: dark){${autoDarkSelectors}{${dark}}}`\n );\n}\n\n/**\n * Create/update/empty the singleton `<style data-filex-theme>` element in\n * <head>. Idempotent — safe to call from every explorer instance.\n */\nexport function syncThemeStyle(id: string): void {\n if (typeof document === 'undefined') return;\n let el = document.head.querySelector<HTMLStyleElement>(`style[${STYLE_ATTR}]`);\n const theme = id === DEFAULT_THEME_ID ? undefined : themeById(id);\n if (!theme) {\n if (el) el.textContent = '';\n return;\n }\n if (!el) {\n el = document.createElement('style');\n el.setAttribute(STYLE_ATTR, '');\n document.head.appendChild(el);\n } else if (el !== document.head.lastElementChild) {\n // Keep it AFTER any stylesheet injected later (e.g. the webcomponent's\n // own core-CSS injection) so equal-specificity rules keep losing to us.\n document.head.appendChild(el);\n }\n const css = generateThemeCss(theme);\n if (el.textContent !== css) el.textContent = css;\n}\n","<script setup lang=\"ts\">\n/**\n * ThemeGallery — wiring:c1 theme picker modal.\n *\n * A grid of theme cards, each rendering a mini live preview (surface +\n * toolbar chips + sample rows) painted with that theme's tokens for the\n * CURRENTLY resolved light/dark mode — so the card shows exactly what\n * you'd get. Click applies instantly (live preview behind the modal) and\n * persists; the selected card carries a ✓. \"Varsayılana dön\" resets.\n *\n * Presentational only — selection state + persistence live in\n * lib/themes.ts (shared across instances); the parent forwards `select`.\n */\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { THEMES, DEFAULT_THEME_ID, type ThemeDef } from '../lib/themes';\nimport Modal from '../modals/Modal.vue';\n\nconst props = defineProps<{\n open: boolean;\n locale: LocaleCode;\n /** Host mode (forwarded to Modal so the backdrop themes correctly). */\n theme?: ThemeMode;\n /** Resolved mode — decides which variant the preview cards paint. */\n dark: boolean;\n /** Currently selected theme id. */\n current: string;\n}>();\n\nconst emit = defineEmits<{\n (e: 'close'): void;\n (e: 'select', id: string): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\n/** Inline variables for one card — a self-contained mini `--fe-*` scope,\n * so the preview markup can use the exact same tokens the real UI uses. */\nfunction cardVars(th: ThemeDef): Record<string, string> {\n return props.dark ? th.dark : th.light;\n}\n\nconst DEFAULT_ID = DEFAULT_THEME_ID;\n</script>\n\n<template>\n <Modal :open=\"open\" :title=\"t('theme.title')\" size=\"lg\" :theme=\"theme\" @close=\"emit('close')\">\n <p class=\"fe-themes__hint\">{{ t('theme.hint') }}</p>\n <div class=\"fe-themes\" role=\"listbox\" :aria-label=\"t('theme.title')\">\n <button\n v-for=\"th in THEMES\"\n :key=\"th.id\"\n type=\"button\"\n class=\"fe-themecard\"\n :class=\"{ 'is-selected': th.id === current }\"\n role=\"option\"\n :aria-selected=\"th.id === current\"\n :style=\"cardVars(th)\"\n @click=\"emit('select', th.id)\"\n >\n <span class=\"fe-themecard__preview\" aria-hidden=\"true\">\n <span class=\"fe-themecard__topbar\">\n <span class=\"fe-themecard__chip fe-themecard__chip--primary\"></span>\n <span class=\"fe-themecard__chip\"></span>\n <span class=\"fe-themecard__chip fe-themecard__chip--ghost\"></span>\n </span>\n <span class=\"fe-themecard__row\">\n <span class=\"fe-themecard__dot\"></span>\n <span class=\"fe-themecard__line\" style=\"width: 62%\"></span>\n </span>\n <span class=\"fe-themecard__row fe-themecard__row--selected\">\n <span class=\"fe-themecard__dot fe-themecard__dot--primary\"></span>\n <span class=\"fe-themecard__line\" style=\"width: 44%\"></span>\n </span>\n <span class=\"fe-themecard__row\">\n <span class=\"fe-themecard__dot fe-themecard__dot--muted\"></span>\n <span class=\"fe-themecard__line fe-themecard__line--muted\" style=\"width: 74%\"></span>\n </span>\n </span>\n <span class=\"fe-themecard__name\">\n {{ t(th.nameKey) }}\n <span v-if=\"th.id === current\" class=\"fe-themecard__check\" :title=\"t('theme.selected')\">✓</span>\n </span>\n </button>\n </div>\n <template #actions>\n <button\n type=\"button\"\n class=\"fe-btn\"\n :disabled=\"current === DEFAULT_ID\"\n @click=\"emit('select', DEFAULT_ID)\"\n >\n {{ t('theme.reset') }}\n </button>\n <button type=\"button\" class=\"fe-btn fe-btn--primary\" @click=\"emit('close')\">\n {{ t('theme.close') }}\n </button>\n </template>\n </Modal>\n</template>\n\n<!-- Deliberately NOT scoped: the webcomponent injects the CORE package's\n built style.css, whose data-v scope ids don't match the ids the\n webcomponent's own compile assigns (verified: fe-themecard got\n data-v-99a95ed7 in core vs data-v-5d4cc1fd in the wc bundle) — scoped\n rules would silently not apply in embeds. Class names are fe-*\n namespaced, so global is collision-safe (same approach as base.css). -->\n<style>\n.fe-themes__hint {\n margin: 0 0 12px;\n font-size: 12.5px;\n color: var(--fe-text-muted);\n}\n\n.fe-themes {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));\n gap: 12px;\n}\n\n/* Each card is its own mini token scope (inline --fe-* vars from the theme\n definition), so every color below refers to the CARD's theme — not the\n active page theme. */\n.fe-themecard {\n display: flex;\n flex-direction: column;\n padding: 0;\n border: 2px solid var(--fe-border-strong);\n border-radius: var(--fe-radius, 8px);\n background: var(--fe-bg);\n cursor: pointer;\n overflow: hidden;\n text-align: left;\n transition: transform 0.12s ease, box-shadow 0.12s ease;\n font: inherit;\n}\n\n.fe-themecard:hover {\n transform: translateY(-2px);\n box-shadow: var(--fe-shadow-sm, 0 2px 6px rgba(15, 23, 42, 0.08));\n}\n\n.fe-themecard:focus-visible {\n outline: 2px solid var(--fe-primary);\n outline-offset: 2px;\n}\n\n.fe-themecard.is-selected {\n border-color: var(--fe-primary);\n box-shadow: 0 0 0 2px var(--fe-primary);\n}\n\n.fe-themecard__preview {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 10px;\n background: var(--fe-bg);\n border-bottom: 1px solid var(--fe-border);\n min-height: 84px;\n}\n\n.fe-themecard__topbar {\n display: flex;\n gap: 4px;\n margin-bottom: 2px;\n}\n\n.fe-themecard__chip {\n height: 8px;\n width: 22px;\n border-radius: 4px;\n background: var(--fe-bg-hover);\n border: 1px solid var(--fe-border);\n}\n\n.fe-themecard__chip--primary {\n background: var(--fe-primary);\n border-color: var(--fe-primary);\n}\n\n.fe-themecard__chip--ghost {\n background: var(--fe-bg-elev);\n}\n\n.fe-themecard__row {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 3px 4px;\n border-radius: 4px;\n}\n\n.fe-themecard__row--selected {\n background: var(--fe-bg-selected);\n}\n\n.fe-themecard__dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--fe-text);\n opacity: 0.75;\n flex: none;\n}\n\n.fe-themecard__dot--primary {\n background: var(--fe-primary);\n opacity: 1;\n}\n\n.fe-themecard__dot--muted {\n background: var(--fe-text-muted);\n}\n\n.fe-themecard__line {\n height: 6px;\n border-radius: 3px;\n background: var(--fe-text);\n opacity: 0.55;\n}\n\n.fe-themecard__line--muted {\n background: var(--fe-text-muted);\n}\n\n.fe-themecard__name {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 8px 10px;\n font-size: 12.5px;\n font-weight: 600;\n color: var(--fe-text);\n background: var(--fe-bg-elev);\n font-family: var(--fe-font, inherit);\n}\n\n.fe-themecard__check {\n flex: none;\n width: 18px;\n height: 18px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n background: var(--fe-primary);\n color: var(--fe-text-on-primary);\n font-size: 11px;\n line-height: 1;\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * ShortcutSettings — wiring:c2 keyboard-shortcut customization modal.\n *\n * Category-grouped rows from the shortcut registry; each row shows the\n * action label + current combo badge(s) + \"Change\" (press-to-capture:\n * the next key combination is recorded, Esc cancels) + a per-row\n * \"reset to default\" and a header \"reset all\".\n *\n * Conflicts: assigning a combo that another action already uses turns\n * the row into a red warning with two choices — unbind the old action\n * and take the combo, or cancel. Combos reserved by fixed shortcuts\n * (Backspace, Esc) can never be taken.\n *\n * While the modal is open a window-level CAPTURE listener swallows\n * keydowns (except Esc/Tab) so experimenting with keys can't trigger\n * explorer actions behind the modal; native button activation (Enter/\n * Space on a focused button) is a default action and still works.\n */\nimport { computed, onBeforeUnmount, ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport {\n comboFromEvent,\n effectiveCombo,\n findShortcutConflict,\n resetAllShortcuts,\n resetShortcut,\n setShortcutOverride,\n useShortcutList,\n SHORTCUT_ACTIONS,\n type ShortcutView,\n} from '../composables/useKeyboardShortcuts';\nimport Modal from '../modals/Modal.vue';\n\nconst props = defineProps<{\n open: boolean;\n locale: LocaleCode;\n theme?: 'light' | 'dark' | 'auto';\n}>();\n\nconst emit = defineEmits<{\n (e: 'close'): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst list = useShortcutList();\n\nconst groups = computed(() => {\n const order: string[] = [];\n const map = new Map<string, ShortcutView[]>();\n for (const s of list.value) {\n if (!map.has(s.groupKey)) {\n map.set(s.groupKey, []);\n order.push(s.groupKey);\n }\n map.get(s.groupKey)!.push(s);\n }\n return order.map((key) => ({ key, items: map.get(key)! }));\n});\n\nconst anyOverridden = computed(() => list.value.some((s) => s.overridden));\n\n// --- capture / conflict state ---\n\nconst capturingId = ref<string | null>(null);\nconst conflict = ref<{ id: string; combo: string; conflictId: string; fixed: boolean } | null>(null);\n\nfunction labelOf(id: string): string {\n const def = SHORTCUT_ACTIONS.find((a) => a.id === id);\n return def ? t(def.labelKey) : id;\n}\n\nfunction beginCapture(id: string) {\n conflict.value = null;\n capturingId.value = id;\n}\n\nfunction cancelCapture() {\n capturingId.value = null;\n}\n\nfunction attemptAssign(id: string, combo: string) {\n capturingId.value = null;\n if (combo === effectiveCombo(id)) return; // unchanged\n const clash = findShortcutConflict(combo, id);\n if (clash) {\n conflict.value = { id, combo, conflictId: clash.id, fixed: clash.fixed };\n return;\n }\n setShortcutOverride(id, combo);\n}\n\nfunction confirmConflictTake() {\n const c = conflict.value;\n if (!c || c.fixed) return;\n setShortcutOverride(c.conflictId, ''); // unbind the old owner\n setShortcutOverride(c.id, c.combo);\n conflict.value = null;\n}\n\nfunction dismissConflict() {\n conflict.value = null;\n}\n\nfunction onReset(id: string) {\n conflict.value = null;\n resetShortcut(id);\n}\n\nfunction onResetAll() {\n conflict.value = null;\n capturingId.value = null;\n resetAllShortcuts();\n}\n\n// --- window capture listener (only while open) ---\n\nfunction onWindowKeydown(e: KeyboardEvent) {\n if (capturingId.value) {\n e.preventDefault();\n e.stopPropagation();\n if (e.key === 'Escape') {\n cancelCapture();\n return;\n }\n const combo = comboFromEvent(e);\n if (!combo) return; // bare modifier — keep listening\n attemptAssign(capturingId.value, combo);\n return;\n }\n // Modal open but idle: let Esc (close) and Tab (focus nav) through,\n // swallow everything else so explorer shortcuts can't fire behind us.\n if (e.key === 'Escape' || e.key === 'Tab') return;\n e.stopPropagation();\n}\n\nwatch(\n () => props.open,\n (open) => {\n if (open) {\n window.addEventListener('keydown', onWindowKeydown, true);\n } else {\n window.removeEventListener('keydown', onWindowKeydown, true);\n capturingId.value = null;\n conflict.value = null;\n }\n },\n);\n\nonBeforeUnmount(() => window.removeEventListener('keydown', onWindowKeydown, true));\n\nfunction onClose() {\n if (capturingId.value) {\n cancelCapture();\n return;\n }\n emit('close');\n}\n</script>\n\n<template>\n <Modal :open=\"open\" :title=\"t('shortcuts.settings.title')\" size=\"lg\" :theme=\"theme\" @close=\"onClose\">\n <div class=\"fe-shortset\">\n <div class=\"fe-shortset__topbar\">\n <p class=\"fe-shortset__hint\">{{ t('shortcuts.settings.hint') }}</p>\n <button\n type=\"button\"\n class=\"fe-btn fe-shortset__reset-all\"\n :disabled=\"!anyOverridden\"\n @click=\"onResetAll\"\n >\n ↺ {{ t('shortcuts.settings.reset_all') }}\n </button>\n </div>\n\n <section v-for=\"g in groups\" :key=\"g.key\" class=\"fe-shortset__group\">\n <h3 class=\"fe-shortcuts__heading\">{{ t(g.key) }}</h3>\n <div\n v-for=\"s in g.items\"\n :key=\"s.id\"\n class=\"fe-shortset__item\"\n :class=\"{\n 'is-capturing': capturingId === s.id,\n 'is-conflict': conflict?.id === s.id,\n }\"\n >\n <div class=\"fe-shortset__row\">\n <span class=\"fe-shortset__label\">\n {{ t(s.labelKey) }}\n <span v-if=\"s.overridden\" class=\"fe-shortcuts__custom\" :title=\"t('shortcuts.settings.customized')\">●</span>\n </span>\n <span class=\"fe-shortset__keys\">\n <span v-if=\"capturingId === s.id\" class=\"fe-shortset__capture\" role=\"status\">\n {{ t('shortcuts.settings.capture') }}\n </span>\n <template v-else>\n <span v-if=\"s.keys.length === 0\" class=\"fe-shortcuts__unbound\">\n {{ t('shortcuts.settings.unbound') }}\n </span>\n <template v-for=\"(combo, i) in s.keys\" v-else :key=\"combo\">\n <kbd class=\"fe-kbd\">{{ combo }}</kbd>\n <span v-if=\"i < s.keys.length - 1\" class=\"fe-shortcuts__or\" aria-hidden=\"true\">/</span>\n </template>\n </template>\n </span>\n <span class=\"fe-shortset__actions\">\n <template v-if=\"s.customizable\">\n <button\n v-if=\"capturingId !== s.id\"\n type=\"button\"\n class=\"fe-btn fe-shortset__btn\"\n @click=\"beginCapture(s.id)\"\n >\n {{ t('shortcuts.settings.change') }}\n </button>\n <button\n v-else\n type=\"button\"\n class=\"fe-btn fe-shortset__btn\"\n @click=\"cancelCapture\"\n >\n {{ t('shortcuts.settings.conflict_cancel') }}\n </button>\n <button\n v-if=\"s.overridden\"\n type=\"button\"\n class=\"fe-btn fe-btn--icon-only fe-shortset__btn\"\n :title=\"t('shortcuts.settings.reset')\"\n :aria-label=\"t('shortcuts.settings.reset')\"\n @click=\"onReset(s.id)\"\n >\n ↺\n </button>\n </template>\n <span v-else class=\"fe-shortset__fixed\">{{ t('shortcuts.settings.fixed') }}</span>\n </span>\n </div>\n <div v-if=\"conflict && conflict.id === s.id\" class=\"fe-shortset__conflict\" role=\"alert\">\n <span class=\"fe-shortset__conflict-msg\">\n <kbd class=\"fe-kbd\">{{ conflict.combo }}</kbd>\n {{\n conflict.fixed\n ? t('shortcuts.settings.conflict_fixed', { name: labelOf(conflict.conflictId) })\n : t('shortcuts.settings.conflict', { name: labelOf(conflict.conflictId) })\n }}\n </span>\n <span class=\"fe-shortset__conflict-actions\">\n <button\n v-if=\"!conflict.fixed\"\n type=\"button\"\n class=\"fe-btn fe-btn--danger fe-shortset__btn\"\n @click=\"confirmConflictTake\"\n >\n {{ t('shortcuts.settings.conflict_take') }}\n </button>\n <button type=\"button\" class=\"fe-btn fe-shortset__btn\" @click=\"dismissConflict\">\n {{ t('shortcuts.settings.conflict_cancel') }}\n </button>\n </span>\n </div>\n </div>\n </section>\n </div>\n <template #actions>\n <button type=\"button\" class=\"fe-btn\" @click=\"onClose\">{{ t('viewer.close') }}</button>\n </template>\n </Modal>\n</template>\n","<script setup lang=\"ts\">\n/**\n * PreviewModal — inline file preview.\n *\n * Strategy by extension:\n * image / video / audio / pdf → native browser elements\n * md / markdown → markdown-it (lazy) → rendered HTML\n * code (js/ts/php/py/json/...) → Monaco when ready, highlight.js\n * fallback while it's still loading,\n * plain `<pre>` when neither is\n * installed\n * office (docx/xlsx/pptx) → OnlyOffice iframe (config.onlyOfficeBase)\n * plain text (txt/log/conf) → CodeMirror when saveText is set,\n * `<pre>` otherwise\n * anything else → \"indir\" fallback\n *\n * Monaco is dynamic-imported at FileExplorer onMounted; by the time the\n * user clicks an editable code file the chunk is usually already cached.\n * We probe `getMonaco()` synchronously when the modal opens — if it's\n * not yet loaded we render the highlight.js read-only view immediately,\n * then upgrade to Monaco once the import resolves.\n */\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, shallowRef, watch } from 'vue';\nimport type { Component } from 'vue';\nimport type { FileNode } from '../types/FileNode';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport Modal from './Modal.vue';\nimport { ensureMonaco, getMonaco, ensureHighlight } from '../composables/useMonacoLoader';\nimport { useLocale } from '../composables/useLocale';\n\nconst props = defineProps<{\n open: boolean;\n locale: LocaleCode;\n file: FileNode | null;\n previewUrl: (path: string) => string;\n downloadUrl: (path: string) => string;\n onlyOfficeBase?: string | null;\n onlyOfficeConfigEndpoint?: string | null;\n saveTextEndpoint?: string | null;\n openMode?: 'edit' | 'view';\n authHeaders?: () => Record<string, string>;\n authCredentials?: RequestCredentials;\n /** New rich-viewer config (forwarded by FileExplorer from ExplorerConfig). */\n drawioUrl?: string | null;\n pdfWorkerUrl?: string | null;\n pdfSaveUrl?: string | null;\n /** Standalone full-screen viewer route — `?path=…&storage=…&type=…`. */\n viewerBaseUrl?: string | null;\n /* wiring:e2 — false hides the \"Düzenle\" / \"Yeni Sekmede Aç\" buttons.\n * The standalone route fetches RAW server bytes, which inside an\n * E2E-encrypted folder is ciphertext (and its save path could clobber\n * the encrypted blob) — the host disables the escape hatches there. */\n newTabEnabled?: boolean;\n /** Drop the dialog chrome (backdrop tint, header bar, footer actions)\n * so the viewer fills the full viewport. Used by the standalone\n * /files/edit route where the browser tab IS the container — a\n * modal frame on top of the editor just steals real estate. */\n chromeless?: boolean;\n /** When the dynamic-viewer chunk fails to load, fall back to the\n * legacy native renderer (e.g. native `<object>` for PDFs). */\n /** Explicit theme. Forwarded to the underlying Modal (which tags\n * its backdrop with `.fe--theme-{light,dark}` so the CSS variable\n * override matches the host admin shell) and to Monaco (vs vs\n * vs-dark). When unset Monaco falls back to `prefers-color-scheme`\n * and the modal cascade follows whatever `.fe` parent it gets. */\n theme?: 'light' | 'dark' | 'auto';\n}>();\n\nconst emit = defineEmits<{\n (e: 'close'): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nfunction ext(f: FileNode | null): string {\n return (f?.extension || '').toLowerCase();\n}\n\nconst IMAGE = ['jpg', 'jpeg', 'png', 'webp', 'gif', 'bmp', 'avif', 'svg', 'heic'];\nconst VIDEO = ['mp4', 'webm', 'mov', 'mkv', 'm4v', 'ogv'];\nconst AUDIO = ['mp3', 'wav', 'ogg', 'flac', 'm4a', 'aac', 'opus'];\n\nconst CODE_LANGS: Record<string, string> = {\n md: 'markdown', markdown: 'markdown',\n txt: 'plaintext', log: 'plaintext',\n js: 'javascript', mjs: 'javascript', cjs: 'javascript',\n ts: 'typescript', tsx: 'typescript', jsx: 'javascript',\n vue: 'xml', svelte: 'xml', html: 'xml', htm: 'xml', xml: 'xml', svg: 'xml',\n css: 'css', scss: 'scss', sass: 'scss', less: 'less',\n json: 'json', jsonc: 'json',\n yml: 'yaml', yaml: 'yaml',\n php: 'php', py: 'python', rb: 'ruby', go: 'go', rs: 'rust',\n java: 'java', kt: 'kotlin', swift: 'swift', cpp: 'cpp', c: 'c',\n h: 'cpp', hpp: 'cpp', cs: 'csharp', dart: 'dart',\n sh: 'bash', bash: 'bash', zsh: 'bash', fish: 'bash',\n sql: 'sql',\n toml: 'ini', ini: 'ini', conf: 'ini', env: 'bash', cfg: 'ini',\n dockerfile: 'dockerfile',\n graphql: 'graphql', gql: 'graphql',\n diff: 'diff', patch: 'diff',\n};\n// CSV/TSV land in the rich viewer (`csv` kind below) instead of the\n// legacy plain-text path so the user gets a proper table preview.\nconst TEXT_PLAIN = ['txt', 'log'];\nconst OFFICE = ['docx', 'doc', 'xlsx', 'xls', 'pptx', 'ppt', 'odt', 'ods', 'odp', 'rtf'];\n\n/**\n * Lazy viewer map — extension → component loader. Each loader is a\n * dynamic import so the viewer chunk only ships when the file type\n * is actually opened. The PreviewModal mounts the resolved component\n * via `<component :is=\"ViewerCmp\" />` once the dynamic import settles.\n */\nconst VIEWER_MAP: Record<string, () => Promise<Component>> = {\n glb: () => import('../viewers/Viewer3D.vue'),\n gltf: () => import('../viewers/Viewer3D.vue'),\n obj: () => import('../viewers/Viewer3D.vue'),\n stl: () => import('../viewers/Viewer3D.vue'),\n fbx: () => import('../viewers/Viewer3D.vue'),\n '3ds': () => import('../viewers/Viewer3D.vue'),\n\n epub: () => import('../viewers/EpubViewer.vue'),\n\n mmd: () => import('../viewers/MermaidViewer.vue'),\n mermaid: () => import('../viewers/MermaidViewer.vue'),\n\n drawio: () => import('../viewers/DrawioViewer.vue'),\n dio: () => import('../viewers/DrawioViewer.vue'),\n\n tif: () => import('../viewers/TiffViewer.vue'),\n tiff: () => import('../viewers/TiffViewer.vue'),\n\n psd: () => import('../viewers/PsdViewer.vue'),\n\n // PDF deliberately uses the native browser viewer (`kind === 'pdf'`\n // branch in the template). PdfViewer.vue still exists for callers\n // that want the rich custom UI but the SFC default keeps things\n // minimal — the browser already paints search/zoom/page UI for free.\n\n ipynb: () => import('../viewers/IpynbViewer.vue'),\n\n csv: () => import('../viewers/CsvViewer.vue'),\n tsv: () => import('../viewers/CsvViewer.vue'),\n\n zip: () => import('../viewers/ArchiveViewer.vue'),\n};\n\ntype PreviewKind =\n | 'image' | 'video' | 'audio' | 'pdf' | 'markdown' | 'code'\n | 'office' | 'text' | 'viewer' | 'other';\n\nconst kind = computed<PreviewKind>(() => {\n const e = ext(props.file);\n if (!e) return 'other';\n if (IMAGE.includes(e)) return 'image';\n if (VIDEO.includes(e)) return 'video';\n if (AUDIO.includes(e)) return 'audio';\n // PDF always uses the native browser <object> renderer. The\n // PdfViewer SFC is no longer wired into the default map — the\n // browser-bundled toolbar is enough and removes a 600 KB pdfjs\n // worker chunk + a custom toolbar layer for parity with the rest\n // of the read-only viewers.\n if (e === 'pdf') return 'pdf';\n // Markdown stays in its own branch (gets the split view in edit mode);\n // plain text → code editor in edit mode, raw <pre> in view mode.\n const wantEdit = props.openMode !== 'view';\n if (e === 'md' || e === 'markdown') return 'markdown';\n if (e in CODE_LANGS) return 'code';\n if (e in VIEWER_MAP) return 'viewer';\n if (OFFICE.includes(e)) return 'office';\n if (TEXT_PLAIN.includes(e)) return wantEdit ? 'code' : 'text';\n return 'other';\n});\n\n// --- Rich viewer plumbing ---\n//\n// `viewerCmp` holds the dynamically-imported component once the load\n// resolves. Stored in a `shallowRef` because the component itself\n// shouldn't be deep-watched.\nconst viewerCmp = shallowRef<Component | null>(null);\nconst viewerLoadError = ref<string | null>(null);\nconst pdfFallbackToNative = ref(false);\n\nasync function loadViewerFor(extension: string): Promise<void> {\n viewerCmp.value = null;\n viewerLoadError.value = null;\n const loader = VIEWER_MAP[extension];\n if (!loader) return;\n try {\n const mod = (await loader()) as { default?: Component };\n viewerCmp.value = mod.default ?? (mod as unknown as Component);\n } catch (err) {\n viewerLoadError.value = err instanceof Error ? err.message : 'viewer load failed';\n if (extension === 'pdf') pdfFallbackToNative.value = true;\n }\n}\n\nfunction onPdfFallback(): void {\n pdfFallbackToNative.value = true;\n}\n\n/** Build the props bundle pushed into the active viewer component. */\nconst viewerProps = computed(() => {\n const e = ext(props.file);\n const base: Record<string, unknown> = {\n url: src.value,\n ext: e,\n mime: props.file?.mime_type,\n t,\n authHeaders: props.authHeaders,\n authCredentials: props.authCredentials,\n };\n if (props.file) {\n base.filePath = stripAdapter(props.file.path);\n // Archive viewer needs the adapter-qualified path because the\n // /api/files/archive/list handler falls back to storages[0] when\n // no adapter prefix is present — on multi-storage instances that\n // 500s for every non-default storage (sample.zip on fm s3-test).\n if (e === 'zip' || e === 'rar' || e === '7z' || e === 'tar' || e === 'gz' || e === 'tgz') {\n base.filePath = props.file.path;\n }\n }\n if (e === 'drawio' || e === 'dio') {\n base.drawioUrl = props.drawioUrl ?? undefined;\n base.saveUrl = props.saveTextEndpoint ?? undefined;\n base.readOnly = props.openMode === 'view';\n }\n if (e === 'pdf') {\n base.pdfWorkerUrl = props.pdfWorkerUrl ?? undefined;\n base.pdfSaveUrl = props.pdfSaveUrl ?? undefined;\n }\n return base;\n});\n\nfunction openInNewTab(): void {\n buildAndOpenStandalone(props.openMode || 'edit');\n}\n\nfunction openEditInNewTab(): void {\n buildAndOpenStandalone('edit');\n}\n\nfunction buildAndOpenStandalone(mode: 'view' | 'edit'): void {\n if (!props.file) return;\n const e = ext(props.file);\n // Keep the adapter-qualified path intact so the editor route\n // resolves the storage from the URL (stripping it falls back to\n // storages[0] and 404s for any non-default adapter). Default base\n // is the SFC's standalone /files/edit route; embedders override via\n // viewerBaseUrl when they mount us elsewhere.\n const base = props.viewerBaseUrl || '/files/edit';\n const sep = base.includes('?') ? '&' : '?';\n const url =\n `${base}${sep}path=${encodeURIComponent(props.file.path)}` +\n `&type=${encodeURIComponent(e)}` +\n `&mode=${encodeURIComponent(mode)}`;\n window.open(url, '_blank', 'noopener');\n}\n\n/**\n * Extensions that have a meaningful \"edit\" surface. Read-only kinds\n * (image/video/audio/3D/archive) don't surface a \"Düzenle\" button.\n */\nconst EDITABLE_EXTS = new Set([\n // OnlyOffice — open the in-page office editor (or new tab) with\n // edit permissions.\n 'docx', 'doc', 'xlsx', 'xls', 'pptx', 'ppt',\n 'odt', 'ods', 'odp', 'rtf',\n // Drawio / mermaid round-trip via the new-tab route.\n 'drawio', 'dio', 'mmd', 'mermaid',\n // Code / text / markdown — Monaco / split editor.\n 'md', 'markdown', 'txt', 'log',\n 'json', 'jsonc', 'yaml', 'yml', 'xml', 'svg', 'html', 'htm',\n 'js', 'mjs', 'cjs', 'ts', 'tsx', 'jsx', 'vue', 'svelte',\n 'css', 'scss', 'sass', 'less',\n 'php', 'py', 'rb', 'go', 'rs', 'java', 'kt', 'swift',\n 'cpp', 'c', 'h', 'hpp', 'cs', 'dart',\n 'sh', 'bash', 'sql',\n 'toml', 'ini', 'conf', 'cfg', 'env',\n 'dockerfile', 'graphql', 'gql',\n]);\n\nconst canEditKind = computed<boolean>(() =>\n !!props.file && EDITABLE_EXTS.has(ext(props.file)),\n);\n\n// Keep adapter prefix so backend resolves the right storage — stripping\n// it defaults to storages[0] and 404s on any non-default adapter.\nconst src = computed(() => (props.file ? props.previewUrl(props.file.path) : ''));\nconst download = computed(() => (props.file ? props.downloadUrl(props.file.path) : ''));\n\nfunction stripAdapter(p: string): string {\n const idx = p.indexOf('://');\n return idx === -1 ? p : p.slice(idx + 3);\n}\n\nconst loading = ref(false);\nconst fetchError = ref<string | null>(null);\nconst rawText = ref<string>('');\nconst MAX_TEXT_BYTES = 1_000_000;\nconst tooLarge = ref(false);\n\n// Markdown split-edit state — drives the side-by-side textarea+preview\n// layout inside the `kind === 'markdown'` template when openMode='edit'.\nconst mdDirty = ref(false);\nconst mdSaving = ref(false);\nlet mdReRenderTimer: ReturnType<typeof setTimeout> | undefined;\nlet mdAutosaveTimer: ReturnType<typeof setTimeout> | undefined;\nfunction onMdInput() {\n mdDirty.value = true;\n if (mdReRenderTimer) clearTimeout(mdReRenderTimer);\n mdReRenderTimer = setTimeout(() => {\n renderMarkdown(rawText.value);\n }, 250);\n // Autosave 1.5s after last keystroke — manual Kaydet button + Ctrl+S\n // still work; saveMarkdown() guards against overlap.\n if (mdAutosaveTimer) clearTimeout(mdAutosaveTimer);\n mdAutosaveTimer = setTimeout(() => {\n void saveMarkdown();\n }, 1500);\n}\nasync function saveMarkdown() {\n if (!props.saveTextEndpoint || !props.file || mdSaving.value) return;\n mdSaving.value = true;\n fetchError.value = null;\n try {\n const headers = {\n 'Content-Type': 'application/json',\n ...(await (props.authHeaders ?? (() => ({})))()),\n };\n const res = await fetch(props.saveTextEndpoint, {\n method: 'POST',\n headers,\n credentials: props.authCredentials || 'same-origin',\n body: JSON.stringify({ path: stripAdapter(props.file.path), content: rawText.value }),\n });\n if (!res.ok) {\n throw new Error(`save failed: ${res.status} ${await res.text()}`);\n }\n mdDirty.value = false;\n } catch (err) {\n fetchError.value = err instanceof Error ? err.message : String(err);\n } finally {\n mdSaving.value = false;\n }\n}\n\nasync function fetchText(url: string): Promise<void> {\n loading.value = true;\n fetchError.value = null;\n rawText.value = '';\n tooLarge.value = false;\n try {\n const headers: Record<string, string> = {};\n if (props.authHeaders) Object.assign(headers, props.authHeaders());\n const res = await fetch(url, {\n credentials: props.authCredentials || 'same-origin',\n headers,\n });\n if (!res.ok) {\n throw new Error(`${res.status} ${res.statusText}`);\n }\n const len = Number(res.headers.get('content-length') || '0');\n if (len > MAX_TEXT_BYTES) {\n tooLarge.value = true;\n return;\n }\n const text = await res.text();\n if (text.length > MAX_TEXT_BYTES) {\n tooLarge.value = true;\n rawText.value = text.slice(0, MAX_TEXT_BYTES);\n } else {\n rawText.value = text;\n }\n } catch (err) {\n fetchError.value = err instanceof Error ? err.message : String(err);\n } finally {\n loading.value = false;\n }\n}\n\n// --- Markdown rendering (lazy markdown-it) ---\n//\n// Beyond the base markdown render we walk the resulting DOM for two\n// enrichments:\n// - ```mermaid``` fences → swap the `<pre>` for a rendered SVG via\n// the `mermaid` peer (when installed).\n// - ```math``` / `$$ … $$` blocks → render with `katex` (peer).\n// Both enrichments degrade gracefully when the peer isn't available\n// (the original `<pre>` stays in place).\n\nconst markdownHtml = ref<string>('');\nconst markdownEl = ref<HTMLDivElement | null>(null);\n\nasync function renderMarkdown(text: string): Promise<void> {\n try {\n const mod = (await import(/* @vite-ignore */ 'markdown-it').catch(() => null)) as any;\n if (!mod) {\n markdownHtml.value = '';\n return;\n }\n const Md = (mod as { default: any }).default ?? (mod as any);\n // html: true so inline HTML in README.md / docs renders (the\n // GitHub / GitLab contract — operators expect `<img>`, tables,\n // `<details>`, etc. to work). We sanitize the output below to\n // strip scripts / event handlers before injecting via v-html.\n const md = new Md({\n html: true,\n linkify: true,\n breaks: true,\n typographer: true,\n });\n const raw = md.render(text);\n markdownHtml.value = sanitizeHtml(raw);\n // Wait for Vue to flush the v-html into the DOM before walking it.\n await new Promise<void>((r) => setTimeout(r, 0));\n await enrichMarkdown();\n } catch (err) {\n markdownHtml.value = '';\n fetchError.value = err instanceof Error ? err.message : String(err);\n }\n}\n\n/**\n * Sanitize the markdown-it output before v-html injection.\n *\n * GitHub / GitLab let README authors embed inline HTML (img, table,\n * details, kbd …) so the viewer ships with `html: true`. This filter\n * strips the executable surface: `<script>`, `<iframe>`, `<object>`,\n * `<embed>`, any `on*` event-handler attribute, and `javascript:`\n * URLs. Conservative — README content with inline handlers is\n * exceptional and silent over-removal beats silent XSS.\n *\n * No external dep — keeping the package install-free is the trade\n * we want. Integrators who need a heavier sanitizer can run their\n * own DOMPurify pass on the rendered output before showing it.\n */\nfunction sanitizeHtml(html: string): string {\n return html\n .replace(/<\\s*script\\b[^<]*(?:(?!<\\s*\\/\\s*script\\s*>)<[^<]*)*<\\s*\\/\\s*script\\s*>/gi, '')\n .replace(/<\\s*iframe\\b[\\s\\S]*?<\\s*\\/\\s*iframe\\s*>/gi, '')\n .replace(/<\\s*object\\b[\\s\\S]*?<\\s*\\/\\s*object\\s*>/gi, '')\n .replace(/<\\s*embed\\b[^>]*>/gi, '')\n .replace(/\\son\\w+\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s>]+)/gi, '')\n .replace(/(href|src|action|formaction|xlink:href)\\s*=\\s*(?:\"\\s*javascript:[^\"]*\"|'\\s*javascript:[^']*')/gi, '$1=\"#\"');\n}\n\nasync function enrichMarkdown(): Promise<void> {\n if (!markdownEl.value) return;\n const root = markdownEl.value;\n const blocks = Array.from(root.querySelectorAll('pre > code')) as HTMLElement[];\n if (blocks.length === 0) return;\n\n let mermaid: any = undefined;\n let katex: any = undefined;\n\n for (const block of blocks) {\n const cls = block.className || '';\n const isMermaid =\n /\\blanguage-mermaid\\b/.test(cls) || /\\blanguage-mmd\\b/.test(cls);\n const isMath =\n /\\blanguage-math\\b/.test(cls) ||\n /\\blanguage-latex\\b/.test(cls) ||\n /\\blanguage-tex\\b/.test(cls);\n\n if (isMermaid) {\n if (mermaid === undefined) {\n try {\n const m = await import(/* @vite-ignore */ 'mermaid');\n mermaid = m.default ?? m;\n mermaid.initialize?.({\n startOnLoad: false,\n securityLevel: 'strict',\n });\n } catch {\n mermaid = null;\n }\n }\n if (!mermaid) continue;\n try {\n const id = `filex-md-mermaid-${Math.random().toString(36).slice(2)}`;\n const { svg } = await mermaid.render(id, block.textContent || '');\n const wrap = document.createElement('div');\n wrap.className = 'fe-preview__md-mermaid';\n wrap.innerHTML = svg;\n block.parentElement?.replaceWith(wrap);\n } catch {\n /* leave fenced block */\n }\n } else if (isMath) {\n if (katex === undefined) {\n try {\n const m = await import(/* @vite-ignore */ 'katex');\n katex = m.default ?? m;\n } catch {\n katex = null;\n }\n }\n if (!katex) continue;\n try {\n const html = katex.renderToString(block.textContent || '', {\n displayMode: true,\n throwOnError: false,\n });\n const wrap = document.createElement('div');\n wrap.className = 'fe-preview__md-math';\n wrap.innerHTML = html;\n block.parentElement?.replaceWith(wrap);\n } catch {\n /* leave fenced block */\n }\n }\n }\n}\n\n// --- Code highlight (highlight.js fallback) ---\n//\n// Used as the placeholder render until Monaco resolves, AND as the\n// permanent renderer when Monaco isn't installed at all (peer missing).\n\nconst codeHtml = ref<string>('');\n\nasync function highlightCode(text: string, language: string): Promise<void> {\n try {\n const mod = (await ensureHighlight()) as any;\n if (!mod) {\n codeHtml.value = '';\n return;\n }\n const hljs = mod.default ?? mod;\n if (hljs.getLanguage(language)) {\n const result = hljs.highlight(text, { language, ignoreIllegals: true });\n codeHtml.value = result.value;\n } else {\n const result = hljs.highlightAuto(text);\n codeHtml.value = result.value;\n }\n } catch (err) {\n codeHtml.value = '';\n fetchError.value = err instanceof Error ? err.message : String(err);\n }\n}\n\n// --- Monaco editor (lazy) ---\n//\n// We attempt to instantiate Monaco when the modal opens for a code/text\n// file. If the module isn't loaded yet, the highlight.js placeholder\n// renders first, and the editor mounts in-place once Monaco resolves.\n// Save endpoint required for editing — read-only Monaco still loads if\n// the user just wants the IDE-grade syntax/colour view.\n\nconst monacoEl = ref<HTMLDivElement | null>(null);\nlet monacoEditor: any = null;\nlet codeAutosaveTimer: ReturnType<typeof setTimeout> | undefined;\nconst monacoReady = ref(false);\nconst saving = ref(false);\nconst saveOk = ref(false);\nconst saveError = ref<string | null>(null);\n\nfunction disposeMonaco(): void {\n if (monacoEditor) {\n try {\n monacoEditor.dispose();\n } catch {\n /* ignore */\n }\n monacoEditor = null;\n }\n monacoReady.value = false;\n saveOk.value = false;\n saveError.value = null;\n}\n\n/**\n * Map an extension to a Monaco language id. Anything not in the map\n * just becomes 'plaintext' — Monaco still gives line numbers + Ctrl+S.\n */\nfunction monacoLanguageFor(extension: string): string {\n const map: Record<string, string> = {\n js: 'javascript', mjs: 'javascript', cjs: 'javascript',\n ts: 'typescript', tsx: 'typescript', jsx: 'javascript',\n json: 'json', jsonc: 'json',\n css: 'css', scss: 'scss', sass: 'scss', less: 'less',\n html: 'html', htm: 'html', vue: 'html', svelte: 'html',\n xml: 'xml', svg: 'xml',\n md: 'markdown', markdown: 'markdown',\n php: 'php', py: 'python',\n yml: 'yaml', yaml: 'yaml',\n go: 'go', rs: 'rust', sql: 'sql',\n cpp: 'cpp', c: 'c', h: 'cpp', hpp: 'cpp',\n sh: 'shell', bash: 'shell',\n dockerfile: 'dockerfile',\n toml: 'ini', ini: 'ini', conf: 'ini', cfg: 'ini',\n };\n return map[extension] ?? 'plaintext';\n}\n\nasync function tryMountMonaco(text: string, extension: string): Promise<boolean> {\n const monaco = (await ensureMonaco()) as any;\n if (!monaco || !monacoEl.value) return false;\n try {\n disposeMonaco();\n const editable = !!props.saveTextEndpoint && props.openMode !== 'view';\n // Honour the explicit theme prop when set; fall back to the OS\n // preference otherwise. Without this the Monaco editor stays on\n // vs-dark on OS-dark systems even when the host admin shell is\n // light, producing a jarring light-card + dark-code combo inside\n // the in-page preview modal.\n const dark = props.theme === 'dark'\n ? true\n : props.theme === 'light'\n ? false\n : window.matchMedia?.('(prefers-color-scheme: dark)').matches;\n monacoEditor = monaco.editor.create(monacoEl.value, {\n value: text,\n language: monacoLanguageFor(extension),\n readOnly: !editable,\n theme: dark ? 'vs-dark' : 'vs',\n automaticLayout: true,\n minimap: { enabled: false },\n fontSize: 13,\n });\n if (editable) {\n monacoEditor.addCommand(\n monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS,\n () => void saveCode(),\n );\n // Autosave: 1.5s after the last keystroke we POST the buffer.\n // Ctrl+S still works for the impatient — saveCode() guards against\n // overlap, so a manual save during the debounce window just wins\n // and the queued autosave becomes a no-op.\n monacoEditor.onDidChangeModelContent(() => {\n if (codeAutosaveTimer) clearTimeout(codeAutosaveTimer);\n codeAutosaveTimer = setTimeout(() => {\n void saveCode();\n }, 1500);\n });\n }\n monacoReady.value = true;\n return true;\n } catch (err) {\n fetchError.value = `Monaco mount fail: ${(err as Error).message}`;\n return false;\n }\n}\n\nasync function saveCode(): Promise<void> {\n if (!props.saveTextEndpoint || !props.file) return;\n if (props.openMode === 'view') return;\n if (saving.value) return;\n saving.value = true;\n saveOk.value = false;\n saveError.value = null;\n try {\n const text = monacoEditor ? monacoEditor.getValue() : '';\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (props.authHeaders) Object.assign(headers, props.authHeaders());\n const res = await fetch(props.saveTextEndpoint, {\n method: 'POST',\n headers,\n credentials: props.authCredentials || 'same-origin',\n body: JSON.stringify({\n path: stripAdapter(props.file.path),\n content: text,\n }),\n });\n if (!res.ok) {\n const txt = await res.text().catch(() => '');\n throw new Error(`${res.status} ${res.statusText}${txt ? ' — ' + txt.slice(0, 150) : ''}`);\n }\n saveOk.value = true;\n setTimeout(() => {\n saveOk.value = false;\n }, 2500);\n } catch (err) {\n saveError.value = (err as Error).message;\n } finally {\n saving.value = false;\n }\n}\n\n// --- Orchestration: fetch + render when modal opens ---\n\nasync function runOrchestration(open: boolean, url: string, k: string): Promise<void> {\n rawText.value = '';\n markdownHtml.value = '';\n codeHtml.value = '';\n fetchError.value = null;\n officeError.value = null;\n viewerCmp.value = null;\n viewerLoadError.value = null;\n pdfFallbackToNative.value = false;\n disposeOnlyOfficeEditor();\n disposeMonaco();\n if (!open || !url) return;\n if (k === 'viewer') {\n await loadViewerFor(ext(props.file));\n return;\n }\n if (k === 'markdown' || k === 'code' || k === 'text') {\n await fetchText(url);\n if (tooLarge.value) return;\n if (k === 'markdown') {\n await renderMarkdown(rawText.value);\n return;\n }\n // For code/text — try Monaco first when the cached module is\n // already in memory. If not, render the highlight.js placeholder\n // immediately, then attempt to upgrade to Monaco when the import\n // settles.\n const lang = CODE_LANGS[ext(props.file)] || '';\n const monacoCached = getMonaco();\n if (monacoCached) {\n await new Promise<void>((r) => setTimeout(r, 0));\n const ok = await tryMountMonaco(rawText.value, ext(props.file));\n if (!ok) await highlightCode(rawText.value, lang);\n } else {\n // Render highlight.js immediately for read-only colour. Then\n // kick off the Monaco load and swap it in once ready.\n if (k === 'code') await highlightCode(rawText.value, lang);\n ensureMonaco().then(async (m) => {\n if (!m) return;\n if (!props.open) return;\n // Wait one tick so the placeholder DOM exists before swapping.\n await new Promise<void>((r) => setTimeout(r, 0));\n await tryMountMonaco(rawText.value, ext(props.file));\n });\n }\n } else if (k === 'office') {\n await new Promise<void>((r) => setTimeout(r, 0));\n await mountOnlyOfficeEditor();\n }\n}\n\nwatch(\n () => [props.open, src.value, kind.value, props.openMode] as const,\n ([open, url, k]) => {\n void runOrchestration(open, url, k);\n },\n);\n\n// Hand-fire on mount so the standalone Editor.vue route (which mounts\n// us with `open` already true) actually runs the orchestration. The\n// watcher itself is non-immediate because `immediate: true` would fire\n// before the rest of <script setup> finishes, hitting the TDZ on\n// `officeEditor`/Monaco state below. Doing this in onMounted+nextTick\n// guarantees every `let`/`function` in the file has been hoisted.\nonMounted(() => {\n void nextTick(() => {\n if (!props.open) return;\n void runOrchestration(props.open, src.value, kind.value);\n });\n});\n\nconst codeLanguage = computed(() => CODE_LANGS[ext(props.file)] || 'plaintext');\n\n// --- OnlyOffice DocEditor (real, JWT-signed) ---\n\nconst officeEl = ref<HTMLDivElement | null>(null);\nconst officeError = ref<string | null>(null);\nlet officeEditor: any = null;\n\nasync function mountOnlyOfficeEditor(): Promise<void> {\n officeError.value = null;\n if (!props.file || kind.value !== 'office') return;\n if (!props.onlyOfficeConfigEndpoint) {\n officeError.value = 'OnlyOffice yapılandırması yok';\n return;\n }\n if (!officeEl.value) return;\n\n try {\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (props.authHeaders) Object.assign(headers, props.authHeaders());\n const res = await fetch(props.onlyOfficeConfigEndpoint, {\n method: 'POST',\n headers,\n credentials: props.authCredentials || 'same-origin',\n body: JSON.stringify({\n // Send the FULL adapter-qualified path. The backend resolves\n // `<adapter>://<rel>` against ListEnabledStorages; passing the\n // bare relative path falls back to storages[0] which 404s for\n // anything sitting on a non-primary storage (e.g. s3-test).\n path: props.file.path,\n mode: props.openMode || 'edit',\n }),\n });\n if (!res.ok) {\n throw new Error(`Config fetch ${res.status}: ${(await res.text()).slice(0, 200)}`);\n }\n const { config, documentServerUrl } = (await res.json()) as {\n config: any;\n documentServerUrl: string;\n };\n\n await loadOnlyOfficeScript(documentServerUrl);\n disposeOnlyOfficeEditor();\n\n const mountId = 'fe-onlyoffice-mount';\n officeEl.value.id = mountId;\n\n config.events = {\n onError: (err: any) => {\n officeError.value = formatOnlyOfficeError(err);\n },\n };\n\n const W = window as any;\n if (!W.DocsAPI || !W.DocsAPI.DocEditor) {\n throw new Error('DocsAPI not available after script load');\n }\n officeEditor = new W.DocsAPI.DocEditor(mountId, config);\n } catch (err) {\n officeError.value = err instanceof Error ? err.message : String(err);\n }\n}\n\nfunction disposeOnlyOfficeEditor(): void {\n try {\n officeEditor?.destroyEditor?.();\n } catch {\n /* ignore */\n }\n officeEditor = null;\n}\n\nonBeforeUnmount(() => {\n disposeOnlyOfficeEditor();\n disposeMonaco();\n});\n\n/**\n * OnlyOffice fires onError with an event-like object:\n * { type:'error', data:{ errorCode, errorDescription, ... } }\n * The legacy stringification produced \"[object Object]\" for objects\n * whose `data` was itself an object. Walk one level deeper so the\n * user sees the actual error description instead of a useless cast.\n */\nfunction formatOnlyOfficeError(err: unknown): string {\n if (typeof err === 'string') return err;\n const e = err as { data?: unknown; message?: unknown; errorDescription?: unknown };\n if (e?.data && typeof e.data === 'object') {\n const d = e.data as { errorDescription?: unknown; errorCode?: unknown; message?: unknown };\n if (typeof d.errorDescription === 'string') return d.errorDescription;\n if (typeof d.message === 'string') return d.message;\n if (d.errorCode !== undefined) return `OnlyOffice error ${d.errorCode}`;\n }\n if (typeof e?.data === 'string') return e.data;\n if (typeof e?.errorDescription === 'string') return e.errorDescription;\n if (typeof e?.message === 'string') return e.message;\n try {\n return JSON.stringify(err);\n } catch {\n return 'OnlyOffice error';\n }\n}\n\nconst ONLYOFFICE_SCRIPT_ID = 'fe-onlyoffice-api-js';\nfunction loadOnlyOfficeScript(base: string): Promise<void> {\n return new Promise((resolve, reject) => {\n if ((window as any).DocsAPI?.DocEditor) {\n resolve();\n return;\n }\n const existing = document.getElementById(ONLYOFFICE_SCRIPT_ID) as HTMLScriptElement | null;\n if (existing) {\n existing.addEventListener('load', () => resolve());\n existing.addEventListener('error', () => reject(new Error('OnlyOffice api.js load failed')));\n return;\n }\n const script = document.createElement('script');\n script.id = ONLYOFFICE_SCRIPT_ID;\n script.src = `${base.replace(/\\/$/, '')}/web-apps/apps/api/documents/api.js`;\n script.async = true;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('OnlyOffice api.js load failed'));\n document.head.appendChild(script);\n });\n}\n</script>\n\n<template>\n <Modal :open=\"open\" size=\"xl\" :title=\"file?.basename || ''\" :chromeless=\"chromeless\" :theme=\"theme\" @close=\"emit('close')\">\n <div v-if=\"file\" class=\"fe-preview\">\n <template v-if=\"kind === 'image'\">\n <img :src=\"src\" :alt=\"file.basename\" class=\"fe-preview__image\" />\n </template>\n <template v-else-if=\"kind === 'video'\">\n <video :src=\"src\" controls preload=\"metadata\" class=\"fe-preview__video\" />\n </template>\n <template v-else-if=\"kind === 'audio'\">\n <audio :src=\"src\" controls class=\"fe-preview__audio\" />\n </template>\n <template v-else-if=\"kind === 'pdf'\">\n <object :data=\"src\" type=\"application/pdf\" class=\"fe-preview__iframe\">\n <div class=\"fe-preview__fallback\">\n <span class=\"fe-preview__fallback-icon\">📕</span>\n <p>Tarayıcı PDF'i inline açamadı.</p>\n <a :href=\"download\" class=\"fe-btn fe-btn--primary\" target=\"_blank\" rel=\"noopener\">PDF'i Yeni Sekmede Aç</a>\n </div>\n </object>\n </template>\n\n <template v-else-if=\"kind === 'markdown'\">\n <div v-if=\"loading\" class=\"fe-preview__fallback\">{{ t('viewer.loading') }}</div>\n <div v-else-if=\"tooLarge\" class=\"fe-preview__fallback\">\n Dosya çok büyük (>1 MB). <a :href=\"download\" class=\"fe-btn\">{{ t('viewer.download') }}</a>\n </div>\n <div\n v-else-if=\"openMode === 'edit' && saveTextEndpoint\"\n class=\"fe-preview__md-split\"\n >\n <div class=\"fe-preview__md-split-bar\">\n <span class=\"fe-preview__md-split-label\">MARKDOWN</span>\n <span v-if=\"fetchError\" class=\"fe-preview__md-split-error\">{{ fetchError }}</span>\n <button\n type=\"button\"\n class=\"fe-btn fe-btn--primary\"\n :disabled=\"!mdDirty || mdSaving\"\n @click=\"saveMarkdown\"\n >\n {{ mdSaving ? t('viewer.saving') : (mdDirty ? t('viewer.save') : t('viewer.saved')) }}\n </button>\n </div>\n <div class=\"fe-preview__md-split-body\">\n <textarea\n class=\"fe-preview__md-split-input\"\n v-model=\"rawText\"\n @input=\"onMdInput\"\n @keydown.ctrl.s.prevent=\"saveMarkdown\"\n @keydown.meta.s.prevent=\"saveMarkdown\"\n spellcheck=\"false\"\n placeholder=\"# Markdown buraya…\"\n />\n <div\n ref=\"markdownEl\"\n class=\"fe-preview__md-split-output fe-preview__md\"\n v-html=\"markdownHtml\"\n ></div>\n </div>\n </div>\n <div v-else-if=\"fetchError\" class=\"fe-preview__fallback\">\n <p>{{ fetchError }}</p>\n <a :href=\"download\" class=\"fe-btn fe-btn--primary\">{{ t('viewer.download') }}</a>\n </div>\n <div v-else-if=\"markdownHtml\" ref=\"markdownEl\" class=\"fe-preview__md\" v-html=\"markdownHtml\"></div>\n <pre v-else class=\"fe-preview__pre\">{{ rawText }}</pre>\n </template>\n\n <template v-else-if=\"kind === 'viewer'\">\n <div v-if=\"viewerLoadError && !pdfFallbackToNative\" class=\"fe-preview__fallback\">\n <span class=\"fe-preview__fallback-icon\">⚠️</span>\n <p>{{ viewerLoadError }}</p>\n <a :href=\"download\" class=\"fe-btn fe-btn--primary\">{{ t('viewer.download') }}</a>\n </div>\n <div v-else-if=\"!viewerCmp\" class=\"fe-preview__fallback\">\n <span class=\"fe-preview__fallback-icon\">⏳</span>\n <p>{{ t('viewer.loading') }}</p>\n </div>\n <component\n v-else\n :is=\"viewerCmp\"\n v-bind=\"viewerProps\"\n class=\"fe-preview__viewer\"\n @fallback=\"onPdfFallback\"\n />\n </template>\n\n <template v-else-if=\"kind === 'code' || kind === 'text'\">\n <div v-if=\"loading\" class=\"fe-preview__fallback\">{{ t('viewer.loading') }}</div>\n <div v-else-if=\"tooLarge\" class=\"fe-preview__fallback\">\n Dosya çok büyük (>1 MB). <a :href=\"download\" class=\"fe-btn\">{{ t('viewer.download') }}</a>\n </div>\n <div v-else-if=\"fetchError\" class=\"fe-preview__fallback\">\n <p>{{ fetchError }}</p>\n <a :href=\"download\" class=\"fe-btn fe-btn--primary\">{{ t('viewer.download') }}</a>\n </div>\n <div v-else class=\"fe-preview__code-wrap\">\n <div class=\"fe-preview__code-toolbar\">\n <span class=\"fe-preview__code-lang\">{{ codeLanguage }}</span>\n <span v-if=\"!monacoReady && codeHtml\" class=\"fe-preview__code-status\">\n {{ saveTextEndpoint ? t('viewer.editor_loading') : t('viewer.read_only') }}\n </span>\n <span v-if=\"saveOk\" class=\"fe-preview__code-status fe-preview__code-status--ok\">✓ {{ t('viewer.saved') }}</span>\n <span v-if=\"saveError\" class=\"fe-preview__code-status fe-preview__code-status--err\" :title=\"saveError\">✗ {{ t('viewer.save_error') }}</span>\n <span v-if=\"openMode === 'view'\" class=\"fe-preview__code-status\">{{ t('viewer.read_only') }}</span>\n <button\n v-else-if=\"saveTextEndpoint && monacoReady\"\n type=\"button\"\n class=\"fe-btn fe-btn--primary\"\n :disabled=\"saving\"\n @click=\"saveCode\"\n >{{ saving ? t('viewer.saving') : t('viewer.save') }}</button>\n </div>\n <!-- Monaco target — hidden until ready, then occupies the slot. -->\n <div ref=\"monacoEl\" class=\"fe-preview__code-editor\" :class=\"{ 'is-hidden': !monacoReady }\" />\n <!-- Highlight.js read-only fallback — visible until Monaco mounts. -->\n <pre\n v-if=\"!monacoReady && codeHtml\"\n class=\"fe-preview__pre fe-preview__code hljs\"\n ><code :class=\"`language-${codeLanguage}`\" v-html=\"codeHtml\"></code></pre>\n <pre\n v-else-if=\"!monacoReady && !codeHtml\"\n class=\"fe-preview__pre\"\n :data-lang=\"codeLanguage\"\n >{{ rawText }}</pre>\n </div>\n </template>\n\n <template v-else-if=\"kind === 'office'\">\n <div v-if=\"officeError\" class=\"fe-preview__fallback\">\n <span class=\"fe-preview__fallback-icon\">📄</span>\n <p>{{ officeError }}</p>\n <a :href=\"download\" class=\"fe-btn fe-btn--primary\">{{ t('viewer.download') }}</a>\n </div>\n <div v-else ref=\"officeEl\" class=\"fe-preview__office\" />\n </template>\n\n <template v-else>\n <div class=\"fe-preview__fallback\">\n <span class=\"fe-preview__fallback-icon\">📎</span>\n <p>{{ t('viewer.no_preview') }}</p>\n <a :href=\"download\" class=\"fe-btn fe-btn--primary\">{{ t('viewer.download') }}</a>\n </div>\n </template>\n </div>\n <template #actions>\n <button\n v-if=\"file && openMode === 'view' && canEditKind && newTabEnabled !== false /* wiring:e2 */\"\n type=\"button\"\n class=\"fe-btn fe-btn--primary\"\n @click=\"openEditInNewTab\"\n >✏ {{ t('viewer.edit') }}</button>\n <button\n v-if=\"file && newTabEnabled !== false /* wiring:e2 */\"\n type=\"button\"\n class=\"fe-btn\"\n @click=\"openInNewTab\"\n >↗ {{ t('viewer.open_in_new_tab') }}</button>\n <a v-if=\"file\" :href=\"download\" class=\"fe-btn\">{{ t('viewer.download') }}</a>\n <button type=\"button\" class=\"fe-btn\" @click=\"emit('close')\">{{ t('viewer.close') }}</button>\n </template>\n </Modal>\n</template>\n\n<style>\n.fe-preview__code-editor.is-hidden {\n display: none;\n}\n/* Wrapper for the dynamic viewers — they render their own toolbars\n * inside the wrapper, so we just give them the full pane height. */\n.fe-preview__viewer {\n width: 100%;\n height: 100%;\n min-height: 70vh;\n display: flex;\n flex-direction: column;\n}\n.fe-preview .fe-preview__viewer {\n align-self: stretch;\n}\n.fe-preview__md-mermaid {\n display: flex;\n justify-content: center;\n margin: 16px 0;\n}\n.fe-preview__md-mermaid svg {\n max-width: 100%;\n height: auto;\n}\n.fe-preview__md-math {\n margin: 16px 0;\n text-align: center;\n overflow-x: auto;\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * QuickLook — wiring:c2 Space quick-look overlay.\n *\n * A thin behavioural wrapper over the existing PreviewModal (view\n * mode), so every viewer the modal knows (image/video/pdf/office/code/\n * 3D/archive/…) works in quick-look for free. What this layer adds:\n *\n * - Space closes again (macOS Quick Look convention)\n * - ← ↑ / → ↓ ask the host to move the selection; the host keeps the\n * `file` prop in sync so the preview follows the selection\n * - Enter promotes the peek into the full open flow (emit 'open-full')\n * - a small floating hint bar with the key legend\n *\n * Keys are handled in window CAPTURE phase with stopPropagation so the\n * global shortcut registry never double-handles them; events that\n * originate in a form control inside a viewer (e.g. the CSV filter\n * input) are left alone. Esc is untouched — PreviewModal's own Modal\n * already closes on it.\n */\nimport { onBeforeUnmount, watch } from 'vue';\nimport type { FileNode } from '../types/FileNode';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport PreviewModal from '../modals/PreviewModal.vue';\n\nconst props = defineProps<{\n open: boolean;\n locale: LocaleCode;\n file: FileNode | null;\n previewUrl: (path: string) => string;\n downloadUrl: (path: string) => string;\n onlyOfficeBase?: string | null;\n onlyOfficeConfigEndpoint?: string | null;\n authHeaders?: () => Record<string, string>;\n authCredentials?: RequestCredentials;\n drawioUrl?: string | null;\n pdfWorkerUrl?: string | null;\n viewerBaseUrl?: string | null;\n theme?: 'light' | 'dark' | 'auto';\n}>();\n\nconst emit = defineEmits<{\n (e: 'close'): void;\n /** Arrow navigation: -1 = previous file, +1 = next file. */\n (e: 'nav', delta: number): void;\n /** Enter — close the peek and open the file for real. */\n (e: 'open-full'): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nfunction inFormControl(target: EventTarget | null): boolean {\n const el = target as HTMLElement | null;\n return !!(\n el &&\n (el.tagName === 'INPUT' ||\n el.tagName === 'TEXTAREA' ||\n el.tagName === 'SELECT' ||\n el.isContentEditable)\n );\n}\n\nfunction onKeydown(e: KeyboardEvent) {\n if (!props.open) return;\n if (e.ctrlKey || e.metaKey || e.altKey) return;\n if (inFormControl(e.target)) return;\n switch (e.key) {\n case ' ':\n e.preventDefault();\n e.stopPropagation();\n emit('close');\n break;\n case 'ArrowRight':\n case 'ArrowDown':\n e.preventDefault();\n e.stopPropagation();\n emit('nav', 1);\n break;\n case 'ArrowLeft':\n case 'ArrowUp':\n e.preventDefault();\n e.stopPropagation();\n emit('nav', -1);\n break;\n case 'Enter':\n e.preventDefault();\n e.stopPropagation();\n emit('open-full');\n break;\n }\n}\n\nwatch(\n () => props.open,\n (open) => {\n if (open) window.addEventListener('keydown', onKeydown, true);\n else window.removeEventListener('keydown', onKeydown, true);\n },\n { immediate: true },\n);\n\nonBeforeUnmount(() => window.removeEventListener('keydown', onKeydown, true));\n</script>\n\n<template>\n <PreviewModal\n class=\"fe-quicklook\"\n :open=\"open\"\n :locale=\"locale\"\n :file=\"file\"\n :theme=\"theme\"\n :preview-url=\"previewUrl\"\n :download-url=\"downloadUrl\"\n :only-office-base=\"onlyOfficeBase\"\n :only-office-config-endpoint=\"onlyOfficeConfigEndpoint\"\n open-mode=\"view\"\n :auth-headers=\"authHeaders\"\n :auth-credentials=\"authCredentials\"\n :drawio-url=\"drawioUrl\"\n :pdf-worker-url=\"pdfWorkerUrl\"\n :viewer-base-url=\"viewerBaseUrl\"\n @close=\"emit('close')\"\n />\n <transition name=\"fe-toast\">\n <div\n v-if=\"open\"\n class=\"fe fe-ql-hint\"\n :class=\"{\n 'fe--theme-light': theme === 'light',\n 'fe--theme-dark': theme === 'dark',\n }\"\n aria-hidden=\"true\"\n >\n <kbd class=\"fe-kbd\">Space</kbd> {{ t('quicklook.hint_close') }}\n <span class=\"fe-ql-hint__sep\">·</span>\n <kbd class=\"fe-kbd\">↑</kbd><kbd class=\"fe-kbd\">↓</kbd> {{ t('quicklook.hint_nav') }}\n <span class=\"fe-ql-hint__sep\">·</span>\n <kbd class=\"fe-kbd\">Enter</kbd> {{ t('quicklook.hint_open') }}\n </div>\n </transition>\n</template>\n","<script setup lang=\"ts\">\n/**\n * OperationsCenter — the single visible surface for long-running work\n * (wiring:c3). Compact bottom-right badge (active count + aggregate\n * progress ring; hidden when idle) that expands into a panel: active\n * operations on top, session history below.\n *\n * Renders whatever the useOperations store aggregates — uploads, ops-queue\n * jobs, future convert/archive kinds — with one uniform row template.\n * Cancel / retry / dismiss route back through the store's action registry\n * to the owning publisher.\n */\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport type { Operation, OperationsStore } from '../composables/useOperations';\nimport { useLocale } from '../composables/useLocale';\n\nconst props = defineProps<{\n center: OperationsStore;\n locale: LocaleCode;\n narrow?: boolean;\n}>();\n\nconst { t, formatSize } = useLocale(() => props.locale);\n\nconst open = ref(false);\nconst rootEl = ref<HTMLElement | null>(null);\n\nconst active = computed(() => props.center.active.value);\nconst history = computed(() => props.center.history.value);\nconst hasError = computed(() => props.center.hasError.value);\nconst overall = computed(() => props.center.overallPercent.value);\nconst runningCount = computed(() => props.center.runningCount.value);\n\n// Badge visible while anything is active; once the panel is open it stays\n// up (showing history) until the user closes it. Idle + closed → hidden.\nconst visible = computed(() => active.value.length > 0 || (open.value && history.value.length > 0));\n\nwatch(visible, (v) => {\n if (!v) open.value = false;\n});\n\n// ---- progress ring ----\nconst RING_R = 8.5;\nconst RING_C = 2 * Math.PI * RING_R;\nconst ringOffset = computed(() => {\n const p = overall.value;\n if (p === null) return RING_C * 0.72; // spinner arc\n return RING_C * (1 - Math.min(100, Math.max(0, p)) / 100);\n});\nconst ringSpin = computed(() => overall.value === null && runningCount.value > 0);\n\nconst pctText = computed(() => {\n if (runningCount.value === 0 || overall.value === null) return '';\n return t('opc.percent', { n: overall.value });\n});\n\nconst badgeAria = computed(() => t('opc.aria_badge', { n: active.value.length }));\n\n// ---- row helpers ----\nconst KIND_ICONS: Record<Operation['kind'], string> = {\n upload: 'M12 16V5M7 9.5 12 5l5 4.5M5 19h14',\n copy: 'M9 9h11v11H9zM5 15V4h11',\n move: 'M4 12h13M12 6l6 6-6 6',\n delete: 'M5 7h14M9 7V5h6v2M8 7l1 13h6l1-13',\n convert: 'M20 8A8 8 0 0 0 6 6L4 8M4 16a8 8 0 0 0 14 2l2-2M20 3v5h-5M4 21v-5h5',\n archive: 'M4 8V5h16v3zM5 8h14v12H5zM10 12h4',\n};\n\nfunction kindLabel(o: Operation): string {\n return t(`opc.kind.${o.kind}`);\n}\n\nfunction rowTitle(o: Operation): string {\n return o.name || kindLabel(o);\n}\n\nfunction statusText(o: Operation): string {\n if (o.status === 'running') {\n if (o.queued) return t('opc.queued');\n if (o.totalBytes && o.totalBytes > 0) {\n return `${formatSize(o.uploadedBytes ?? 0)} / ${formatSize(o.totalBytes)}`;\n }\n if (o.totalCount && o.totalCount > 0) {\n return `${o.doneCount ?? 0}/${o.totalCount}`;\n }\n return t('opc.status.running');\n }\n if (o.status === 'done') return t('opc.status.done');\n if (o.status === 'aborted') return t('opc.status.aborted');\n return o.error || t('opc.status.error');\n}\n\nfunction chipText(o: Operation): string {\n return t(`opc.status.${o.status === 'running' ? 'running' : o.status}`);\n}\n\n// ---- outside click + Escape ----\nfunction onDocPointerDown(ev: MouseEvent) {\n if (!open.value) return;\n const el = rootEl.value;\n if (el && ev.target instanceof Node && !el.contains(ev.target)) open.value = false;\n}\nfunction onDocKeydown(ev: KeyboardEvent) {\n if (open.value && ev.key === 'Escape') open.value = false;\n}\nonMounted(() => {\n document.addEventListener('mousedown', onDocPointerDown);\n document.addEventListener('keydown', onDocKeydown);\n});\nonBeforeUnmount(() => {\n document.removeEventListener('mousedown', onDocPointerDown);\n document.removeEventListener('keydown', onDocKeydown);\n});\n</script>\n\n<template>\n <div\n v-if=\"visible\"\n ref=\"rootEl\"\n class=\"fe-opc\"\n :class=\"{ 'fe-opc--narrow': narrow, 'fe-opc--open': open }\"\n >\n <transition name=\"fe-opc-pop\">\n <section v-if=\"open\" class=\"fe-opc__panel\" role=\"dialog\" :aria-label=\"t('opc.title')\">\n <header class=\"fe-opc__head\">\n <strong>{{ t('opc.title') }}</strong>\n <button\n type=\"button\"\n class=\"fe-opc__x\"\n :aria-label=\"t('opc.close')\"\n @click=\"open = false\"\n >×</button>\n </header>\n <div class=\"fe-opc__body\">\n <div v-if=\"active.length > 0\" class=\"fe-opc__section\" aria-live=\"polite\">\n <h3 class=\"fe-opc__section-title\">{{ t('opc.active') }}</h3>\n <ul class=\"fe-opc__list\">\n <li\n v-for=\"o in active\"\n :key=\"o.key\"\n class=\"fe-opc__item\"\n :class=\"`is-${o.status}`\"\n >\n <svg\n class=\"fe-opc__kicon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path :d=\"KIND_ICONS[o.kind]\" />\n </svg>\n <div class=\"fe-opc__mid\">\n <div class=\"fe-opc__name\" :title=\"rowTitle(o)\">{{ rowTitle(o) }}</div>\n <div class=\"fe-opc__sub\">\n <span class=\"fe-opc__kind\">{{ kindLabel(o) }}</span>\n <span class=\"fe-opc__dot\" aria-hidden=\"true\">·</span>\n <span class=\"fe-opc__state\">{{ statusText(o) }}</span>\n </div>\n <div\n v-if=\"o.status === 'running' && o.percent !== null\"\n class=\"fe-opc__bar\"\n role=\"progressbar\"\n :aria-valuenow=\"o.percent\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n >\n <div class=\"fe-opc__bar-fill\" :style=\"{ width: o.percent + '%' }\" />\n </div>\n </div>\n <span\n v-if=\"o.status === 'running' && o.percent === null && !o.queued\"\n class=\"fe-opc__spin\"\n aria-hidden=\"true\"\n />\n <div class=\"fe-opc__acts\">\n <button\n v-if=\"o.status === 'running' && o.cancellable\"\n type=\"button\"\n class=\"fe-opc__act\"\n @click=\"center.cancel(o.key)\"\n >{{ t('opc.cancel') }}</button>\n <button\n v-if=\"o.status === 'error' && o.retryable\"\n type=\"button\"\n class=\"fe-opc__act fe-opc__act--retry\"\n @click=\"center.retry(o.key)\"\n >{{ t('opc.retry') }}</button>\n <button\n v-if=\"o.status !== 'running'\"\n type=\"button\"\n class=\"fe-opc__x\"\n :aria-label=\"t('opc.dismiss')\"\n @click=\"center.dismiss(o.key)\"\n >×</button>\n </div>\n </li>\n </ul>\n </div>\n\n <div v-if=\"history.length > 0\" class=\"fe-opc__section\">\n <h3 class=\"fe-opc__section-title\">\n {{ t('opc.history') }}\n <button type=\"button\" class=\"fe-opc__act\" @click=\"center.clearHistory()\">\n {{ t('opc.clear') }}\n </button>\n </h3>\n <ul class=\"fe-opc__list fe-opc__list--history\">\n <li\n v-for=\"o in history\"\n :key=\"'h-' + o.key\"\n class=\"fe-opc__item fe-opc__item--history\"\n :class=\"`is-${o.status}`\"\n >\n <svg\n class=\"fe-opc__kicon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path :d=\"KIND_ICONS[o.kind]\" />\n </svg>\n <div class=\"fe-opc__mid\">\n <div class=\"fe-opc__name\" :title=\"rowTitle(o)\">{{ rowTitle(o) }}</div>\n <div v-if=\"o.status === 'error' && o.error\" class=\"fe-opc__sub fe-opc__sub--err\">\n {{ o.error }}\n </div>\n </div>\n <span class=\"fe-opc__chip\" :class=\"`is-${o.status}`\">{{ chipText(o) }}</span>\n </li>\n </ul>\n </div>\n\n <p v-if=\"active.length === 0 && history.length === 0\" class=\"fe-opc__empty\">\n {{ t('opc.empty') }}\n </p>\n </div>\n </section>\n </transition>\n\n <button\n type=\"button\"\n class=\"fe-opc__badge\"\n :class=\"{ 'is-error': hasError }\"\n :aria-expanded=\"open\"\n :aria-label=\"badgeAria\"\n @click=\"open = !open\"\n >\n <svg\n class=\"fe-opc__ring\"\n :class=\"{ 'fe-opc__ring--spin': ringSpin }\"\n viewBox=\"0 0 22 22\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <circle class=\"fe-opc__ring-track\" cx=\"11\" cy=\"11\" :r=\"RING_R\" fill=\"none\" stroke-width=\"2.5\" />\n <circle\n class=\"fe-opc__ring-fill\"\n cx=\"11\"\n cy=\"11\"\n :r=\"RING_R\"\n fill=\"none\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n :stroke-dasharray=\"RING_C\"\n :stroke-dashoffset=\"ringOffset\"\n transform=\"rotate(-90 11 11)\"\n />\n </svg>\n <span class=\"fe-opc__count\">{{ active.length }}</span>\n <span v-if=\"pctText\" class=\"fe-opc__pct\">{{ pctText }}</span>\n </button>\n </div>\n</template>\n","/**\n * useOperations — unified long-running-operation store (wiring:c3).\n *\n * One presentation-level aggregation point for everything that used to be\n * scattered across corner UIs:\n * - uploads (useUploadChunked jobs / legacy multipart rows)\n * - ops-queue jobs (usePendingOps copy/move/delete worker ops)\n * - future kinds (convert / archive — same `sync()` contract, own group)\n *\n * The store does NOT talk to the network. Publishers (renderless\n * UploadProgress / PendingOpsTray adapters) reconcile their reactive source\n * lists into the store via `sync(group, items)`; OperationsCenter renders the\n * merged picture (badge + panel). Action callbacks (cancel/retry/dismiss)\n * are registered per row so the panel can route user intent back to the\n * owning surface without the store knowing any transport details.\n *\n * Lifecycle rules (per the İşlem Merkezi contract):\n * - running rows live in `active`;\n * - done/aborted rows linger in `active` for DONE_LINGER_MS (\"bitti\"\n * flash) then move to `history` (session-only, capped);\n * - error rows are STICKY: they stay in `active` until the user\n * dismisses or retries them — even after the source list swept them\n * (usePendingOps drops terminal ops after its RETAIN window).\n */\n\nimport { computed, getCurrentScope, onScopeDispose, ref } from 'vue';\n\nexport type OperationKind = 'upload' | 'copy' | 'move' | 'delete' | 'convert' | 'archive';\nexport type OperationStatus = 'running' | 'done' | 'error' | 'aborted';\n\n/** What a publisher hands to `sync()` for one row. */\nexport interface OperationInput {\n /** Stable id within the group (upload uuid / ops row id). */\n id: string | number;\n kind: OperationKind;\n /** Primary label — file name or target path. '' → renderer falls back to the kind verb. */\n name: string;\n /** 0..100, or null for indeterminate (renderer shows a spinner). */\n percent: number | null;\n status: OperationStatus;\n error?: string | null;\n /** Queue op accepted but not started yet (\"Sırada\"). */\n queued?: boolean;\n /** Progress counters for queue ops (3/5 items). */\n doneCount?: number;\n totalCount?: number;\n /** Byte progress for uploads. */\n uploadedBytes?: number;\n totalBytes?: number;\n cancellable?: boolean;\n retryable?: boolean;\n}\n\nexport interface OperationActions {\n cancel?: () => void;\n /** Clean the row out of the OWNING source list (called on retire/dismiss). */\n dismiss?: () => void;\n retry?: () => void;\n}\n\nexport interface Operation {\n /** `${group}:${id}` — unique across publishers. */\n key: string;\n kind: OperationKind;\n name: string;\n percent: number | null;\n status: OperationStatus;\n error: string | null;\n queued: boolean;\n doneCount: number | null;\n totalCount: number | null;\n uploadedBytes: number | null;\n totalBytes: number | null;\n cancellable: boolean;\n retryable: boolean;\n startedAt: number;\n settledAt: number | null;\n}\n\nconst DONE_LINGER_MS = 4000;\nconst HISTORY_CAP = 50;\n\nfunction toOperation(key: string, input: OperationInput, prev?: Operation): Operation {\n const terminal = input.status !== 'running';\n return {\n key,\n kind: input.kind,\n name: input.name,\n percent: input.percent,\n status: input.status,\n error: input.error ?? null,\n queued: input.queued ?? false,\n doneCount: input.doneCount ?? null,\n totalCount: input.totalCount ?? null,\n uploadedBytes: input.uploadedBytes ?? null,\n totalBytes: input.totalBytes ?? null,\n cancellable: input.cancellable ?? false,\n retryable: input.retryable ?? false,\n startedAt: prev?.startedAt ?? Date.now(),\n settledAt: prev?.settledAt ?? (terminal ? Date.now() : null),\n };\n}\n\nexport function useOperations() {\n const active = ref<Operation[]>([]);\n const history = ref<Operation[]>([]);\n\n const actions = new Map<string, OperationActions>();\n /** Keys already moved to history — sync must not resurrect them. */\n const retired = new Set<string>();\n const lingerTimers = new Map<string, ReturnType<typeof setTimeout>>();\n\n function clearTimer(key: string) {\n const tm = lingerTimers.get(key);\n if (tm !== undefined) {\n clearTimeout(tm);\n lingerTimers.delete(key);\n }\n }\n\n /** Move a row from active to the session history (newest first). */\n function retire(key: string, opts: { toHistory?: boolean } = {}) {\n clearTimer(key);\n const idx = active.value.findIndex((o) => o.key === key);\n if (idx === -1) return;\n const [op] = active.value.splice(idx, 1);\n active.value = [...active.value];\n retired.add(key);\n if (opts.toHistory !== false) {\n history.value = [{ ...op, settledAt: op.settledAt ?? Date.now() }, ...history.value].slice(\n 0,\n HISTORY_CAP,\n );\n }\n }\n\n function scheduleLinger(key: string) {\n if (lingerTimers.has(key)) return;\n lingerTimers.set(\n key,\n setTimeout(() => {\n lingerTimers.delete(key);\n // Retire + ask the owning source to drop its row so it doesn't\n // resurrect on the next sync (uploads keep done rows forever).\n const acts = actions.get(key);\n retire(key);\n acts?.dismiss?.();\n }, DONE_LINGER_MS),\n );\n }\n\n /**\n * Full-list reconcile for one publisher group. Upserts every present row,\n * removes vanished ones (sticky errors excepted), and manages the\n * done-linger → history hand-off.\n */\n function sync(\n group: string,\n items: Array<{ input: OperationInput; actions?: OperationActions }>,\n ): void {\n const prefix = `${group}:`;\n const present = new Set<string>();\n let next = [...active.value];\n let changed = false;\n\n for (const item of items) {\n const key = `${group}:${item.input.id}`;\n present.add(key);\n if (item.actions) actions.set(key, item.actions);\n if (retired.has(key)) continue; // already history — don't resurrect\n const idx = next.findIndex((o) => o.key === key);\n const op = toOperation(key, item.input, idx === -1 ? undefined : next[idx]);\n if (idx === -1) {\n next = [op, ...next];\n changed = true;\n } else if (JSON.stringify(next[idx]) !== JSON.stringify(op)) {\n next[idx] = op;\n changed = true;\n }\n if (op.status === 'done' || op.status === 'aborted') scheduleLinger(key);\n }\n\n // Vanished from source: running → drop silently (superseded elsewhere),\n // done/aborted → straight to history, error → sticky (keep visible).\n for (const o of [...next]) {\n if (!o.key.startsWith(prefix) || present.has(o.key)) continue;\n if (o.status === 'error') continue;\n clearTimer(o.key);\n next = next.filter((x) => x.key !== o.key);\n changed = true;\n if (o.status !== 'running') {\n retired.add(o.key);\n history.value = [{ ...o, settledAt: o.settledAt ?? Date.now() }, ...history.value].slice(\n 0,\n HISTORY_CAP,\n );\n }\n }\n\n // Bookkeeping: retired keys whose source rows are gone can be forgotten\n // (their ids won't reappear — uuids / monotonic op ids).\n for (const key of [...retired]) {\n if (key.startsWith(prefix) && !present.has(key)) retired.delete(key);\n }\n for (const key of [...actions.keys()]) {\n if (key.startsWith(prefix) && !present.has(key) && !active.value.some((o) => o.key === key)) {\n // keep actions for rows still on screen (sticky errors)\n if (!next.some((o) => o.key === key)) actions.delete(key);\n }\n }\n\n if (changed) active.value = next;\n }\n\n function cancel(key: string) {\n actions.get(key)?.cancel?.();\n }\n\n function retry(key: string) {\n const acts = actions.get(key);\n retire(key); // failed attempt goes to history; retry publishes a fresh row\n acts?.dismiss?.();\n acts?.retry?.();\n }\n\n function dismiss(key: string) {\n const acts = actions.get(key);\n retire(key);\n acts?.dismiss?.();\n }\n\n function clearHistory() {\n history.value = [];\n }\n\n const runningCount = computed(\n () => active.value.filter((o) => o.status === 'running').length,\n );\n const errorCount = computed(() => active.value.filter((o) => o.status === 'error').length);\n const hasError = computed(() => errorCount.value > 0);\n\n /**\n * Aggregate progress across determinate running rows (uploads weighted by\n * bytes, queue ops by item counts). null → nothing determinate is running\n * (badge ring spins instead of filling).\n */\n const overallPercent = computed<number | null>(() => {\n const running = active.value.filter((o) => o.status === 'running');\n let sum = 0;\n let n = 0;\n for (const o of running) {\n let frac: number | null = null;\n if (o.totalBytes && o.totalBytes > 0) {\n frac = Math.min(1, (o.uploadedBytes ?? 0) / o.totalBytes);\n } else if (o.totalCount && o.totalCount > 0) {\n frac = Math.min(1, (o.doneCount ?? 0) / o.totalCount);\n } else if (o.percent !== null) {\n frac = Math.min(1, o.percent / 100);\n }\n if (frac !== null) {\n sum += frac;\n n += 1;\n }\n }\n if (n === 0) return null;\n return Math.round((sum / n) * 100);\n });\n\n if (getCurrentScope()) {\n onScopeDispose(() => {\n for (const tm of lingerTimers.values()) clearTimeout(tm);\n lingerTimers.clear();\n });\n }\n\n return {\n active,\n history,\n runningCount,\n errorCount,\n hasError,\n overallPercent,\n sync,\n cancel,\n retry,\n dismiss,\n clearHistory,\n };\n}\n\nexport type OperationsStore = ReturnType<typeof useOperations>;\n","<script setup lang=\"ts\">\n/**\n * OnboardingTour — wiring:c4 first-use coach-mark tour.\n *\n * A dependency-free spotlight walkthrough: each step targets a live DOM\n * element inside the explorer root (resolved lazily — steps whose target\n * is missing are skipped, so confined embeds with hidden surfaces never\n * show a dangling spotlight). Positioning is hand-rolled with\n * getBoundingClientRect + fixed overlay; the spotlight is a rounded\n * cutout drawn with a huge box-shadow.\n *\n * Teleported under <body> (same reason as ContextMenu: transformed embed\n * ancestors break position:fixed) and re-uses the `.fe-ctx-backdrop--theme-*`\n * classes so the CSS-variable theme cascade applies outside the `.fe` tree.\n *\n * Persistence (`filex.tourDone`) is the PARENT's job — the tour only\n * emits `close`; FileExplorer decides when it counts as done.\n */\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\n\nconst props = defineProps<{\n open: boolean;\n locale: LocaleCode;\n /** Explorer root — targets are resolved inside it only. */\n root: HTMLElement | null;\n theme?: ThemeMode;\n}>();\n\nconst emit = defineEmits<{\n (e: 'close'): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\n// ------------------------------------------------------------------\n// Step definitions. `target` returns the element to spotlight (null =\n// centered card, e.g. the closing shortcuts step). Buttons without a\n// stable class are found via their localized title attribute — the\n// toolbar gives every icon-only button a title from the same catalogue.\n// ------------------------------------------------------------------\n\nfunction byTitle(root: HTMLElement, label: string): HTMLElement | null {\n const nodes = root.querySelectorAll<HTMLElement>('button[title]');\n for (const el of Array.from(nodes)) {\n if (el.getAttribute('title') === label) return el;\n }\n return null;\n}\n\ninterface TourStep {\n id: string;\n titleKey: string;\n descKey: string;\n target: (root: HTMLElement) => HTMLElement | null;\n}\n\nconst STEPS: TourStep[] = [\n {\n id: 'nav',\n titleKey: 'tour.step.nav.title',\n descKey: 'tour.step.nav.desc',\n target: (r) => r.querySelector<HTMLElement>('.fe-breadcrumb'),\n },\n {\n id: 'upload',\n titleKey: 'tour.step.upload.title',\n descKey: 'tour.step.upload.desc',\n target: (r) =>\n byTitle(r, t('toolbar.upload')) || r.querySelector<HTMLElement>('.fe-fab'),\n },\n {\n id: 'search',\n titleKey: 'tour.step.search.title',\n descKey: 'tour.step.search.desc',\n target: (r) =>\n r.querySelector<HTMLElement>('.fe-search__input') ||\n r.querySelector<HTMLElement>('.fe-toolbar__search-toggle'),\n },\n {\n id: 'view',\n titleKey: 'tour.step.view.title',\n descKey: 'tour.step.view.desc',\n target: (r) => r.querySelector<HTMLElement>('.fe-toolbar__view'),\n },\n {\n id: 'share',\n titleKey: 'tour.step.share.title',\n descKey: 'tour.step.share.desc',\n target: (r) => r.querySelector<HTMLElement>('.fe__body'),\n },\n {\n id: 'help',\n titleKey: 'tour.step.help.title',\n descKey: 'tour.step.help.desc',\n target: () => null,\n },\n];\n\n// Steps re-resolved on every open so surfaces that appeared/disappeared\n// since mount (narrow-mode collapse, RBAC hiding upload…) are honored.\nconst activeSteps = ref<TourStep[]>([]);\nconst stepIdx = ref(0);\n\nconst step = computed<TourStep | null>(() => activeSteps.value[stepIdx.value] ?? null);\nconst total = computed(() => activeSteps.value.length);\n\nfunction resolveSteps() {\n const r = props.root;\n activeSteps.value = STEPS.filter((s) => {\n if (s.id === 'help') return true; // centered card — no DOM dependency\n if (!r) return false;\n const el = s.target(r);\n // Element must exist AND be laid out (visible) — a display:none\n // toolbar section in narrow mode yields a 0×0 rect.\n if (!el) return false;\n const rect = el.getBoundingClientRect();\n return rect.width > 0 && rect.height > 0;\n });\n}\n\n// ------------------------------------------------------------------\n// Spotlight + card geometry\n// ------------------------------------------------------------------\n\ninterface Rect {\n top: number;\n left: number;\n width: number;\n height: number;\n}\nconst spot = ref<Rect | null>(null);\nconst cardStyle = ref<Record<string, string>>({});\nconst cardEl = ref<HTMLElement | null>(null);\n\nconst PAD = 6; // spotlight breathing room around the target\nconst GAP = 12; // gap between spotlight and the card\n\nasync function place() {\n const s = step.value;\n const r = props.root;\n if (!s) return;\n const el = r ? s.target(r) : null;\n if (!el) {\n spot.value = null; // centered card\n cardStyle.value = {};\n return;\n }\n const rect = el.getBoundingClientRect();\n if (rect.width <= 0 && rect.height <= 0) {\n spot.value = null;\n cardStyle.value = {};\n return;\n }\n spot.value = {\n top: rect.top - PAD,\n left: rect.left - PAD,\n width: rect.width + PAD * 2,\n height: rect.height + PAD * 2,\n };\n // Card: below the spotlight when there's room, above otherwise;\n // clamped into the viewport horizontally.\n await nextTick();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const cw = Math.min(340, vw - 24);\n const ch = cardEl.value?.offsetHeight ?? 160;\n let top = rect.bottom + PAD + GAP;\n if (top + ch > vh - 12) top = Math.max(12, rect.top - PAD - GAP - ch);\n let left = rect.left + rect.width / 2 - cw / 2;\n left = Math.min(Math.max(12, left), vw - cw - 12);\n cardStyle.value = {\n top: `${Math.round(top)}px`,\n left: `${Math.round(left)}px`,\n width: `${cw}px`,\n };\n}\n\nfunction onViewportChange() {\n if (props.open) void place();\n}\n\n// ------------------------------------------------------------------\n// Flow\n// ------------------------------------------------------------------\n\nfunction next() {\n if (stepIdx.value >= total.value - 1) {\n emit('close');\n return;\n }\n stepIdx.value += 1;\n}\n\nfunction back() {\n if (stepIdx.value > 0) stepIdx.value -= 1;\n}\n\nfunction skip() {\n emit('close');\n}\n\nfunction onKey(e: KeyboardEvent) {\n if (!props.open) return;\n if (e.key === 'Escape') {\n e.stopPropagation();\n skip();\n } else if (e.key === 'ArrowRight' || e.key === 'Enter') {\n e.preventDefault();\n next();\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n back();\n }\n}\n\nwatch(\n () => props.open,\n async (v) => {\n if (v) {\n stepIdx.value = 0;\n resolveSteps();\n await nextTick();\n await place();\n cardEl.value?.focus();\n }\n },\n);\n\nwatch(stepIdx, async () => {\n await place();\n cardEl.value?.focus();\n});\n\nonMounted(() => {\n window.addEventListener('resize', onViewportChange);\n window.addEventListener('scroll', onViewportChange, true);\n});\nonBeforeUnmount(() => {\n window.removeEventListener('resize', onViewportChange);\n window.removeEventListener('scroll', onViewportChange, true);\n});\n\n// Theme cascade outside `.fe` — same pattern as ContextMenu.\nconst prefersDark = ref(false);\nlet mq: MediaQueryList | undefined;\nfunction syncPrefersDark(e?: MediaQueryListEvent | MediaQueryList) {\n prefersDark.value = !!(e && 'matches' in e && e.matches);\n}\nonMounted(() => {\n if (typeof window === 'undefined') return;\n mq = window.matchMedia('(prefers-color-scheme: dark)');\n syncPrefersDark(mq);\n mq.addEventListener?.('change', syncPrefersDark);\n});\nonBeforeUnmount(() => {\n mq?.removeEventListener?.('change', syncPrefersDark);\n});\nconst themeClass = computed(() => `fe-ctx-backdrop--theme-${props.theme || 'auto'}`);\n</script>\n\n<template>\n <Teleport to=\"body\">\n <transition name=\"fe-tour\">\n <div\n v-if=\"open && step\"\n class=\"fe-tour\"\n :class=\"themeClass\"\n :data-prefers-dark=\"prefersDark ? '1' : '0'\"\n role=\"dialog\"\n aria-modal=\"true\"\n :aria-label=\"t('tour.aria')\"\n @keydown=\"onKey\"\n >\n <!-- Spotlight: rounded cutout via huge box-shadow. Centered steps\n (no target) use a full-dim overlay instead. -->\n <div\n v-if=\"spot\"\n class=\"fe-tour__spot\"\n :style=\"{\n top: spot.top + 'px',\n left: spot.left + 'px',\n width: spot.width + 'px',\n height: spot.height + 'px',\n }\"\n aria-hidden=\"true\"\n />\n <div v-else class=\"fe-tour__dim\" aria-hidden=\"true\" />\n\n <div\n ref=\"cardEl\"\n class=\"fe-tour__card\"\n :class=\"{ 'fe-tour__card--center': !spot }\"\n :style=\"spot ? cardStyle : {}\"\n tabindex=\"-1\"\n >\n <p class=\"fe-tour__progress\" aria-hidden=\"true\">\n {{ t('tour.progress', { n: stepIdx + 1, m: total }) }}\n </p>\n <h3 class=\"fe-tour__title\">{{ t(step.titleKey) }}</h3>\n <p class=\"fe-tour__desc\">{{ t(step.descKey) }}</p>\n <div class=\"fe-tour__dots\" aria-hidden=\"true\">\n <span\n v-for=\"(s, i) in activeSteps\"\n :key=\"s.id\"\n class=\"fe-tour__dot\"\n :class=\"{ 'is-active': i === stepIdx }\"\n />\n </div>\n <div class=\"fe-tour__actions\">\n <button type=\"button\" class=\"fe-btn fe-tour__skip\" @click=\"skip\">\n {{ t('tour.skip') }}\n </button>\n <span class=\"fe-tour__actions-spacer\" />\n <button\n v-if=\"stepIdx > 0\"\n type=\"button\"\n class=\"fe-btn\"\n @click=\"back\"\n >\n {{ t('tour.back') }}\n </button>\n <button type=\"button\" class=\"fe-btn fe-btn--primary\" @click=\"next\">\n {{ stepIdx >= total - 1 ? t('tour.done') : t('tour.next') }}\n </button>\n </div>\n </div>\n </div>\n </transition>\n </Teleport>\n</template>\n","<script setup lang=\"ts\">\n/**\n * TabBar — wiring:d1 sekme şeridi.\n *\n * Thin strip that sits ABOVE the toolbar. The host renders it only when\n * 2+ tabs exist (embed pixel-parity: a single tab shows nothing at all).\n * Purely presentational: every mutation is an emit; useTabs owns state.\n *\n * Interactions:\n * click tab → select\n * × / middle-tık → close\n * + → new tab (clone of the current location)\n * drag → reorder (HTML5 DnD; live-swap while dragging)\n * ⫿ (split) → toggle the active tab's secondary pane\n *\n * UNSCOPED styles (`fe-tabs*` in base.css) — the webcomponent build\n * cannot carry scoped data-v hashes (v0.5.0 discovery).\n */\nimport { ref } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\n\nexport interface TabItem {\n id: string;\n label: string;\n /** true → the tab carries a split pane (small accent dot). */\n split: boolean;\n}\n\nconst props = defineProps<{\n tabs: TabItem[];\n activeId: string;\n locale: LocaleCode;\n /** false → the split toggle is hidden (narrow embeds). */\n splitEnabled?: boolean;\n /** true → the split toggle renders pressed (active tab has a pane). */\n splitActive?: boolean;\n}>();\n\nconst emit = defineEmits<{\n (e: 'select', id: string): void;\n (e: 'close', id: string): void;\n (e: 'new'): void;\n (e: 'reorder', from: number, to: number): void;\n (e: 'toggle-split'): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\n// ---- drag-sort (HTML5 DnD, live swap) ------------------------------\nconst dragIndex = ref<number | null>(null);\nconst overIndex = ref<number | null>(null);\n\nfunction onDragStart(i: number, ev: DragEvent) {\n dragIndex.value = i;\n if (ev.dataTransfer) {\n ev.dataTransfer.effectAllowed = 'move';\n // Firefox requires SOME payload for a drag to start. Deliberately not\n // the internal file-DnD MIME, so the explorer's drop surfaces ignore it.\n ev.dataTransfer.setData('text/plain', props.tabs[i]?.id ?? '');\n }\n}\n\nfunction onDragOver(i: number, ev: DragEvent) {\n if (dragIndex.value === null) return;\n ev.preventDefault();\n ev.stopPropagation();\n if (ev.dataTransfer) ev.dataTransfer.dropEffect = 'move';\n overIndex.value = i;\n}\n\nfunction onDragLeave(i: number) {\n if (overIndex.value === i) overIndex.value = null;\n}\n\nfunction onDrop(i: number, ev: DragEvent) {\n if (dragIndex.value === null) return;\n ev.preventDefault();\n ev.stopPropagation();\n if (dragIndex.value !== i) emit('reorder', dragIndex.value, i);\n dragIndex.value = null;\n overIndex.value = null;\n}\n\nfunction onDragEnd() {\n dragIndex.value = null;\n overIndex.value = null;\n}\n\n// Middle-click closes a tab (browser convention). The mousedown guard\n// cancels Chromium's autoscroll on the scrollable strip — without it the\n// auxclick event is never generated.\nfunction onTabMiddleDown(ev: MouseEvent) {\n if (ev.button === 1) ev.preventDefault();\n}\nfunction onAux(id: string, ev: MouseEvent) {\n if (ev.button !== 1) return;\n ev.preventDefault();\n ev.stopPropagation();\n emit('close', id);\n}\n</script>\n\n<template>\n <div class=\"fe-tabs\" role=\"tablist\" :aria-label=\"t('tabs.strip')\">\n <div class=\"fe-tabs__scroll\">\n <div\n v-for=\"(tab, i) in tabs\"\n :key=\"tab.id\"\n class=\"fe-tabs__tab\"\n :class=\"{\n 'is-active': tab.id === activeId,\n 'is-dragover': overIndex === i && dragIndex !== null && dragIndex !== i,\n }\"\n role=\"tab\"\n :aria-selected=\"tab.id === activeId ? 'true' : 'false'\"\n tabindex=\"0\"\n draggable=\"true\"\n :title=\"tab.label\"\n @click=\"emit('select', tab.id)\"\n @keydown.enter.prevent=\"emit('select', tab.id)\"\n @mousedown=\"onTabMiddleDown($event)\"\n @auxclick=\"onAux(tab.id, $event)\"\n @dragstart=\"onDragStart(i, $event)\"\n @dragover=\"onDragOver(i, $event)\"\n @dragleave=\"onDragLeave(i)\"\n @drop=\"onDrop(i, $event)\"\n @dragend=\"onDragEnd\"\n >\n <span v-if=\"tab.split\" class=\"fe-tabs__splitdot\" aria-hidden=\"true\"></span>\n <span class=\"fe-tabs__label\">{{ tab.label }}</span>\n <button\n type=\"button\"\n class=\"fe-tabs__close\"\n :aria-label=\"t('tabs.close')\"\n :title=\"t('tabs.close')\"\n @click.stop=\"emit('close', tab.id)\"\n >×</button>\n </div>\n <button\n type=\"button\"\n class=\"fe-tabs__new\"\n :aria-label=\"t('tabs.new')\"\n :title=\"t('tabs.new')\"\n @click=\"emit('new')\"\n >+</button>\n </div>\n <button\n v-if=\"splitEnabled !== false\"\n type=\"button\"\n class=\"fe-tabs__split\"\n :class=\"{ 'is-active': splitActive }\"\n :aria-label=\"splitActive ? t('tabs.split_off') : t('tabs.split')\"\n :title=\"splitActive ? t('tabs.split_off') : t('tabs.split')\"\n :aria-pressed=\"splitActive ? 'true' : 'false'\"\n @click=\"emit('toggle-split')\"\n >\n <svg\n class=\"fe-ficon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" />\n <path d=\"M12 4v16\" />\n </svg>\n </button>\n </div>\n</template>\n","/**\n * e2ecrypto — client-side crypto for E2E-encrypted folders (wiring:e2).\n *\n * WebCrypto ONLY — zero dependencies. Design doc: docs/E2E-ENCRYPTION.md.\n *\n * Scheme (v1):\n * folder password ─PBKDF2-SHA256(600k iter, per-folder 16B salt)─▶ KEK (AES-256-GCM)\n * per-file random 32B DEK (AES-256-GCM) encrypts the content one-shot;\n * the DEK is wrapped with the KEK and stored in the file's own header.\n *\n * File layout ('filexe2e' magic, fixed 97-byte header):\n * [0..8) magic \"filexe2e\"\n * [8] version 0x01\n * [9..21) wrapIV (12B) — GCM IV of the DEK wrap\n * [21..69) wrappedDEK (48B = 32B DEK + 16B GCM tag)\n * [69..81) dataIV (12B) — GCM IV of the content\n * [81..97) reserved (zeros; v2 chunking/metadata)\n * [97..) ciphertext (content + 16B GCM tag)\n *\n * Folder marker `.filex-e2e.json` at the encrypted-folder root:\n * { v:1, salt:<b64 16B>, iter:600000, verify:<b64 12B IV || GCM('filex-e2e-verify-v1')> }\n *\n * The KEK NEVER leaves memory — no storage of any kind. Password loss is\n * data loss by design (no recovery path exists anywhere).\n */\n\nexport const E2E_MARKER_NAME = '.filex-e2e.json';\nexport const E2E_MAGIC = 'filexe2e';\nexport const E2E_VERSION = 1;\nexport const E2E_DEFAULT_ITERATIONS = 600_000;\nexport const E2E_MIN_ITERATIONS = 600_000;\n/** MVP single-shot in-memory ceiling — larger uploads are refused with a warning. */\nexport const E2E_MAX_FILE_BYTES = 200 * 1024 * 1024;\nexport const E2E_MIN_PASSWORD_LEN = 8;\n\nconst VERIFY_PLAINTEXT = 'filex-e2e-verify-v1';\nconst MAGIC_BYTES = new TextEncoder().encode(E2E_MAGIC); // 8 bytes\nconst HEADER_LEN = 97;\nconst WRAP_IV_OFF = 9;\nconst WRAPPED_DEK_OFF = 21;\nconst WRAPPED_DEK_LEN = 48;\nconst DATA_IV_OFF = 69;\nconst IV_LEN = 12;\n\nexport interface E2eMarker {\n v: number;\n salt: string; // base64\n iter: number;\n verify: string; // base64: 12B IV || AES-GCM ciphertext of VERIFY_PLAINTEXT\n}\n\n/** Thrown on wrong password / corrupted ciphertext (GCM tag mismatch). */\nexport class E2eDecryptError extends Error {\n constructor(msg = 'e2e: decrypt failed') {\n super(msg);\n this.name = 'E2eDecryptError';\n }\n}\n\n// ---------------------------------------------------------------------\n// base64 helpers (no deps)\n// ---------------------------------------------------------------------\n\nexport function bytesToB64(b: Uint8Array): string {\n let s = '';\n for (let i = 0; i < b.length; i++) s += String.fromCharCode(b[i]);\n return btoa(s);\n}\n\nexport function b64ToBytes(s: string): Uint8Array {\n const raw = atob(s);\n const out = new Uint8Array(raw.length);\n for (let i = 0; i < raw.length; i++) out[i] = raw.charCodeAt(i);\n return out;\n}\n\n// ---------------------------------------------------------------------\n// Key derivation\n// ---------------------------------------------------------------------\n\n/**\n * Derive the folder KEK from a password. Returns a NON-extractable\n * AES-256-GCM CryptoKey — it can encrypt/decrypt but never be exported,\n * so even a same-origin script can't read the raw key material back.\n */\nexport async function deriveKek(\n password: string,\n salt: Uint8Array,\n iterations: number,\n): Promise<CryptoKey> {\n const material = await crypto.subtle.importKey(\n 'raw',\n new TextEncoder().encode(password),\n 'PBKDF2',\n false,\n ['deriveKey'],\n );\n return crypto.subtle.deriveKey(\n // Copy into a fresh ArrayBuffer-backed view — TS 5.9 BufferSource typing\n // rejects Uint8Array<ArrayBufferLike> that may wrap a SharedArrayBuffer.\n { name: 'PBKDF2', salt: new Uint8Array(salt).buffer as ArrayBuffer, iterations, hash: 'SHA-256' },\n material,\n { name: 'AES-GCM', length: 256 },\n false, // non-extractable\n ['encrypt', 'decrypt'],\n );\n}\n\n// ---------------------------------------------------------------------\n// Marker create / verify\n// ---------------------------------------------------------------------\n\n/** Create a fresh folder marker for `password` (also returns the derived KEK). */\nexport async function createMarker(\n password: string,\n iterations: number = E2E_DEFAULT_ITERATIONS,\n): Promise<{ marker: E2eMarker; kek: CryptoKey }> {\n const iter = Math.max(E2E_MIN_ITERATIONS, iterations);\n const salt = crypto.getRandomValues(new Uint8Array(16));\n const kek = await deriveKek(password, salt, iter);\n const iv = crypto.getRandomValues(new Uint8Array(IV_LEN));\n const ct = new Uint8Array(\n await crypto.subtle.encrypt(\n { name: 'AES-GCM', iv: iv.buffer as ArrayBuffer },\n kek,\n new TextEncoder().encode(VERIFY_PLAINTEXT),\n ),\n );\n const verify = new Uint8Array(IV_LEN + ct.length);\n verify.set(iv, 0);\n verify.set(ct, IV_LEN);\n return {\n marker: { v: E2E_VERSION, salt: bytesToB64(salt), iter, verify: bytesToB64(verify) },\n kek,\n };\n}\n\n/** Parse marker JSON text; returns null when the shape is not a v1 marker. */\nexport function parseMarker(text: string): E2eMarker | null {\n try {\n const m = JSON.parse(text) as E2eMarker;\n if (!m || m.v !== E2E_VERSION) return null;\n if (typeof m.salt !== 'string' || typeof m.verify !== 'string') return null;\n if (typeof m.iter !== 'number' || m.iter < 1) return null;\n return m;\n } catch {\n return null;\n }\n}\n\n/**\n * Check `password` against a folder marker. Resolves to the derived KEK on\n * success, or `null` on a wrong password (GCM tag mismatch on the verify\n * blob). Never talks to any server.\n */\nexport async function verifyPassword(\n marker: E2eMarker,\n password: string,\n): Promise<CryptoKey | null> {\n const salt = b64ToBytes(marker.salt);\n const kek = await deriveKek(password, salt, marker.iter);\n const verify = b64ToBytes(marker.verify);\n if (verify.length <= IV_LEN) return null;\n try {\n const pt = await crypto.subtle.decrypt(\n { name: 'AES-GCM', iv: verify.slice(0, IV_LEN).buffer as ArrayBuffer },\n kek,\n verify.slice(IV_LEN).buffer as ArrayBuffer,\n );\n if (new TextDecoder().decode(pt) !== VERIFY_PLAINTEXT) return null;\n return kek;\n } catch {\n return null; // wrong password\n }\n}\n\n// ---------------------------------------------------------------------\n// Magic sniff\n// ---------------------------------------------------------------------\n\n/** True when the buffer starts with the 'filexe2e' magic. */\nexport function hasMagic(buf: ArrayBuffer | Uint8Array): boolean {\n const b = buf instanceof Uint8Array ? buf : new Uint8Array(buf);\n if (b.length < MAGIC_BYTES.length) return false;\n for (let i = 0; i < MAGIC_BYTES.length; i++) {\n if (b[i] !== MAGIC_BYTES[i]) return false;\n }\n return true;\n}\n\n// ---------------------------------------------------------------------\n// File encrypt / decrypt (one-shot MVP)\n// ---------------------------------------------------------------------\n\n/**\n * Encrypt `content` under the folder KEK: mints a fresh DEK, encrypts the\n * content one-shot, wraps the DEK with the KEK and prepends the fixed\n * 'filexe2e' header. Throws when content exceeds E2E_MAX_FILE_BYTES.\n */\nexport async function encryptFile(kek: CryptoKey, content: ArrayBuffer): Promise<ArrayBuffer> {\n if (content.byteLength > E2E_MAX_FILE_BYTES) {\n throw new Error('e2e: file exceeds the 200MB single-shot limit');\n }\n const rawDek = crypto.getRandomValues(new Uint8Array(32));\n const dek = await crypto.subtle.importKey('raw', rawDek.buffer as ArrayBuffer, { name: 'AES-GCM' }, false, [\n 'encrypt',\n ]);\n const wrapIV = crypto.getRandomValues(new Uint8Array(IV_LEN));\n const dataIV = crypto.getRandomValues(new Uint8Array(IV_LEN));\n const wrappedDek = new Uint8Array(\n await crypto.subtle.encrypt({ name: 'AES-GCM', iv: wrapIV.buffer as ArrayBuffer }, kek, rawDek.buffer as ArrayBuffer),\n );\n const ct = new Uint8Array(\n await crypto.subtle.encrypt({ name: 'AES-GCM', iv: dataIV.buffer as ArrayBuffer }, dek, content),\n );\n // Zero the raw DEK copy as a hygiene measure (best-effort — GC may have\n // other copies, but don't leave the obvious one around).\n rawDek.fill(0);\n\n const out = new Uint8Array(HEADER_LEN + ct.length);\n out.set(MAGIC_BYTES, 0);\n out[8] = E2E_VERSION;\n out.set(wrapIV, WRAP_IV_OFF);\n out.set(wrappedDek, WRAPPED_DEK_OFF); // 48 bytes\n out.set(dataIV, DATA_IV_OFF);\n // [81..97) reserved zeros\n out.set(ct, HEADER_LEN);\n return out.buffer;\n}\n\n/**\n * Decrypt a 'filexe2e' blob with the folder KEK. Throws E2eDecryptError on\n * a wrong key / tampered data, and a plain Error when the header is not an\n * e2e file at all.\n */\nexport async function decryptFile(kek: CryptoKey, data: ArrayBuffer): Promise<ArrayBuffer> {\n const b = new Uint8Array(data);\n if (!hasMagic(b) || b.length < HEADER_LEN) {\n throw new Error('e2e: not an encrypted file');\n }\n if (b[8] !== E2E_VERSION) {\n throw new Error(`e2e: unsupported version ${b[8]}`);\n }\n const wrapIV = b.slice(WRAP_IV_OFF, WRAP_IV_OFF + IV_LEN);\n const wrappedDek = b.slice(WRAPPED_DEK_OFF, WRAPPED_DEK_OFF + WRAPPED_DEK_LEN);\n const dataIV = b.slice(DATA_IV_OFF, DATA_IV_OFF + IV_LEN);\n let rawDek: ArrayBuffer;\n try {\n rawDek = await crypto.subtle.decrypt(\n { name: 'AES-GCM', iv: wrapIV.buffer as ArrayBuffer },\n kek,\n wrappedDek.buffer as ArrayBuffer,\n );\n } catch {\n throw new E2eDecryptError('e2e: DEK unwrap failed (wrong password?)');\n }\n const dek = await crypto.subtle.importKey('raw', rawDek, { name: 'AES-GCM' }, false, ['decrypt']);\n try {\n return await crypto.subtle.decrypt(\n { name: 'AES-GCM', iv: dataIV.buffer as ArrayBuffer },\n dek,\n b.slice(HEADER_LEN).buffer as ArrayBuffer,\n );\n } catch {\n throw new E2eDecryptError('e2e: content decrypt failed');\n }\n}\n\n// ---------------------------------------------------------------------\n// In-memory session key ring\n// ---------------------------------------------------------------------\n\n/**\n * Tiny per-explorer key ring: encrypted-folder root (wire path) → KEK.\n * Lives ONLY in memory — \"Kilitle\" drops the entry, a reload drops all.\n */\nexport function createKeyRing() {\n const keys = new Map<string, CryptoKey>();\n return {\n get(root: string): CryptoKey | undefined {\n return keys.get(root);\n },\n set(root: string, kek: CryptoKey): void {\n keys.set(root, kek);\n },\n /** Drop one folder's key (\"Kilitle\"). */\n lock(root: string): void {\n keys.delete(root);\n },\n has(root: string): boolean {\n return keys.has(root);\n },\n clear(): void {\n keys.clear();\n },\n };\n}\n\nexport type E2eKeyRing = ReturnType<typeof createKeyRing>;\n","/**\n * listing.ts — shared listing helpers used by BOTH the main panel\n * (FileExplorer.load) and the split-view secondary panel\n * (SecondaryPane.loadPane). SINGLE SOURCE so the two panes can never\n * drift apart: the internal-entry filter and the virtual `.trash` row\n * must be identical in both, otherwise split view shows mismatched rows\n * (the trash row missing on one side → visible row-offset).\n */\nimport { ref } from 'vue';\n\nimport type { FileNode } from '../types/FileNode';\nimport { E2E_MARKER_NAME } from './e2ecrypto';\n\n/** Adapter-strip: `s3-test://fileman/x` → `fileman/x`. */\nexport function stripAdapter(p: string): string {\n const idx = p.indexOf('://');\n return idx === -1 ? p : p.slice(idx + 3);\n}\n\n/**\n * Hide system/internal entries the user must never see as files:\n * thumbnails, version history, the soft-delete store, keepdir markers\n * and the E2E marker. Shared by both panes' listing filters.\n */\nexport function filterInternalEntries(files: FileNode[]): FileNode[] {\n return (files || []).filter((f) => {\n if (f.path.includes('.thumbs')) return false;\n if (f.path.includes('.versions') || f.basename === '.versions') return false;\n if (f.basename === '.trash') return false;\n if (f.basename === '.keepdir') return false;\n if (f.basename === E2E_MARKER_NAME) return false;\n return true;\n });\n}\n\nconst SHOW_HIDDEN_LS_KEY = 'filex.showHidden';\n\nfunction readShowHidden(): boolean {\n try {\n return localStorage.getItem(SHOW_HIDDEN_LS_KEY) === '1';\n } catch {\n return false; // private mode / no storage → hidden, the safe default\n }\n}\n\n/**\n * Whether dot-prefixed entries are listed. Off by default, like every other\n * file manager. Shared by both panes so split view can't disagree with itself.\n */\nexport const showHiddenFiles = ref(readShowHidden());\n\nexport function setShowHiddenFiles(v: boolean): void {\n showHiddenFiles.value = v;\n try {\n localStorage.setItem(SHOW_HIDDEN_LS_KEY, v ? '1' : '0');\n } catch {\n /* preference just won't persist */\n }\n}\n\n/**\n * Hide dot-prefixed entries unless the user asked to see them.\n *\n * These are mostly not the user's files at all: a Mac writing over WebDAV\n * leaves a `.DS_Store` in every folder it opens and an AppleDouble `._name`\n * beside every file carrying extended attributes. Finder hides its own litter\n * locally, so seeing it reappear in the web UI reads as corruption.\n *\n * A toggle rather than a blocklist, because they ARE real files: hiding them\n * outright would leave the ones already uploaded unreachable and undeletable.\n */\nexport function filterHiddenEntries(files: FileNode[], showHidden: boolean): FileNode[] {\n if (showHidden) return files || [];\n return (files || []).filter((f) => !(f.basename || '').startsWith('.'));\n}\n\n/** filterInternalEntries + filterHiddenEntries — what both panes render. */\nexport function filterListing(files: FileNode[]): FileNode[] {\n return filterHiddenEntries(filterInternalEntries(files), showHiddenFiles.value);\n}\n\n/** True when `dirname` (adapter-qualified) is the storage root, where the\n * virtual trash row belongs. */\nexport function isStorageRootDir(dirname: string): boolean {\n const rel = stripAdapter(dirname);\n return rel === 'fileman' || rel === '';\n}\n\n/** True when the listing IS the trash view (don't inject the row into itself). */\nexport function isTrashListing(dirname: string): boolean {\n return stripAdapter(dirname).startsWith('fileman/.trash');\n}\n\n/** The synthetic `.trash` row shown at storage root — rendered as\n * \"Çöp Kutusu\" / \"Trash\" via the `.trash` basename → locale mapping. */\nexport function makeTrashRow(adapter: string): FileNode {\n return {\n type: 'dir',\n path: `${adapter}://fileman/.trash`,\n basename: '.trash',\n extension: '',\n storage: adapter,\n visibility: 'private',\n size: 0,\n file_size: 0,\n mime_type: 'inode/directory',\n extra_metadata: {},\n } as unknown as FileNode;\n}\n\n/**\n * Inject the virtual `.trash` row at the front of a root listing when\n * enabled. Returns true if a row was added (so the caller can hydrate\n * it). Mutates `files` in place. Single source for both panes.\n */\nexport function injectTrashRow(\n files: FileNode[],\n adapter: string,\n dirname: string,\n trashVisible: boolean,\n): boolean {\n if (!trashVisible) return false;\n if (isTrashListing(dirname)) return false;\n if (!isStorageRootDir(dirname)) return false;\n files.unshift(makeTrashRow(adapter));\n return true;\n}\n\n/** Best-effort fill of the trash row's size (total bytes) + date (newest\n * deletion) from the backend trash listing, so it reads like a real\n * folder instead of \"— / —\". Non-blocking; mutates the row in place. */\nexport async function hydrateTrashRow(\n files: FileNode[],\n storage: string,\n api: { listTrash: (s?: string) => Promise<{ entries: Array<{ size?: number; deleted_at: string }> }> },\n): Promise<void> {\n try {\n const { entries } = await api.listTrash(storage);\n const row = files.find((f) => f.basename === '.trash');\n if (!row) return;\n let total = 0;\n let newest = 0;\n for (const e of entries) {\n total += e.size || 0;\n const ts = Date.parse(e.deleted_at);\n if (!Number.isNaN(ts) && ts > newest) newest = ts;\n }\n row.size = total;\n if (newest > 0) row.last_modified = newest;\n } catch {\n /* keep the bare row */\n }\n}\n","<script setup lang=\"ts\">\n/**\n * SecondaryPane — wiring:d1 split görünümün sağ (ikincil) paneli.\n *\n * Deliberately LIGHT: its own path + its own listing — fetched through\n * the SAME FileApi instance the host already constructed (`api.index`,\n * no copied fetch logic) — a small breadcrumb, double-click navigation,\n * click selection and drag&drop in BOTH directions. No toolbar, no\n * inspector, no upload: those belong to the main panel.\n *\n * Path semantics, confinement (`clamp`) and wire-form resolution\n * (`qualify` / `toUser`) are injected from the host so the pane can\n * never drift from the main panel's multi-storage / rootFloor rules.\n *\n * Cross-pane transfers only EMIT (`transfer`); the host decides\n * move-vs-copy and runs the existing ops APIs. Unscoped styles\n * (`fe-split*` in base.css) — webcomponent data-v rule.\n */\nimport { computed, ref } from 'vue';\nimport type { FileApi } from '../composables/useFileApi';\nimport type { FileNode, ViewMode } from '../types/FileNode';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { filterListing, injectTrashRow, hydrateTrashRow } from '../lib/listing';\nimport ListView from './ListView.vue';\nimport GridView from './GridView.vue';\nimport GalleryView from './GalleryView.vue';\n\n// Same literals ListView/GridView already hardcode for the internal DnD\n// channel; `-src` carries the origin directory so the host can move (and\n// undo) correctly across panes.\nconst FE_DND_MIME = 'application/x-brf-files';\nconst FE_DND_SRC_MIME = 'application/x-brf-files-src';\n\nconst props = defineProps<{\n api: FileApi;\n /** Opening location, in the host's `currentPath` form. */\n initialPath: string;\n locale: LocaleCode;\n /** Host's own qualify(): user path → wire `<adapter>://<rel>`. */\n qualify: (p: string) => string;\n /** Host's wire → user-path converter (multi-storage aware). */\n toUser: (wire: string) => string;\n /** Host's rootFloor clamp — keeps the pane inside the confine. */\n clamp: (p: string) => string;\n /** Label for the root crumb (adapter name / storage list). */\n rootLabel: string;\n /** rootFloor (user-path form, '' when unconfined) — trims crumbs. */\n floor?: string;\n /** Multi-storage mode: '' is the virtual drives root (no fetch). */\n multiRoot?: boolean;\n /** Synthesized storage rows for the virtual drives root. */\n virtualRows?: () => FileNode[];\n /** Active-panel highlight (keyboard target). */\n active?: boolean;\n /** ui-fix — the pane renders the SAME view components as the main\n * panel (list/grid/gallery) instead of its own flat list. */\n viewMode?: ViewMode;\n /** ui-fix — authenticated thumb resolver, forwarded to grid/gallery. */\n thumbSrc?: (n: FileNode) => string | null;\n /** ui-fix — mirror the main panel's virtual `.trash` row at storage root\n * so both split panes list identical rows (no row-offset). Defaults on. */\n trashVisible?: boolean;\n}>();\n\nconst emit = defineEmits<{\n (e: 'navigate', path: string): void;\n (e: 'activate'): void;\n (e: 'close'): void;\n (e: 'open-tab', path: string): void;\n (e: 'transfer', p: { sources: string[]; targetWire: string; originWire?: string }): void;\n /* ui-fix — yan panelde sağ-tık: menü ana bileşende (FileExplorer) açılır.\n * node=null → boş alana sağ-tık (seçimsiz, yalnız Yapıştır). */\n (e: 'context', node: FileNode | null, ev: MouseEvent): void;\n /* ui-fix — çöp kutusu satırı açıldığında: trash görünümü ana panele aittir\n * (geri yükleme aksiyonlarıyla), host loadTrash() ile açar. */\n (e: 'open-trash'): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst path = ref<string>('');\nconst files = ref<FileNode[]>([]);\nconst loading = ref(false);\nconst error = ref('');\nconst selected = ref(new Set<string>());\n\nfunction isStorageRow(n: FileNode): boolean {\n return n.mime_type === 'inode/storage';\n}\n\nconst atVirtualRoot = computed(\n () => !!props.multiRoot && !(path.value ?? '').replace(/^\\/+|\\/+$/g, ''),\n);\n\nasync function loadPane(target?: string): Promise<void> {\n const requested = props.clamp(target ?? path.value ?? '');\n loading.value = true;\n error.value = '';\n try {\n // Multi-storage virtual root: synthesize the drives list, no backend\n // call — mirrors the main panel's load() branch.\n if (props.multiRoot && !requested) {\n files.value = props.virtualRows ? props.virtualRows() : [];\n path.value = '';\n selected.value = new Set();\n emit('navigate', '');\n return;\n }\n const resp = await props.api.index(props.qualify(requested));\n // Same internal-entry filter + virtual `.trash` row as the main panel\n // (shared helpers → both split panes list identical rows, no offset).\n files.value = filterListing(resp.files);\n if (injectTrashRow(files.value, resp.adapter, resp.dirname, props.trashVisible !== false)) {\n void hydrateTrashRow(files.value, resp.adapter, props.api);\n }\n path.value = props.toUser(resp.dirname);\n selected.value = new Set();\n emit('navigate', path.value);\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err);\n } finally {\n loading.value = false;\n }\n}\n\nvoid loadPane(props.initialPath ?? '');\n\n// ------------------------------------------------------------------\n// Breadcrumb (kırıntı)\n// ------------------------------------------------------------------\n\ninterface Crumb {\n label: string;\n target: string;\n last: boolean;\n}\n\nconst crumbs = computed<Crumb[]>(() => {\n const clean = (path.value || '').replace(/^\\/+|\\/+$/g, '');\n const segs = clean ? clean.split('/') : [];\n const floor = (props.floor || '').replace(/^\\/+|\\/+$/g, '');\n const out: Crumb[] = [];\n let acc = '';\n for (const s of segs) {\n acc = acc ? `${acc}/${s}` : s;\n // Confined embeds: hide the segments strictly ABOVE the floor — the\n // floor segment itself acts as the pane's root crumb.\n if (floor && !(acc === floor || acc.startsWith(floor + '/'))) continue;\n out.push({ label: s, target: acc, last: false });\n }\n if (out.length > 0) out[out.length - 1].last = true;\n return out;\n});\n\nconst showRootCrumb = computed(() => !props.floor);\n\nfunction crumbGo(target: string) {\n emit('activate');\n void loadPane(target);\n}\n\n// ------------------------------------------------------------------\n// Selection + navigation\n// ------------------------------------------------------------------\n\n/* ui-fix — adapter for the shared view components' click contract\n * ({ctrl, shift} mod object instead of a MouseEvent). Shift behaves as\n * ctrl here: the pane keeps a simple Set, no range anchor. */\nfunction onViewClick(n: FileNode, mod: { ctrl: boolean; shift: boolean }) {\n emit('activate');\n const multi = mod.ctrl || mod.shift;\n const next = new Set<string>(multi ? selected.value : []);\n if (multi && next.has(n.path)) next.delete(n.path);\n else next.add(n.path);\n selected.value = next;\n}\n\n/* ui-fix — right-click on a pane item: activate + select it, then let the\n * host open the pane context menu (its actions are pane-routed). Selecting\n * first keeps the menu's targets on THIS pane, not the main panel. */\nfunction onViewContext(n: FileNode, ev: MouseEvent) {\n ev.preventDefault();\n ev.stopPropagation();\n emit('activate');\n if (!selected.value.has(n.path)) selected.value = new Set([n.path]);\n emit('context', n, ev);\n}\n\n/* ui-fix — boş alana (arka plan) sağ-tık: seçimsiz menü (yalnız Yapıştır)\n * → boş klasöre / mevcut klasöre dosya yapıştırma. Satır menüsü stopProp\n * ettiğinden bu yalnız gerçek boş alanda tetiklenir. */\nfunction onBgContext(ev: MouseEvent) {\n ev.preventDefault();\n ev.stopPropagation(); // FileExplorer kökündeki canvas menüsüne bubble etmesin\n emit('activate');\n selected.value = new Set();\n emit('context', null, ev);\n}\n\n/* ui-fix — drop-into from the shared views: same payload path as the\n * old flat rows (dir check + wire-qualified row paths). */\nfunction onViewDropInto(target: FileNode, ev: DragEvent) {\n dropBg.value = false;\n if (target.type !== 'dir' || isStorageRow(target)) return;\n if (!acceptDrag(ev)) return;\n handleDropPayload(ev, target.path);\n}\n\nfunction onRowDbl(n: FileNode) {\n if (n.type !== 'dir') return;\n // The virtual `.trash` row opens the backend trash listing (restore\n // actions) — that view lives in the main panel; let the host open it.\n if (n.basename === '.trash') {\n emit('activate');\n emit('open-trash');\n return;\n }\n void loadPane(isStorageRow(n) ? n.path : props.toUser(n.path));\n}\n\nfunction clearSelection() {\n selected.value = new Set();\n}\n\n// ------------------------------------------------------------------\n// Drag source\n// ------------------------------------------------------------------\n\nfunction onRowDragStart(n: FileNode, ev: DragEvent) {\n if (!ev.dataTransfer) return;\n if (isStorageRow(n) || atVirtualRoot.value || n.basename === '.trash') {\n ev.preventDefault();\n return;\n }\n if (!selected.value.has(n.path)) selected.value = new Set([n.path]);\n const items = files.value\n .filter((f) => selected.value.has(f.path) && !isStorageRow(f))\n .map((f) => ({ path: f.path, basename: f.basename, type: f.type }));\n if (items.length === 0) {\n ev.preventDefault();\n return;\n }\n ev.dataTransfer.setData(FE_DND_MIME, JSON.stringify(items));\n ev.dataTransfer.setData(FE_DND_SRC_MIME, props.qualify(path.value));\n ev.dataTransfer.setData('text/plain', items.map((i) => i.path).join('\\n'));\n ev.dataTransfer.effectAllowed = 'move';\n}\n\n// ------------------------------------------------------------------\n// Drop target (dir rows + pane background)\n// ------------------------------------------------------------------\n\nconst dropBg = ref(false);\n\nfunction acceptDrag(ev: DragEvent): boolean {\n return !!ev.dataTransfer?.types.includes(FE_DND_MIME);\n}\n\nfunction handleDropPayload(ev: DragEvent, targetWire: string) {\n const raw = ev.dataTransfer?.getData(FE_DND_MIME);\n if (!raw || !targetWire) return;\n let items: Array<{ path: string }> = [];\n try {\n items = JSON.parse(raw);\n } catch {\n return;\n }\n const origin = ev.dataTransfer?.getData(FE_DND_SRC_MIME) || undefined;\n const sources = items\n .map((i) => i.path)\n .filter((p) => p && p !== targetWire && !targetWire.startsWith(p + '/'));\n if (sources.length === 0) return;\n ev.preventDefault();\n ev.stopPropagation();\n emit('transfer', { sources, targetWire, originWire: origin });\n}\n\nfunction onBgDragOver(ev: DragEvent) {\n if (!acceptDrag(ev) || atVirtualRoot.value) return;\n ev.preventDefault();\n ev.stopPropagation();\n if (ev.dataTransfer) ev.dataTransfer.dropEffect = 'move';\n dropBg.value = true;\n}\n\nfunction onBgDragLeave() {\n dropBg.value = false;\n}\n\nfunction onBgDrop(ev: DragEvent) {\n dropBg.value = false;\n if (!acceptDrag(ev) || atVirtualRoot.value) return;\n handleDropPayload(ev, props.qualify(path.value));\n}\n\n// ------------------------------------------------------------------\n// Host API (keyboard routing when this pane is active)\n// ------------------------------------------------------------------\n\nfunction goUp() {\n const cur = (path.value ?? '').replace(/^\\/+|\\/+$/g, '');\n const floor = (props.floor || '').replace(/^\\/+|\\/+$/g, '');\n if (!cur || cur === floor) return;\n const idx = cur.lastIndexOf('/');\n void loadPane(idx === -1 ? '' : cur.slice(0, idx));\n}\n\nfunction selectAll() {\n selected.value = new Set(files.value.filter((f) => !isStorageRow(f)).map((f) => f.path));\n}\n\nfunction selectedNodes(): FileNode[] {\n return files.value.filter((f) => selected.value.has(f.path));\n}\n\nfunction openSelected() {\n const n = selectedNodes()[0];\n if (n && n.type === 'dir') onRowDbl(n);\n}\n\nfunction reload(): Promise<void> {\n return loadPane();\n}\n\nfunction getPath(): string {\n return path.value;\n}\n\ndefineExpose({ reload, goUp, selectAll, openSelected, selectedNodes, getPath });\n</script>\n\n<template>\n <section\n class=\"fe-split\"\n :class=\"{ 'fe-pane--focus': active }\"\n role=\"region\"\n :aria-label=\"t('split.pane')\"\n @pointerdown=\"emit('activate')\"\n >\n <header class=\"fe-split__crumbs\">\n <button\n v-if=\"showRootCrumb\"\n type=\"button\"\n class=\"fe-split__crumb\"\n :class=\"{ 'is-last': crumbs.length === 0 }\"\n :title=\"rootLabel\"\n @click=\"crumbGo('')\"\n >{{ rootLabel }}</button>\n <template v-for=\"c in crumbs\" :key=\"c.target\">\n <span class=\"fe-split__sep\" aria-hidden=\"true\">›</span>\n <button\n type=\"button\"\n class=\"fe-split__crumb\"\n :class=\"{ 'is-last': c.last }\"\n :title=\"c.label\"\n @click=\"crumbGo(c.target)\"\n >{{ c.label }}</button>\n </template>\n <span class=\"fe-split__spacer\"></span>\n <button\n type=\"button\"\n class=\"fe-split__closebtn\"\n :aria-label=\"t('split.close')\"\n :title=\"t('split.close')\"\n @click=\"emit('close')\"\n >×</button>\n </header>\n\n <div\n class=\"fe-split__body\"\n :class=\"{ 'is-dropover': dropBg }\"\n @click.self=\"clearSelection\"\n @contextmenu=\"onBgContext\"\n @dragover=\"onBgDragOver\"\n @dragleave=\"onBgDragLeave\"\n @drop=\"onBgDrop\"\n >\n <div v-if=\"loading && files.length === 0\" class=\"fe-split__state\" role=\"status\">\n {{ t('loading') }}\n </div>\n <div v-else-if=\"error\" class=\"fe-split__state\">\n <span>{{ t('split.error') }}</span>\n <button type=\"button\" class=\"fe-btn\" @click=\"() => loadPane()\">\n {{ t('split.retry') }}\n </button>\n </div>\n <div v-else-if=\"files.length === 0\" class=\"fe-split__state\">\n {{ t('empty.folder') }}\n </div>\n <!-- ui-fix — aynı görünüm bileşenleri (list/grid/gallery), pane'in\n kendi viewMode'uyla; eski düz fe-split__list kalktı. -->\n <ListView\n v-else-if=\"(viewMode ?? 'list') === 'list'\"\n :files=\"files\"\n :selected=\"selected\"\n :locale=\"locale\"\n :loading=\"loading\"\n @click-row=\"onViewClick\"\n @dbl-row=\"onRowDbl\"\n @context-row=\"onViewContext\"\n @item-drag-start=\"onRowDragStart\"\n @item-drop-into=\"onViewDropInto\"\n />\n <GridView\n v-else-if=\"viewMode === 'grid'\"\n :files=\"files\"\n :selected=\"selected\"\n :locale=\"locale\"\n :loading=\"loading\"\n :thumb-src=\"thumbSrc\"\n @click-card=\"onViewClick\"\n @dbl-card=\"onRowDbl\"\n @context-card=\"onViewContext\"\n @item-drag-start=\"onRowDragStart\"\n @item-drop-into=\"onViewDropInto\"\n />\n <GalleryView\n v-else\n :files=\"files\"\n :selected=\"selected\"\n :locale=\"locale\"\n :loading=\"loading\"\n :thumb-src=\"thumbSrc\"\n @click-card=\"onViewClick\"\n @dbl-card=\"onRowDbl\"\n @context-card=\"onViewContext\"\n @item-drag-start=\"onRowDragStart\"\n @item-drop-into=\"onViewDropInto\"\n />\n </div>\n </section>\n</template>\n","/**\n * useTabs — wiring:d1 sekmeler (çalışma alanı tab şeridi).\n *\n * A LAYER ABOVE FileExplorer's location state, never a replacement for\n * it: each tab is a location snapshot `{ id, path, viewMode, split }`.\n * The composable performs no fetching and owns no navigation — the host\n * activates a tab by running its EXISTING `load(path)` pipeline and\n * reports navigations back through `syncActive()`, which keeps the\n * active snapshot glued to wherever the user actually is.\n *\n * `path` is stored in the SAME form as FileExplorer's `currentPath`\n * (virtual `<storage>/<rel>` in multi-storage mode, bare relative path\n * in single-storage mode) — i.e. the exact string `load(path)` accepts.\n * Storing the wire form (`adapter://rel`) instead would break the\n * rootPath-floor clamp inside load() (the floor is compared in user-path\n * form), so the user-path form is deliberate.\n *\n * Persistence: localStorage under a host-supplied key (the host derives\n * it from the pathPersist scope: disabled when `pathPersist: 'none'`,\n * suffixed with the rootPath confine so embedded instances with\n * different confines never clobber each other). Schema:\n *\n * { \"v\": 1, \"active\": \"<id>\",\n * \"tabs\": [ { \"id\", \"path\", \"viewMode\", \"split\": {\"path\"}|null } ] }\n */\n\nimport { computed, ref, watch, type Ref } from 'vue';\nimport type { ViewMode } from '../types/FileNode';\n\n/** Per-tab split state — the secondary pane's own location. */\nexport interface TabSplit {\n path: string;\n /** ui-fix — the pane's OWN view mode (list/grid/gallery); undefined\n * inherits the main panel's mode at split time. */\n viewMode?: ViewMode;\n}\n\nexport interface TabState {\n id: string;\n /** Location snapshot in `currentPath` form (see module docs). */\n path: string;\n viewMode: ViewMode;\n split: TabSplit | null;\n}\n\nexport interface UseTabsOptions {\n /** localStorage key; null disables persistence entirely. */\n storageKey: string | null;\n}\n\nfunction makeId(): string {\n try {\n return crypto.randomUUID();\n } catch {\n return `t${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n }\n}\n\nexport function useTabs(opts: UseTabsOptions) {\n const tabs: Ref<TabState[]> = ref([]);\n const activeId = ref<string>('');\n\n const activeTab = computed<TabState | null>(\n () => tabs.value.find((t) => t.id === activeId.value) ?? null,\n );\n const activeIndex = computed(() => tabs.value.findIndex((t) => t.id === activeId.value));\n const hasMultiple = computed(() => tabs.value.length > 1);\n\n // ------------------------------------------------------------------\n // Persistence\n // ------------------------------------------------------------------\n\n /** Restore from storage. Returns true when at least one tab loaded. */\n function restore(): boolean {\n if (!opts.storageKey) return false;\n try {\n const raw = localStorage.getItem(opts.storageKey);\n if (!raw) return false;\n const parsed = JSON.parse(raw) as { v?: unknown; active?: unknown; tabs?: unknown };\n if (!parsed || !Array.isArray(parsed.tabs) || parsed.tabs.length === 0) return false;\n const clean: TabState[] = [];\n for (const t of parsed.tabs as Array<Record<string, unknown>>) {\n if (!t || typeof t.path !== 'string') continue;\n // ViewMode is validated loosely on purpose: future modes (e.g. the\n // gallery wave) must survive a round-trip through an older schema.\n const vm =\n typeof t.viewMode === 'string' && t.viewMode ? (t.viewMode as ViewMode) : 'list';\n const rawSplit = t.split as { path?: unknown; viewMode?: unknown } | null | undefined;\n const split =\n rawSplit && typeof rawSplit === 'object' && typeof rawSplit.path === 'string'\n ? {\n path: rawSplit.path,\n viewMode:\n typeof rawSplit.viewMode === 'string' && rawSplit.viewMode\n ? (rawSplit.viewMode as ViewMode)\n : undefined,\n }\n : null;\n clean.push({\n id: typeof t.id === 'string' && t.id ? t.id : makeId(),\n path: t.path,\n viewMode: vm,\n split,\n });\n }\n if (clean.length === 0) return false;\n tabs.value = clean;\n activeId.value = clean.some((t) => t.id === parsed.active)\n ? String(parsed.active)\n : clean[0].id;\n return true;\n } catch {\n return false;\n }\n }\n\n function persist(): void {\n if (!opts.storageKey) return;\n try {\n localStorage.setItem(\n opts.storageKey,\n JSON.stringify({ v: 1, active: activeId.value, tabs: tabs.value }),\n );\n } catch {\n /* private mode / quota */\n }\n }\n\n watch([tabs, activeId], persist, { deep: true });\n\n // ------------------------------------------------------------------\n // Mutations\n // ------------------------------------------------------------------\n\n /** Create the first tab (no-op once any tab exists). */\n function seed(path: string, viewMode: ViewMode): void {\n if (tabs.value.length > 0) return;\n const t: TabState = { id: makeId(), path, viewMode, split: null };\n tabs.value = [t];\n activeId.value = t.id;\n }\n\n /** Update the ACTIVE tab's snapshot (navigation / view-mode change). */\n function syncActive(patch: Partial<Pick<TabState, 'path' | 'viewMode'>>): void {\n const t = activeTab.value;\n if (!t) return;\n if (patch.path !== undefined) t.path = patch.path;\n if (patch.viewMode !== undefined) t.viewMode = patch.viewMode;\n }\n\n /** Open a new tab right after the active one (browser convention). */\n function openTab(\n path: string,\n o: { viewMode: ViewMode; background?: boolean; split?: TabSplit | null },\n ): TabState {\n const t: TabState = { id: makeId(), path, viewMode: o.viewMode, split: o.split ?? null };\n const idx = activeIndex.value;\n tabs.value.splice(idx === -1 ? tabs.value.length : idx + 1, 0, t);\n if (!o.background) activeId.value = t.id;\n return t;\n }\n\n /**\n * Close a tab. The last remaining tab never closes. Returns the tab\n * the host must ACTIVATE (right neighbour, else left) when the active\n * one was closed; null when the visible location is unchanged.\n */\n function closeTab(id: string): TabState | null {\n if (tabs.value.length <= 1) return null;\n const idx = tabs.value.findIndex((t) => t.id === id);\n if (idx === -1) return null;\n const wasActive = tabs.value[idx].id === activeId.value;\n tabs.value.splice(idx, 1);\n if (!wasActive) return null;\n const next = tabs.value[Math.min(idx, tabs.value.length - 1)];\n activeId.value = next.id;\n return next;\n }\n\n /** Make a tab active. Returns it when the active tab actually changed. */\n function activate(id: string): TabState | null {\n const t = tabs.value.find((x) => x.id === id);\n if (!t || t.id === activeId.value) return null;\n activeId.value = t.id;\n return t;\n }\n\n /** Cycle: +1 = next, -1 = previous (wraps). */\n function step(delta: number): TabState | null {\n if (tabs.value.length < 2) return null;\n const idx = activeIndex.value === -1 ? 0 : activeIndex.value;\n const next = tabs.value[(idx + delta + tabs.value.length) % tabs.value.length];\n return activate(next.id);\n }\n\n /** Drag-sort support: move the tab at `from` to position `to`. */\n function move(from: number, to: number): void {\n if (from === to) return;\n if (from < 0 || to < 0 || from >= tabs.value.length || to >= tabs.value.length) return;\n const list = [...tabs.value];\n const [t] = list.splice(from, 1);\n list.splice(to, 0, t);\n tabs.value = list;\n }\n\n /** Set (or clear with null) the ACTIVE tab's split state. */\n function setSplit(split: TabSplit | null): void {\n const t = activeTab.value;\n if (!t) return;\n t.split = split;\n }\n\n return {\n tabs,\n activeId,\n activeTab,\n activeIndex,\n hasMultiple,\n restore,\n seed,\n syncActive,\n openTab,\n closeTab,\n activate,\n step,\n move,\n setSplit,\n };\n}\n\nexport type TabsApi = ReturnType<typeof useTabs>;\n","<script setup lang=\"ts\">\n/**\n * EncryptedFolderModal — create an E2E-encrypted folder (wiring:e2).\n *\n * Collects folder name + password ×2 and an explicit \"I understand there\n * is NO recovery\" acknowledgement. The parent (FileExplorer) performs the\n * actual newfolder + marker-upload dance; this modal never touches the\n * network and never stores the password anywhere.\n *\n * Crypto scheme + threat model: docs/E2E-ENCRYPTION.md.\n */\nimport { ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { E2E_MIN_PASSWORD_LEN } from '../lib/e2ecrypto';\nimport Modal from '../modals/Modal.vue';\n\nconst props = defineProps<{\n open: boolean;\n locale: LocaleCode;\n /** True while the parent is creating the folder + uploading the marker. */\n busy?: boolean;\n}>();\n\nconst emit = defineEmits<{\n (e: 'close'): void;\n (e: 'submit', payload: { name: string; password: string }): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\nconst name = ref('');\nconst password = ref('');\nconst password2 = ref('');\nconst ack = ref(false);\nconst err = ref<string | null>(null);\n\nwatch(\n () => props.open,\n (v) => {\n if (v) {\n name.value = '';\n password.value = '';\n password2.value = '';\n ack.value = false;\n err.value = null;\n }\n },\n);\n\nfunction submit() {\n if (props.busy) return;\n const clean = name.value.trim();\n if (!clean) {\n err.value = t('modal.newfolder.placeholder');\n return;\n }\n if (/[\\\\/]/.test(clean) || clean === '.' || clean === '..' || clean.startsWith('.filex')) {\n err.value = t('e2e.create.bad_name');\n return;\n }\n if (password.value.length < E2E_MIN_PASSWORD_LEN) {\n err.value = t('e2e.create.pw_short');\n return;\n }\n if (password.value !== password2.value) {\n err.value = t('e2e.create.pw_mismatch');\n return;\n }\n if (!ack.value) {\n err.value = t('e2e.create.ack_required');\n return;\n }\n err.value = null;\n emit('submit', { name: clean, password: password.value });\n}\n</script>\n\n<template>\n <Modal :open=\"open\" :title=\"t('e2e.create.title')\" size=\"sm\" @close=\"emit('close')\">\n <form class=\"fe-e2e-form\" @submit.prevent=\"submit\">\n <input\n v-model=\"name\"\n type=\"text\"\n class=\"fe-input\"\n :placeholder=\"t('modal.newfolder.placeholder')\"\n autocomplete=\"off\"\n :disabled=\"busy\"\n />\n <input\n v-model=\"password\"\n type=\"password\"\n class=\"fe-input\"\n :placeholder=\"t('e2e.create.pw_placeholder')\"\n autocomplete=\"new-password\"\n :disabled=\"busy\"\n />\n <input\n v-model=\"password2\"\n type=\"password\"\n class=\"fe-input\"\n :placeholder=\"t('e2e.create.pw2_placeholder')\"\n autocomplete=\"new-password\"\n :disabled=\"busy\"\n @keydown.enter.prevent=\"submit\"\n />\n <div class=\"fe-e2e-warn\" role=\"alert\">\n <strong>{{ t('e2e.create.warn_title') }}</strong>\n <p>{{ t('e2e.create.warn_body') }}</p>\n </div>\n <label class=\"fe-e2e-ack\">\n <input v-model=\"ack\" type=\"checkbox\" :disabled=\"busy\" />\n <span>{{ t('e2e.create.ack') }}</span>\n </label>\n <p v-if=\"err\" class=\"fe-form__error\">{{ err }}</p>\n </form>\n <template #actions>\n <button type=\"button\" class=\"fe-btn\" :disabled=\"busy\" @click=\"emit('close')\">\n {{ t('modal.newfolder.cancel') }}\n </button>\n <button type=\"button\" class=\"fe-btn fe-btn--primary\" :disabled=\"busy\" @click=\"submit\">\n {{ busy ? t('e2e.create.busy') : t('e2e.create.create') }}\n </button>\n </template>\n </Modal>\n</template>\n","<script setup lang=\"ts\">\nimport { ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport Modal from './Modal.vue';\n\nconst props = defineProps<{\n open: boolean;\n locale: LocaleCode;\n /* wiring:e2 — hosts hide the encrypted option (e.g. already inside an\n * encrypted folder / feature-gated embeds). Default: shown. */\n encryptedOption?: boolean;\n}>();\n\nconst emit = defineEmits<{\n (e: 'close'): void;\n (e: 'submit', name: string): void;\n /* wiring:e2 — user picked \"Create encrypted folder…\" — the parent swaps\n * this modal for EncryptedFolderModal. */\n (e: 'encrypted'): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\nconst name = ref('');\nconst err = ref<string | null>(null);\n\nwatch(() => props.open, (v) => {\n if (v) {\n name.value = '';\n err.value = null;\n }\n});\n\nfunction submit() {\n const clean = name.value.trim();\n if (!clean) {\n err.value = t('modal.newfolder.placeholder');\n return;\n }\n if (/[\\\\/]/.test(clean) || clean === '.' || clean === '..') {\n err.value = 'Geçersiz karakter';\n return;\n }\n emit('submit', clean);\n}\n</script>\n\n<template>\n <Modal :open=\"open\" :title=\"t('modal.newfolder.title')\" size=\"sm\" @close=\"emit('close')\">\n <form @submit.prevent=\"submit\">\n <input\n v-model=\"name\"\n type=\"text\"\n class=\"fe-input\"\n :placeholder=\"t('modal.newfolder.placeholder')\"\n autocomplete=\"off\"\n @keydown.enter.prevent=\"submit\"\n />\n <p v-if=\"err\" class=\"fe-form__error\">{{ err }}</p>\n <!-- wiring:e2 — encrypted-folder entry point lives inside the normal\n new-folder flow so every trigger (toolbar / context menu / palette)\n reaches it without extra wiring. -->\n <button\n v-if=\"encryptedOption !== false\"\n type=\"button\"\n class=\"fe-e2e-optlink\"\n @click=\"emit('encrypted')\"\n >\n 🔒 {{ t('e2e.create.option') }}\n </button>\n <!-- /wiring:e2 -->\n </form>\n <template #actions>\n <button type=\"button\" class=\"fe-btn\" @click=\"emit('close')\">\n {{ t('modal.newfolder.cancel') }}\n </button>\n <button type=\"button\" class=\"fe-btn fe-btn--primary\" @click=\"submit\">\n {{ t('modal.newfolder.create') }}\n </button>\n </template>\n </Modal>\n</template>\n","<script setup lang=\"ts\">\nimport { ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport Modal from './Modal.vue';\n\nconst props = defineProps<{\n open: boolean;\n locale: LocaleCode;\n currentName: string;\n}>();\n\nconst emit = defineEmits<{\n (e: 'close'): void;\n (e: 'submit', name: string): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\nconst name = ref('');\n\nwatch(\n () => [props.open, props.currentName] as const,\n ([isOpen, cur]) => {\n if (isOpen) {\n name.value = cur;\n }\n },\n);\n\nfunction submit() {\n const clean = name.value.trim();\n if (!clean) return;\n if (/[\\\\/]/.test(clean) || clean === '.' || clean === '..') return;\n emit('submit', clean);\n}\n</script>\n\n<template>\n <Modal :open=\"open\" :title=\"t('modal.rename.title')\" size=\"sm\" @close=\"emit('close')\">\n <form @submit.prevent=\"submit\">\n <input\n v-model=\"name\"\n type=\"text\"\n class=\"fe-input\"\n autocomplete=\"off\"\n @keydown.enter.prevent=\"submit\"\n />\n </form>\n <template #actions>\n <button type=\"button\" class=\"fe-btn\" @click=\"emit('close')\">\n {{ t('modal.rename.cancel') }}\n </button>\n <button type=\"button\" class=\"fe-btn fe-btn--primary\" @click=\"submit\">\n {{ t('modal.rename.save') }}\n </button>\n </template>\n </Modal>\n</template>\n","<script setup lang=\"ts\">\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport Modal from './Modal.vue';\n\nconst props = defineProps<{\n open: boolean;\n locale: LocaleCode;\n count: number;\n}>();\n\nconst emit = defineEmits<{\n (e: 'close'): void;\n (e: 'confirm'): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n</script>\n\n<template>\n <Modal :open=\"open\" :title=\"t('modal.delete.title')\" size=\"sm\" @close=\"emit('close')\">\n <p>{{ t('modal.delete.message', { count }) }}</p>\n <template #actions>\n <button type=\"button\" class=\"fe-btn\" @click=\"emit('close')\">\n {{ t('modal.delete.cancel') }}\n </button>\n <button type=\"button\" class=\"fe-btn fe-btn--danger\" @click=\"emit('confirm')\">\n {{ t('modal.delete.confirm') }}\n </button>\n </template>\n </Modal>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport type { ShareInfo } from '../types/FileNode';\nimport { useLocale } from '../composables/useLocale';\nimport Modal from './Modal.vue';\n\nconst props = defineProps<{\n open: boolean;\n locale: LocaleCode;\n share?: (ShareInfo & { url: string; filename?: string }) | null;\n}>();\n\nconst emit = defineEmits<{\n (e: 'close'): void;\n (\n e: 'submit',\n payload: { password: boolean; expires_at: string | null; max_downloads: number | null },\n ): void;\n (e: 'toast', msg: string): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst usePin = ref(false);\nconst expiresAt = ref<string>('');\nconst maxDownloads = ref<string>('');\n\nwatch(() => props.open, (v) => {\n if (v) {\n usePin.value = false;\n expiresAt.value = '';\n maxDownloads.value = '';\n }\n});\n\nfunction submit() {\n emit('submit', {\n password: usePin.value,\n expires_at: expiresAt.value ? new Date(expiresAt.value).toISOString() : null,\n max_downloads: maxDownloads.value ? Number(maxDownloads.value) : null,\n });\n}\n\nasync function copy(value: string, toast: string) {\n try {\n await navigator.clipboard.writeText(value);\n emit('toast', toast);\n } catch {\n /* no-op */\n }\n}\n\n// Wrap a value in single quotes for safe paste into a POSIX shell —\n// embedded single quotes become the standard '\\'' dance.\nfunction shQuote(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\n// One-line curl that downloads the shared file straight onto a server.\n// The PIN (if any) rides in the querystring — HandleDownload accepts\n// ?pin=, and -L follows the 302 to the presigned URL for S3 storages.\nconst cliCommand = computed(() => {\n const sh = props.share;\n if (!sh) return '';\n let url = sh.url;\n if (sh.password_pin) {\n url += (url.includes('?') ? '&' : '?') + 'pin=' + encodeURIComponent(sh.password_pin);\n }\n // Prefer an explicit output name; fall back to the server's\n // Content-Disposition filename (-OJ) when we don't know it.\n const target = sh.filename ? `-o ${shQuote(sh.filename)} ` : '-OJ ';\n return `curl -fSL ${target}${shQuote(url)}`;\n});\n</script>\n\n<template>\n <Modal :open=\"open\" :title=\"t('modal.share.title')\" size=\"md\" @close=\"emit('close')\">\n <template v-if=\"!share\">\n <form class=\"fe-form\" @submit.prevent=\"submit\">\n <label class=\"fe-form__row\">\n <input v-model=\"usePin\" type=\"checkbox\" />\n <span>{{ t('modal.share.pin') }}</span>\n </label>\n <label class=\"fe-form__row fe-form__row--stack\">\n <span>{{ t('modal.share.expires') }}</span>\n <input v-model=\"expiresAt\" type=\"datetime-local\" class=\"fe-input\" />\n </label>\n <label class=\"fe-form__row fe-form__row--stack\">\n <span>{{ t('modal.share.max_downloads') }}</span>\n <input v-model=\"maxDownloads\" type=\"number\" min=\"1\" class=\"fe-input\" />\n </label>\n </form>\n </template>\n <template v-else>\n <div class=\"fe-share-result\">\n <div class=\"fe-share-result__row\">\n <label>Link</label>\n <div class=\"fe-share-result__copy\">\n <input :value=\"share.url\" readonly class=\"fe-input\" />\n <button type=\"button\" class=\"fe-btn\" @click=\"copy(share.url, t('modal.share.url_copied'))\">\n {{ t('modal.share.copy') }}\n </button>\n </div>\n </div>\n <div v-if=\"share.password_pin\" class=\"fe-share-result__row\">\n <label>PIN</label>\n <div class=\"fe-share-result__copy\">\n <input :value=\"share.password_pin\" readonly class=\"fe-input fe-input--mono\" />\n <button type=\"button\" class=\"fe-btn\" @click=\"copy(share.password_pin, t('modal.share.pin_copied'))\">\n {{ t('modal.share.copy') }}\n </button>\n </div>\n </div>\n <div class=\"fe-share-result__row\">\n <label>CLI</label>\n <div class=\"fe-share-result__copy\">\n <input :value=\"cliCommand\" readonly class=\"fe-input fe-input--mono\" />\n <button type=\"button\" class=\"fe-btn\" @click=\"copy(cliCommand, t('modal.share.cli_copied'))\">\n {{ t('modal.share.copy') }}\n </button>\n </div>\n </div>\n </div>\n </template>\n <template #actions>\n <button type=\"button\" class=\"fe-btn\" @click=\"emit('close')\">\n {{ share ? 'Kapat' : t('modal.share.cancel') }}\n </button>\n <button v-if=\"!share\" type=\"button\" class=\"fe-btn fe-btn--primary\" @click=\"submit\">\n {{ t('modal.share.create') }}\n </button>\n </template>\n </Modal>\n</template>\n","<script setup lang=\"ts\">\n/**\n * ConvertModal — universal file converter via a hidden, embedded iframe to\n * the p2r3/convert fork running at `convertUrl` (loaded with `?embed=1`).\n *\n * The iframe performs the actual conversion in-browser (WASM handlers); we\n * drive it headlessly over postMessage (protocol defined in the fork's\n * `setupEmbedBridge`):\n * 1. iframe → { source:'convert-embed', event:'ready' }\n * 2. we → { target:'convert-embed', cmd:'listFormats', id }\n * iframe→ { source, id, ok, formats:[{index,ext,format,mime,name,from,to}] }\n * 3. user searches + picks a target format\n * 4. we fetch the source bytes, → { cmd:'convert', name, bytes, fromIndex, toIndex }\n * iframe→ { ok, name, ext, bytes:ArrayBuffer }\n * 5. we wrap the bytes in a File and upload it to the current folder.\n */\nimport { computed, onBeforeUnmount, onMounted, ref } from 'vue';\n\nconst props = defineProps<{\n /** Converter base, e.g. https://fm.brf.sh/convert */\n convertUrl: string;\n /** Source file name with extension, e.g. \"clip.avi\" */\n fileName: string;\n /** Lazily fetch the source file bytes (api.fetchArrayBuffer bound to the path). */\n fetchBytes: () => Promise<ArrayBuffer>;\n /** Upload the produced File into the current folder (api.uploadMultipart bound to dir). */\n upload: (file: File) => Promise<void>;\n t?: (key: string, fallback: string) => string;\n}>();\n\nconst emit = defineEmits<{ (e: 'close'): void; (e: 'done', name: string): void }>();\n\ninterface Fmt {\n index: number; ext: string; format: string; mime: string;\n name: string; from: boolean; to: boolean; category: string | null;\n}\n\nconst iframeRef = ref<HTMLIFrameElement | null>(null);\nconst status = ref<'loading' | 'ready' | 'converting' | 'done' | 'error'>('loading');\nconst error = ref<string | null>(null);\nconst formats = ref<Fmt[]>([]);\nconst search = ref('');\nconst selectedTo = ref<Fmt | null>(null);\n\nconst srcExt = computed(() => (props.fileName.split('.').pop() || '').toLowerCase());\n\nconst fromFmt = computed<Fmt | null>(() => {\n const ins = formats.value.filter((f) => f.from);\n return (\n ins.find((f) => (f.ext || '').toLowerCase() === srcExt.value) ||\n ins.find((f) => (f.format || '').toLowerCase() === srcExt.value) ||\n null\n );\n});\n\nconst toList = computed<Fmt[]>(() => {\n const q = search.value.trim().toLowerCase();\n const seen = new Set<string>();\n const uniq: Fmt[] = [];\n for (const f of formats.value) {\n if (!f.to) continue;\n const key = (f.ext || f.format || '').toLowerCase();\n if (!key || seen.has(key)) continue;\n seen.add(key);\n uniq.push(f);\n }\n uniq.sort((a, b) => (a.ext || a.format).localeCompare(b.ext || b.format));\n if (!q) return uniq;\n return uniq.filter(\n (f) =>\n (f.ext || '').toLowerCase().includes(q) ||\n (f.format || '').toLowerCase().includes(q) ||\n (f.name || '').toLowerCase().includes(q) ||\n (f.mime || '').toLowerCase().includes(q),\n );\n});\n\nconst iframeSrc = computed(() => `${props.convertUrl.replace(/\\/$/, '')}/?embed=1`);\n\nlet msgId = 0;\nconst pending = new Map<number, { resolve: (v: any) => void; reject: (e: any) => void }>();\n\nfunction send(cmd: string, extra: Record<string, unknown> = {}, transfer: Transferable[] = []): Promise<any> {\n const id = ++msgId;\n return new Promise((resolve, reject) => {\n pending.set(id, { resolve, reject });\n iframeRef.value?.contentWindow?.postMessage({ target: 'convert-embed', id, cmd, ...extra }, '*', transfer);\n setTimeout(() => {\n if (pending.has(id)) { pending.delete(id); reject(new Error('convert timeout')); }\n }, 180000);\n });\n}\n\nfunction onMessage(ev: MessageEvent) {\n const d = ev.data;\n if (!d || d.source !== 'convert-embed') return;\n if (d.event === 'ready') { void loadFormats(); return; }\n const p = pending.get(d.id);\n if (!p) return;\n pending.delete(d.id);\n if (d.ok) p.resolve(d); else p.reject(new Error(d.error || 'convert error'));\n}\n\nasync function loadFormats() {\n try {\n const res = await send('listFormats');\n formats.value = res.formats || [];\n status.value = 'ready';\n if (!fromFmt.value) {\n error.value = tt('convert.unsupportedInput', 'Bu dosya tipi için kaynak format bulunamadı.');\n }\n } catch (e) {\n error.value = (e as Error).message;\n status.value = 'error';\n }\n}\n\nasync function doConvert() {\n if (!selectedTo.value || !fromFmt.value) return;\n status.value = 'converting';\n error.value = null;\n try {\n const buf = await props.fetchBytes();\n const res = await send(\n 'convert',\n { name: props.fileName, bytes: buf, fromIndex: fromFmt.value.index, toIndex: selectedTo.value.index },\n [buf],\n );\n const base = props.fileName.replace(/\\.[^.]+$/, '');\n const ext = res.ext || selectedTo.value.ext || selectedTo.value.format;\n const outName = `${base}.${ext}`;\n const file = new File([res.bytes], outName, { type: selectedTo.value.mime || 'application/octet-stream' });\n await props.upload(file);\n status.value = 'done';\n emit('done', outName);\n } catch (e) {\n error.value = (e as Error).message;\n status.value = 'error';\n }\n}\n\nfunction tt(k: string, fb: string) { return props.t ? props.t(k, fb) : fb; }\n\nonMounted(() => window.addEventListener('message', onMessage));\nonBeforeUnmount(() => window.removeEventListener('message', onMessage));\n</script>\n\n<template>\n <div class=\"filex-cv__bg\" @click.self=\"emit('close')\">\n <div class=\"filex-cv\">\n <header class=\"filex-cv__head\">\n <h3>{{ tt('convert.title', 'Dönüştür') }} — {{ fileName }}</h3>\n <button class=\"filex-cv__x\" @click=\"emit('close')\">✕</button>\n </header>\n\n <div v-if=\"status === 'loading'\" class=\"filex-cv__msg\">\n {{ tt('convert.loading', 'Dönüştürücü yükleniyor…') }}\n </div>\n\n <div v-else-if=\"status === 'done'\" class=\"filex-cv__msg filex-cv__ok\">\n <p>✓ {{ tt('convert.done', 'Dönüştürüldü ve klasöre yüklendi.') }}</p>\n <button class=\"filex-cv__convert\" @click=\"emit('close')\">{{ tt('convert.close', 'Kapat') }}</button>\n </div>\n\n <template v-else>\n <p class=\"filex-cv__src\">\n {{ tt('convert.from', 'Kaynak') }}: <b>{{ srcExt || '?' }}</b>\n </p>\n <input\n v-model=\"search\"\n class=\"filex-cv__search\"\n :placeholder=\"tt('convert.searchFmt', 'Hedef format ara (pdf, mp4, png…)')\"\n />\n <div class=\"filex-cv__list\">\n <button\n v-for=\"f in toList\"\n :key=\"f.index\"\n :class=\"['filex-cv__fmt', { 'is-sel': selectedTo?.index === f.index }]\"\n @click=\"selectedTo = f\"\n >\n <b>{{ (f.ext || f.format).toUpperCase() }}</b>\n <small>{{ f.name }}</small>\n </button>\n <div v-if=\"toList.length === 0\" class=\"filex-cv__empty\">\n {{ tt('convert.noFmt', 'Eşleşen format yok.') }}\n </div>\n </div>\n <div v-if=\"error\" class=\"filex-cv__err\">{{ error }}</div>\n <footer class=\"filex-cv__foot\">\n <button\n class=\"filex-cv__convert\"\n :disabled=\"!selectedTo || !fromFmt || status === 'converting'\"\n @click=\"doConvert\"\n >\n {{ status === 'converting' ? tt('convert.converting', 'Dönüştürülüyor…') : tt('convert.convert', 'Dönüştür') }}\n </button>\n </footer>\n </template>\n\n <!-- hidden headless converter engine -->\n <iframe ref=\"iframeRef\" :src=\"iframeSrc\" class=\"filex-cv__frame\" title=\"converter\" />\n </div>\n </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n this CSS does not match the one Vue stamps onto the DOM — so every rule\n here silently stopped applying. Measured in the desktop app: the share\n dialog had `position: static`, no background and no radius, i.e. raw\n unstyled HTML, in EVERY embedded surface.\n Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n there is nothing here that can leak into a host page. */\n.filex-cv__bg {\n position: fixed; inset: 0; z-index: 1000;\n background: rgba(0, 0, 0, 0.55);\n display: flex; align-items: center; justify-content: center;\n}\n.filex-cv {\n width: min(560px, 92vw); max-height: 80vh; overflow: hidden;\n display: flex; flex-direction: column;\n background: var(--fe-bg, #fff); color: var(--fe-text, #1a1f29);\n border: 1px solid var(--fe-border, #e2e6ed); border-radius: 12px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.35);\n}\n.filex-cv__head {\n display: flex; align-items: center; justify-content: space-between;\n padding: 12px 16px; border-bottom: 1px solid var(--fe-border, #e2e6ed);\n}\n.filex-cv__head h3 { margin: 0; font-size: 14px; font-weight: 600; }\n.filex-cv__x { border: 0; background: none; cursor: pointer; font-size: 16px; color: var(--fe-text-muted, #5a6475); }\n.filex-cv__msg { padding: 28px; text-align: center; color: var(--fe-text-muted, #5a6475); }\n.filex-cv__ok { color: #059669; }\n.filex-cv__src { padding: 12px 16px 0; font-size: 13px; color: var(--fe-text-muted, #5a6475); }\n.filex-cv__search {\n margin: 8px 16px; padding: 8px 10px;\n border: 1px solid var(--fe-border, #e2e6ed); border-radius: 8px;\n background: var(--fe-bg-elev, #f7f8fa); color: inherit; font-size: 13px;\n}\n.filex-cv__list {\n flex: 1; overflow-y: auto; padding: 4px 12px 12px;\n display: grid; grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); gap: 8px;\n}\n.filex-cv__fmt {\n display: flex; flex-direction: column; gap: 2px; align-items: flex-start;\n padding: 8px 10px; cursor: pointer; text-align: left;\n border: 1px solid var(--fe-border, #e2e6ed); border-radius: 8px;\n background: var(--fe-bg-elev, #f7f8fa); color: inherit;\n}\n.filex-cv__fmt small { color: var(--fe-text-muted, #5a6475); font-size: 11px; }\n.filex-cv__fmt.is-sel { border-color: #44c878; background: rgba(68, 200, 120, 0.12); }\n.filex-cv__empty { grid-column: 1 / -1; text-align: center; color: var(--fe-text-muted, #5a6475); padding: 16px; }\n.filex-cv__err { padding: 0 16px; color: var(--fe-danger, #dc2626); font-size: 13px; }\n.filex-cv__foot { padding: 12px 16px; border-top: 1px solid var(--fe-border, #e2e6ed); text-align: right; }\n.filex-cv__convert {\n padding: 8px 18px; border: 0; border-radius: 8px; cursor: pointer;\n background: #44c878; color: #03200f; font-weight: 600; font-size: 13px;\n}\n.filex-cv__convert:disabled { opacity: 0.5; cursor: default; }\n.filex-cv__frame { position: absolute; width: 0; height: 0; border: 0; left: -9999px; }\n</style>\n","<script setup lang=\"ts\">\n// Access modal — one popup combining \"İzinler\" (per-user RBAC grants,\n// owner-only) and \"Bağlantı ile paylaş\" (public share link, editor+). Opened\n// from the explorer's unified \"Paylaş / İzinler\" action. The layout is a fixed\n// header/tabs with a single scrollable body so the popup never grows into one\n// long scroll. Styling uses the SFC's --fe-* theme variables (light/dark).\nimport { ref, onMounted, onBeforeUnmount, computed } from 'vue';\nimport type { FileApi, Grant, UserSuggestion } from '../composables/useFileApi';\nimport type { ShareInfo } from '../types/FileNode';\n\nconst props = defineProps<{\n api: FileApi;\n path: string; // adapter://rel of the target item\n isDir?: boolean; // folder → grants cascade; file → no `/…` inheritance hint\n size?: number; // bytes, for the share-mail body (files only)\n locale?: 'tr' | 'en';\n}>();\nconst emit = defineEmits<{ (e: 'close'): void }>();\n\nconst tr = computed(() => (props.locale ?? 'tr') !== 'en');\nfunction L(t: string, e: string): string {\n return tr.value ? t : e;\n}\n\n// Split adapter://rel for a friendlier path chip.\nconst pathParts = computed(() => {\n const m = /^([^:]+):\\/\\/(.*)$/.exec(props.path);\n const adapter = m ? m[1] : '';\n const rel = m ? m[2] : props.path;\n const segs = rel.split('/').filter(Boolean);\n return { adapter, name: segs.length ? segs[segs.length - 1] : adapter, rel };\n});\n\ntype Tab = 'perms' | 'share' | 'drop';\nconst tab = ref<Tab>('perms');\nconst canManage = ref(false); // owner/admin → can see the permissions tab\n\n// ── permissions state ──\nconst loading = ref(true);\nconst err = ref('');\nconst direct = ref<Grant[]>([]);\nconst inherited = ref<Grant[]>([]);\nconst storageRbac = ref(true);\nconst email = ref('');\nconst level = ref<'viewer' | 'editor' | 'owner'>('viewer');\nconst busy = ref(false);\nconst notice = ref('');\nconst noAccount = ref(false);\nconst createRole = ref<'user' | 'viewer'>('user');\nconst inviteResult = ref<{ tempPassword?: string } | null>(null);\nconst suggestions = ref<UserSuggestion[]>([]);\nconst showSuggest = ref(false);\nlet searchTimer: ReturnType<typeof setTimeout> | undefined;\n\nconst levels: Array<{ v: 'viewer' | 'editor' | 'owner'; l: string; d: string }> = [\n { v: 'viewer', l: L('Görüntüleyen', 'Viewer'), d: L('görüntüle + indir', 'view + download') },\n { v: 'editor', l: L('Düzenleyen', 'Editor'), d: L('oku + yaz + sil', 'read + write + delete') },\n { v: 'owner', l: L('Sahip', 'Owner'), d: L('düzenle + izin yönet', 'edit + manage access') },\n];\nfunction levelLabel(v: string): string {\n return levels.find((o) => o.v === v)?.l ?? v;\n}\n\n// ── share state ──\nconst shares = ref<ShareInfo[]>([]);\nconst shareBusy = ref(false);\nconst sharePwd = ref(false);\nconst shareExpiry = ref(0); // days; 0 = never\nconst shareResult = ref<{ url: string; pin?: string | null } | null>(null);\nconst shareErr = ref('');\nconst copied = ref('');\n// prefilled recipient when the owner chose \"share link\" for a no-account email\nconst shareMailTo = ref('');\nconst shareMailBusy = ref(false);\nconst shareMailNotice = ref('');\n\nconst expiryOptions = [\n { v: 0, l: L('Süresiz', 'Never') },\n { v: 1, l: L('1 gün', '1 day') },\n { v: 7, l: L('7 gün', '7 days') },\n { v: 30, l: L('30 gün', '30 days') },\n];\n\n// ── file-drop (public upload link) state ──\nconst dropPwd = ref(false);\nconst dropExpiry = ref(0); // days; 0 = never\nconst dropShowAdv = ref(false);\nconst dropMaxFiles = ref<string>('');\nconst dropMaxSizeMB = ref<string>('');\nconst dropAllowedExt = ref<string>('');\nconst dropAskName = ref(true);\nconst dropBusy = ref(false);\nconst dropErr = ref('');\nconst dropResult = ref<{ url: string; pin?: string | null } | null>(null);\nconst dropMailTo = ref('');\nconst dropMailBusy = ref(false);\nconst dropMailNotice = ref('');\n\n// splitEmails turns a free-text recipient field into a deduped address list —\n// comma / semicolon / whitespace separated, so one input handles many people.\nfunction splitEmails(raw: string): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const part of raw.split(/[,;\\s]+/)) {\n const e = part.trim().toLowerCase();\n if (e && e.includes('@') && !seen.has(e)) {\n seen.add(e);\n out.push(e);\n }\n }\n return out;\n}\n\n// mailResultNotice renders a sent/failed summary from the share-mail response.\nfunction mailResultNotice(res: { sent?: string[]; failed?: string[] }): string {\n const sent = res.sent?.length ?? 0;\n const failed = res.failed?.length ?? 0;\n if (failed === 0) return L(`E-posta gönderildi ✓ (${sent})`, `Email sent ✓ (${sent})`);\n return L(`${sent} gönderildi, ${failed} başarısız`, `${sent} sent, ${failed} failed`);\n}\n\nasync function reload() {\n loading.value = true;\n err.value = '';\n try {\n const r = await props.api.listPermissions(props.path);\n direct.value = r.direct ?? [];\n inherited.value = r.inherited ?? [];\n storageRbac.value = r.storage_rbac;\n canManage.value = true;\n } catch (e) {\n // 403 = caller is editor (not owner): no permissions tab, share only.\n const st = (e as { status?: number }).status;\n if (st === 403) {\n canManage.value = false;\n // Editor (not owner): no permissions tab → fall back to the link tab.\n tab.value = 'share';\n } else {\n err.value = e instanceof Error ? e.message : String(e);\n }\n } finally {\n loading.value = false;\n }\n}\nasync function reloadShares() {\n try {\n const r = await props.api.listShares(props.path);\n shares.value = r.shares ?? [];\n } catch {\n shares.value = [];\n }\n}\nonMounted(async () => {\n await reload();\n await reloadShares();\n});\nonBeforeUnmount(() => {\n if (searchTimer) clearTimeout(searchTimer);\n});\n\nfunction onEmailInput() {\n noAccount.value = false;\n inviteResult.value = null;\n notice.value = '';\n const q = email.value.trim();\n if (searchTimer) clearTimeout(searchTimer);\n if (q.length < 1) {\n suggestions.value = [];\n showSuggest.value = false;\n return;\n }\n searchTimer = setTimeout(async () => {\n try {\n const r = await props.api.searchUsers(q);\n suggestions.value = r.users ?? [];\n showSuggest.value = suggestions.value.length > 0;\n } catch {\n showSuggest.value = false;\n }\n }, 180);\n}\nasync function pickUser(u: UserSuggestion) {\n showSuggest.value = false;\n email.value = u.email;\n let lvl = level.value;\n if (u.role === 'viewer' && lvl !== 'viewer') lvl = 'viewer';\n busy.value = true;\n notice.value = '';\n try {\n await props.api.addPermission({ path: props.path, user_id: u.id, level: lvl, is_dir: !!props.isDir });\n email.value = '';\n suggestions.value = [];\n await reload();\n notice.value = L('Yetki verildi.', 'Access granted.');\n } catch (e) {\n notice.value = e instanceof Error ? e.message : String(e);\n } finally {\n busy.value = false;\n }\n}\nasync function submitEmail() {\n const addr = email.value.trim().toLowerCase();\n if (!addr || !addr.includes('@')) {\n notice.value = L('Geçerli bir e-posta girin.', 'Enter a valid email.');\n return;\n }\n showSuggest.value = false;\n busy.value = true;\n notice.value = '';\n inviteResult.value = null;\n try {\n const res = await props.api.resolveEmail(addr);\n if (res.found && res.user) {\n let lvl = level.value;\n if (res.user.role === 'viewer' && lvl !== 'viewer') lvl = 'viewer';\n await props.api.addPermission({ path: props.path, user_id: res.user.id, level: lvl, is_dir: !!props.isDir });\n email.value = '';\n await reload();\n notice.value = L('Yetki verildi.', 'Access granted.');\n } else {\n noAccount.value = true;\n }\n } catch (e) {\n notice.value = e instanceof Error ? e.message : String(e);\n } finally {\n busy.value = false;\n }\n}\nasync function inviteCreateUser() {\n busy.value = true;\n notice.value = '';\n try {\n const r = await props.api.invitePermission({\n path: props.path, email: email.value.trim().toLowerCase(),\n level: level.value, create_user: true, role: createRole.value, is_dir: !!props.isDir,\n locale: props.locale ?? 'tr',\n });\n inviteResult.value = { tempPassword: r.temp_password };\n notice.value = r.emailed\n ? L('Kullanıcı açıldı, davet e-postası gönderildi.', 'User created, invite emailed.')\n : L('Kullanıcı açıldı. Geçici parolayı iletin.', 'User created. Share the temp password.');\n noAccount.value = false; email.value = '';\n await reload();\n } catch (e) {\n notice.value = e instanceof Error ? e.message : String(e);\n } finally {\n busy.value = false;\n }\n}\n// \"Sadece paylaş\" → jump to the share tab with the address prefilled so the\n// owner creates a link (with their chosen expiry/PIN) and mails it there.\nfunction gotoShareWithMail() {\n shareMailTo.value = email.value.trim().toLowerCase();\n noAccount.value = false;\n notice.value = '';\n tab.value = 'share';\n}\nasync function changeLevel(g: Grant, newLevel: string) {\n if (newLevel === g.level) return;\n busy.value = true;\n try { await props.api.updatePermission(g.id, newLevel); await reload(); }\n catch (e) { notice.value = e instanceof Error ? e.message : String(e); }\n finally { busy.value = false; }\n}\nasync function removeGrant(g: Grant) {\n busy.value = true;\n try { await props.api.deletePermission(g.id); await reload(); }\n catch (e) { notice.value = e instanceof Error ? e.message : String(e); }\n finally { busy.value = false; }\n}\nfunction glabel(g: Grant): string {\n return g.user_display_name || g.user_email || `#${g.user_id}`;\n}\nfunction ginitial(g: Grant): string {\n return (g.user_display_name || g.user_email || '?').charAt(0).toUpperCase();\n}\n\n// ── share actions ──\nfunction expiresAtISO(): string | null {\n if (!shareExpiry.value) return null;\n return new Date(Date.now() + shareExpiry.value * 86400000).toISOString();\n}\nasync function createLink() {\n shareBusy.value = true;\n shareErr.value = '';\n shareResult.value = null;\n shareMailNotice.value = '';\n try {\n const r = await props.api.createShare({\n path: props.path,\n password: sharePwd.value,\n expires_at: expiresAtISO(),\n });\n shareResult.value = { url: r.share.url, pin: r.share.password_pin ?? null };\n await reloadShares();\n } catch (e) {\n shareErr.value = e instanceof Error ? e.message : String(e);\n } finally {\n shareBusy.value = false;\n }\n}\nasync function sendShareMail() {\n const list = splitEmails(shareMailTo.value);\n if (!list.length) {\n shareMailNotice.value = L('Geçerli bir e-posta girin.', 'Enter a valid email.');\n return;\n }\n if (!shareResult.value?.url) return;\n shareMailBusy.value = true;\n shareMailNotice.value = '';\n try {\n const res = await props.api.shareMail({\n path: props.path, emails: list, url: shareResult.value.url,\n pin: shareResult.value.pin ?? undefined,\n expires_days: shareExpiry.value || undefined,\n locale: props.locale ?? 'tr',\n is_dir: !!props.isDir,\n size: props.size,\n });\n shareMailNotice.value = mailResultNotice(res);\n } catch (e) {\n const detail = (e as { detail?: string }).detail ?? '';\n if (detail.includes('not_configured')) {\n shareMailNotice.value = L('SMTP ayarlı/doğrulanmış değil — linki elle iletin.', 'SMTP not set up/verified — share the link manually.');\n } else if (detail.includes('send_failed')) {\n shareMailNotice.value = L('Gönderilemedi (geçici hata) — tekrar deneyin.', 'Send failed (temporary) — please retry.');\n } else {\n shareMailNotice.value = e instanceof Error ? e.message : String(e);\n }\n } finally {\n shareMailBusy.value = false;\n }\n}\n\n// ── file-drop (upload link) actions ──\nfunction dropExpiresAtISO(): string | null {\n if (!dropExpiry.value) return null;\n return new Date(Date.now() + dropExpiry.value * 86400000).toISOString();\n}\nasync function createDropLink() {\n dropBusy.value = true;\n dropErr.value = '';\n dropResult.value = null;\n dropMailNotice.value = '';\n try {\n const drop_settings: Record<string, unknown> = { ask_name: dropAskName.value };\n if (dropMaxFiles.value) drop_settings.max_files = Number(dropMaxFiles.value);\n if (dropMaxSizeMB.value) drop_settings.max_file_size_mb = Number(dropMaxSizeMB.value);\n const exts = dropAllowedExt.value.split(/[,\\s]+/).map((s) => s.trim().replace(/^\\./, '')).filter(Boolean);\n if (exts.length) drop_settings.allowed_ext = exts;\n const r = await props.api.createShare({\n path: props.path,\n kind: 'drop',\n password: dropPwd.value,\n expires_at: dropExpiresAtISO(),\n drop_settings,\n });\n dropResult.value = { url: r.share.url, pin: r.share.password_pin ?? null };\n } catch (e) {\n dropErr.value = e instanceof Error ? e.message : String(e);\n } finally {\n dropBusy.value = false;\n }\n}\nasync function sendDropMail() {\n const list = splitEmails(dropMailTo.value);\n if (!list.length) {\n dropMailNotice.value = L('Geçerli bir e-posta girin.', 'Enter a valid email.');\n return;\n }\n if (!dropResult.value?.url) return;\n dropMailBusy.value = true;\n dropMailNotice.value = '';\n try {\n const res = await props.api.shareMail({\n path: props.path, emails: list, url: dropResult.value.url,\n pin: dropResult.value.pin ?? undefined,\n expires_days: dropExpiry.value || undefined,\n locale: props.locale ?? 'tr',\n is_dir: true,\n mode: 'drop',\n });\n dropMailNotice.value = mailResultNotice(res);\n } catch (e) {\n const detail = (e as { detail?: string }).detail ?? '';\n if (detail.includes('not_configured')) {\n dropMailNotice.value = L('SMTP ayarlı/doğrulanmış değil — linki elle iletin.', 'SMTP not set up/verified — share the link manually.');\n } else {\n dropMailNotice.value = e instanceof Error ? e.message : String(e);\n }\n } finally {\n dropMailBusy.value = false;\n }\n}\nasync function revoke(s: ShareInfo) {\n shareBusy.value = true;\n try { await props.api.revokeShare(s.uuid); await reloadShares(); }\n catch (e) { shareErr.value = e instanceof Error ? e.message : String(e); }\n finally { shareBusy.value = false; }\n}\nfunction copy(text: string, tag = 'url') {\n navigator.clipboard?.writeText(text);\n copied.value = tag;\n setTimeout(() => { if (copied.value === tag) copied.value = ''; }, 1400);\n}\n\n// ── native share (Web Share API) ──\n// Same OS share sheet the fishapp uses (Windows share / Android share). Only\n// shown when the browser supports it (secure context + navigator.share, e.g.\n// Chrome/Edge on Windows, Android). The shared text mirrors the invite email\n// body (see backend mail_templates.go) so a WhatsApp/mail forward reads the\n// same as an emailed link.\nconst canShare = computed(() => typeof navigator !== 'undefined' && typeof navigator.share === 'function');\n\n// humanSize mirrors the Go humanSize() used in the email body (1.4 MB).\nfunction humanSize(b?: number): string {\n if (!b || b <= 0) return '';\n const unit = 1024;\n if (b < unit) return `${b} B`;\n const units = ['K', 'M', 'G', 'T', 'P', 'E'];\n let div = unit, exp = 0;\n for (let n = b / unit; n >= unit; n /= unit) { div *= unit; exp++; }\n return `${(b / div).toFixed(1)} ${units[exp]}B`;\n}\n\nfunction expiryLine(days: number): string {\n if (days > 0) return L(`Bu bağlantı ${days} gün geçerlidir.`, `This link is valid for ${days} day(s).`);\n return L('Bu bağlantının süresi yoktur.', 'This link does not expire.');\n}\n\n// Text + title for a download-share link, mirroring shareMailText().\nfunction shareBody(): { title: string; text: string } {\n const name = pathParts.value.name;\n const url = shareResult.value?.url ?? '';\n const pin = shareResult.value?.pin ?? '';\n const kind = props.isDir ? L('klasör', 'folder') : L('dosya', 'file');\n const title = tr.value\n ? `${name} ${props.isDir ? 'klasörü' : 'dosyası'} sizinle paylaşıldı`\n : `${name} has been shared with you`;\n const lines: string[] = [];\n lines.push(L('Merhaba,', 'Hello,'), '');\n lines.push(L(`Sizinle bir ${kind} paylaşıldı:`, `A ${kind} has been shared with you:`), '');\n if (props.isDir) {\n lines.push(L(`Klasör: ${name}`, `Folder: ${name}`));\n } else {\n lines.push(L(`Dosya: ${name}`, `File: ${name}`));\n const sz = humanSize(props.size);\n if (sz) lines.push(L(`Boyut: ${sz}`, `Size: ${sz}`));\n }\n lines.push('', L('İndirmek için:', 'Download it here:'), url);\n if (pin) lines.push('', L(`PIN (erişim kodu): ${pin}`, `PIN (access code): ${pin}`));\n lines.push('', expiryLine(shareExpiry.value));\n return { title, text: lines.join('\\n') };\n}\n\n// Text + title for a file-drop (upload) link, mirroring dropInviteMailText().\nfunction dropBody(): { title: string; text: string } {\n const folder = pathParts.value.name;\n const url = dropResult.value?.url ?? '';\n const pin = dropResult.value?.pin ?? '';\n const maxFiles = Number(dropMaxFiles.value) || 20;\n const maxMB = Number(dropMaxSizeMB.value) || 500;\n const exts = dropAllowedExt.value.split(/[,\\s]+/).map((s) => s.trim().replace(/^\\./, '')).filter(Boolean);\n const title = L(`${folder} adlı klasöre dosya eklemeniz istendi`, `You've been asked to add files to ${folder}`);\n const lines: string[] = [];\n lines.push(L('Merhaba,', 'Hello,'), '');\n lines.push(L('Dosya yüklemeniz istendi.', \"You've been invited to upload files.\"), '');\n lines.push(L(`Klasör: ${folder}`, `Folder: ${folder}`));\n lines.push(L(`Sınır: en fazla ${maxFiles} dosya, dosya başına ${maxMB} MB.`, `Limit: up to ${maxFiles} file(s), ${maxMB} MB per file.`));\n lines.push(exts.length\n ? L(`İzinli türler: ${exts.join(', ')}`, `Allowed types: ${exts.join(', ')}`)\n : L('İzinli türler: tüm türler', 'Allowed types: all'));\n lines.push('', L('Dosyalarınızı buradan yükleyebilirsiniz:', 'Upload your files here:'), url);\n if (pin) lines.push('', L(`PIN (erişim kodu): ${pin}`, `PIN (access code): ${pin}`));\n lines.push('', expiryLine(dropExpiry.value));\n return { title, text: lines.join('\\n') };\n}\n\nasync function nativeShare(body: { title: string; text: string }) {\n if (!canShare.value) return;\n try {\n await navigator.share(body);\n } catch {\n // user cancelled (AbortError) or the target rejected — nothing to do.\n }\n}\n</script>\n\n<template>\n <div class=\"fx-perm-overlay\" @click.self=\"emit('close')\">\n <div class=\"fx-perm-modal\">\n <header class=\"fx-perm-head\">\n <div class=\"fx-perm-title\">\n <span class=\"fx-perm-ico\" aria-hidden=\"true\">{{ isDir ? '📁' : '📄' }}</span>\n <div class=\"fx-perm-titletext\">\n <h3>{{ L('Paylaş / İzinler', 'Share / Permissions') }}</h3>\n <span class=\"fx-perm-sub\" :title=\"path\">{{ pathParts.name }}<span class=\"fx-perm-subdim\"> · {{ pathParts.adapter }}</span></span>\n </div>\n </div>\n <button class=\"fx-perm-x\" @click=\"emit('close')\" aria-label=\"close\">✕</button>\n </header>\n\n <div class=\"fx-perm-tabs\">\n <button\n v-if=\"canManage\"\n class=\"fx-perm-tab\"\n :class=\"{ 'is-active': tab === 'perms' }\"\n @click=\"tab = 'perms'\"\n >{{ L('Kişiler', 'People') }}</button>\n <button\n class=\"fx-perm-tab\"\n :class=\"{ 'is-active': tab === 'share' }\"\n @click=\"tab = 'share'\"\n >{{ L('Bağlantı', 'Link') }}</button>\n <button\n v-if=\"isDir\"\n class=\"fx-perm-tab\"\n :class=\"{ 'is-active': tab === 'drop' }\"\n @click=\"tab = 'drop'\"\n >{{ L('Dosya İste', 'Request files') }}</button>\n </div>\n\n <div class=\"fx-perm-body\">\n <!-- ───────── Permissions tab ───────── -->\n <template v-if=\"tab === 'perms' && canManage\">\n <div v-if=\"!storageRbac\" class=\"fx-perm-warn\">\n {{ L('Bu diskte RBAC kapalı — izinler yalnızca RBAC açık disklerde geçerli.', 'RBAC is off on this storage — grants only apply when RBAC is enabled.') }}\n </div>\n <div v-if=\"err\" class=\"fx-perm-warn\">{{ err }}</div>\n <div v-if=\"loading\" class=\"fx-perm-muted\">{{ L('Yükleniyor…', 'Loading…') }}</div>\n <template v-else>\n <!-- Add person (primary action, on top) -->\n <div class=\"fx-perm-addcard\">\n <div class=\"fx-perm-add\">\n <div class=\"fx-perm-emailwrap\">\n <input v-model=\"email\" type=\"email\" class=\"fx-perm-input\" autocomplete=\"off\"\n :placeholder=\"L('İsim veya e-posta', 'Name or email')\"\n @input=\"onEmailInput\" @keyup.enter=\"submitEmail\" @focus=\"onEmailInput\" />\n <ul v-if=\"showSuggest\" class=\"fx-perm-suggest\">\n <li v-for=\"u in suggestions\" :key=\"u.id\" @mousedown.prevent=\"pickUser(u)\">\n <span class=\"fx-perm-suggest-av\">{{ (u.display_name || u.email).charAt(0).toUpperCase() }}</span>\n <span class=\"fx-perm-suggest-txt\">\n <span class=\"fx-perm-suggest-name\">{{ u.display_name || u.email }}</span>\n <span class=\"fx-perm-suggest-meta\">{{ u.email }} · {{ u.role }}</span>\n </span>\n </li>\n </ul>\n </div>\n <select v-model=\"level\" class=\"fx-perm-sel\" :title=\"levels.find(o => o.v === level)?.d\">\n <option v-for=\"o in levels\" :key=\"o.v\" :value=\"o.v\">{{ o.l }}</option>\n </select>\n <button class=\"fx-perm-btn fx-perm-btn--primary\" :disabled=\"busy\" @click=\"submitEmail\">\n {{ L('Ekle', 'Add') }}\n </button>\n </div>\n\n <div v-if=\"noAccount\" class=\"fx-perm-invite\">\n <p class=\"fx-perm-muted\">{{ L('Bu e-postada hesap yok. Ne yapmak istersiniz?', 'No account for this email — what next?') }}</p>\n <div class=\"fx-perm-invite-actions\">\n <div class=\"fx-perm-invite-row\">\n <select v-model=\"createRole\" class=\"fx-perm-sel\">\n <option value=\"user\">{{ L('Kullanıcı', 'User') }}</option>\n <option value=\"viewer\">{{ L('Görüntüleyen', 'Viewer') }}</option>\n </select>\n <button class=\"fx-perm-btn fx-perm-btn--primary\" :disabled=\"busy\" @click=\"inviteCreateUser\">\n {{ L('Kullanıcı oluştur + yetki ver', 'Create user + grant') }}\n </button>\n </div>\n <button class=\"fx-perm-btn fx-perm-btn--ghost\" :disabled=\"busy\" @click=\"gotoShareWithMail\">\n {{ L('Sadece paylaşım linki gönder →', 'Just send a share link →') }}\n </button>\n </div>\n </div>\n <div v-if=\"notice\" class=\"fx-perm-notice\">{{ notice }}</div>\n <div v-if=\"inviteResult?.tempPassword\" class=\"fx-perm-reveal\">\n {{ L('Geçici parola:', 'Temp password:') }} <code>{{ inviteResult.tempPassword }}</code>\n </div>\n </div>\n\n <!-- People with access -->\n <div class=\"fx-perm-section\">\n <h4>{{ L('Erişimi olanlar', 'People with access') }}</h4>\n <div v-if=\"!direct.length && !inherited.length\" class=\"fx-perm-empty\">\n {{ L('Henüz kimseyle paylaşılmadı.', 'Not shared with anyone yet.') }}\n </div>\n <div v-for=\"g in direct\" :key=\"'d' + g.id\" class=\"fx-perm-person\">\n <span class=\"fx-perm-av\">{{ ginitial(g) }}</span>\n <span class=\"fx-perm-user\" :title=\"g.user_email\">{{ glabel(g) }}</span>\n <select class=\"fx-perm-sel fx-perm-sel--sm\" :value=\"g.level\"\n @change=\"changeLevel(g, ($event.target as HTMLSelectElement).value)\">\n <option v-for=\"o in levels\" :key=\"o.v\" :value=\"o.v\">{{ o.l }}</option>\n </select>\n <button class=\"fx-perm-del\" :disabled=\"busy\" :title=\"L('Kaldır', 'Remove')\" @click=\"removeGrant(g)\">✕</button>\n </div>\n <div v-for=\"g in inherited\" :key=\"'i' + g.id\" class=\"fx-perm-person fx-perm-inh\">\n <span class=\"fx-perm-av fx-perm-av--dim\">{{ ginitial(g) }}</span>\n <span class=\"fx-perm-user\" :title=\"g.user_email\">{{ glabel(g) }}</span>\n <span class=\"fx-perm-badge\">{{ levelLabel(g.level) }}</span>\n <span class=\"fx-perm-from\" :title=\"L('Üst klasörden gelir', 'Inherited from') + ': ' + (g.path_prefix || '/')\">\n ↳ {{ g.path_prefix || '/' }}\n </span>\n </div>\n </div>\n </template>\n </template>\n\n <!-- ───────── Share tab ───────── -->\n <template v-if=\"tab === 'share'\">\n <div class=\"fx-perm-addcard\">\n <div class=\"fx-perm-share-opts\">\n <label class=\"fx-perm-check\">\n <input type=\"checkbox\" v-model=\"sharePwd\" />\n {{ L('PIN ile koru', 'Protect with a PIN') }}\n </label>\n <label class=\"fx-perm-expiry\">\n <span class=\"fx-perm-muted\">{{ L('Süre', 'Expiry') }}</span>\n <select v-model.number=\"shareExpiry\" class=\"fx-perm-sel fx-perm-sel--sm\">\n <option v-for=\"o in expiryOptions\" :key=\"o.v\" :value=\"o.v\">{{ o.l }}</option>\n </select>\n </label>\n <button class=\"fx-perm-btn fx-perm-btn--primary\" :disabled=\"shareBusy\" @click=\"createLink\">\n {{ L('Bağlantı oluştur', 'Create link') }}\n </button>\n </div>\n\n <div v-if=\"shareErr\" class=\"fx-perm-warn\">{{ shareErr }}</div>\n\n <div v-if=\"shareResult\" class=\"fx-perm-result\">\n <div class=\"fx-perm-linkrow\">\n <a :href=\"shareResult.url\" target=\"_blank\" rel=\"noopener\" class=\"fx-perm-link\">{{ shareResult.url }}</a>\n <button class=\"fx-perm-btn fx-perm-btn--sm\" @click=\"copy(shareResult.url, 'new')\">\n {{ copied === 'new' ? L('Kopyalandı ✓', 'Copied ✓') : L('Kopyala', 'Copy') }}\n </button>\n </div>\n <div v-if=\"shareResult.pin\" class=\"fx-perm-pin\">\n <span>PIN: <code>{{ shareResult.pin }}</code></span>\n <button class=\"fx-perm-btn fx-perm-btn--sm\" @click=\"copy(shareResult.pin, 'sharepin')\">\n {{ copied === 'sharepin' ? L('Kopyalandı ✓', 'Copied ✓') : L('Kopyala', 'Copy') }}\n </button>\n </div>\n\n <!-- send by email (one or more, comma/space separated) -->\n <div class=\"fx-perm-mailrow\">\n <input v-model=\"shareMailTo\" type=\"text\" class=\"fx-perm-input\" autocomplete=\"off\"\n :placeholder=\"L('e-posta(lar) — virgülle ayırın', 'email(s) — comma separated')\" @keyup.enter=\"sendShareMail\" />\n <button class=\"fx-perm-btn\" :disabled=\"shareMailBusy\" @click=\"sendShareMail\">\n {{ L('Gönder', 'Send') }}\n </button>\n </div>\n <div v-if=\"shareMailNotice\" class=\"fx-perm-notice\">{{ shareMailNotice }}</div>\n\n <!-- native share (OS share sheet) — same as the fishapp Paylaş button -->\n <button v-if=\"canShare\" type=\"button\" class=\"fx-perm-btn fx-perm-btn--ghost fx-perm-sharebtn\" @click=\"nativeShare(shareBody())\">\n <span aria-hidden=\"true\">📤</span> {{ L('Paylaş', 'Share') }}\n </button>\n </div>\n <p v-else-if=\"shareMailTo\" class=\"fx-perm-hint\">\n {{ L('Aşağıdan bir bağlantı oluşturun, ardından', 'Create a link below, then it will be sent to') }}\n <strong>{{ shareMailTo }}</strong> {{ L('adresine gönderin.', '.') }}\n </p>\n </div>\n\n <div class=\"fx-perm-section\">\n <h4>{{ L('Mevcut bağlantılar', 'Existing links') }}</h4>\n <div v-if=\"!shares.length\" class=\"fx-perm-empty\">{{ L('Yok', 'None') }}</div>\n <div v-for=\"s in shares\" :key=\"s.uuid\" class=\"fx-perm-person\">\n <span class=\"fx-perm-user fx-perm-link\" :title=\"s.url\">{{ s.url }}</span>\n <button class=\"fx-perm-btn fx-perm-btn--sm\" @click=\"copy(s.url, s.uuid)\">\n {{ copied === s.uuid ? L('✓', '✓') : L('Kopyala', 'Copy') }}\n </button>\n <button class=\"fx-perm-del\" :disabled=\"shareBusy\" :title=\"L('İptal', 'Revoke')\" @click=\"revoke(s)\">✕</button>\n </div>\n </div>\n </template>\n\n <!-- ───────── File-drop (upload link) tab ───────── -->\n <template v-if=\"tab === 'drop'\">\n <div class=\"fx-perm-addcard\">\n <p class=\"fx-perm-muted fx-perm-dropintro\">\n {{ L('Bu klasöre herkesin dosya YÜKLEYEBİLECEĞİ herkese açık bir bağlantı. Yükleyenler klasördeki mevcut dosyaları göremez.', 'A public link that lets anyone UPLOAD files into this folder. Uploaders never see the folder\\'s existing files.') }}\n </p>\n <div class=\"fx-perm-share-opts\">\n <label class=\"fx-perm-check\">\n <input type=\"checkbox\" v-model=\"dropPwd\" />\n {{ L('PIN ile koru', 'Protect with a PIN') }}\n </label>\n <label class=\"fx-perm-expiry\">\n <span class=\"fx-perm-muted\">{{ L('Süre', 'Expiry') }}</span>\n <select v-model.number=\"dropExpiry\" class=\"fx-perm-sel fx-perm-sel--sm\">\n <option v-for=\"o in expiryOptions\" :key=\"o.v\" :value=\"o.v\">{{ o.l }}</option>\n </select>\n </label>\n <button class=\"fx-perm-btn fx-perm-btn--primary\" :disabled=\"dropBusy\" @click=\"createDropLink\">\n {{ L('Bağlantı oluştur', 'Create link') }}\n </button>\n </div>\n\n <button type=\"button\" class=\"fx-perm-btn fx-perm-btn--ghost fx-perm-advtoggle\" @click=\"dropShowAdv = !dropShowAdv\">\n {{ dropShowAdv ? L('Gelişmiş ▲', 'Advanced ▲') : L('Gelişmiş ▼', 'Advanced ▼') }}\n </button>\n <div v-if=\"dropShowAdv\" class=\"fx-perm-adv\">\n <label class=\"fx-perm-adv-row\">\n <span class=\"fx-perm-muted\">{{ L('En fazla dosya', 'Max files') }}</span>\n <input v-model=\"dropMaxFiles\" type=\"number\" min=\"1\" class=\"fx-perm-input fx-perm-input--sm\" placeholder=\"20\" />\n </label>\n <label class=\"fx-perm-adv-row\">\n <span class=\"fx-perm-muted\">{{ L('Dosya başı MB', 'MB / file') }}</span>\n <input v-model=\"dropMaxSizeMB\" type=\"number\" min=\"1\" class=\"fx-perm-input fx-perm-input--sm\" placeholder=\"500\" />\n </label>\n <label class=\"fx-perm-adv-row\">\n <span class=\"fx-perm-muted\">{{ L('İzinli türler', 'Allowed types') }}</span>\n <input v-model=\"dropAllowedExt\" type=\"text\" class=\"fx-perm-input fx-perm-input--sm\" :placeholder=\"L('hepsi (örn. pdf, jpg)', 'all (e.g. pdf, jpg)')\" />\n </label>\n <label class=\"fx-perm-check\">\n <input type=\"checkbox\" v-model=\"dropAskName\" />\n {{ L('Yükleyenin adını sor', 'Ask uploader name') }}\n </label>\n </div>\n\n <div v-if=\"dropErr\" class=\"fx-perm-warn\">{{ dropErr }}</div>\n\n <div v-if=\"dropResult\" class=\"fx-perm-result\">\n <div class=\"fx-perm-linkrow\">\n <a :href=\"dropResult.url\" target=\"_blank\" rel=\"noopener\" class=\"fx-perm-link\">{{ dropResult.url }}</a>\n <button class=\"fx-perm-btn fx-perm-btn--sm\" @click=\"copy(dropResult.url, 'drop')\">\n {{ copied === 'drop' ? L('Kopyalandı ✓', 'Copied ✓') : L('Kopyala', 'Copy') }}\n </button>\n </div>\n <div v-if=\"dropResult.pin\" class=\"fx-perm-pin\">\n <span>PIN: <code>{{ dropResult.pin }}</code></span>\n <button class=\"fx-perm-btn fx-perm-btn--sm\" @click=\"copy(dropResult.pin, 'droppin')\">\n {{ copied === 'droppin' ? L('Kopyalandı ✓', 'Copied ✓') : L('Kopyala', 'Copy') }}\n </button>\n </div>\n\n <!-- email the upload link to one or more people -->\n <div class=\"fx-perm-mailrow\">\n <input v-model=\"dropMailTo\" type=\"text\" class=\"fx-perm-input\" autocomplete=\"off\"\n :placeholder=\"L('e-posta(lar) — virgülle ayırın', 'email(s) — comma separated')\" @keyup.enter=\"sendDropMail\" />\n <button class=\"fx-perm-btn\" :disabled=\"dropMailBusy\" @click=\"sendDropMail\">\n {{ L('Gönder', 'Send') }}\n </button>\n </div>\n <div v-if=\"dropMailNotice\" class=\"fx-perm-notice\">{{ dropMailNotice }}</div>\n\n <!-- native share (OS share sheet) — same as the fishapp Paylaş button -->\n <button v-if=\"canShare\" type=\"button\" class=\"fx-perm-btn fx-perm-btn--ghost fx-perm-sharebtn\" @click=\"nativeShare(dropBody())\">\n <span aria-hidden=\"true\">📤</span> {{ L('Paylaş', 'Share') }}\n </button>\n </div>\n </div>\n </template>\n </div>\n </div>\n </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n this CSS does not match the one Vue stamps onto the DOM — so every rule\n here silently stopped applying. Measured in the desktop app: the share\n dialog had `position: static`, no background and no radius, i.e. raw\n unstyled HTML, in EVERY embedded surface.\n Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n there is nothing here that can leak into a host page. */\n.fx-perm-overlay {\n position: fixed; inset: 0; background: rgba(0, 0, 0, 0.5);\n display: flex; align-items: center; justify-content: center; z-index: 10000;\n font-family: var(--fe-font);\n}\n.fx-perm-modal {\n display: flex; flex-direction: column;\n background: var(--fe-bg); color: var(--fe-text);\n width: min(520px, 94vw); max-height: 86vh;\n border: 1px solid var(--fe-border); border-radius: var(--fe-radius-lg, 14px);\n box-shadow: var(--fe-shadow); font-size: 14px; overflow: hidden;\n}\n/* header + tabs are fixed; only the body scrolls */\n.fx-perm-head {\n display: flex; align-items: center; justify-content: space-between; gap: 10px;\n padding: 16px 18px 12px; flex: none;\n}\n.fx-perm-title { display: flex; align-items: center; gap: 10px; min-width: 0; }\n.fx-perm-ico { font-size: 22px; line-height: 1; }\n.fx-perm-titletext { display: flex; flex-direction: column; min-width: 0; }\n.fx-perm-title h3 { margin: 0; font-size: 15px; font-weight: 600; color: var(--fe-text); }\n.fx-perm-sub {\n font-size: 12px; color: var(--fe-text); max-width: 340px;\n overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\n}\n.fx-perm-subdim { color: var(--fe-text-muted); }\n.fx-perm-x {\n background: none; border: none; font-size: 17px; cursor: pointer;\n color: var(--fe-text-muted); flex: none; line-height: 1; padding: 2px 4px; border-radius: 6px;\n}\n.fx-perm-x:hover { color: var(--fe-text); background: var(--fe-bg-hover); }\n.fx-perm-tabs { display: flex; gap: 2px; padding: 0 18px; border-bottom: 1px solid var(--fe-border); flex: none; }\n.fx-perm-tab {\n background: none; border: none; border-bottom: 2px solid transparent;\n padding: 8px 12px; cursor: pointer; color: var(--fe-text-muted); font-size: 13px;\n font-family: inherit; font-weight: 500;\n}\n.fx-perm-tab:hover { color: var(--fe-text); }\n.fx-perm-tab.is-active { color: var(--fe-primary); border-bottom-color: var(--fe-primary); }\n.fx-perm-body { flex: 1 1 auto; overflow-y: auto; padding: 14px 18px 18px; }\n\n.fx-perm-addcard {\n padding: 12px; border-radius: var(--fe-radius-md, 10px);\n background: var(--fe-bg-elev); border: 1px solid var(--fe-border);\n}\n.fx-perm-section { margin-top: 16px; }\n.fx-perm-section h4 {\n margin: 0 0 8px; font-size: 11px; text-transform: uppercase; letter-spacing: 0.05em; color: var(--fe-text-muted);\n}\n.fx-perm-empty { color: var(--fe-text-muted); font-size: 13px; padding: 8px 2px; }\n\n/* person rows */\n.fx-perm-person { display: flex; align-items: center; gap: 10px; padding: 7px 2px; }\n.fx-perm-person + .fx-perm-person { border-top: 1px solid var(--fe-border); }\n.fx-perm-inh { color: var(--fe-text-muted); }\n.fx-perm-av {\n width: 28px; height: 28px; flex: none; border-radius: 50%;\n display: flex; align-items: center; justify-content: center;\n background: var(--fe-primary); color: var(--fe-text-on-primary, #fff);\n font-size: 12px; font-weight: 600;\n}\n.fx-perm-av--dim { background: var(--fe-bg-hover); color: var(--fe-text-muted); }\n.fx-perm-user { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--fe-text); min-width: 0; }\n.fx-perm-from { font-size: 11px; color: var(--fe-text-muted); white-space: nowrap; }\n.fx-perm-badge {\n font-size: 11px; padding: 2px 9px; border-radius: 999px;\n background: var(--fe-bg-hover); color: var(--fe-text);\n}\n\n/* inputs / selects / buttons */\n.fx-perm-sel, .fx-perm-input {\n padding: 7px 9px; border-radius: var(--fe-radius-sm, 7px); border: 1px solid var(--fe-border);\n background: var(--fe-bg); color: var(--fe-text); font-size: 13px; font-family: inherit;\n}\n.fx-perm-sel--sm { padding: 5px 7px; font-size: 12px; }\n.fx-perm-sel:focus, .fx-perm-input:focus { outline: none; border-color: var(--fe-primary); }\n.fx-perm-add { display: flex; gap: 8px; align-items: stretch; }\n.fx-perm-emailwrap { position: relative; flex: 1; min-width: 120px; }\n.fx-perm-input { width: 100%; box-sizing: border-box; }\n.fx-perm-suggest {\n position: absolute; top: calc(100% + 3px); left: 0; right: 0; z-index: 5; margin: 0; padding: 4px;\n list-style: none; background: var(--fe-bg); border: 1px solid var(--fe-border);\n border-radius: var(--fe-radius-sm, 7px); box-shadow: var(--fe-shadow); max-height: 210px; overflow: auto;\n}\n.fx-perm-suggest li { display: flex; align-items: center; gap: 8px; padding: 6px 8px; border-radius: 6px; cursor: pointer; }\n.fx-perm-suggest li:hover { background: var(--fe-bg-hover); }\n.fx-perm-suggest-av {\n width: 24px; height: 24px; flex: none; border-radius: 50%; display: flex; align-items: center; justify-content: center;\n background: var(--fe-bg-hover); color: var(--fe-text); font-size: 11px; font-weight: 600;\n}\n.fx-perm-suggest-txt { display: flex; flex-direction: column; min-width: 0; }\n.fx-perm-suggest-name { color: var(--fe-text); font-size: 13px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.fx-perm-suggest-meta { color: var(--fe-text-muted); font-size: 11px; }\n.fx-perm-check { display: inline-flex; gap: 6px; align-items: center; font-size: 13px; color: var(--fe-text); cursor: pointer; }\n.fx-perm-btn {\n padding: 7px 13px; border-radius: var(--fe-radius-sm, 7px); border: 1px solid var(--fe-border);\n background: var(--fe-bg); color: var(--fe-text); font-size: 13px; font-family: inherit; cursor: pointer; white-space: nowrap;\n}\n.fx-perm-btn:hover:not(:disabled) { background: var(--fe-bg-hover); }\n.fx-perm-btn:disabled { opacity: 0.55; cursor: default; }\n.fx-perm-btn--sm { padding: 5px 10px; font-size: 12px; }\n.fx-perm-btn--primary { background: var(--fe-primary); border-color: var(--fe-primary); color: var(--fe-text-on-primary, #fff); }\n.fx-perm-btn--primary:hover:not(:disabled) { background: var(--fe-primary-hover, var(--fe-primary)); filter: brightness(1.05); }\n.fx-perm-btn--ghost { background: none; border-color: transparent; color: var(--fe-primary); padding-left: 2px; }\n.fx-perm-btn--ghost:hover:not(:disabled) { background: none; text-decoration: underline; }\n.fx-perm-del { background: none; border: none; color: var(--fe-danger); cursor: pointer; font-size: 14px; flex: none; padding: 2px 4px; }\n.fx-perm-del:hover:not(:disabled) { filter: brightness(1.15); }\n\n/* invite sub-flow */\n.fx-perm-invite {\n margin-top: 10px; padding-top: 10px; border-top: 1px dashed var(--fe-border);\n}\n.fx-perm-invite-actions { display: flex; flex-direction: column; gap: 8px; margin-top: 6px; }\n.fx-perm-invite-row { display: flex; gap: 8px; align-items: stretch; }\n.fx-perm-invite-row .fx-perm-btn--primary { flex: 1; }\n\n/* share result */\n.fx-perm-share-opts { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; }\n.fx-perm-expiry { display: inline-flex; gap: 6px; align-items: center; font-size: 13px; }\n.fx-perm-share-opts .fx-perm-btn--primary { margin-left: auto; }\n.fx-perm-result { margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--fe-border); }\n.fx-perm-linkrow { display: flex; gap: 8px; align-items: center; }\n.fx-perm-link { color: var(--fe-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 1; min-width: 0; text-decoration: none; }\n.fx-perm-link:hover { text-decoration: underline; }\n.fx-perm-pin { margin: 8px 0 0; font-size: 13px; color: var(--fe-text); display: flex; align-items: center; gap: 8px; }\n.fx-perm-pin code, .fx-perm-reveal code { font-family: var(--fe-font-mono, monospace); background: var(--fe-bg-hover); padding: 1px 6px; border-radius: 5px; }\n.fx-perm-mailrow { display: flex; gap: 8px; margin-top: 10px; }\n.fx-perm-mailrow .fx-perm-input { flex: 1; }\n.fx-perm-hint { font-size: 13px; color: var(--fe-text-muted); margin: 10px 0 0; }\n/* native \"Paylaş\" button — sits under the mail row, full width */\n.fx-perm-sharebtn { display: flex; width: 100%; align-items: center; justify-content: center; gap: 6px; margin-top: 8px; }\n\n/* file-drop tab */\n.fx-perm-dropintro { margin: 0 0 12px; line-height: 1.4; }\n.fx-perm-advtoggle { margin-top: 10px; padding-left: 2px; }\n.fx-perm-adv {\n margin-top: 8px; padding-top: 10px; border-top: 1px dashed var(--fe-border);\n display: flex; flex-direction: column; gap: 8px;\n}\n.fx-perm-adv-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; font-size: 13px; }\n.fx-perm-input--sm { width: 130px; padding: 5px 8px; font-size: 12px; }\n\n.fx-perm-warn {\n background: rgba(245, 158, 11, 0.14); border: 1px solid rgba(245, 158, 11, 0.4);\n border-radius: var(--fe-radius-sm, 7px); padding: 8px 10px; font-size: 13px; margin-bottom: 10px; color: var(--fe-text);\n}\n.fx-perm-notice { margin-top: 8px; font-size: 13px; color: var(--fe-text-muted); }\n.fx-perm-reveal { margin-top: 8px; font-size: 13px; word-break: break-all; color: var(--fe-text); }\n.fx-perm-muted { color: var(--fe-text-muted); font-size: 13px; }\n</style>\n","<script setup lang=\"ts\">\n/**\n * FileExplorer — the public Vue component, panel + PWA + standalone use.\n *\n * Orchestrates:\n * - Directory listing (useFileApi)\n * - Chunked multipart upload (useUploadChunked) + drag & drop\n * - Selection + keyboard shortcuts\n * - Context menu (Teleport-based) with per-target actions\n * - Modal flows: newFolder / rename / delete / share / preview\n * - Eager Monaco preload so the code-edit path is snappy\n *\n * All backend endpoints arrive via the `config` prop. Auth is bearer\n * (PWA / OIDC) / CSRF (panel) / basic / none — `useFileApi` swallows\n * the difference.\n */\nimport { computed, customRef, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport type { ExplorerConfig } from './types/ExplorerConfig';\nimport type {\n FileNode,\n ShareInfo,\n ViewMode,\n ClipboardState,\n Capabilities,\n} from './types/FileNode';\nimport { isExternalUsable } from './types/FileNode';\nimport { useFileApi, type GlobalSearchHit } from './composables/useFileApi';\nimport { useUploadChunked, type UploadJob } from './composables/useUploadChunked';\nimport { useSelection } from './composables/useSelection';\nimport { useKeyboardShortcuts } from './composables/useKeyboardShortcuts';\nimport { useLocale } from './composables/useLocale';\nimport { usePendingOps, type PendingOp } from './composables/usePendingOps';\nimport { useRealtime } from './composables/useRealtime';\nimport { useThumbs } from './composables/useThumbs';\nimport { preloadEditor } from './composables/useMonacoLoader';\nimport PresenceBar from './components/PresenceBar.vue';\n\nimport Toolbar, { type SelectionMode } from './components/Toolbar.vue';\nimport StarButton from './components/StarButton.vue';\nimport TagPicker from './components/TagPicker.vue';\nimport RecentlyOpened from './components/RecentlyOpened.vue';\nimport Breadcrumb from './components/Breadcrumb.vue';\nimport ListView from './components/ListView.vue';\nimport GridView from './components/GridView.vue';\nimport GalleryView from './components/GalleryView.vue'; /* wiring:d2 */\nimport ContextMenu, { type ContextAction } from './components/ContextMenu.vue';\nimport UploadProgress from './components/UploadProgress.vue';\nimport PendingOpsTray from './components/PendingOpsTray.vue';\nimport InspectorPanel from './components/InspectorPanel.vue'; /* koru:k1 */\n/* cila:c wiring */\nimport CommandPalette from './components/CommandPalette.vue';\nimport ShortcutsHelp from './components/ShortcutsHelp.vue';\n/* /cila:c wiring */\n/* wiring:c1 — tema galerisi */\nimport ThemeGallery from './components/ThemeGallery.vue';\nimport { useThemeState, applyThemeToEl, syncThemeStyle } from './lib/themes';\n/* /wiring:c1 */\n/* wiring:c2 — shortcut settings modal + Space quick-look overlay */\nimport ShortcutSettings from './components/ShortcutSettings.vue';\nimport QuickLook from './components/QuickLook.vue';\n/* /wiring:c2 */\n/* wiring:c3 — unified operations center */\nimport OperationsCenter from './components/OperationsCenter.vue';\nimport { useOperations } from './composables/useOperations';\n/* /wiring:c3 */\n/* wiring:c4 */\nimport OnboardingTour from './components/OnboardingTour.vue';\n/* /wiring:c4 */\n/* wiring:d1 — sekmeler + tab başına split */\nimport TabBar from './components/TabBar.vue';\nimport SecondaryPane from './components/SecondaryPane.vue';\nimport { useTabs, type TabState } from './composables/useTabs';\n/* /wiring:d1 */\n/* wiring:e2 — uçtan uca şifreli klasörler (docs/E2E-ENCRYPTION.md) */\nimport EncryptedFolderModal from './components/EncryptedFolderModal.vue';\nimport {\n createKeyRing,\n createMarker,\n parseMarker,\n verifyPassword,\n encryptFile,\n decryptFile,\n hasMagic,\n E2E_MARKER_NAME,\n E2E_MAX_FILE_BYTES,\n} from './lib/e2ecrypto';\n/* /wiring:e2 */\n\n/* ui-fix — listing helpers shared with SecondaryPane (single source: the\n internal-entry filter + virtual `.trash` row must be identical in both\n panes or split view shows mismatched rows). */\nimport {\n filterListing,\n showHiddenFiles,\n setShowHiddenFiles,\n injectTrashRow,\n hydrateTrashRow as hydrateTrashRowShared,\n} from './lib/listing';\n\nimport NewFolderModal from './modals/NewFolderModal.vue';\nimport RenameModal from './modals/RenameModal.vue';\nimport DeleteConfirmModal from './modals/DeleteConfirmModal.vue';\nimport ShareModal from './modals/ShareModal.vue';\nimport PreviewModal from './modals/PreviewModal.vue';\nimport ConvertModal from './modals/ConvertModal.vue';\nimport PermissionsModal from './modals/PermissionsModal.vue';\n\nconst props = defineProps<{\n config: ExplorerConfig;\n}>();\n\nconst emit = defineEmits<{\n (e: 'share-created', payload: { path: string; url: string; pin: string | null }): void;\n (e: 'file-opened', file: { path: string; basename: string }): void;\n (e: 'error', err: { message: string; context?: unknown }): void;\n (e: 'upload-progress', p: { uploadId: string; percent: number; done: boolean }): void;\n (\n e: 'selection-change',\n items: Array<{ path: string; basename: string; type: 'file' | 'dir' }>,\n ): void;\n // Fires whenever the viewed folder changes (virtual `<storage>/<rel>` form).\n // Lets a host (e.g. the Explore page's realtime layer) track the current\n // folder without reaching into internal state.\n (e: 'navigate', p: { path: string }): void;\n}>();\n\n// --------------------------------------------------------------------\n// State\n// --------------------------------------------------------------------\n\nconst api = useFileApi(props.config);\n\n// Locale up-front: the pendingOps onSettled callback below (and the undo-toast\n// helpers) need `t()` at runtime, so the catalogue must be constructed before\n// they are wired. Depends only on props — safe this early.\nconst locale = computed(() => props.config.locale || 'tr');\nconst { t } = useLocale(locale);\n\n// Live collaboration (WebSocket file-change events + presence), bundled into the\n// core so every consumer — the native panel AND the embedded webcomponent —\n// gets it. Auth is a short-lived ticket fetched through the same API (works\n// same-origin and proxied cross-origin); it degrades to polling when no live\n// socket is available.\nconst realtime = useRealtime(api, { reload: () => load() });\nconst presenceUsers = realtime.presenceUsers;\n// True while the live socket is unavailable and the explorer runs on the\n// polling fallback — drives the small \"no live connection\" badge. Healthy\n// connections show nothing.\nconst realtimeDegraded = realtime.degraded;\nfunction realtimeRoom(vp: string): string | null {\n const p = (vp || '').replace(/^\\/+|\\/+$/g, '');\n if (p === '.trash' || p.startsWith('.trash/')) return null;\n // The wire form must go through the mode-aware qualify(), exactly like every\n // API call: in single-storage mode currentPath is a BARE relative path\n // (\"projeler/5\") — virtualToWire would mistake its first segment for an\n // adapter (\"projeler://5\") and subscribe a nonexistent room, so presence and\n // live changes silently missed the real folder. An empty p is the storage\n // root — a real room (\"main://\") — not \"no room\"; only the multi-storage\n // drives list (no adapter yet) has none.\n const wire = qualify(p);\n if (!wire || !wire.includes('://') || wire.startsWith('://')) return null;\n return wire;\n}\nonMounted(() => {\n realtime.start();\n realtime.subscribe(realtimeRoom(currentPath.value));\n});\nonBeforeUnmount(() => realtime.stop());\n\n// Authenticated thumbnails — raw thumb_url is root-relative + header-less,\n// which only ever worked for the native same-origin SPA (embedded hosts got\n// empty/broken <img>s). See useThumbs.\nconst thumbs = useThumbs(props.config.apiBase, api);\n\nconst chunked = useUploadChunked(props.config, api);\n\n// Undo registry for async pending ops: when a cleanly-invertible operation\n// (move → reverse move, trash-delete → restore) is queued, its inverse is\n// registered under the op id; once the op settles OK the toast grows a\n// \"Geri Al\" action. Ops without an entry keep the plain settled toast.\nconst opUndo = new Map<number, { message: string; fn: () => Promise<void> }>();\n\nconst pendingOps = usePendingOps(props.config, api, {\n onSettled: (op: PendingOp) => {\n const undo = opUndo.get(op.id);\n opUndo.delete(op.id);\n if (op.status === 'error') {\n flashToast(op.error_message || 'İşlem başarısız');\n } else if (undo) {\n undoToast(`${undo.message} (${op.progress_total})`, undo.fn);\n } else {\n const verb =\n op.op_type === 'copy'\n ? 'Kopyalandı'\n : op.op_type === 'move'\n ? 'Taşındı'\n : 'Silindi';\n flashToast(`${verb} (${op.progress_total})`);\n }\n void load();\n void splitPaneRef.value?.reload(); /* wiring:d1 — ikincil panel de tazelenir */\n },\n});\n\nconst loading = ref(false);\n// rootPath confinement (UX): when set, the explorer treats this folder as its\n// floor — it opens there, never lists the drives root, and can't navigate\n// above it. Security is enforced server-side (X-Filex-Root / token root scope);\n// this is purely the clean-embed presentation. `rootFloor` is the virtual form\n// (`<storage>/<rel>`) used for path comparisons in multi-storage mode.\nconst rootPathProp = (props.config.rootPath || '').trim(); // qualified `<adapter>://<rel>`\nconst rootFloor = rootPathProp.replace('://', '/').replace(/^\\/+|\\/+$/g, '');\nconst initialFloorPath = rootFloor || props.config.initialPath || '';\nconst currentPath = ref<string>(initialFloorPath);\nconst adapter = ref<string>(props.config.defaultAdapter || 'brf');\nconst dirname = ref<string>(initialFloorPath);\nconst files = ref<FileNode[]>([]);\n// RBAC effective level for the current directory ('' = ACL not enforced on\n// this storage → no gating). Drives which write/manage actions are offered.\nconst dirPerm = ref<string>('');\n// The dead deep-link state: set to the requested path when a listing came\n// back 404 (folder doesn't exist) or 403 (RBAC-hidden — rendered identically\n// on purpose so a denied folder doesn't reveal that it exists). '' = none.\nconst notFoundPath = ref<string>('');\n// Listing failure that is NOT a dead link (network error, 5xx): remembered so\n// the body can render a retryable error state instead of a misleading \"this\n// folder is empty\". Only shown when no listing is visible — a failed\n// navigation away from a healthy listing keeps the current list + toast,\n// exactly as before.\nconst loadError = ref<string>('');\nlet loadErrorPath: string | undefined;\nfunction retryLoad() {\n void load(loadErrorPath);\n}\n\nconst VIEW_MODE_KEY = 'brf-file-explorer:view-mode';\nconst viewMode = customRef<ViewMode>((track, trigger) => {\n let value: ViewMode = (() => {\n try {\n const stored = localStorage.getItem(VIEW_MODE_KEY);\n if (stored === 'list' || stored === 'grid' || stored === 'gallery') return stored; /* wiring:d2 */\n } catch {\n /* private mode */\n }\n return props.config.viewMode ?? 'list';\n })();\n return {\n get() {\n track();\n return value;\n },\n set(next) {\n if (next === value) return;\n value = next;\n try {\n localStorage.setItem(VIEW_MODE_KEY, next);\n } catch {\n /* quota */\n }\n trigger();\n },\n };\n});\n/* cila:a density — Toolbar owns the persisted preference (filex.density);\n mirrored here only so the root `.fe` can carry fe--density-compact. */\nconst density = ref<'comfortable' | 'compact'>('comfortable');\nconst searchQuery = ref('');\n// trashMode — true while viewing the filex trash (soft-deleted nodes from the\n// backend trash endpoint), entered by opening the virtual `.trash` row and\n// exited by any normal navigation (load() resets it). Replaces a brittle\n// `currentPath.startsWith('fileman/.trash')` check that never matched the\n// filex backend's storage layout, so trash always looked empty.\nconst trashMode = ref(false);\n// The storage the trash view was entered from, so \"up\" returns there (not the\n// global root). Set in loadTrash().\nconst trashOrigin = ref<string>('');\nconst trashActive = computed(() => trashMode.value);\n\n// When the caller can see exactly ONE storage, the multi-storage root is a\n// one-row list that carries no information — the user clicks through it every\n// single time. Treat that storage as the floor instead: open it directly and\n// stop offering an \"up\" that only leads back to the one row.\n//\n// Empty string means \"not in that situation\" (single-storage mode, or more\n// than one storage visible), which leaves every existing path untouched.\nconst soleStorageName = computed(() => {\n if (!multiStorageRoot.value) return '';\n const list = props.config.storages ?? [];\n return list.length === 1 ? list[0].name : '';\n});\n\n// canGoUp/goUp — toolbar's \"↑ Up one level\" button. In single-storage\n// mode \"\" means the storage root; in multi-storage mode \"\" means\n// the global root (storage list). Both → no parent → button hidden.\nconst canGoUp = computed(() => {\n const p = (currentPath.value ?? '').replace(/^\\/+|\\/+$/g, '');\n if (rootFloor && p === rootFloor) return false; // at the confined floor — nowhere above\n if (soleStorageName.value && p === soleStorageName.value) return false;\n return p.length > 0;\n});\n\n// True when the explorer is showing the synthetic storage list and\n// there's no real backend folder to mutate. New Folder / Upload /\n// Paste are hidden in this state.\nconst atVirtualRoot = computed(() => {\n if (!multiStorageRoot.value) return false;\n return !((currentPath.value ?? '').replace(/^\\/+|\\/+$/g, ''));\n});\n\nfunction goUp() {\n // Leaving the trash view returns to the storage it was opened from, not the\n // global storage-list root.\n if (trashMode.value) {\n void load(trashOrigin.value);\n return;\n }\n const cur = (currentPath.value ?? '').replace(/^\\/+|\\/+$/g, '');\n if (!cur || cur === rootFloor) return;\n // The button is hidden here, but Alt+↑ / Backspace still route through.\n if (soleStorageName.value && cur === soleStorageName.value) return;\n const idx = cur.lastIndexOf('/');\n let parent = idx === -1 ? '' : cur.slice(0, idx);\n // Never step above the confined floor.\n if (rootFloor && !(parent === rootFloor || parent.startsWith(rootFloor + '/'))) parent = rootFloor;\n void load(parent);\n}\n\nconst selection = useSelection(() => files.value);\nwatch(\n () => [...selection.selected.value],\n () => {\n emit(\n 'selection-change',\n selection.nodes.value.map((n) => ({ path: n.path, basename: n.basename, type: n.type })),\n );\n // Presence focus: a single selected file is what the user is \"on\"; a\n // multi-select or folder selection clears it.\n const focusFiles = selection.nodes.value.filter((n) => n.type === 'file');\n realtime.setFocus(focusFiles.length === 1 ? focusFiles[0].basename : null);\n },\n);\n\nconst clipboard = ref<ClipboardState>({ mode: null, items: [], sourcePath: null });\n\nconst capabilitiesData = ref<Capabilities | null>(null);\n\n// Creative UI state: starred / tags / recently-opened. The component\n// helpers (StarButton, TagPicker, RecentlyOpened) handle their own\n// API calls — the explorer just tracks the cross-row state needed to\n// render inline stars and keep the recents tray in sync.\nconst starredIds = ref(new Set<number>());\nconst showRecents = ref(false);\nconst showTagPicker = ref(false);\nconst tagPickerNode = ref<FileNode | null>(null);\nconst recentRefreshKey = ref(0);\n\nasync function loadStarred() {\n try {\n const headers = await buildAuthHeaders();\n const base = props.config.apiBase ?? '';\n const res = await fetch(`${base}/api/files/manager/star/list?limit=500`, {\n headers,\n // ⚠ NOT 'include'. With a bearer token the request is cross-origin for\n // every embedder that serves the UI from a different origin to the API\n // (the desktop app is one), and a credentialed request may not be\n // answered with `Access-Control-Allow-Origin: *` — which is what filex\n // sends. This one line made starred files fail silently in every such\n // install while the rest of the explorer worked.\n credentials: api.credentialsMode(),\n });\n if (!res.ok) return;\n const body = await res.json();\n const rows: { id?: number }[] = Array.isArray(body)\n ? body\n : Array.isArray(body?.entries)\n ? body.entries\n : Array.isArray(body?.nodes)\n ? body.nodes\n : [];\n starredIds.value = new Set(rows.map((n) => n.id).filter((id): id is number => typeof id === 'number'));\n } catch {\n // Silent — backend may be older without the meta routes.\n }\n}\n\nfunction onStarChange(n: FileNode, value: boolean) {\n if (typeof n.id !== 'number') return;\n const next = new Set(starredIds.value);\n if (value) next.add(n.id);\n else next.delete(n.id);\n starredIds.value = next;\n}\n\nasync function markRecent(n: FileNode) {\n if (typeof n.id !== 'number') return;\n try {\n const base = props.config.apiBase ?? '';\n await fetch(`${base}/api/files/manager/recent`, {\n method: 'POST',\n headers: await buildAuthHeaders({ 'Content-Type': 'application/json' }),\n credentials: api.credentialsMode(),\n body: JSON.stringify({ node_id: n.id }),\n });\n recentRefreshKey.value += 1;\n } catch {\n // Silent — the open succeeds, recent tracking is best-effort.\n }\n}\n\nfunction openTagPickerFor(n: FileNode) {\n if (typeof n.id !== 'number') return;\n tagPickerNode.value = n;\n showTagPicker.value = true;\n}\n\nfunction onRecentOpen(entry: { id: number; storage_id?: number; path: string; name: string }) {\n // RecentlyOpened emits the bare row — synthesize a FileNode shaped\n // enough for openNode to route into the editor / preview.\n const node = {\n type: 'file',\n path: entry.path,\n basename: entry.name,\n extension: (entry.name.split('.').pop() || '').toLowerCase(),\n id: entry.id,\n } as unknown as FileNode;\n showRecents.value = false;\n openNode(node);\n}\n\n// Resolution order for each external viewer: explicit config override → live\n// backend probe. The probe is the source of truth: an operator can flip the\n// service \"on\" but if last_check failed (state='error') we still hide the\n// entry so users don't get 503s on click. Explicit config wins because\n// embedders sometimes terminate TLS in front of filex and the backend can't\n// see the public URL.\nconst effectiveOnlyOfficeBase = computed<string | null>(() => {\n if (props.config.onlyOfficeBase) return props.config.onlyOfficeBase;\n const ext = capabilitiesData.value?.external?.onlyoffice;\n if (ext && !isExternalUsable(ext)) return null;\n return capabilitiesData.value?.onlyoffice_url || null;\n});\n\nconst effectiveOnlyOfficeConfigEndpoint = computed<string | null>(() => {\n if (!effectiveOnlyOfficeBase.value) return null;\n return api.endpoints.onlyOfficeConfig || null;\n});\n\nconst effectiveDrawioUrl = computed<string | null>(() => {\n const override = props.config.drawioUrl || props.config.drawioBase;\n if (override) return override;\n const ext = capabilitiesData.value?.external?.drawio;\n if (ext && !isExternalUsable(ext)) return null;\n return capabilitiesData.value?.drawio_url || null;\n});\n\n// Universal converter (p2r3/convert fork). convert_url is only populated by\n// the backend when the \"convert\" external service is enabled, so a simple\n// presence check is enough gating.\nconst effectiveConvertUrl = computed<string | null>(\n () => props.config.convertBase || capabilitiesData.value?.convert_url || null,\n);\n\n// Upload\nconst uploadJobs = ref<UploadJob[]>([]);\nconst fileInputEl = ref<HTMLInputElement | null>(null);\n\n// Modals\nconst showNewFolder = ref(false);\nconst showRename = ref(false);\nconst showDelete = ref(false);\nconst showShare = ref(false);\nconst showPreview = ref(false);\nconst renameTarget = ref<FileNode | null>(null);\n/* ui-fix — açık olan rename/delete/new-folder modal'ı yan panele mi ait?\n * (menü ana panelle aynı; mutasyonlar doğru panele yönlensin diye.) */\nconst mutationInPane = ref(false);\nconst shareTarget = ref<FileNode | null>(null);\nconst activeShare = ref<(ShareInfo & { url: string; filename?: string }) | null>(null);\nconst previewTarget = ref<FileNode | null>(null);\nconst previewMode = ref<'edit' | 'view'>('edit');\nconst showConvert = ref(false);\nconst convertTarget = ref<FileNode | null>(null);\nconst showPerm = ref(false);\nconst permTarget = ref<FileNode | null>(null);\n\n/* === koru:k1 — inspector (details) panel ===\n * Open/closed preference persists under `filex.inspector`; the panel itself\n * mounts with v-if so the closed state leaves zero DOM behind. */\nconst INSPECTOR_LS_KEY = 'filex.inspector';\nconst showInspector = ref<boolean>(\n (() => {\n try {\n return localStorage.getItem(INSPECTOR_LS_KEY) === '1';\n } catch {\n return false;\n }\n })(),\n);\nfunction persistInspector(v: boolean) {\n try {\n localStorage.setItem(INSPECTOR_LS_KEY, v ? '1' : '0');\n } catch {\n /* quota / private mode */\n }\n}\nfunction toggleInspector() {\n showInspector.value = !showInspector.value;\n persistInspector(showInspector.value);\n}\nfunction openInspector() {\n if (!showInspector.value) {\n showInspector.value = true;\n persistInspector(true);\n }\n}\nfunction closeInspector() {\n if (showInspector.value) {\n showInspector.value = false;\n persistInspector(false);\n }\n}\n// Folder summary label for the no-selection state.\nconst inspectorDirLabel = computed(() => {\n if (trashMode.value) return t('node.trash');\n const p = (currentPath.value ?? '').replace(/^\\/+|\\/+$/g, '');\n if (!p) return adapter.value || t('breadcrumb.root');\n return p.split('/').pop() || p;\n});\nfunction onInspectorManage(n: FileNode) {\n permTarget.value = n;\n showPerm.value = true;\n}\n/* === /koru:k1 === */\n\n// RBAC helpers. '' means ACL is not enforced on this storage → full access\n// (the pre-RBAC default). Otherwise 'editor'/'owner' may write; only 'owner'\n// manages permissions. Enforcement is server-side; this just shapes the menu.\nfunction permCanEdit(p: string | undefined): boolean {\n // undefined = ACL not enforced (dev / unwired) → full access. In production\n // the backend always sends a level; 'none'/'viewer' cannot write, only\n // 'editor'/'owner' can.\n return p === undefined || p === 'editor' || p === 'owner';\n}\nfunction permIsOwner(p: string | undefined): boolean {\n return p === 'owner';\n}\n// Effective perm for a selection: a single entry's own perm (falls back to the\n// directory perm), else the directory perm for multi-select / background.\nfunction selPerm(sel: FileNode[]): string {\n if (sel.length === 1 && typeof sel[0]?.perm === 'string') return sel[0].perm as string;\n return dirPerm.value;\n}\n// Can the current user write into the directory being viewed? Gates the\n// toolbar New Folder / Upload / Paste + drag-drop upload.\nconst canWriteHere = computed(() => permCanEdit(dirPerm.value));\n// Empty-state affordances: the \"drop files here\" hint + upload button only\n// make sense in a real writable folder (not the virtual drives root, not the\n// trash view).\nconst emptyCanUpload = computed(\n () => canWriteHere.value && !atVirtualRoot.value && !trashMode.value,\n);\n\n// Context menu\nconst ctxRef = ref<InstanceType<typeof ContextMenu> | null>(null);\nconst rootEl = ref<HTMLElement | null>(null);\nconst toolbarRef = ref<InstanceType<typeof Toolbar> | null>(null);\n\n/* bag:b4 — narrow/embed mini mode.\n * isNarrow: container width < 560px (ResizeObserver on the .fe root, so it\n * tracks the EMBED container, not the viewport) → root gets `fe--narrow`,\n * the toolbar collapses and the upload FAB appears.\n * isCoarse: touch-first device → context menus render as a bottom sheet. */\nconst isNarrow = ref(false);\nconst isCoarse = ref(false);\nlet narrowRO: ResizeObserver | undefined;\nlet coarseMq: MediaQueryList | undefined;\nfunction syncCoarsePointer(e?: MediaQueryListEvent | MediaQueryList) {\n isCoarse.value = !!(e && 'matches' in e && e.matches);\n}\nonMounted(() => {\n if (typeof ResizeObserver !== 'undefined' && rootEl.value) {\n narrowRO = new ResizeObserver((entries) => {\n const w = entries[0]?.contentRect?.width ?? rootEl.value?.clientWidth ?? 0;\n isNarrow.value = w > 0 && w < 560;\n });\n narrowRO.observe(rootEl.value);\n }\n if (typeof window !== 'undefined' && window.matchMedia) {\n coarseMq = window.matchMedia('(pointer: coarse)');\n syncCoarsePointer(coarseMq);\n coarseMq.addEventListener?.('change', syncCoarsePointer);\n }\n});\nonBeforeUnmount(() => {\n narrowRO?.disconnect();\n narrowRO = undefined;\n coarseMq?.removeEventListener?.('change', syncCoarsePointer);\n coarseMq = undefined;\n});\n/* /bag:b4 */\n\n// Toast (tiny, no lib). Evolved into a snackbar: plain messages keep the old\n// 2.5s auto-hide; messages carrying an action (\"Geri Al\") stay 8s and can be\n// dismissed by click or Esc.\ninterface ToastState {\n message: string;\n actionLabel?: string;\n action?: () => void | Promise<void>;\n}\nconst toast = ref<ToastState | null>(null);\nlet toastTimer: ReturnType<typeof setTimeout> | undefined;\nfunction showToast(state: ToastState, ms: number) {\n toast.value = state;\n if (toastTimer) clearTimeout(toastTimer);\n toastTimer = setTimeout(() => (toast.value = null), ms);\n}\nfunction flashToast(msg: string) {\n showToast({ message: msg }, 2500);\n}\nfunction undoToast(message: string, undo: () => Promise<void>) {\n showToast({ message, actionLabel: t('toast.undo'), action: undo }, 8000);\n}\nfunction dismissToast() {\n if (toastTimer) {\n clearTimeout(toastTimer);\n toastTimer = undefined;\n }\n toast.value = null;\n}\nasync function runToastAction() {\n const act = toast.value?.action;\n dismissToast();\n if (!act) return;\n try {\n await act();\n flashToast(t('toast.undone'));\n await load();\n } catch {\n flashToast(t('toast.undo_failed'));\n }\n}\n\n// --------------------------------------------------------------------\n// Data loading\n// --------------------------------------------------------------------\n\n// multiStorageRoot — when on, \"/\" is a virtual folder listing every\n// configured storage as a clickable dir. Path semantics shift:\n//\n// \"\" → global root, list storages\n// \"<storage>\" → that storage's root (api: `<storage>://`)\n// \"<storage>/<rel>\" → deeper folder (api: `<storage>://<rel>`)\n//\n// `qualify()` is overridden inside this mode to translate the\n// slash-separated user path into the wire `<adapter>://<rel>` form.\nconst multiStorageRoot = computed(() => props.config.multiStorageRoot === true);\n\nfunction splitVirtualPath(p: string): { adapter: string; rel: string } {\n const clean = p.replace(/^\\/+|\\/+$/g, '');\n if (!clean) return { adapter: '', rel: '' };\n const slash = clean.indexOf('/');\n if (slash === -1) return { adapter: clean, rel: '' };\n return { adapter: clean.slice(0, slash), rel: clean.slice(slash + 1) };\n}\n\nfunction virtualToWire(p: string): string {\n // Convert `s3-test/example` → `s3-test://example`. Pass-through\n // when the input already carries `://` (legacy callers).\n if (p.includes('://')) return p;\n const { adapter, rel } = splitVirtualPath(p);\n if (!adapter) return ''; // global root — no wire form\n return rel ? `${adapter}://${rel}` : `${adapter}://`;\n}\n\nfunction wireToVirtual(p: string): string {\n // Convert `s3-test://example` → `s3-test/example`.\n const idx = p.indexOf('://');\n if (idx === -1) return p.replace(/^\\/+|\\/+$/g, '');\n const adapter = p.slice(0, idx);\n const rel = p.slice(idx + 3).replace(/^\\/+|\\/+$/g, '');\n return rel ? `${adapter}/${rel}` : adapter;\n}\n\nfunction virtualStorageRows(): FileNode[] {\n // Synthesize a FileNode for every configured storage. Used as the\n // \"/\" listing in multi-storage mode.\n const list = props.config.storages ?? [];\n return list.map((s) => ({\n type: 'dir',\n path: s.name, // virtual path (no adapter prefix)\n basename: s.label || s.name,\n extension: '',\n storage: s.name,\n visibility: 'private',\n file_size: 0,\n mime_type: 'inode/storage',\n extra_metadata: { driver: s.driver, readOnly: s.readOnly },\n } as unknown as FileNode));\n}\n\n// Flip dot-file visibility. Both panes filter at load time rather than in a\n// computed, so the listings are re-fetched instead of re-filtered — that keeps\n// selection and the operations that read `files` working on exactly what is\n// on screen.\nfunction toggleHiddenFiles() {\n setShowHiddenFiles(!showHiddenFiles.value);\n void load();\n void splitPaneRef.value?.reload();\n}\n\nasync function load(path?: string) {\n loading.value = true;\n // Any normal navigation exits trash mode (the trash view is entered only\n // by opening the virtual `.trash` row, which calls loadTrash()).\n trashMode.value = false;\n let requested = path ?? currentPath.value ?? '';\n try {\n notFoundPath.value = '';\n loadError.value = '';\n // Clamp to the confined floor: an empty/above-floor request (incl. a stale\n // persisted path or the drives root) snaps back to rootPath. This both\n // suppresses the multi-storage drives list and blocks up-navigation.\n if (rootFloor) {\n const p = String(requested).replace(/^\\/+|\\/+$/g, '');\n if (!p || !(p === rootFloor || p.startsWith(rootFloor + '/'))) requested = rootFloor;\n }\n\n // Multi-storage virtual root — synthesize a list of storages\n // instead of calling the backend.\n if (multiStorageRoot.value && !virtualToWire(requested)) {\n // One visible storage → skip the one-row list and open it. Recursion is\n // bounded: the recursive call carries a non-empty path, so\n // virtualToWire() resolves and this branch is not re-entered.\n if (soleStorageName.value) return await load(soleStorageName.value);\n currentPath.value = '';\n adapter.value = '';\n dirname.value = '';\n e2eRoot.value = ''; /* wiring:e2 — sanal kökte kilit ekranı olmaz */\n files.value = virtualStorageRows();\n return;\n }\n\n const target = multiStorageRoot.value\n ? virtualToWire(requested)\n : qualify(requested);\n\n const resp = searchQuery.value\n ? await api.search(target, searchQuery.value)\n : await api.index(target);\n adapter.value = resp.adapter;\n dirname.value = resp.dirname;\n dirPerm.value = (resp.perm as string) || '';\n /* wiring:e2 — backend tells us when this dir sits inside an encrypted\n subtree; '' resets on every plain folder. Drives the lock screen. */\n e2eRoot.value = typeof resp.e2e_root === 'string' ? resp.e2e_root : '';\n /* /wiring:e2 */\n files.value = filterListing(resp.files);\n // Inject virtual `.trash` entry at root only — shared helper so the\n // split-view secondary pane shows the exact same row (no row-offset).\n if (injectTrashRow(files.value, resp.adapter, resp.dirname, props.config.trashVisible !== false)) {\n void hydrateTrashRowShared(files.value, resp.adapter, api);\n }\n // currentPath is the user-facing form: `s3-test/example` in\n // multi-storage mode, the bare relative path otherwise.\n currentPath.value = multiStorageRoot.value\n ? wireToVirtual(resp.dirname)\n : stripAdapter(resp.dirname);\n } catch (err) {\n const e = err instanceof Error ? err.message : String(err);\n const status = (err as { status?: number }).status;\n if (status === 404 || status === 403) {\n // Dead deep link (deleted folder, phantom path or RBAC-hidden dir):\n // show the dedicated not-found state instead of a toast over a stale\n // listing that reads as \"this folder is empty\".\n notFoundPath.value = String(requested);\n e2eRoot.value = ''; /* wiring:e2 — ölü linkte kilit ekranı kalmasın */\n files.value = [];\n emit('error', { message: e, context: { path } });\n return;\n }\n // Real failure (network, 5xx). Never swallowed: the error still emits, and\n // it surfaces either as the retryable error state (nothing else on screen)\n // or as the classic toast over the still-visible previous listing.\n loadError.value = e;\n loadErrorPath = typeof requested === 'string' ? requested : undefined;\n emit('error', { message: e, context: { path } });\n if (files.value.length > 0) flashToast(e);\n } finally {\n loading.value = false;\n }\n}\n\nfunction stripAdapter(p: string): string {\n const idx = p.indexOf('://');\n return idx === -1 ? p : p.slice(idx + 3);\n}\n\n// \"Go to root\" escape hatch on the not-found state. load('') clamps to the\n// confined rootFloor on embeds, so this is safe everywhere.\nfunction leaveNotFound() {\n notFoundPath.value = '';\n // Cold-load on a dead deep link: currentPath is still '' (the 404 never\n // committed it), so navigating to root doesn't change it and the\n // watch(currentPath) persistence never fires — the dead hash would\n // survive and a reload would land on the 404 again. Clear it explicitly;\n // if load('') clamps to a confined floor path, the watch fires with the\n // new path and rewrites the hash correctly anyway.\n writePersistedPath('');\n void load('');\n}\n\n// (hydrateTrashRow moved to lib/listing.ts — shared with SecondaryPane.)\n\n// loadTrash — show the backend trash (soft-deleted nodes) as a flat listing.\n// Entered by opening the virtual `.trash` row. Each row keeps its node `id`\n// so restore can target it. Permanent delete is admin-only / auto-purge, so\n// the only mutation offered here is Restore.\nasync function loadTrash() {\n loading.value = true;\n trashOrigin.value = adapter.value || '';\n trashMode.value = true;\n e2eRoot.value = ''; /* wiring:e2 — çöp görünümü şifreli bağlamın dışındadır */\n selection.clear();\n try {\n const { entries } = await api.listTrash();\n files.value = entries.map(\n (e) =>\n ({\n type: 'file',\n id: e.id,\n path: e.storage_name ? `${e.storage_name}://${e.path}` : e.path,\n basename: e.name,\n extension: e.name.includes('.') ? e.name.split('.').pop() || '' : '',\n storage: e.storage_name || '',\n visibility: 'private',\n file_size: e.size,\n mime_type: e.mime || '',\n extra_metadata: { deleted_at: e.deleted_at, ttl_days: e.ttl_days ?? null },\n }) as unknown as FileNode,\n );\n dirname.value = '.trash';\n currentPath.value = '.trash';\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n emit('error', { message: msg, context: { op: 'trash-list' } });\n flashToast(msg);\n } finally {\n loading.value = false;\n }\n}\n\n/**\n * qualify — return `<adapter>://<rel>` for backend calls.\n *\n * The backend's manager handler picks a storage by parsing the\n * adapter prefix. Without one it falls back to `storages[0]`,\n * which 404s on every non-default storage (S3/SFTP/WebDAV in a\n * multi-storage install). All API callers (rename/move/delete/\n * upload/preview/download/share/copy) must use a qualified path.\n *\n * In multi-storage mode `currentPath` is `<storage>/<rel>` (no\n * `://`), so qualify forwards through `virtualToWire` which\n * splits the first segment off as the adapter. In single-storage\n * mode the legacy bare-relative path is glued onto `adapter.value`.\n *\n * `stripAdapter()` stays for cosmetic display logic only\n * (breadcrumb root check, inRoot computation, openPageBase).\n */\nfunction qualify(p: string): string {\n if (p && p.includes('://')) return p;\n if (multiStorageRoot.value) {\n const wire = virtualToWire(p ?? '');\n if (wire) return wire;\n return adapter.value ? `${adapter.value}://` : '';\n }\n if (!p) return `${adapter.value}://`;\n return `${adapter.value}://${p.replace(/^\\/+/, '')}`;\n}\n\n// ----------------------------------------------------------------\n// Undo helpers — compute the inverse of cleanly-invertible operations\n// (move → reverse move, rename → rename back, trash → restore). All\n// paths here are wire form (`<adapter>://<rel>`).\n// ----------------------------------------------------------------\n\nfunction wireBasename(p: string): string {\n const idx = p.indexOf('://');\n const rel = (idx === -1 ? p : p.slice(idx + 3)).replace(/\\/+$/, '');\n const slash = rel.lastIndexOf('/');\n return slash === -1 ? rel : rel.slice(slash + 1);\n}\n\nfunction wireParent(p: string): string {\n const idx = p.indexOf('://');\n const prefix = idx === -1 ? '' : p.slice(0, idx + 3);\n const rel = (idx === -1 ? p : p.slice(idx + 3)).replace(/\\/+$/, '');\n const slash = rel.lastIndexOf('/');\n return slash === -1 ? prefix : prefix + rel.slice(0, slash);\n}\n\n/* ui-fix — iki wire yolun AYNI dizini gösterip göstermediği (trailing-slash\n * ve kök `adapter://` güvenli). Bir öğeyi ZATEN bulunduğu klasöre bırakma\n * (source parent === target) no-op olmalı; aksi halde backend \"kendine\n * kopyala\" 400'ü döner. */\nfunction sameDir(a: string, b: string): boolean {\n const norm = (s: string) => {\n const i = s.indexOf('://');\n const pre = i === -1 ? '' : s.slice(0, i + 3);\n const rel = (i === -1 ? s : s.slice(i + 3)).replace(/\\/+$/, '');\n return pre + rel;\n };\n return norm(a) === norm(b);\n}\n\nfunction wireJoin(dir: string, name: string): string {\n if (!dir) return name;\n return dir.endsWith('://') || dir.endsWith('/') ? dir + name : `${dir}/${name}`;\n}\n\n// Register the inverse of a queued async move under its op id: once the op\n// settles OK, the toast offers \"Geri Al\" which queues the reverse move. The\n// inverse op deliberately gets NO undo entry of its own (no redo ping-pong).\nfunction registerMoveUndo(\n opId: number,\n sources: string[],\n targetWire: string,\n originWire: string | undefined,\n) {\n if (!originWire || !targetWire) return;\n const movedPaths = sources.map((p) => wireJoin(targetWire, wireBasename(p)));\n if (movedPaths.length === 0) return;\n opUndo.set(opId, {\n message: t('toast.moved'),\n fn: async () => {\n const { op } = await api.moveAsync(movedPaths, originWire, targetWire);\n pendingOps.register(op);\n },\n });\n}\n\nwatch(\n () => searchQuery.value,\n () => void load(),\n);\n\n// ----------------------------------------------------------------\n// Path persistence\n// ----------------------------------------------------------------\nconst PATH_LS_KEY = 'brf-file-explorer:path';\n\nfunction persistMode(): 'hash' | 'localStorage' | 'hash+localStorage' | 'none' {\n return props.config.pathPersist ?? 'hash';\n}\n\nfunction hashPersistEnabled(): boolean {\n const m = persistMode();\n return m === 'hash' || m === 'hash+localStorage';\n}\n\n// A pasted/hand-edited hash can carry a stray `%` (a folder literally named\n// \"100%\") that decodeURIComponent rejects — fall back to the raw text.\nfunction safeDecode(s: string): string {\n try {\n return decodeURIComponent(s);\n } catch {\n return s;\n }\n}\n\nfunction readLsPath(): string {\n try {\n return localStorage.getItem(PATH_LS_KEY) || '';\n } catch {\n return '';\n }\n}\n\nfunction readHashPath(): string {\n const h = window.location.hash || '';\n if (!h.startsWith('#')) return '';\n return safeDecode(h.slice(1)).replace(/^\\/+|\\/+$/g, '');\n}\n\nfunction readPersistedPath(): string {\n if (typeof window === 'undefined') return '';\n const mode = persistMode();\n if (mode === 'none') return '';\n if (mode === 'localStorage') return readLsPath();\n const fromHash = readHashPath();\n if (fromHash || mode === 'hash') return fromHash;\n // hash+localStorage with an empty hash: an explicit start path\n // (?storage= deep link / rootPath floor) outranks the remembered folder.\n if (initialFloorPath) return '';\n return readLsPath();\n}\n\nfunction writePersistedPath(path: string) {\n if (typeof window === 'undefined') return;\n const mode = persistMode();\n if (mode === 'none') return;\n if (mode === 'localStorage' || mode === 'hash+localStorage') {\n try {\n if (path) localStorage.setItem(PATH_LS_KEY, path);\n else localStorage.removeItem(PATH_LS_KEY);\n } catch {\n /* private mode / quota */\n }\n if (mode === 'localStorage') return;\n }\n // Encode per segment so folder names with `%`/`#`/`?` survive the URL\n // round-trip while `/` separators stay readable.\n const encoded = path ? path.split('/').map(encodeURIComponent).join('/') : '';\n const target = encoded ? `#${encoded}` : '';\n if ((window.location.hash || '') === target) return;\n // replaceState never fires `hashchange`, so onHashChange only ever sees\n // genuine external edits (paste, back/forward) — no self-echo to suppress.\n history.replaceState(\n null,\n '',\n target || window.location.pathname + window.location.search,\n );\n}\n\nfunction onHashChange() {\n if (!hashPersistEnabled()) return;\n const p = readHashPath();\n if (p && p !== currentPath.value) {\n void load(p);\n }\n}\n\nwatch(currentPath, (p) => {\n writePersistedPath(p);\n emit('navigate', { path: p });\n realtime.subscribe(realtimeRoom(p));\n});\n\n// Let a host force a soft re-fetch of the current folder (reusing the existing\n// list-fetch) — used by the realtime layer to refresh on live change events\n// without a full component remount.\ndefineExpose({ reload: () => load() });\n\nonMounted(async () => {\n // Eagerly start fetching Monaco — the user doesn't pay for it\n // perceptually; click-to-edit hits an in-memory cache.\n preloadEditor();\n\n const fromPersist = readPersistedPath();\n await load(fromPersist || undefined);\n await nextTick();\n rootEl.value?.focus();\n // Best-effort initial fetch — silent if the older backend doesn't\n // expose /api/files/manager/starred. Without this stars never light\n // up on first render even when the row IS starred server-side.\n void loadStarred();\n if (hashPersistEnabled()) {\n window.addEventListener('hashchange', onHashChange);\n }\n if (api.endpoints.opsList) {\n pendingOps.startPolling();\n }\n if (api.endpoints.capabilities) {\n api\n .capabilities()\n .then((cap) => {\n capabilitiesData.value = cap;\n })\n .catch(() => {\n /* swallow — `onlyoffice_url` falls back to null */\n });\n }\n});\n\n// --------------------------------------------------------------------\n// Keyboard\n// --------------------------------------------------------------------\n\n/* cila:c wiring — command palette (Ctrl/Cmd+K) + shortcuts help (?) state */\nconst showPalette = ref(false);\nconst showShortcutsHelp = ref(false);\n/* /cila:c wiring */\n\n/* bul:s3 — palette \"everywhere\" search + open-hit navigation */\n\n// Debounce/min-chars live in the palette; this is just the API call.\nfunction paletteGlobalSearch(q: string): Promise<GlobalSearchHit[]> {\n return api.globalSearch(q, { limit: 8, scope: 'all' });\n}\n\n/**\n * Open a global-search hit: navigate to the file's folder, then select +\n * preview it through the existing openNode mechanics. Hits come back as raw\n * node rows (in-storage relative `path`, numeric `storage_id`), so the\n * storage segment for multi-storage mode is resolved best-effort: an\n * explicit name on the hit (future backends) > the only configured storage\n * > the storage currently open. A wrong guess lands on the existing\n * \"folder not found\" state, which is already a graceful dead-end.\n */\nasync function openSearchHit(hit: GlobalSearchHit) {\n const rel = String(hit.path ?? '').replace(/^\\/+|\\/+$/g, '');\n if (!rel) return;\n const isDir = hit.type === 'dir';\n const slash = rel.lastIndexOf('/');\n const targetRel = isDir ? rel : slash === -1 ? '' : rel.slice(0, slash);\n let target = targetRel;\n if (multiStorageRoot.value) {\n const configured = props.config.storages ?? [];\n const storageName =\n (typeof hit.storage === 'string' && hit.storage) ||\n (typeof hit.storage_name === 'string' && hit.storage_name) ||\n (configured.length === 1 ? configured[0].name : '') ||\n adapter.value;\n if (!storageName) return;\n target = targetRel ? `${storageName}/${targetRel}` : storageName;\n }\n await load(target);\n if (isDir) return;\n const name = String(hit.name ?? rel.slice(slash + 1));\n const node = files.value.find((f) => f.type === 'file' && f.basename === name);\n if (node) {\n selection.click(node.path);\n openNode(node);\n }\n}\n/* /bul:s3 */\n\nuseKeyboardShortcuts(rootEl, {\n onDelete: () => {\n /* ui-fix — kısayol da aktif panele gider (menüyle tutarlı). */\n if (paneIsActive.value) {\n const psel = splitPaneRef.value?.selectedNodes() ?? [];\n if (psel.length) {\n paneCtxTargets.value = psel;\n mutationInPane.value = true;\n showDelete.value = true;\n }\n } else if (!selection.isEmpty.value) {\n mutationInPane.value = false;\n showDelete.value = true;\n }\n },\n onRename: () => {\n if (paneIsActive.value) {\n const psel = splitPaneRef.value?.selectedNodes() ?? [];\n if (psel.length === 1) {\n renameTarget.value = psel[0];\n mutationInPane.value = true;\n showRename.value = true;\n }\n } else if (selection.nodes.value.length === 1) {\n renameTarget.value = selection.nodes.value[0];\n mutationInPane.value = false;\n showRename.value = true;\n }\n },\n onSelectAll: () => (paneIsActive.value ? splitPaneRef.value?.selectAll() : selection.selectAll()) /* wiring:d1 pane-route */,\n onOpen: () => {\n if (paneIsActive.value) return splitPaneRef.value?.openSelected(); /* wiring:d1 pane-route */\n const n = selection.nodes.value[0];\n if (n) openNode(n);\n },\n onClose: () => {\n showNewFolder.value = false;\n showRename.value = false;\n showDelete.value = false;\n showShare.value = false;\n showPreview.value = false;\n ctxRef.value?.hide();\n dismissToast();\n /* koru:k1 — Esc closes the narrow-mode inspector overlay only; the wide\n side panel is a persistent surface toggled by `i` / the toolbar. */\n if (isNarrow.value) closeInspector();\n },\n onFocusSearch: () => toolbarRef.value?.focusSearch(),\n onCut: () => (paneIsActive.value ? paneCut() : cut()) /* wiring:d1 pane-route */,\n onCopy: () => (paneIsActive.value ? paneCopy() : copyToClipboard()) /* wiring:d1 pane-route */,\n onPaste: () => (paneIsActive.value ? void panePaste() : void paste()) /* wiring:d1 pane-route */,\n onGoUp: () => (paneIsActive.value ? splitPaneRef.value?.goUp() : goUp()) /* wiring:d1 pane-route */,\n /* cila:c wiring */\n onPathJump: () => {\n showPalette.value = true;\n },\n onShowHelp: () => {\n showShortcutsHelp.value = true;\n },\n /* /cila:c wiring */\n onQuickLook: () => quickLookToggle() /* wiring:c2 */,\n onToggleHidden: () => toggleHiddenFiles(),\n onToggleInspector: () => toggleInspector() /* koru:k1 */,\n /* wiring:d1 — sekme aksiyonları (registry: tab-new/close/next/prev) */\n onTabNew: () => newTabHere(),\n onTabClose: () => closeTabById(tabsActiveId.value),\n onTabNext: () => nextTab(),\n onTabPrev: () => prevTab(),\n /* /wiring:d1 */\n hasSelection: () => !selection.isEmpty.value,\n});\n\n// --------------------------------------------------------------------\n// Actions\n// --------------------------------------------------------------------\n\nconst OFFICE_EXTS = new Set([\n 'docx', 'xlsx', 'pptx',\n 'doc', 'xls', 'ppt',\n 'odt', 'ods', 'odp',\n]);\nconst TEXT_CODE_EXTS = new Set([\n 'txt', 'md', 'markdown', 'log', 'csv', 'tsv', 'conf', 'ini',\n 'env', 'toml', 'cfg',\n 'json', 'jsonc', 'yaml', 'yml', 'xml', 'svg',\n 'js', 'mjs', 'cjs', 'ts', 'tsx', 'jsx',\n 'css', 'scss', 'sass', 'less',\n 'html', 'htm', 'vue', 'svelte',\n 'php', 'py', 'rb', 'rs', 'go', 'java', 'kt', 'swift',\n 'cpp', 'c', 'h', 'hpp', 'cs', 'dart',\n 'sh', 'bash', 'zsh', 'sql', 'lua', 'pl', 'r',\n 'dockerfile', 'gradle', 'gitignore',\n]);\n\nfunction openNode(n: FileNode) {\n // The virtual `.trash` row opens the backend trash listing, not a real dir.\n if (n.basename === '.trash') {\n void loadTrash();\n return;\n }\n if (n.type === 'dir') {\n // Multi-storage virtual rows have a bare path (`s3-test`); pass\n // them straight to load() which will treat them as the wire form\n // for that storage's root. Real backend rows still come back as\n // `<adapter>://<rel>` and stripAdapter turns them into the user\n // path semantics load() expects.\n const target = multiStorageRoot.value\n ? wireToVirtual(n.path)\n : stripAdapter(n.path);\n void load(target);\n return;\n }\n /* wiring:e2 — şifreli klasörde dosya açma: kilit açıksa çöz + salt-okunur\n önizleme (blob URL mevcut viewer'lara gider); kilitliyken hiçbir şey\n açılmaz (kilit ekranı zaten listeyi kapatır). */\n if (e2eUnlocked.value && n.type === 'file') {\n void e2eOpenPreview(n);\n return;\n }\n if (e2eLocked.value && n.type === 'file') return;\n /* /wiring:e2 */\n // \"Aç\" / double-click contract: open in a new tab against the\n // standalone editor route, regardless of file type. The editor page\n // picks the right viewer (OnlyOffice for office, Monaco for code/\n // text, drawio iframe for .drawio, image/PDF/3D viewers otherwise)\n // and wires save-on-change. This is the shape brf-mono ships and\n // what users expect from a Files-style file manager.\n //\n // Capability gate: if we already know the required backend is offline\n // (OnlyOffice for office docs, drawio for diagrams), don't launch a\n // new tab that we'd just render a \"service not configured\" fallback\n // inside — drop into the in-page preview instead, which is the same\n // dead-end UI but without the tab-switching whiplash.\n // Double-click contract: in-page modal preview. Office docs and\n // other read-only kinds open in view mode so a quick peek doesn't\n // mount an editing surface on top of the content. Code/markdown\n // open in edit so the user gets the fast \"open, tweak, Ctrl+S\"\n // loop. Modal's \"Yeni sekmede aç\" button still launches the\n // standalone fullscreen editor route when richer editing is wanted.\n const ext = (n.extension || '').toLowerCase();\n // RBAC: viewers (no edit on this item) always get the read-only preview\n // modal — never the editable surface. This is the \"view vs edit\" split.\n previewMode.value = permCanEdit((n.perm as string) ?? dirPerm.value)\n ? previewModeForExt(ext)\n : 'view';\n previewTarget.value = n;\n showPreview.value = true;\n emit('file-opened', { path: n.path, basename: n.basename });\n void markRecent(n);\n}\n\nconst VIEW_DEFAULT_EXTS = new Set<string>([\n ...OFFICE_EXTS,\n 'drawio', 'dio',\n 'pdf', 'epub', 'ipynb', 'tiff', 'tif', 'psd',\n 'mmd', 'mermaid',\n 'glb', 'gltf', 'obj', 'stl', 'fbx', '3ds',\n 'zip', 'rar', '7z', 'tar', 'gz', 'tgz',\n 'jpg', 'jpeg', 'png', 'webp', 'gif', 'bmp', 'avif', 'svg', 'heic',\n 'mp4', 'webm', 'mov', 'mkv', 'm4v', 'ogv',\n 'mp3', 'wav', 'ogg', 'flac', 'm4a', 'aac', 'opus',\n]);\n\nfunction previewModeForExt(ext: string): 'view' | 'edit' {\n if (VIEW_DEFAULT_EXTS.has(ext)) return 'view';\n return 'edit';\n}\n\nasync function restoreSelection(targets?: FileNode[]) {\n const nodes = targets ?? selection.nodes.value;\n if (nodes.length === 0) return;\n try {\n // filex trash: restore by node id, then refresh the trash listing.\n if (trashMode.value) {\n const ids = nodes\n .map((n) => (n as { id?: number }).id)\n .filter((x): x is number => typeof x === 'number');\n const { restored } = await api.restoreIds(ids);\n flashToast(`${restored} öğe geri getirildi`);\n selection.clear();\n await loadTrash();\n return;\n }\n // Legacy path-based restore (brf-mono `.trash/` convention).\n if (!api.endpoints.restore) return;\n const items = nodes.map((n) => n.path); // qualified\n const { restored } = await api.restore(items);\n flashToast(`${restored} öğe geri getirildi`);\n selection.clear();\n await load();\n } catch (err) {\n emit('error', { message: (err as Error).message, context: { op: 'restore' } });\n }\n}\n\nfunction previewNode(n: FileNode) {\n /* wiring:e2 — önizleme de çözülmüş blob'dan beslenir */\n if (e2eUnlocked.value && n.type === 'file') {\n void e2eOpenPreview(n);\n return;\n }\n /* /wiring:e2 */\n previewMode.value = 'view';\n previewTarget.value = n;\n showPreview.value = true;\n void markRecent(n);\n}\n\n/**\n * openNodeInNewTab — launches the standalone /files/edit route in a\n * fresh tab. Used by the context-menu \"Aç\" action; double-click stays\n * on the in-page modal path. Dirs still navigate inline (no editor for\n * directories). Falls back to the modal if no `openPageBase` is wired\n * by the embedder.\n */\nfunction openNodeInNewTab(n: FileNode) {\n if (n.type === 'dir') {\n const target = multiStorageRoot.value\n ? wireToVirtual(n.path)\n : stripAdapter(n.path);\n void load(target);\n return;\n }\n /* wiring:e2 — standalone editör rotası sunucudan HAM (şifreli) baytı\n çeker; şifreli klasörde her \"Aç\" in-page çözülmüş önizlemeye iner. */\n if (e2eActive.value) {\n if (e2eUnlocked.value) void e2eOpenPreview(n);\n return;\n }\n /* /wiring:e2 */\n // RBAC: a viewer (no edit on this item) can't use the editable \"Aç\"\n // surface — drop to the read-only in-page preview instead.\n if (!permCanEdit((n.perm as string) ?? dirPerm.value)) {\n previewNode(n);\n return;\n }\n const ext = (n.extension || '').toLowerCase();\n const base = props.config.openPageBase;\n if (!base) {\n // Embedder didn't supply a standalone editor route — keep the\n // in-page modal as the only available affordance.\n openNode(n);\n return;\n }\n // Context-menu \"Aç\" is the intent-to-edit action — request edit\n // mode so OnlyOffice / Monaco mount with write permissions.\n // Read-only inspection lives on the \"Önizle\" entry + the dbl-click\n // in-page modal.\n const sep = base.includes('?') ? '&' : '?';\n const url =\n `${base}${sep}path=${encodeURIComponent(n.path)}` +\n `&type=${encodeURIComponent(ext)}` +\n `&mode=edit`;\n window.open(url, '_blank', 'noopener');\n emit('file-opened', { path: n.path, basename: n.basename });\n void markRecent(n);\n}\n\ntype ContextMode = 'selection' | 'breadcrumb' | 'pane' /* ui-fix — yan panel sağ-tık */;\nconst ctxMode = ref<ContextMode>('selection');\nconst breadcrumbCtxPath = ref<string>('');\n/* ui-fix — yan panel sağ-tık menüsünün hedef node'ları (pane selection). */\nconst paneCtxTargets = ref<FileNode[]>([]);\nconst breadcrumbCtxLabel = ref<string>('');\n\nconst selectionMode = computed<SelectionMode>(() => {\n const sel = selection.nodes.value;\n if (sel.length === 0) return 'none';\n if (sel.length === 1) return sel[0].type === 'dir' ? 'single-dir' : 'single-file';\n return 'multi';\n});\n\nasync function onToolbarAction(key: string) {\n const sel = selection.nodes.value;\n // The toolbar's \"Aç\" opens the in-page preview/editor modal (quick peek);\n // everything else shares dispatchItemAction with the context menu so the two\n // identical menus also behave identically.\n if (key === 'open') {\n if (sel[0]) openNode(sel[0]);\n return;\n }\n await dispatchItemAction(key, sel);\n}\n\nasync function onContextTarget(node: FileNode, ev: MouseEvent) {\n ctxMode.value = 'selection';\n if (!selection.has(node.path)) {\n selection.click(node.path);\n await nextTick();\n }\n ctxRef.value?.show({ clientX: ev.clientX, clientY: ev.clientY }, selection.nodes.value);\n}\n\nfunction onContextCanvas(ev: MouseEvent) {\n ev.preventDefault();\n ctxMode.value = 'selection';\n selection.clear();\n ctxRef.value?.show({ clientX: ev.clientX, clientY: ev.clientY }, []);\n}\n\nfunction onCrumbContext(payload: { x: number; y: number; adapterPath: string; label: string }) {\n ctxMode.value = 'breadcrumb';\n breadcrumbCtxPath.value = payload.adapterPath;\n breadcrumbCtxLabel.value = payload.label;\n ctxRef.value?.show({ clientX: payload.x, clientY: payload.y }, []);\n}\n\n/* ui-fix — yan (ikincil) panelde sağ-tık: pane'i aktifleştir + menüyü aç.\n * Menü ana panelle BİREBİR aynı (selectionActionList tek kaynak); aksiyonlar\n * dispatchItemAction'a gider ve ctxMode==='pane' iken pane-route'lanır. */\nfunction onPaneContext(node: FileNode | null, ev: MouseEvent) {\n activePane.value = 'split';\n const sel = splitPaneRef.value?.selectedNodes() ?? [];\n // node=null (boş alana sağ-tık): seçimsiz menü (Yeni Klasör + Yapıştır).\n // Aksi halde pane seçimi (yoksa tıklanan node) hedeftir.\n paneCtxTargets.value = node ? (sel.length > 0 ? sel : [node]) : [];\n ctxMode.value = 'pane';\n ctxRef.value?.show({ clientX: ev.clientX, clientY: ev.clientY }, paneCtxTargets.value);\n}\n\nconst contextActions = computed<ContextAction[]>(() => {\n if (ctxMode.value === 'breadcrumb') {\n return [\n { key: 'open', label: t('ctx.open'), icon: '↗' },\n { key: 'copy-path', label: t('breadcrumb.copy_path'), icon: '📋' },\n ];\n }\n if (ctxMode.value === 'pane' /* ui-fix — yan panel menüsü ana panelle BİREBİR aynı */) {\n const psel = paneCtxTargets.value;\n if (psel.length === 0) {\n // Boş alana sağ-tık: ana paneldeki canvas menüsüyle aynı.\n return [\n { key: 'new-folder', label: t('toolbar.new_folder'), icon: '📁' },\n { key: 'paste', label: t('ctx.paste'), icon: '📋', disabled: !clipboard.value.mode },\n ];\n }\n return selectionActionList(psel);\n }\n\n const sel = selection.nodes.value;\n const any = sel.length > 0;\n const single = sel.length === 1;\n\n if (trashActive.value) {\n if (!any) return [];\n return [\n { key: 'restore', label: t('ctx.restore'), icon: '↩' },\n { divider: true, key: 'sep1', label: '' },\n { key: 'delete', label: t('ctx.delete_perm'), icon: '🗑', danger: true },\n ];\n }\n\n // Storage roots (the virtual rows shown at the multi-storage \"/\"\n // overview) aren't real filesystem entries — they're mount points.\n // Hide every mutation entry (rename/delete/share/cut/copy/new-folder/\n // paste) and only offer \"Aç\" so the menu doesn't surface actions\n // that would 4xx on the backend.\n //\n // PRIOR BUG: this used `currentPath === '/'` but the load() branch\n // for the virtual root sets currentPath to EMPTY string, not '/'.\n // So the guard never fired and every mutation action leaked into\n // the menu at the depo listing — including new-folder + paste,\n // which Burak called out in the most direct possible terms. Use\n // the same empty-after-trim test as `atVirtualRoot` above.\n const trimmedPath = (currentPath.value ?? '').replace(/^\\/+|\\/+$/g, '');\n const inStorageRoot = multiStorageRoot.value && trimmedPath === '';\n if (inStorageRoot) {\n if (!any) return [];\n if (!single) return [];\n return [\n { key: 'open', label: t('ctx.open'), icon: '↗' },\n { key: 'open-tab', label: t('ctx.open_new_tab'), icon: '⧉' } /* wiring:d1 */,\n ];\n }\n\n // Empty background right-click: folder-level actions only. Viewers (no edit\n // on this dir) get nothing here.\n if (!any) {\n // Showing hidden files is a VIEW preference, so it stays available to\n // viewers too — the edit gate below only covers the mutating actions.\n const view: ContextAction[] = [\n {\n key: 'toggle-hidden',\n label: showHiddenFiles.value ? t('ctx.hide_hidden') : t('ctx.show_hidden'),\n icon: showHiddenFiles.value ? '🙈' : '👁',\n },\n ];\n if (!permCanEdit(dirPerm.value)) return view;\n return [\n { key: 'new-folder', label: t('toolbar.new_folder'), icon: '📁' },\n { key: 'paste', label: t('ctx.paste'), icon: '📋', disabled: !clipboard.value.mode },\n ...view,\n ];\n }\n\n return selectionActionList(sel);\n});\n\n// selectionActionList — the SINGLE source of truth for the actions offered on a\n// selection. BOTH the right-click context menu AND the top toolbar render this\n// exact list so they can never drift apart (Burak: \"sağ klik menüyle üst menü\n// tutmuyor\"). The toolbar filters out dividers/hidden; the context menu shows\n// them. Action handling is unified in dispatchItemAction().\nfunction selectionActionList(sel: FileNode[]): ContextAction[] {\n const any = sel.length > 0;\n const single = sel.length === 1;\n const isFile = single && sel[0]?.type === 'file';\n const tagsLabel = locale.value === 'en' ? 'Tags…' : 'Etiketler…';\n const singleHasId = single && typeof sel[0]?.id === 'number';\n const copyIdLabel = locale.value === 'en' ? 'Copy node id' : \"Node id'yi kopyala\";\n // RBAC: gate mutating actions when the caller lacks edit on the target. The\n // \"İzinler\" (permissions) action shows only for owners on RBAC-on storages.\n const p = selPerm(sel);\n const w = permCanEdit(p); // may write here\n // Unified \"Paylaş / İzinler\" popup: public share link (editor+) + per-user\n // permissions (owner-only, decided inside the modal).\n // Unified \"Paylaş / İzinler\" popup carries the public share link, per-user\n // permissions AND the folder-only \"Dosya İste\" (file-drop) tab — the user\n // picks the action from inside the modal, so there's no separate button.\n const accessLabel = locale.value === 'en' ? 'Share / Permissions' : 'Paylaş / İzinler';\n return [\n { key: 'open', label: t('ctx.open'), icon: '↗', hidden: !single },\n { key: 'open-tab', label: t('ctx.open_new_tab'), icon: '⧉', hidden: !single || sel[0]?.type !== 'dir' } /* wiring:d1 — klasörü yeni sekmede aç */,\n { key: 'preview', label: t('ctx.preview'), icon: '👁', hidden: !single, disabled: !isFile },\n { key: 'download', label: t('ctx.download'), icon: '⬇', hidden: !single, disabled: !isFile },\n { key: 'convert', label: t('ctx.convert'), icon: '🔄', hidden: !single || !effectiveConvertUrl.value || !w || e2eActive.value /* wiring:e2 — convert ciphertext'e anlamsız */, disabled: !isFile },\n { key: 'access', label: accessLabel, icon: '🔗', hidden: !single || !w || e2eActive.value /* wiring:e2 — paylaşım MVP'de kapalı (link ciphertext verir) */ },\n { key: 'details', label: t('ctx.details'), icon: 'ℹ', hidden: !any } /* koru:k1 */,\n { key: 'copy-id', label: copyIdLabel, icon: '🆔', hidden: !singleHasId, disabled: !singleHasId },\n { divider: true, key: 'sep1', label: '', hidden: !w },\n { key: 'rename', label: t('ctx.rename'), icon: '✎', hidden: !single || !w, disabled: !single },\n { key: 'cut', label: t('ctx.cut'), icon: '✂', hidden: !any || !w, disabled: !any },\n { key: 'copy', label: t('ctx.copy'), icon: '❐', hidden: !any, disabled: !any },\n { key: 'paste', label: t('ctx.paste'), icon: '📋', hidden: !w, disabled: !clipboard.value.mode },\n { divider: true, key: 'sep-meta', label: '', hidden: !singleHasId },\n { key: 'tags', label: tagsLabel, icon: '🏷', hidden: !singleHasId, disabled: !singleHasId },\n { divider: true, key: 'sep2', label: '', hidden: !w },\n { key: 'delete', label: t('ctx.delete'), icon: '🗑', danger: true, hidden: !any || !w, disabled: !any },\n ];\n}\n\n// toolbarActions — what the top toolbar shows. Mirrors the context menu so the\n// two stay identical for a selection; the empty/trash/virtual-root cases match\n// the context menu's special branches.\nconst toolbarActions = computed<ContextAction[]>(() => {\n const sel = selection.nodes.value;\n if (trashActive.value) {\n if (sel.length === 0) return [];\n return [\n { key: 'restore', label: t('ctx.restore'), icon: '↩' },\n { key: 'delete', label: t('ctx.delete_perm'), icon: '🗑', danger: true },\n ];\n }\n const trimmedPath = (currentPath.value ?? '').replace(/^\\/+|\\/+$/g, '');\n if (multiStorageRoot.value && trimmedPath === '') {\n return sel.length === 1 ? [{ key: 'open', label: t('ctx.open'), icon: '↗' }] : [];\n }\n if (sel.length === 0) return [];\n return selectionActionList(sel);\n});\n\nasync function onContextAction(action: ContextAction, targets: FileNode[]) {\n if (ctxMode.value === 'breadcrumb') {\n if (action.key === 'open') {\n void load(stripAdapter(breadcrumbCtxPath.value));\n } else if (action.key === 'copy-path') {\n await onCopyPath(breadcrumbCtxPath.value);\n }\n return;\n }\n if (ctxMode.value === 'pane' /* ui-fix — yan panel: aynı dispatch, pane-route */) {\n await dispatchItemAction(action.key, paneCtxTargets.value);\n return;\n }\n await dispatchItemAction(action.key, targets);\n}\n\n// dispatchItemAction — unified handler for an action key on a target set. Both\n// the right-click menu (onContextAction) and the toolbar (onToolbarAction)\n// route here, so the two menus that now render the SAME list also behave the\n// same. (Toolbar \"Aç\" is the one deliberate exception — see onToolbarAction.)\nasync function dispatchItemAction(key: string, targets: FileNode[]) {\n switch (key) {\n case 'open':\n // Context-menu \"Aç\" launches the standalone fullscreen route\n // in a new tab. Double-click (openNode) opens the in-page\n // modal — two distinct affordances on purpose: quick peek vs\n // dedicated editing surface.\n if (targets[0]) openNodeInNewTab(targets[0]);\n break;\n case 'preview':\n if (targets[0]) previewNode(targets[0]);\n break;\n case 'download':\n if (targets[0]) downloadFile(targets[0]);\n break;\n case 'convert':\n if (targets[0]) openConvert(targets[0]);\n break;\n case 'share':\n if (targets[0]) openShare(targets[0]);\n break;\n case 'access':\n if (targets[0]) {\n permTarget.value = targets[0];\n showPerm.value = true;\n }\n break;\n case 'details' /* koru:k1 */:\n openInspector();\n break;\n case 'copy-id':\n if (targets[0] && typeof targets[0].id === 'number') {\n const id = targets[0].id;\n navigator.clipboard?.writeText(String(id)).then(\n () => flashToast(locale.value === 'en' ? `Node id ${id} copied` : `Node id ${id} kopyalandı`),\n () => flashToast(`#${id}`),\n );\n }\n break;\n case 'tags':\n if (targets[0]) openTagPickerFor(targets[0]);\n break;\n case 'rename':\n if (targets[0]) {\n renameTarget.value = targets[0];\n mutationInPane.value = ctxMode.value === 'pane'; /* ui-fix */\n showRename.value = true;\n }\n break;\n case 'cut':\n /* ui-fix — pane bağlamında pano kaynağı pane'in dizini olmalı. */\n if (ctxMode.value === 'pane') paneCut();\n else {\n clipboard.value = { mode: 'cut', items: targets, sourcePath: currentPath.value };\n flashToast('Kes → Yapıştır hazır');\n }\n break;\n case 'copy':\n if (ctxMode.value === 'pane') paneCopy();\n else {\n clipboard.value = { mode: 'copy', items: targets, sourcePath: currentPath.value };\n flashToast('Kopyala → Yapıştır hazır');\n }\n break;\n case 'paste':\n /* ui-fix — sağ-klik menüsünden yapıştırma da aktif panele gider\n * (klavye kısayolu zaten pane-route'luydu; menü değildi). */\n if (ctxMode.value === 'pane' || paneIsActive.value) await panePaste();\n else await paste();\n break;\n case 'delete':\n mutationInPane.value = ctxMode.value === 'pane'; /* ui-fix */\n showDelete.value = true;\n break;\n case 'restore':\n if (targets.length > 0) await restoreSelection(targets);\n break;\n case 'toggle-hidden':\n toggleHiddenFiles();\n break;\n case 'new-folder':\n mutationInPane.value = ctxMode.value === 'pane'; /* ui-fix */\n showNewFolder.value = true;\n break;\n case 'duplicate':\n if (targets[0]) await duplicate(targets[0]);\n break;\n /* wiring:d1 — sağ-tık \"Yeni sekmede aç\" */\n case 'open-tab':\n if (targets[0]) openNodeInTab(targets[0]);\n break;\n /* /wiring:d1 */\n }\n}\n\nfunction cut() {\n if (selection.isEmpty.value) return;\n clipboard.value = { mode: 'cut', items: selection.nodes.value, sourcePath: currentPath.value };\n flashToast('Kesildi');\n}\n\nfunction copyToClipboard() {\n if (selection.isEmpty.value) return;\n clipboard.value = { mode: 'copy', items: selection.nodes.value, sourcePath: currentPath.value };\n flashToast('Kopyalandı');\n}\n\nasync function paste() {\n const cb = clipboard.value;\n if (!cb.mode || cb.items.length === 0) return;\n try {\n const items = cb.items.map((n) => n.path); // already qualified (adapter://rel)\n const sourceDir = cb.sourcePath || '';\n const sameDir = cb.mode === 'cut' && sourceDir === currentPath.value;\n if (sameDir) {\n flashToast('Aynı klasöre kesilemez');\n return;\n }\n\n if (cb.mode === 'cut') {\n const targetWire = qualify(currentPath.value);\n const originWire = qualify(sourceDir) || undefined;\n const { op } = await api.moveAsync(items, targetWire, originWire);\n registerMoveUndo(op.id, items, targetWire, originWire);\n pendingOps.register(op);\n flashToast('Taşıma kuyruğa alındı');\n } else {\n const { op } = await api.copy(items, qualify(currentPath.value));\n pendingOps.register(op);\n flashToast('Kopyalama kuyruğa alındı');\n }\n clipboard.value = { mode: null, items: [], sourcePath: null };\n } catch (err) {\n emit('error', { message: (err as Error).message, context: { op: 'paste' } });\n }\n}\n\nasync function duplicate(n: FileNode) {\n try {\n const { op } = await api.copy([n.path], qualify(currentPath.value));\n pendingOps.register(op);\n } catch (err) {\n emit('error', { message: (err as Error).message, context: { op: 'duplicate' } });\n }\n}\n\nfunction downloadFile(n: FileNode) {\n /* wiring:e2 — şifreli klasörde indirme: baytları çek, çöz, orijinal adla\n kaydet (ham ciphertext'i kullanıcıya vermek anlamsız). */\n if (e2eUnlocked.value) {\n void e2eDownload(n);\n return;\n }\n /* /wiring:e2 */\n // Keep `<adapter>://<rel>` so backend resolves the right storage\n // (stripping it would default to the first storage, which 404s for\n // any non-default storage like S3/SFTP/WebDAV).\n const url = api.downloadUrl(n.path);\n window.open(url, '_blank');\n}\n\n// ------- Modals -------\n\nasync function submitNewFolder(name: string) {\n const inPane = mutationInPane.value; /* ui-fix — yan panelde yeni klasör */\n try {\n const dirWire = inPane ? qualify(splitPaneRef.value?.getPath() ?? '') : qualify(currentPath.value);\n await api.newFolder(dirWire, name);\n showNewFolder.value = false;\n if (inPane) await splitPaneRef.value?.reload();\n else await load();\n } catch (err) {\n emit('error', { message: (err as Error).message, context: { op: 'newfolder' } });\n }\n}\n\nasync function submitRename(name: string) {\n const target = renameTarget.value;\n if (!target) return;\n const inPane = mutationInPane.value; /* ui-fix — yan panelden yeniden adlandırma */\n try {\n const dirWire = inPane ? qualify(splitPaneRef.value?.getPath() ?? '') : qualify(currentPath.value);\n const oldPath = target.path; // qualified\n const oldName = target.basename;\n await api.rename(dirWire, oldPath, name);\n showRename.value = false;\n renameTarget.value = null;\n if (inPane) await splitPaneRef.value?.reload();\n else await load();\n // Clean inverse: rename the new path back to the old basename.\n if (name && name !== oldName) {\n const newPath = wireJoin(wireParent(oldPath), name);\n undoToast(t('toast.renamed'), async () => {\n await api.rename(dirWire, newPath, oldName);\n });\n }\n } catch (err) {\n emit('error', { message: (err as Error).message, context: { op: 'rename' } });\n }\n}\n\nasync function confirmDelete() {\n // In the trash view, items are already soft-deleted. Permanent removal is\n // admin-only (and the backend auto-purges after the retention window), so\n // offer Restore here rather than a delete that would just re-trash a path.\n if (trashMode.value) {\n showDelete.value = false;\n flashToast('Çöpteki öğeler saklama süresi sonunda otomatik silinir. Kalıcı silme yönetici panelinden yapılır.');\n return;\n }\n /* ui-fix — yan panelden silme: hedefler + dizin + tazeleme pane'e ait. */\n const inPane = mutationInPane.value;\n const targets = inPane ? paneCtxTargets.value : selection.nodes.value;\n const dirWire = inPane ? qualify(splitPaneRef.value?.getPath() ?? '') : qualify(currentPath.value);\n const items = targets.map((n) => n.path);\n if (items.length === 0) {\n showDelete.value = false;\n return;\n }\n // Trash-delete is invertible via node-id restore — but only when EVERY\n // selected node carries a backend id and the restore endpoint exists.\n // A partial-undo offer would be a lie, so all-or-nothing.\n const nodeIds = targets\n .map((n) => (n as { id?: number }).id)\n .filter((x): x is number => typeof x === 'number');\n const restoreUndo =\n api.endpoints.trashRestore && nodeIds.length === targets.length\n ? async () => {\n const { restored } = await api.restoreIds(nodeIds);\n if (restored === 0) throw new Error('restore failed');\n }\n : null;\n try {\n if (api.endpoints.deleteAsync) {\n const { op } = await api.deleteAsync(items, dirWire);\n if (restoreUndo) {\n opUndo.set(op.id, { message: t('toast.trashed'), fn: restoreUndo });\n }\n pendingOps.register(op);\n flashToast('Silme kuyruğa alındı');\n } else {\n await api.deleteItems(dirWire, items);\n if (inPane) await splitPaneRef.value?.reload();\n else await load();\n if (restoreUndo) undoToast(t('toast.trashed'), restoreUndo);\n }\n showDelete.value = false;\n if (inPane) void splitPaneRef.value?.reload();\n else selection.clear();\n } catch (err) {\n emit('error', { message: (err as Error).message, context: { op: 'delete' } });\n }\n}\n\nfunction openShare(n: FileNode) {\n shareTarget.value = n;\n activeShare.value = null;\n showShare.value = true;\n}\n\nfunction openConvert(n: FileNode) {\n convertTarget.value = n;\n showConvert.value = true;\n}\n\nfunction onConvertDone(name: string) {\n flashToast(locale.value === 'en' ? `Converted → ${name}` : `Dönüştürüldü → ${name}`);\n void load();\n}\n\nasync function submitShare(payload: {\n password: boolean;\n expires_at: string | null;\n max_downloads: number | null;\n}) {\n const target = shareTarget.value;\n if (!target) return;\n try {\n const { share } = await api.createShare({\n path: target.path, // qualified `<adapter>://<rel>`\n password: payload.password,\n expires_at: payload.expires_at,\n max_downloads: payload.max_downloads,\n });\n activeShare.value = share;\n emit('share-created', { path: target.path, url: share.url, pin: share.password_pin ?? null });\n } catch (err) {\n emit('error', { message: (err as Error).message, context: { op: 'share' } });\n }\n}\n\nfunction closeShare() {\n showShare.value = false;\n shareTarget.value = null;\n activeShare.value = null;\n}\n\n// ------- Upload -------\n\nfunction triggerUpload() {\n if (!canWriteHere.value) {\n flashToast(locale.value === 'en' ? 'Read-only here' : 'Burada yazma yetkiniz yok');\n return;\n }\n fileInputEl.value?.click();\n}\n\nfunction onFilePicked(ev: Event) {\n const input = ev.target as HTMLInputElement;\n const list = input.files ? Array.from(input.files) : [];\n input.value = '';\n void uploadFiles(list);\n}\n\nasync function uploadFiles(list: File[]) {\n if (list.length === 0) return;\n /* wiring:e2 — şifreli klasörde upload şeffaf şifrelenir. Kilitliyken\n yükleme yok (düz metin sızdırma kapısı olurdu); 200MB üstü MVP\n tek-shot sınırına takılır ve uyarıyla atlanır. */\n if (e2eLocked.value) {\n flashToast(t('e2e.upload.locked'));\n return;\n }\n if (e2eUnlocked.value) {\n list = await e2eEncryptUploads(list);\n if (list.length === 0) return;\n }\n /* /wiring:e2 */\n const canChunk = !!(api.endpoints.uploadInit && api.endpoints.uploadFinalize);\n for (const f of list) {\n // Chunked (S3 multipart) only when the endpoints exist AND the file is\n // large. If chunked isn't viable (storage has no multipart support —\n // e.g. the local driver — or init errors out) fall back to the legacy\n // single-POST upload, which works for any storage / file size.\n if (canChunk && f.size >= 10 * 1024 * 1024) {\n if (await chunkedUpload(f)) continue;\n }\n await legacyUpload(f);\n }\n await load();\n}\n\nasync function legacyUpload(file: File) {\n // Register a progress row so the corner badge tracks the upload — large files\n // fall back here from the chunked path, and previously showed no progress at\n // all (the chunked placeholder was removed on init failure and the legacy\n // POST tracked nothing, so the badge vanished mid-upload).\n const id = crypto.randomUUID();\n const target = qualify(currentPath.value);\n uploadJobs.value = [\n ...uploadJobs.value,\n { id, file, path: target, totalBytes: file.size, uploadedBytes: 0, percent: 0, status: 'uploading', cancel() {} },\n ];\n const patch = (p: Partial<UploadJob>) => {\n const idx = uploadJobs.value.findIndex((j) => j.id === id);\n if (idx === -1) return;\n const next = [...uploadJobs.value];\n next[idx] = { ...next[idx], ...p };\n uploadJobs.value = next;\n };\n try {\n await api.uploadMultipart(target, [file], (percent) => {\n patch({ percent, uploadedBytes: Math.round((percent / 100) * file.size) });\n emit('upload-progress', { uploadId: id, percent, done: percent >= 100 });\n });\n patch({ percent: 100, uploadedBytes: file.size, status: 'done' });\n emit('upload-progress', { uploadId: id, percent: 100, done: true });\n } catch (err) {\n // Tell the USER, not just the embedding app. `emit('error')` alone left a\n // standalone deployment silent: the progress bar ran to 100% (the bytes\n // do go out — the server rejects them afterwards), the row flipped to an\n // error state carrying no message, and nothing else appeared. olivov lost\n // ten days of uploads to that silence (H2, 2026-08-05).\n const message = (err as Error).message;\n patch({ status: 'error', error: message });\n flashToast(t('upload.failed', { name: file.name }));\n emit('error', {\n message,\n context: { op: 'upload', file: file.name },\n });\n }\n}\n\n/**\n * Attempt an S3 multipart (chunked) upload. Returns `true` on success,\n * `false` when the storage can't do multipart (local driver, init 4xx/5xx)\n * so the caller can transparently fall back to the legacy single-POST\n * upload. On failure the progress placeholder is removed — no stuck error\n * row, no error toast, because the fallback path will report any real error.\n */\nasync function chunkedUpload(file: File): Promise<boolean> {\n // Register the progress row LAZILY — only once init succeeded and bytes are\n // actually moving. A doomed init (local driver / 4xx) then shows no badge at\n // all, so the legacy fallback's own badge is the only one the user sees (no\n // appear-then-vanish flicker).\n const id = crypto.randomUUID();\n let registered = false;\n try {\n await chunked.uploadFile({\n path: qualify(currentPath.value),\n file,\n onProgress: (job) => {\n if (!registered) {\n if (job.status !== 'uploading' && job.uploadedBytes <= 0) return;\n uploadJobs.value = [...uploadJobs.value, { ...job, id } as UploadJob];\n registered = true;\n } else {\n const idx = uploadJobs.value.findIndex((j) => j.id === id);\n if (idx !== -1) {\n const next = [...uploadJobs.value];\n next[idx] = { ...job, id } as UploadJob;\n uploadJobs.value = next;\n }\n }\n emit('upload-progress', {\n uploadId: job.uploadId ?? id,\n percent: job.percent,\n done: job.status === 'done',\n });\n },\n });\n return true;\n } catch {\n if (registered) uploadJobs.value = uploadJobs.value.filter((j) => j.id !== id);\n return false;\n }\n}\n\nconst dragCounter = ref(0);\nconst dragOver = ref(false);\n\n/**\n * isExternalFileDrag — `true` only when the user is dragging files\n * INTO the page from the OS (file picker, finder, etc.). Filters out:\n * - internal row drags (FE_DND_MIME present)\n * - browser image drags (`<img draggable=true>` on this page or\n * across pages). HTML5 `Files` type is leaky — it appears when\n * dragging any image element even though no real file is moving;\n * `dataTransfer.items[*].kind === 'file'` is the canonical signal\n * for an actual OS file.\n */\nfunction isExternalFileDrag(ev: DragEvent): boolean {\n const dt = ev.dataTransfer;\n if (!dt) return false;\n if (dt.types && dt.types.includes(FE_DND_MIME)) return false;\n // Some browsers expose `items` early in the drag, others only on\n // drop. When `items` is available we use it as the authoritative\n // signal — `kind === 'file'` means a real OS file. When unavailable\n // (Firefox during dragover sometimes returns 0 items), fall back to\n // the legacy `Files` type check.\n if (dt.items && dt.items.length > 0) {\n let hasFile = false;\n for (const it of Array.from(dt.items)) {\n if (it.kind === 'file') {\n hasFile = true;\n break;\n }\n }\n return hasFile;\n }\n return dt.types ? dt.types.includes('Files') : false;\n}\n\nfunction onDragEnter(ev: DragEvent) {\n if (!isExternalFileDrag(ev)) return;\n ev.preventDefault();\n dragCounter.value++;\n dragOver.value = true;\n}\nfunction onDragLeave() {\n dragCounter.value = Math.max(0, dragCounter.value - 1);\n if (dragCounter.value === 0) dragOver.value = false;\n}\nfunction onDragOver(ev: DragEvent) {\n /* wiring:d1 — iç sürüklemeler kök gövdeye de bırakılabilir olmalı ki split\n panelinden ana panelin BOŞLUĞUNA bırakmak çalışsın (origin dragover'da\n okunamaz — karar drop anında verilir; aynı-klasör drop'u no-op kalır). */\n if (ev.dataTransfer?.types.includes(FE_DND_MIME)) {\n ev.preventDefault();\n return;\n }\n /* /wiring:d1 */\n if (isExternalFileDrag(ev)) {\n ev.preventDefault();\n }\n}\nfunction onDropUpload(ev: DragEvent) {\n /* wiring:d1 — split panelinden ana panelin boşluğuna bırakma = geçerli\n klasöre aktar (aynı klasörden gelenler no-op, eski davranış korunur). */\n if (ev.dataTransfer?.types.includes(FE_DND_MIME)) {\n const d1Origin = ev.dataTransfer.getData(FE_DND_SRC_MIME) || '';\n const d1Here = qualify(currentPath.value);\n if (d1Origin && d1Here && d1Origin !== d1Here && !trashMode.value && canWriteHere.value) {\n ev.preventDefault();\n dragCounter.value = 0;\n dragOver.value = false;\n try {\n const d1Items = JSON.parse(ev.dataTransfer.getData(FE_DND_MIME)) as Array<{ path: string }>;\n void transferItems(d1Items.map((i) => i.path), d1Here, d1Origin);\n } catch {\n /* bozuk payload — yok say */\n }\n return;\n }\n }\n /* /wiring:d1 */\n // Internal row drag — nothing to do here, the row drop handler\n // in GridView/ListView already resolved the move.\n if (ev.dataTransfer?.types.includes(FE_DND_MIME)) {\n dragCounter.value = 0;\n dragOver.value = false;\n return;\n }\n // Browser-internal image drag without real files — bail before\n // we accidentally synthesise an upload from a 0-length file list\n // (some browsers populate `files` with zero-byte placeholders).\n if (!isExternalFileDrag(ev)) {\n dragCounter.value = 0;\n dragOver.value = false;\n return;\n }\n ev.preventDefault();\n dragCounter.value = 0;\n dragOver.value = false;\n // RBAC: block drag-drop upload where the user can't write.\n if (!canWriteHere.value) {\n flashToast(locale.value === 'en' ? 'Read-only here' : 'Burada yazma yetkiniz yok');\n return;\n }\n const list = ev.dataTransfer?.files ? Array.from(ev.dataTransfer.files) : [];\n if (list.length === 0) return;\n void uploadFiles(list);\n}\n\nfunction onWindowDragOver(ev: DragEvent) {\n if (ev.dataTransfer?.types.includes('Files')) ev.preventDefault();\n}\nfunction onWindowDrop(ev: DragEvent) {\n const root = rootEl.value;\n const target = ev.target as Node | null;\n if (root && target && !root.contains(target)) {\n ev.preventDefault();\n }\n}\nonMounted(() => {\n window.addEventListener('dragover', onWindowDragOver);\n window.addEventListener('drop', onWindowDrop);\n});\nonBeforeUnmount(() => {\n window.removeEventListener('dragover', onWindowDragOver);\n window.removeEventListener('drop', onWindowDrop);\n window.removeEventListener('hashchange', onHashChange);\n});\n\nconst clippedPaths = computed<Set<string>>(() => {\n if (clipboard.value.mode !== 'cut') return new Set();\n return new Set(clipboard.value.items.map((n) => n.path));\n});\n\n// --------------------------------------------------------------------\n// Item drag&drop move\n// --------------------------------------------------------------------\n\nconst FE_DND_MIME = 'application/x-brf-files';\n\nfunction onItemDragStart(node: FileNode, ev: DragEvent) {\n if (!ev.dataTransfer) return;\n if (node.basename === '.trash') {\n ev.preventDefault();\n return;\n }\n if (!selection.has(node.path)) {\n selection.click(node.path);\n }\n const items = selection.nodes.value\n .filter((n) => !clippedPaths.value.has(n.path))\n .filter((n) => n.basename !== '.trash')\n .map((n) => ({ path: n.path, basename: n.basename, type: n.type })); // qualified\n ev.dataTransfer.setData(FE_DND_MIME, JSON.stringify(items));\n ev.dataTransfer.setData(FE_DND_SRC_MIME, qualify(currentPath.value)); /* wiring:d1 — paneller arası origin damgası */\n ev.dataTransfer.setData('text/plain', items.map((i) => i.path).join('\\n'));\n ev.dataTransfer.effectAllowed = 'move';\n}\n\nasync function moveSourcesAsync(sources: string[], targetDir: string, opLabel: string, originOverride?: string): Promise<void> {\n try {\n const originWire = originOverride ?? qualify(currentPath.value); /* wiring:d1 — split panelinden gelen sürüklemede gerçek kaynak klasör */\n if (api.endpoints.moveAsync) {\n const { op } = await api.moveAsync(sources, targetDir, originWire);\n registerMoveUndo(op.id, sources, targetDir, originWire);\n pendingOps.register(op);\n flashToast('Taşıma kuyruğa alındı');\n } else {\n await api.move(originWire, sources, targetDir);\n await load();\n // Sync move (no async endpoint): offer the reverse move right away.\n const movedPaths = sources.map((p) => wireJoin(targetDir, wireBasename(p)));\n undoToast(t('toast.moved'), async () => {\n await api.move(targetDir, movedPaths, originWire);\n });\n }\n selection.clear();\n } catch (err) {\n emit('error', { message: (err as Error).message, context: { op: opLabel, targetDir } });\n }\n}\n\nasync function onItemDropInto(target: FileNode, ev: DragEvent) {\n if (target.type !== 'dir') return;\n const raw = ev.dataTransfer?.getData(FE_DND_MIME);\n if (!raw) return;\n let items: Array<{ path: string }> = [];\n try {\n items = JSON.parse(raw);\n } catch {\n return;\n }\n if (items.length === 0) return;\n\n const targetDir = target.path; // qualified\n const sources = items\n .map((i) => i.path)\n // ui-fix — öğe zaten targetDir'in içindeyse (parent===target) atla: yerinde\n // bırakma no-op, backend \"kendine kopyala\" 400'ü tetiklemez.\n .filter((p) => p && p !== targetDir && !targetDir.startsWith(p + '/') && !sameDir(wireParent(p), targetDir));\n if (sources.length === 0) return; // sessiz no-op (yerinde bırakma)\n await transferItems(sources, targetDir, dndOrigin(ev)); /* wiring:d1 — depo-farkında aktarım */\n}\n\nasync function onCrumbDropInto(adapterPath: string, ev: DragEvent) {\n const raw = ev.dataTransfer?.getData(FE_DND_MIME);\n if (!raw) return;\n let items: Array<{ path: string }> = [];\n try {\n items = JSON.parse(raw);\n } catch {\n return;\n }\n if (items.length === 0) return;\n\n const targetDir = adapterPath; // already qualified by breadcrumb\n const sources = items\n .map((i) => i.path)\n // ui-fix — kırıntıya (aynı klasöre) yerinde bırakma no-op.\n .filter((p) => p && p !== targetDir && !targetDir.startsWith(p + '/') && !sameDir(wireParent(p), targetDir));\n if (sources.length === 0) return;\n await transferItems(sources, targetDir, dndOrigin(ev)); /* wiring:d1 — depo-farkında aktarım */\n}\n\nfunction onCancelUpload(job: UploadJob) {\n job.cancel();\n}\n\nfunction onDismissUpload(job: UploadJob) {\n uploadJobs.value = uploadJobs.value.filter((j) => j.id !== job.id);\n}\n\n// ------- Breadcrumb -------\n\nfunction onNavigate(adapterPath: string) {\n // Multi-storage emits empty string for the global \"/\" crumb. The\n // load() function recognises that as the storage-list virtual root.\n if (multiStorageRoot.value && !adapterPath) {\n void load('');\n return;\n }\n if (multiStorageRoot.value) {\n void load(wireToVirtual(adapterPath));\n return;\n }\n void load(stripAdapter(adapterPath));\n}\n\nasync function onCopyPath(adapterPath: string) {\n try {\n await navigator.clipboard.writeText(adapterPath);\n flashToast(t('breadcrumb.copy_path'));\n } catch {\n /* no-op */\n }\n}\n\n// Sync auth-headers builder for PreviewModal — fetches against the\n// OnlyOffice config endpoint and the saveText endpoint need real\n// headers, not promises. Function-token bearers will use the cached\n// token; first-call resolution happens via the async path elsewhere.\nfunction buildAuthHeaders(extra: Record<string, string> = {}) {\n return api.authHeadersSync({ ...extra });\n}\n\n/* === wiring:c1 — tema galerisi ===\n * Selected theme (shared module state, localStorage `filex.theme`) is applied\n * as inline `--fe-*` variables on the explorer root, resolved to the active\n * light/dark variant — plus a mirrored injected stylesheet for the surfaces\n * that re-declare tokens (teleported context menu, modal backdrops). Theme\n * selection is independent from the light/dark mode: the mode only picks\n * WHICH variant of the theme paints. */\nconst showThemeGallery = ref(false);\nconst { themeId: activeThemeId, setTheme: setActiveTheme } = useThemeState();\n// Resolved mode: explicit config wins, otherwise the OS preference — the same\n// logic variables.css encodes in CSS. The inline root variables beat every\n// stylesheet rule, so they must track this resolution at runtime.\nconst themeMq =\n typeof window !== 'undefined' && window.matchMedia\n ? window.matchMedia('(prefers-color-scheme: dark)')\n : undefined;\nconst themeOsDark = ref(!!themeMq?.matches);\nfunction onThemeMqChange(e: MediaQueryListEvent) {\n themeOsDark.value = e.matches;\n}\nonMounted(() => themeMq?.addEventListener?.('change', onThemeMqChange));\nonBeforeUnmount(() => themeMq?.removeEventListener?.('change', onThemeMqChange));\nconst themeResolvedDark = computed(\n () => props.config.theme === 'dark' || (props.config.theme !== 'light' && themeOsDark.value),\n);\nwatch(\n [activeThemeId, themeResolvedDark, rootEl],\n () => {\n syncThemeStyle(activeThemeId.value);\n if (rootEl.value) applyThemeToEl(rootEl.value, activeThemeId.value, themeResolvedDark.value);\n },\n { immediate: true },\n);\n/* === /wiring:c1 === */\n/* === wiring:c2 — shortcut settings modal + Space quick-look ===\n * quickLookTarget follows the selection while the peek is open: arrow\n * keys emitted by QuickLook move the selection here, and the watcher\n * below syncs the previewed file. Space toggles (registry action\n * `quicklook`); Enter promotes the peek into the normal open flow. */\nconst showShortcutSettings = ref(false);\nconst quickLookOpen = ref(false);\nconst quickLookTarget = ref<FileNode | null>(null);\n\nfunction quickLookToggle() {\n if (quickLookOpen.value) {\n quickLookOpen.value = false;\n return;\n }\n const sel = selection.nodes.value;\n const n = sel.length === 1 ? sel[0] : null;\n if (!n || n.type !== 'file' || n.basename === '.trash') return;\n /* wiring:e2 — Space peek şifreli klasörde önce çözer, sonra açar */\n if (e2eActive.value) {\n if (!e2eUnlocked.value) return;\n void (async () => {\n try {\n await e2eFetchDecrypted(n);\n } catch {\n flashToast(t('e2e.decrypt_failed'));\n return;\n }\n quickLookTarget.value = n;\n quickLookOpen.value = true;\n void markRecent(n);\n })();\n return;\n }\n /* /wiring:e2 */\n quickLookTarget.value = n;\n quickLookOpen.value = true;\n void markRecent(n);\n}\n\nfunction quickLookNav(delta: number) {\n const onlyFiles = files.value.filter((f) => f.type === 'file');\n if (onlyFiles.length === 0) return;\n const cur = quickLookTarget.value;\n let idx = cur ? onlyFiles.findIndex((f) => f.path === cur.path) : -1;\n idx = idx === -1 ? (delta > 0 ? 0 : onlyFiles.length - 1) : (idx + delta + onlyFiles.length) % onlyFiles.length;\n const next = onlyFiles[idx];\n if (!next || next.path === cur?.path) return;\n selection.click(next.path);\n}\n\nfunction quickLookOpenFull() {\n const n = quickLookTarget.value;\n quickLookOpen.value = false;\n if (n) openNode(n);\n}\n\nwatch(\n () => selection.nodes.value,\n (nodes) => {\n if (!quickLookOpen.value) return;\n const n = nodes.length === 1 && nodes[0].type === 'file' ? nodes[0] : null;\n /* wiring:e2 — ok tuşlarıyla gezerken de hedef atanmadan ÖNCE çöz,\n yoksa viewer bir anlığına ham ciphertext URL'i alır. */\n if (n && n.path !== quickLookTarget.value?.path && e2eUnlocked.value) {\n void (async () => {\n try {\n await e2eFetchDecrypted(n);\n } catch {\n /* çözülemedi — hedefi yine de değiştir, viewer hata gösterir */\n }\n quickLookTarget.value = n;\n void markRecent(n);\n })();\n return;\n }\n /* /wiring:e2 */\n if (n && n.path !== quickLookTarget.value?.path) {\n quickLookTarget.value = n;\n void markRecent(n);\n }\n },\n);\n/* === /wiring:c2 === */\n/* wiring:c3 — operations center store + failed-upload retry */\nconst opsCenter = useOperations();\n\n/**\n * Retry a failed upload from the operations center. The failed row is\n * already retired by the store; re-run the upload against the job's ORIGINAL\n * target folder (the user may have navigated away since) via the legacy\n * single-POST path — works for any storage / size, no chunked precondition.\n */\nfunction retryUploadJob(job: UploadJob) {\n uploadJobs.value = uploadJobs.value.filter((j) => j.id !== job.id);\n const file = job.file;\n const target = job.path || qualify(currentPath.value);\n const id = crypto.randomUUID();\n uploadJobs.value = [\n ...uploadJobs.value,\n { id, file, path: target, totalBytes: file.size, uploadedBytes: 0, percent: 0, status: 'uploading', cancel() {} },\n ];\n const patchRetry = (p: Partial<UploadJob>) => {\n const idx = uploadJobs.value.findIndex((j) => j.id === id);\n if (idx === -1) return;\n const next = [...uploadJobs.value];\n next[idx] = { ...next[idx], ...p };\n uploadJobs.value = next;\n };\n api\n .uploadMultipart(target, [file], (percent) => {\n patchRetry({ percent, uploadedBytes: Math.round((percent / 100) * file.size) });\n emit('upload-progress', { uploadId: id, percent, done: percent >= 100 });\n })\n .then(() => {\n patchRetry({ percent: 100, uploadedBytes: file.size, status: 'done' });\n emit('upload-progress', { uploadId: id, percent: 100, done: true });\n void load();\n })\n .catch((err: Error) => {\n patchRetry({ status: 'error', error: err.message });\n flashToast(t('upload.failed', { name: file.name }));\n emit('error', { message: err.message, context: { op: 'upload-retry', file: file.name } });\n });\n}\n/* /wiring:c3 */\n/* === wiring:c4 — onboarding coach-mark tour ===\n * First mount with no `filex.tourDone` flag auto-starts the tour (short\n * delay so the listing/toolbar are laid out). Closing it — finished OR\n * skipped — stamps the flag; \"Turu tekrar başlat\" re-opens it any time.\n * Restart arrives as a bubbled `fe:tour-restart` CustomEvent from the\n * Toolbar overflow menu, so no extra prop/emit threading through the\n * shared component tags is needed. */\nconst TOUR_LS_KEY = 'filex.tourDone';\nconst showTour = ref(false);\nlet tourTimer: ReturnType<typeof setTimeout> | undefined;\n\nfunction tourAlreadyDone(): boolean {\n try {\n return localStorage.getItem(TOUR_LS_KEY) === '1';\n } catch {\n return true; // no storage → never auto-nag\n }\n}\n\nfunction startTour() {\n showTour.value = true;\n}\n\nfunction onTourClose() {\n showTour.value = false;\n try {\n localStorage.setItem(TOUR_LS_KEY, '1');\n } catch {\n /* private mode / quota */\n }\n rootEl.value?.focus();\n}\n\nfunction onTourRestartEvent() {\n startTour();\n}\n\nonMounted(() => {\n rootEl.value?.addEventListener('fe:tour-restart', onTourRestartEvent);\n if (!tourAlreadyDone()) {\n tourTimer = setTimeout(() => {\n if (!showTour.value) startTour();\n }, 900);\n }\n});\nonBeforeUnmount(() => {\n if (tourTimer) clearTimeout(tourTimer);\n rootEl.value?.removeEventListener('fe:tour-restart', onTourRestartEvent);\n});\n/* === /wiring:c4 === */\n\n/* === wiring:d1 — sekmeler (tab şeridi) + tab başına split ===\n *\n * useTabs, mevcut konum state'inin (currentPath/viewMode) ÜSTÜNDE bir\n * katmandır: aktif tab gezinmeleri watch ile dinleyip snapshot'ını\n * günceller; tab geçişi mevcut load(path) yolunu çağırır — yeni fetch\n * mantığı yok. Şerit tek sekmede hiç render edilmez (embed pixel-aynı).\n *\n * Persist: `filex.tabs` — pathPersist scope mantığı izlenir: mode 'none'\n * ise persist kapalı; rootPath confine'ı anahtara eklenir ki farklı\n * confine'lı embed'ler birbirinin sekmelerini ezmesin.\n */\nconst FE_DND_SRC_MIME = 'application/x-brf-files-src';\n\nconst TABS_LS_BASE = 'filex.tabs';\nfunction tabsStorageKey(): string | null {\n if (persistMode() === 'none') return null;\n return rootPathProp ? `${TABS_LS_BASE}:${rootPathProp}` : TABS_LS_BASE;\n}\nconst tabsApi = useTabs({ storageKey: tabsStorageKey() });\nconst tabsRestored = tabsApi.restore();\nconst tabsActiveId = tabsApi.activeId;\n\nconst tabsVisible = computed(() => tabsApi.hasMultiple.value);\nconst activeSplit = computed(() => tabsApi.activeTab.value?.split ?? null);\n\n// Sekme adı OTOMATİK = güncel klasör adı (kök = depo adı / kök etiketi).\nfunction tabLabel(path: string): string {\n const p = (path || '').replace(/^\\/+|\\/+$/g, '');\n if (p === '.trash') return t('node.trash');\n if (!p) return multiStorageRoot.value ? t('breadcrumb.root') : adapter.value || t('breadcrumb.root');\n return p.split('/').pop() || p;\n}\nconst tabItems = computed(() =>\n tabsApi.tabs.value.map((tb) => ({ id: tb.id, label: tabLabel(tb.path), split: !!tb.split })),\n);\n\n// Aktif tab kullanıcıyı izler: gezinme + görünüm değişimi snapshot'a yazılır.\nwatch(currentPath, (p) => tabsApi.syncActive({ path: p }));\nwatch(viewMode, (v) => tabsApi.syncActive({ viewMode: v }));\n\n// İlk sekme, ilk konum belli olur olmaz tohumlanır (restore varsa dokunma —\n// aktif snapshot ilk load sonrası currentPath watcher'ıyla zaten senkronlanır).\nonMounted(() => {\n if (!tabsRestored) tabsApi.seed(currentPath.value ?? '', viewMode.value);\n});\n\nfunction applyTabLocation(tb: TabState) {\n if (tb.viewMode && tb.viewMode !== viewMode.value) viewMode.value = tb.viewMode;\n if (tb.path === '.trash') {\n void loadTrash();\n return;\n }\n void load(tb.path);\n}\nfunction activateTab(id: string) {\n const tb = tabsApi.activate(id);\n if (tb) applyTabLocation(tb);\n}\nfunction newTabHere() {\n // Mevcut konumu klonlar; görünüm zaten oradadır, load gerekmez.\n tabsApi.openTab(currentPath.value ?? '', { viewMode: viewMode.value, background: false });\n}\nfunction closeTabById(id: string) {\n const next = tabsApi.closeTab(id);\n if (next) applyTabLocation(next);\n}\nfunction nextTab() {\n const tb = tabsApi.step(1);\n if (tb) applyTabLocation(tb);\n}\nfunction prevTab() {\n const tb = tabsApi.step(-1);\n if (tb) applyTabLocation(tb);\n}\n\n/** Bir klasörü ARKA PLANDA yeni sekmede aç (orta-tık / sağ-tık / palet). */\nfunction openNodeInTab(n: FileNode) {\n if (n.type !== 'dir' || n.basename === '.trash') return;\n const target = multiStorageRoot.value ? wireToVirtual(n.path) : stripAdapter(n.path);\n tabsApi.openTab(target, { viewMode: viewMode.value, background: true });\n}\n\n// Orta-tık delegasyonu: ListView/GridView satırları data-fe-path taşır; kendi\n// keydown/emit zinciri eklemek yerine kökte tek auxclick dinleyicisi yeter.\n// (SecondaryPane kendi satırlarında stopPropagation ile kendisi halleder.)\nfunction onListAuxClick(ev: MouseEvent) {\n if (ev.button !== 1) return;\n const host = ev.target as HTMLElement | null;\n const el = host && typeof host.closest === 'function' ? host.closest('[data-fe-path]') : null;\n const p = el?.getAttribute('data-fe-path');\n if (!p) return;\n const node = files.value.find((f) => f.path === p);\n if (!node || node.type !== 'dir' || node.basename === '.trash') return;\n ev.preventDefault();\n openNodeInTab(node);\n}\n// Orta-tuş mousedown'ı satırlar üzerinde iptal: scroll'lu gövdede Chromium'un\n// autoscroll'u devreye girer ve auxclick HİÇ üretilmez (canlı teşhis) —\n// preventDefault autoscroll'u bastırır, auxclick yeniden akar.\nfunction onListMiddleDown(ev: MouseEvent) {\n if (ev.button !== 1) return;\n const host = ev.target as HTMLElement | null;\n if (host && typeof host.closest === 'function' && host.closest('[data-fe-path]')) {\n ev.preventDefault();\n }\n}\nonMounted(() => {\n rootEl.value?.addEventListener('auxclick', onListAuxClick);\n rootEl.value?.addEventListener('mousedown', onListMiddleDown);\n});\nonBeforeUnmount(() => {\n rootEl.value?.removeEventListener('auxclick', onListAuxClick);\n rootEl.value?.removeEventListener('mousedown', onListMiddleDown);\n});\n\n// ---- split (tab başına ikincil panel) ------------------------------\n\nconst splitPaneRef = ref<InstanceType<typeof SecondaryPane> | null>(null);\n// Dar modda split devre dışı (state korunur, genişleyince geri gelir).\nconst splitVisible = computed(() => !!activeSplit.value && !isNarrow.value);\n\nfunction toggleSplit() {\n if (activeSplit.value) {\n tabsApi.setSplit(null);\n activePane.value = 'main';\n return;\n }\n if (isNarrow.value) return;\n tabsApi.setSplit({ path: currentPath.value ?? '', viewMode: viewMode.value });\n}\nfunction closeSplit() {\n tabsApi.setSplit(null);\n activePane.value = 'main';\n}\nfunction onPaneNavigate(p: string) {\n tabsApi.setSplit({ ...(activeSplit.value ?? {}), path: p });\n}\n/* ui-fix — çöp kutusu satırı yan panelde açılınca: trash görünümü (geri\n * yükleme aksiyonlarıyla) ana panele aittir → ana paneli aktif edip aç. */\nfunction onPaneOpenTrash() {\n activePane.value = 'main';\n void loadTrash();\n}\n/* ui-fix — pane'in KENDİ görünüm modu: split açılırken ana panelinkini\n * devralır, sonrasında bağımsız. Toolbar'ın görünüm değiştiricisi ve palet\n * toggle'ı AKTİF panele yazar (Burak: \"B tıklıyken ikon değiştir dersem\n * B'nin değişmesi lazım\"). */\nconst paneViewMode = computed<ViewMode>(() => activeSplit.value?.viewMode ?? viewMode.value);\nfunction setPaneViewMode(v: ViewMode) {\n if (!activeSplit.value) return;\n tabsApi.setSplit({ ...activeSplit.value, viewMode: v });\n}\nconst displayedViewMode = computed<ViewMode>(() =>\n paneIsActive.value ? paneViewMode.value : viewMode.value,\n);\nfunction setDisplayedViewMode(v: ViewMode) {\n if (paneIsActive.value) setPaneViewMode(v);\n else viewMode.value = v;\n}\n\n// Aktif panel: kısayollar aktif panele gider; panel tıklamayla aktifleşir.\nconst activePane = ref<'main' | 'split'>('main');\nfunction setPaneMain() {\n activePane.value = 'main';\n}\nwatch(splitVisible, (v) => {\n if (!v) activePane.value = 'main';\n});\nconst paneIsActive = computed(() => activePane.value === 'split' && splitVisible.value);\nconst mainPaneFocus = computed(() => splitVisible.value && activePane.value === 'main');\n\n// Pane yardımcıları — hep ana panelin mevcut dönüştürücülerini sarar.\nfunction paneToUser(wire: string): string {\n return multiStorageRoot.value ? wireToVirtual(wire) : stripAdapter(wire);\n}\nfunction paneClamp(p: string): string {\n const clean = String(p ?? '').replace(/^\\/+|\\/+$/g, '');\n if (!rootFloor) return clean;\n if (!clean || !(clean === rootFloor || clean.startsWith(rootFloor + '/'))) return rootFloor;\n return clean;\n}\n\n// Pano (clipboard) aktif panele göre: kes/kopyala pane seçiminden beslenir,\n// yapıştır pane klasörüne iner. State ana panelinkiyle ORTAK — panolar arası\n// kes-yapıştır bedavaya çalışır.\nfunction paneCut() {\n const nodes = splitPaneRef.value?.selectedNodes() ?? [];\n if (nodes.length === 0) return;\n clipboard.value = { mode: 'cut', items: nodes, sourcePath: splitPaneRef.value?.getPath() ?? '' };\n flashToast('Kesildi');\n}\nfunction paneCopy() {\n const nodes = splitPaneRef.value?.selectedNodes() ?? [];\n if (nodes.length === 0) return;\n clipboard.value = { mode: 'copy', items: nodes, sourcePath: splitPaneRef.value?.getPath() ?? '' };\n flashToast('Kopyalandı');\n}\nasync function panePaste() {\n const cb = clipboard.value;\n const pane = splitPaneRef.value;\n if (!cb.mode || cb.items.length === 0 || !pane) return;\n const targetWire = qualify(pane.getPath() ?? '');\n const originWire = qualify(cb.sourcePath || '') || undefined;\n if (cb.mode === 'cut' && originWire === targetWire) {\n flashToast('Aynı klasöre kesilemez');\n return;\n }\n await transferItems(cb.items.map((n) => n.path), targetWire, originWire, cb.mode === 'copy');\n clipboard.value = { mode: null, items: [], sourcePath: null };\n}\n\n// ---- paneller arası aktarım ----------------------------------------\n\nfunction wireAdapterOf(p: string): string {\n const i = p.indexOf('://');\n return i === -1 ? '' : p.slice(0, i);\n}\nfunction dndOrigin(ev: DragEvent): string | undefined {\n const v = ev.dataTransfer?.getData(FE_DND_SRC_MIME);\n return v || undefined;\n}\n\n/**\n * transferItems — panel-arası / pano aktarımının tek kapısı.\n * Aynı depo → TAŞI (mevcut moveSourcesAsync yolu: kuyruk + geri al).\n * Farklı depo → KOPYALA dene; backend cross-storage desteklemiyorsa\n * i18n'li hata toast'ı. Bitince ikincil panel de tazelenir (ana panel\n * moveSourcesAsync / pendingOps onSettled üzerinden zaten tazelenir).\n */\nasync function transferItems(\n sources: string[],\n targetWire: string,\n originWire?: string,\n forceCopy = false,\n): Promise<void> {\n // ui-fix — yerinde bırakma (source parent === target) no-op: backend\n // \"kendine kopyala\" 400'ü engellenir (paneller arası + pano yolu).\n const list = sources.filter(\n (p) => p && p !== targetWire && !targetWire.startsWith(p + '/') && !sameDir(wireParent(p), targetWire),\n );\n if (list.length === 0 || !targetWire) return;\n const targetAdapter = wireAdapterOf(targetWire);\n const cross = list.some((p) => wireAdapterOf(p) !== targetAdapter);\n if (cross || forceCopy) {\n try {\n const { op } = await api.copy(list, targetWire);\n pendingOps.register(op);\n flashToast(cross ? t('split.cross_copy') : t('split.copy_queued'));\n } catch (err) {\n emit('error', { message: (err as Error).message, context: { op: 'transfer', targetWire } });\n flashToast(cross ? t('split.cross_failed') : (err as Error).message);\n return;\n }\n } else {\n await moveSourcesAsync(list, targetWire, 'move-transfer', originWire);\n }\n void splitPaneRef.value?.reload();\n}\n\nfunction onPaneTransfer(p: { sources: string[]; targetWire: string; originWire?: string }) {\n void transferItems(p.sources, p.targetWire, p.originWire);\n}\n/* === /wiring:d1 === */\n\n/* === wiring:e2 — uçtan uca şifreli klasörler ===\n *\n * Kripto şeması + tehdit modeli: docs/E2E-ENCRYPTION.md ve lib/e2ecrypto.ts.\n * Burada yalnız orkestrasyon var: backend listing yanıtındaki `e2e_root`\n * kilit ekranını sürer; parola marker'a karşı TARAYICIDA doğrulanır (sunucuya\n * hiçbir şey gitmez); türetilen klasör anahtarı (KEK) YALNIZ bellekte yaşar\n * (`e2eRing`) — localStorage/sessionStorage'a asla yazılmaz. Upload şeffaf\n * şifrelenir, önizleme/indirme şeffaf çözülür (blob URL mevcut viewer'lara).\n */\nconst e2eRing = createKeyRing();\n// Map'ler reaktif değil — sürüm sayacı computed'ları tetikler.\nconst e2eRingVer = ref(0);\n// İçinde bulunulan şifreli kökün wire yolu ('' = şifreli bağlam yok).\nconst e2eRoot = ref('');\n// path → çözülmüş blob objectURL (önizleme). Kilitleme/unmount'ta revoke.\nconst e2eUrls = new Map<string, string>();\n\nconst e2eActive = computed(() => !!e2eRoot.value && !trashMode.value);\nconst e2eUnlocked = computed(() => {\n void e2eRingVer.value;\n return e2eActive.value && e2eRing.has(e2eRoot.value);\n});\nconst e2eLocked = computed(() => {\n void e2eRingVer.value;\n return e2eActive.value && !e2eRing.has(e2eRoot.value);\n});\n\n// Kilit ekranı formu.\nconst e2ePw = ref('');\nconst e2eUnlockBusy = ref(false);\nconst e2eUnlockErr = ref('');\n// Şifreli klasör oluşturma modalı.\nconst showEncFolder = ref(false);\nconst e2eCreateBusy = ref(false);\n\nfunction e2eKek(): CryptoKey | null {\n return e2eRing.get(e2eRoot.value) ?? null;\n}\n\nfunction e2eRevokeAll() {\n for (const url of e2eUrls.values()) URL.revokeObjectURL(url);\n e2eUrls.clear();\n}\nonBeforeUnmount(e2eRevokeAll);\n\n/** Kilidi aç: marker'ı kökten çek, parolayı YERELDE doğrula, KEK'i belleğe koy. */\nasync function e2eUnlock() {\n if (!e2ePw.value || e2eUnlockBusy.value || !e2eRoot.value) return;\n e2eUnlockBusy.value = true;\n e2eUnlockErr.value = '';\n try {\n let markerText = '';\n try {\n const { blob, url } = await api.fetchBlob(wireJoin(e2eRoot.value, E2E_MARKER_NAME));\n URL.revokeObjectURL(url);\n markerText = await blob.text();\n } catch {\n e2eUnlockErr.value = t('e2e.unlock.marker_missing');\n return;\n }\n const marker = parseMarker(markerText);\n if (!marker) {\n e2eUnlockErr.value = t('e2e.unlock.marker_missing');\n return;\n }\n const kek = await verifyPassword(marker, e2ePw.value);\n if (!kek) {\n e2eUnlockErr.value = t('e2e.unlock.wrong');\n return;\n }\n e2eRing.set(e2eRoot.value, kek);\n e2eRingVer.value++;\n e2ePw.value = '';\n } finally {\n e2eUnlockBusy.value = false;\n }\n}\n\n/** \"Kilitle\": bellekteki anahtarı ve çözülmüş blob'ları at. */\nfunction e2eLock() {\n if (!e2eRoot.value) return;\n e2eRing.lock(e2eRoot.value);\n e2eRingVer.value++;\n e2eRevokeAll();\n flashToast(t('e2e.locked_toast'));\n}\n\n// Uzantı → önizleme MIME'ı: çözülmüş blob'un <img>/<video>/<object>\n// etiketlerinde doğru render'ı için (sunucu şifreli dosyayı octet-stream\n// bilir, oradan gelen tip işe yaramaz).\nconst E2E_MIME: Record<string, string> = {\n txt: 'text/plain', md: 'text/markdown', log: 'text/plain', csv: 'text/csv',\n json: 'application/json', xml: 'application/xml', html: 'text/html',\n jpg: 'image/jpeg', jpeg: 'image/jpeg', png: 'image/png', gif: 'image/gif',\n webp: 'image/webp', bmp: 'image/bmp', avif: 'image/avif', svg: 'image/svg+xml',\n pdf: 'application/pdf',\n mp4: 'video/mp4', webm: 'video/webm', mov: 'video/quicktime', m4v: 'video/mp4',\n mp3: 'audio/mpeg', wav: 'audio/wav', ogg: 'audio/ogg', flac: 'audio/flac',\n m4a: 'audio/mp4', aac: 'audio/aac', opus: 'audio/opus',\n};\nfunction e2eMimeFor(n: FileNode): string {\n const ext = (n.extension || '').toLowerCase();\n return E2E_MIME[ext] || 'application/octet-stream';\n}\n\n/**\n * Dosyayı çek + çöz + objectURL'ini cache'le. Magic'siz (ör. DAV'la düz\n * yazılmış) dosyada null döner — çağıran normal ham akışa düşer. Yanlış\n * anahtar/bozuk veri E2eDecryptError fırlatır (çağıran toast'lar).\n */\nasync function e2eFetchDecrypted(n: FileNode): Promise<string | null> {\n const cached = e2eUrls.get(n.path);\n if (cached) return cached;\n const kek = e2eKek();\n if (!kek) return null;\n const buf = await api.fetchArrayBuffer(n.path);\n if (!hasMagic(buf)) return null;\n const plain = await decryptFile(kek, buf);\n const url = URL.createObjectURL(new Blob([plain], { type: e2eMimeFor(n) }));\n e2eUrls.set(n.path, url);\n return url;\n}\n\n/** PreviewModal/QuickLook'a giden URL sağlayıcı: çözülmüş blob > ham URL. */\nfunction e2ePreviewSrc(p: string): string {\n return e2eUrls.get(p) ?? api.previewUrl(p);\n}\n\n/** Çöz + salt-okunur in-page önizleme (openNode/previewNode buraya iner). */\nasync function e2eOpenPreview(n: FileNode) {\n try {\n await e2eFetchDecrypted(n);\n } catch {\n flashToast(t('e2e.decrypt_failed'));\n return;\n }\n previewMode.value = 'view';\n previewTarget.value = n;\n showPreview.value = true;\n emit('file-opened', { path: n.path, basename: n.basename });\n void markRecent(n);\n}\n\n/** Çöz + orijinal adla indir. Magic'siz dosya olduğu gibi iner. */\nasync function e2eDownload(n: FileNode) {\n try {\n const buf = await api.fetchArrayBuffer(n.path);\n const kek = e2eKek();\n let out = buf;\n if (hasMagic(buf)) {\n if (!kek) throw new Error('locked');\n out = await decryptFile(kek, buf);\n }\n const url = URL.createObjectURL(new Blob([out], { type: e2eMimeFor(n) }));\n const a = document.createElement('a');\n a.href = url;\n a.download = n.basename;\n document.body.appendChild(a);\n a.click();\n a.remove();\n setTimeout(() => URL.revokeObjectURL(url), 30_000);\n } catch {\n flashToast(t('e2e.download.failed'));\n }\n}\n\n/** Upload listesi → şifreli File listesi (200MB üstü + marker adı atlanır). */\nasync function e2eEncryptUploads(list: File[]): Promise<File[]> {\n const kek = e2eKek();\n if (!kek) return [];\n const out: File[] = [];\n for (const f of list) {\n if (f.name === E2E_MARKER_NAME) continue;\n if (f.size > E2E_MAX_FILE_BYTES) {\n flashToast(t('e2e.upload.too_big'));\n continue;\n }\n try {\n const ct = await encryptFile(kek, await f.arrayBuffer());\n out.push(new File([ct], f.name, { type: 'application/octet-stream' }));\n } catch (err) {\n emit('error', { message: (err as Error).message, context: { op: 'e2e-encrypt', file: f.name } });\n }\n }\n return out;\n}\n\n/** EncryptedFolderModal submit'i: klasörü aç + marker'ı yükle + kilidi açık bırak. */\nasync function submitEncryptedFolder(payload: { name: string; password: string }) {\n if (e2eActive.value) {\n // İç içe şifreli klasör kök tespitini bulanıklaştırır — MVP'de yok.\n flashToast(t('e2e.create.nested'));\n return;\n }\n e2eCreateBusy.value = true;\n try {\n const dirWire = qualify(currentPath.value);\n await api.newFolder(dirWire, payload.name);\n const { marker, kek } = await createMarker(payload.password);\n const markerFile = new File([JSON.stringify(marker)], E2E_MARKER_NAME, {\n type: 'application/json',\n });\n const newDirWire = wireJoin(dirWire, payload.name);\n await api.uploadMultipart(newDirWire, [markerFile]);\n // Oluşturan oturumda kilit açık başlar (parolayı az önce kendisi girdi).\n e2eRing.set(newDirWire, kek);\n e2eRingVer.value++;\n showEncFolder.value = false;\n flashToast(t('e2e.create.done'));\n await load();\n } catch (err) {\n emit('error', { message: (err as Error).message, context: { op: 'e2e-create' } });\n flashToast(t('e2e.create.failed'));\n } finally {\n e2eCreateBusy.value = false;\n }\n}\n/* === /wiring:e2 === */\n</script>\n\n<template>\n <div\n ref=\"rootEl\"\n class=\"fe\"\n :class=\"{\n 'fe--theme-light': config.theme === 'light',\n 'fe--theme-dark': config.theme === 'dark',\n 'fe--is-dragover': dragOver,\n 'fe--density-compact': density === 'compact' /* cila:a density */,\n 'fe--narrow': isNarrow /* bag:b4 */,\n }\"\n tabindex=\"-1\"\n @dragenter=\"onDragEnter\"\n @dragover=\"onDragOver\"\n @dragleave=\"onDragLeave\"\n @drop=\"onDropUpload\"\n @contextmenu=\"onContextCanvas\"\n >\n <!-- wiring:d1 — sekme şeridi: TEK sekmede hiç render edilmez (embed pixel-aynı) -->\n <TabBar\n v-if=\"tabsVisible\"\n :tabs=\"tabItems\"\n :active-id=\"tabsActiveId\"\n :locale=\"locale\"\n :split-enabled=\"!isNarrow\"\n :split-active=\"!!activeSplit\"\n @select=\"activateTab\"\n @close=\"closeTabById\"\n @new=\"newTabHere\"\n @reorder=\"(from: number, to: number) => tabsApi.move(from, to)\"\n @toggle-split=\"toggleSplit\"\n />\n <!-- /wiring:d1 -->\n <Toolbar\n ref=\"toolbarRef\"\n :view-mode=\"displayedViewMode /* ui-fix — aktif panelin modu */\"\n :search-query=\"searchQuery\"\n :trash-active=\"trashActive\"\n :actions=\"toolbarActions\"\n :selection-mode=\"selectionMode\"\n :paste-enabled=\"!!clipboard.mode\"\n :convert-enabled=\"!!effectiveConvertUrl\"\n :can-go-up=\"canGoUp\"\n :at-virtual-root=\"atVirtualRoot\"\n :can-write=\"canWriteHere\"\n :locale=\"locale\"\n :narrow=\"isNarrow /* bag:b4 */\"\n :theme=\"config.theme || 'auto' /* bag:b4 */\"\n :inspector-open=\"showInspector /* koru:k1 */\"\n @toggle-inspector=\"toggleInspector /* koru:k1 */\"\n @open-theme=\"showThemeGallery = true /* wiring:c1 */\"\n @update:view-mode=\"setDisplayedViewMode($event) /* ui-fix — aktif panele */\"\n @update:search-query=\"searchQuery = $event\"\n @update:density=\"density = $event\"\n @open-shortcut-settings=\"showShortcutSettings = true /* wiring:c2 */\"\n @new-folder=\"showNewFolder = true\"\n @upload=\"triggerUpload\"\n @refresh=\"() => load()\"\n @go-up=\"goUp\"\n @action=\"onToolbarAction\"\n @open-recents=\"showRecents = true\"\n />\n\n <!-- koru:k1 — fe__main lays the listing body and the inspector panel out\n as flex siblings (row). Without the inspector open it is visually\n identical to the previous direct-child fe__body. -->\n <div class=\"fe__main\" :class=\"{ 'fe__main--split': splitVisible } /* wiring:d1 */\">\n <!-- ui-fix — sol panelin başlığı (breadcrumb + durum şeritleri + body)\n tek bir sarmalda: split modunda bu sarmal sol yarıya sığar, böylece\n breadcrumb tüm sayfayı değil kendi panelini kaplar (SecondaryPane'in\n kendi kırıntısıyla simetrik). Aktif-panel vurgusu da bu sarmalda. -->\n <div\n class=\"fe__primary\"\n :class=\"{ 'fe-pane--focus': mainPaneFocus } /* wiring:d1 — aktif panel vurgusu */\"\n >\n <Breadcrumb\n :dirname=\"dirname\"\n :adapter=\"adapter\"\n :root-label=\"adapter\"\n :locale=\"locale\"\n :multi-storage-root=\"multiStorageRoot\"\n :root-path=\"rootPathProp\"\n @navigate=\"onNavigate\"\n @copy-path=\"onCopyPath\"\n @crumb-context=\"onCrumbContext\"\n @crumb-drop=\"onCrumbDropInto\"\n />\n\n <!-- Live presence: who else is viewing this folder (empty → nothing shown).\n When the live socket is unavailable the same strip carries a small\n degraded-connection badge instead (presence is empty in fallback);\n a healthy connection shows nothing extra. -->\n <div v-if=\"presenceUsers.length || realtimeDegraded\" class=\"fe__presence\">\n <PresenceBar v-if=\"presenceUsers.length\" :users=\"presenceUsers\" :locale=\"locale\" />\n <span\n v-if=\"realtimeDegraded\"\n class=\"fe-connbadge\"\n role=\"status\"\n :title=\"t('conn.tooltip')\"\n >\n <span class=\"fe-connbadge__dot\" aria-hidden=\"true\"></span>\n {{ t('conn.offline') }}\n </span>\n </div>\n\n <!-- wiring:e2 — kilit açık şeridi: şifreli klasörde anahtar bellekteyken\n görünür; \"Kilitle\" anahtarı ve çözülmüş blob'ları atar. -->\n <div v-if=\"e2eUnlocked\" class=\"fe-e2e-strip\" role=\"status\">\n <span class=\"fe-e2e-strip__icon\" aria-hidden=\"true\">🔒</span>\n <span class=\"fe-e2e-strip__label\">{{ t('e2e.strip.label') }}</span>\n <button type=\"button\" class=\"fe-btn fe-e2e-strip__btn\" @click=\"e2eLock\">\n {{ t('e2e.strip.lock') }}\n </button>\n </div>\n <!-- /wiring:e2 -->\n\n <div\n class=\"fe__body\"\n @pointerdown.capture=\"setPaneMain() /* wiring:d1 */\"\n @click.self=\"selection.clear()\"\n >\n <!-- Initial load: skeleton ghosts (view-mode aware) instead of an\n empty/\"no files\" flash. Only when there's nothing yet — navigation\n keeps the current list, exactly as before. -->\n <div v-if=\"loading && files.length === 0\" class=\"fe__skeleton\" role=\"status\">\n <span class=\"fe-sr-only\">{{ t('loading') }}</span>\n <div v-if=\"viewMode !== 'list' /* wiring:d2 — galeri de grid iskeletini kullanır */\" class=\"fe-skel-grid\" aria-hidden=\"true\">\n <div v-for=\"i in 8\" :key=\"i\" class=\"fe-skel-card\">\n <div class=\"fe-skel fe-skel--thumb\"></div>\n <div class=\"fe-skel fe-skel--label\"></div>\n </div>\n </div>\n <div v-else class=\"fe-skel-list\" aria-hidden=\"true\">\n <div v-for=\"i in 8\" :key=\"i\" class=\"fe-skel-row\">\n <div class=\"fe-skel fe-skel--icon\"></div>\n <div class=\"fe-skel fe-skel--name\"></div>\n <div class=\"fe-skel fe-skel--size\"></div>\n <div class=\"fe-skel fe-skel--date\"></div>\n </div>\n </div>\n </div>\n <!-- Dead deep link (404) or RBAC-hidden dir (403, shown identically):\n a dedicated state instead of a misleading \"this folder is empty\". -->\n <div v-else-if=\"notFoundPath\" class=\"fe-state\">\n <svg\n class=\"fe-state__art\"\n viewBox=\"0 0 120 100\"\n width=\"110\"\n height=\"92\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 36v42a6 6 0 0 0 6 6h72a6 6 0 0 0 6-6V44a6 6 0 0 0-6-6H62l-9-10H24a6 6 0 0 0-6 6z\" />\n <path d=\"M52 55c0-4.6 3.6-8 8-8s8 3.4 8 8c0 5.5-8 4.8-8 11\" />\n <circle cx=\"60\" cy=\"73\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n <p class=\"fe-state__title\">{{ t('notFound.title') }}</p>\n <p class=\"fe-state__path\">{{ notFoundPath }}</p>\n <p class=\"fe-state__hint\">{{ t('notFound.desc') }}</p>\n <div class=\"fe-state__actions\">\n <button type=\"button\" class=\"fe-btn\" @click=\"leaveNotFound\">\n {{ t('notFound.goRoot') }}\n </button>\n </div>\n </div>\n <!-- Listing failed (network / 5xx) with nothing else to show: retryable\n error state in the same visual language. -->\n <div v-else-if=\"loadError && files.length === 0\" class=\"fe-state\">\n <svg\n class=\"fe-state__art\"\n viewBox=\"0 0 120 100\"\n width=\"110\"\n height=\"92\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"60\" cy=\"50\" r=\"28\" />\n <path d=\"M60 36v18\" />\n <circle cx=\"60\" cy=\"63\" r=\"1.8\" fill=\"currentColor\" stroke=\"none\" />\n <path d=\"M24 88h72\" stroke-dasharray=\"3 5\" />\n </svg>\n <p class=\"fe-state__title\">{{ t('error.title') }}</p>\n <!-- wiring:c4 — friendly hint + collapsible technical detail; the raw\n error message used to sit in the hint slot and read like UI copy. -->\n <p class=\"fe-state__hint\">{{ t('error.hint') }}</p>\n <div class=\"fe-state__actions\">\n <button type=\"button\" class=\"fe-btn fe-btn--primary\" @click=\"retryLoad\">\n {{ t('error.retry') }}\n </button>\n </div>\n <details class=\"fe-state__details\">\n <summary class=\"fe-state__details-summary\">{{ t('error.details') }}</summary>\n <pre class=\"fe-state__details-pre\">{{ loadError }}</pre>\n </details>\n <!-- /wiring:c4 -->\n </div>\n <!-- wiring:e2 — şifreli klasör kilit ekranı: parola doğru girilene dek\n listeleme render edilmez. Parola tarayıcıda marker'a karşı\n doğrulanır; sunucuya gitmez. -->\n <div v-else-if=\"e2eLocked\" class=\"fe-state fe-e2e-lock\">\n <svg\n class=\"fe-state__art\"\n viewBox=\"0 0 120 100\"\n width=\"110\"\n height=\"92\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <rect x=\"38\" y=\"44\" width=\"44\" height=\"34\" rx=\"6\" />\n <path d=\"M46 44v-8a14 14 0 0 1 28 0v8\" />\n <circle cx=\"60\" cy=\"59\" r=\"3\" fill=\"currentColor\" stroke=\"none\" />\n <path d=\"M60 62v7\" />\n </svg>\n <p class=\"fe-state__title\">{{ t('e2e.locked.title') }}</p>\n <p class=\"fe-state__hint\">{{ t('e2e.locked.hint') }}</p>\n <form class=\"fe-e2e-lock__form\" @submit.prevent=\"e2eUnlock\">\n <input\n v-model=\"e2ePw\"\n type=\"password\"\n class=\"fe-input fe-e2e-lock__input\"\n :placeholder=\"t('e2e.locked.pw_placeholder')\"\n autocomplete=\"current-password\"\n :disabled=\"e2eUnlockBusy\"\n />\n <button\n type=\"submit\"\n class=\"fe-btn fe-btn--primary\"\n :disabled=\"e2eUnlockBusy || !e2ePw\"\n >\n {{ e2eUnlockBusy ? t('e2e.locked.busy') : t('e2e.locked.unlock') }}\n </button>\n </form>\n <p v-if=\"e2eUnlockErr\" class=\"fe-form__error\" role=\"alert\">{{ e2eUnlockErr }}</p>\n </div>\n <!-- /wiring:e2 -->\n <!-- Search with zero hits — its own message, not \"folder is empty\". -->\n <div v-else-if=\"!loading && files.length === 0 && searchQuery\" class=\"fe-state\">\n <svg\n class=\"fe-state__art\"\n viewBox=\"0 0 120 100\"\n width=\"110\"\n height=\"92\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"52\" cy=\"44\" r=\"22\" />\n <path d=\"M68 61l20 20\" />\n <path d=\"M46 38l12 12M58 38l-12 12\" />\n </svg>\n <p class=\"fe-state__title\">{{ t('empty.search.title') }}</p>\n <p class=\"fe-state__hint\">{{ t('empty.search.hint') }}</p>\n </div>\n <!-- Empty trash view. -->\n <div v-else-if=\"!loading && files.length === 0 && trashMode\" class=\"fe-state\">\n <svg\n class=\"fe-state__art\"\n viewBox=\"0 0 120 100\"\n width=\"110\"\n height=\"92\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M38 34l4 48a6 6 0 0 0 6 5.6h24a6 6 0 0 0 6-5.6l4-48\" />\n <path d=\"M32 34h56\" />\n <path d=\"M50 34v-6a6 6 0 0 1 6-6h8a6 6 0 0 1 6 6v6\" />\n <path d=\"M52 44v32M60 44v32M68 44v32\" opacity=\"0.5\" />\n </svg>\n <p class=\"fe-state__title\">{{ t('empty.trash.title') }}</p>\n </div>\n <!-- Loaded, zero files, no search: the real empty-folder state. The\n upload affordances follow write permission (RBAC viewers only get\n the title). -->\n <div v-else-if=\"!loading && files.length === 0\" class=\"fe-state\">\n <svg\n class=\"fe-state__art\"\n viewBox=\"0 0 120 100\"\n width=\"110\"\n height=\"92\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 36v42a6 6 0 0 0 6 6h72a6 6 0 0 0 6-6V44a6 6 0 0 0-6-6H62l-9-10H24a6 6 0 0 0-6 6z\" />\n <g v-if=\"emptyCanUpload\">\n <path d=\"M60 50v14\" stroke-dasharray=\"3 4\" />\n <path d=\"M53 59l7 8 7-8\" />\n </g>\n </svg>\n <p class=\"fe-state__title\">{{ t('empty.folder') }}</p>\n <p v-if=\"emptyCanUpload\" class=\"fe-state__hint\">{{ t('empty.hint') }}</p>\n <div v-if=\"emptyCanUpload\" class=\"fe-state__actions\">\n <button type=\"button\" class=\"fe-btn fe-btn--primary\" @click=\"triggerUpload\">\n {{ t('empty.upload') }}\n </button>\n </div>\n </div>\n <ListView\n v-else-if=\"viewMode === 'list'\"\n :files=\"files\"\n :selected=\"selection.selected.value\"\n :clipped=\"clippedPaths\"\n :show-parent-path=\"!!searchQuery\"\n :locale=\"locale\"\n :loading=\"loading\"\n :starred-ids=\"starredIds\"\n :api-base=\"props.config.apiBase ?? ''\"\n :auth-headers=\"() => buildAuthHeaders()\"\n :auth-credentials=\"api.credentialsMode()\"\n @click-row=\"(n, m) => selection.click(n.path, m)\"\n @dbl-row=\"openNode\"\n @context-row=\"onContextTarget\"\n @item-drag-start=\"onItemDragStart\"\n @item-drop-into=\"onItemDropInto\"\n @star-change=\"onStarChange\"\n />\n <GridView\n v-else-if=\"viewMode === 'grid' /* wiring:d2 — v-else → v-else-if (3. mod eklendi) */\"\n :files=\"files\"\n :selected=\"selection.selected.value\"\n :clipped=\"clippedPaths\"\n :show-parent-path=\"!!searchQuery\"\n :locale=\"locale\"\n :loading=\"loading\"\n :thumb-src=\"thumbs.src\"\n @click-card=\"(n, m) => selection.click(n.path, m)\"\n @dbl-card=\"openNode\"\n @context-card=\"onContextTarget\"\n @item-drag-start=\"onItemDragStart\"\n @item-drop-into=\"onItemDropInto\"\n />\n <!-- wiring:d2 — galeri görünümü (GridView ile aynı event sözleşmesi) -->\n <GalleryView\n v-else\n :files=\"files\"\n :selected=\"selection.selected.value\"\n :clipped=\"clippedPaths\"\n :show-parent-path=\"!!searchQuery\"\n :locale=\"locale\"\n :loading=\"loading\"\n :thumb-src=\"thumbs.src\"\n @click-card=\"(n, m) => selection.click(n.path, m)\"\n @dbl-card=\"openNode\"\n @context-card=\"onContextTarget\"\n @item-drag-start=\"onItemDragStart\"\n @item-drop-into=\"onItemDropInto\"\n />\n <!-- /wiring:d2 -->\n </div>\n </div><!-- /fe__primary ui-fix -->\n\n <!-- wiring:d1 — tab başına split: sağ ikincil panel (dar modda kapalı).\n :key tab kimliğine bağlı — tab geçişinde pane kendi konumuyla temiz\n remount olur. -->\n <SecondaryPane\n v-if=\"splitVisible && activeSplit\"\n ref=\"splitPaneRef\"\n :key=\"'split-' + tabsActiveId\"\n :api=\"api\"\n :initial-path=\"activeSplit.path\"\n :locale=\"locale\"\n :qualify=\"qualify\"\n :to-user=\"paneToUser\"\n :clamp=\"paneClamp\"\n :root-label=\"multiStorageRoot ? '/' : adapter || t('breadcrumb.root')\"\n :floor=\"rootFloor\"\n :multi-root=\"multiStorageRoot\"\n :virtual-rows=\"virtualStorageRows\"\n :active=\"paneIsActive\"\n :view-mode=\"paneViewMode /* ui-fix */\"\n :thumb-src=\"thumbs.src /* ui-fix */\"\n :trash-visible=\"config.trashVisible !== false /* ui-fix — çöp satırı simetrisi */\"\n @navigate=\"onPaneNavigate\"\n @activate=\"activePane = 'split'\"\n @close=\"closeSplit\"\n @open-tab=\"(p: string) => tabsApi.openTab(p, { viewMode: viewMode, background: true })\"\n @transfer=\"onPaneTransfer\"\n @context=\"onPaneContext /* ui-fix — yan panel sağ-tık menüsü */\"\n @open-trash=\"onPaneOpenTrash /* ui-fix — çöp kutusu ana panelde açılır */\"\n />\n <!-- /wiring:d1 -->\n\n <!-- koru:k1 — inspector (details) panel; v-if keeps the closed state\n free of any DOM. Narrow mode renders it as a full-size overlay. -->\n <InspectorPanel\n v-if=\"showInspector\"\n :api=\"api\"\n :nodes=\"selection.nodes.value\"\n :dir-label=\"inspectorDirLabel\"\n :dir-count=\"files.length\"\n :dir-perm=\"dirPerm\"\n :locale=\"locale\"\n :narrow=\"isNarrow\"\n :thumb-src=\"thumbs.src\"\n @close=\"closeInspector\"\n @manage-permissions=\"onInspectorManage\"\n @toast=\"flashToast\"\n @changed=\"() => load()\"\n />\n </div>\n <!-- /koru:k1 fe__main -->\n\n <div v-if=\"dragOver\" class=\"fe__dragover\">\n <div class=\"fe__dragover-card\">\n <span class=\"fe-icon\">⬆</span>\n <p>Dosyaları buraya bırak</p>\n </div>\n </div>\n\n <!-- wiring:c3 — unified operations center. UploadProgress + PendingOpsTray\n no longer draw their own corner UIs: they are renderless publishers\n feeding the opsCenter store; the single visible surface is the\n OperationsCenter badge + panel below. -->\n <UploadProgress\n :jobs=\"uploadJobs\"\n :locale=\"locale\"\n :center=\"opsCenter\"\n @cancel=\"onCancelUpload\"\n @dismiss=\"onDismissUpload\"\n @retry=\"retryUploadJob\"\n />\n\n <PendingOpsTray\n :ops=\"pendingOps.ops.value\"\n :locale=\"locale\"\n :center=\"opsCenter\"\n @dismiss=\"(id) => pendingOps.dismiss(id)\"\n />\n\n <OperationsCenter\n :center=\"opsCenter\"\n :locale=\"locale\"\n :narrow=\"isNarrow\"\n />\n <!-- /wiring:c3 -->\n\n <!-- bag:b4 — narrow-mode upload FAB (hidden in trash / read-only /\n virtual root; PendingOpsTray+UploadProgress shift up via CSS). -->\n <button\n v-if=\"isNarrow && emptyCanUpload\"\n type=\"button\"\n class=\"fe-fab\"\n :title=\"t('toolbar.upload')\"\n :aria-label=\"t('toolbar.upload')\"\n @click=\"triggerUpload\"\n >\n <svg\n class=\"fe-ficon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.2\"\n stroke-linecap=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M12 5v14M5 12h14\" />\n </svg>\n </button>\n\n <ContextMenu\n ref=\"ctxRef\"\n :locale=\"locale\"\n :theme=\"config.theme || 'auto'\"\n :sheet=\"isCoarse /* bag:b4 */\"\n :actions=\"contextActions\"\n @select=\"onContextAction\"\n />\n\n <NewFolderModal\n :open=\"showNewFolder\"\n :locale=\"locale\"\n :encrypted-option=\"!e2eActive /* wiring:e2 — iç içe şifreli klasör yok */\"\n @close=\"showNewFolder = false\"\n @submit=\"submitNewFolder\"\n @encrypted=\"showNewFolder = false; showEncFolder = true /* wiring:e2 */\"\n />\n <!-- wiring:e2 — şifreli klasör oluşturma modalı -->\n <EncryptedFolderModal\n :open=\"showEncFolder\"\n :locale=\"locale\"\n :busy=\"e2eCreateBusy\"\n @close=\"showEncFolder = false\"\n @submit=\"submitEncryptedFolder\"\n />\n <!-- /wiring:e2 -->\n <RenameModal\n :open=\"showRename\"\n :locale=\"locale\"\n :current-name=\"renameTarget?.basename || ''\"\n @close=\"showRename = false\"\n @submit=\"submitRename\"\n />\n <DeleteConfirmModal\n :open=\"showDelete\"\n :locale=\"locale\"\n :count=\"selection.size.value\"\n @close=\"showDelete = false\"\n @confirm=\"confirmDelete\"\n />\n <ShareModal\n :open=\"showShare\"\n :locale=\"locale\"\n :share=\"activeShare\"\n @close=\"closeShare\"\n @submit=\"submitShare\"\n @toast=\"flashToast\"\n />\n <PreviewModal\n :open=\"showPreview\"\n :locale=\"locale\"\n :file=\"previewTarget\"\n :theme=\"config.theme || 'auto'\"\n :preview-url=\"(p) => e2ePreviewSrc(p) /* wiring:e2 — çözülmüş blob > ham URL */\"\n :download-url=\"(p) => (e2eUnlocked ? e2ePreviewSrc(p) : api.downloadUrl(p)) /* wiring:e2 */\"\n :only-office-base=\"e2eActive ? null : effectiveOnlyOfficeBase /* wiring:e2 — OO ciphertext açamaz */\"\n :only-office-config-endpoint=\"effectiveOnlyOfficeConfigEndpoint\"\n :new-tab-enabled=\"!e2eActive /* wiring:e2 — standalone rota ham baytı çeker */\"\n :save-text-endpoint=\"e2eActive ? null : api.endpoints.saveText || null /* wiring:e2 — düz metin kaydı sızıntı olur */\"\n :open-mode=\"previewMode\"\n :auth-headers=\"() => buildAuthHeaders({ 'Content-Type': 'application/json' })\"\n :auth-credentials=\"api.credentialsMode()\"\n :drawio-url=\"effectiveDrawioUrl\"\n :pdf-worker-url=\"props.config.pdfWorkerUrl || null\"\n :pdf-save-url=\"props.config.pdfSaveUrl || null\"\n :viewer-base-url=\"props.config.viewerBaseUrl || null\"\n @close=\"showPreview = false\"\n />\n <ConvertModal\n v-if=\"showConvert && convertTarget && effectiveConvertUrl\"\n :convert-url=\"effectiveConvertUrl\"\n :file-name=\"convertTarget?.basename || convertTarget?.path || ''\"\n :fetch-bytes=\"() => api.fetchArrayBuffer(convertTarget?.path ?? '')\"\n :upload=\"(f) => api.uploadMultipart(qualify(currentPath), [f]).then(() => {})\"\n @close=\"showConvert = false\"\n @done=\"onConvertDone\"\n />\n <PermissionsModal\n v-if=\"showPerm && permTarget\"\n :api=\"api\"\n :path=\"permTarget.path\"\n :is-dir=\"permTarget.type === 'dir'\"\n :size=\"typeof permTarget.size === 'number' ? permTarget.size : undefined\"\n :locale=\"locale === 'en' ? 'en' : 'tr'\"\n @close=\"showPerm = false\"\n />\n\n <!-- Recently-opened tray. Anchored to the toolbar trigger via fixed\n position; click the backdrop or any entry to dismiss.\n `.fe` + theme class keeps the dark/light cascade matching the\n host shell — without them the popup floats outside the\n FileExplorer root and falls back to :root light defaults. -->\n <transition name=\"fe-modal\">\n <div\n v-if=\"showRecents\"\n class=\"fe fe-modal__backdrop fe-recents__backdrop\"\n :class=\"{\n 'fe--theme-light': config.theme === 'light',\n 'fe--theme-dark': config.theme === 'dark',\n }\"\n @click=\"showRecents = false\"\n >\n <div class=\"fe-recents__panel\" @click.stop>\n <div class=\"fe-recents__header\">\n <strong>{{ locale === 'en' ? 'Recently opened' : 'Son açılanlar' }}</strong>\n <button class=\"fe-recents__close\" aria-label=\"Close\" @click=\"showRecents = false\">×</button>\n </div>\n <RecentlyOpened\n :api-base=\"props.config.apiBase ?? ''\"\n :auth-headers=\"() => buildAuthHeaders()\"\n :auth-credentials=\"api.credentialsMode()\"\n :limit=\"20\"\n :refresh-key=\"recentRefreshKey\"\n @open=\"onRecentOpen\"\n @error=\"(msg: string) => emit('error', { message: msg, context: { op: 'recents' } })\"\n />\n </div>\n </div>\n </transition>\n\n <!-- Tag editor — opened from the context menu via Etiketler. -->\n <transition name=\"fe-modal\">\n <div\n v-if=\"showTagPicker && tagPickerNode && typeof tagPickerNode.id === 'number'\"\n class=\"fe-modal__backdrop\"\n @click=\"showTagPicker = false\"\n >\n <div class=\"fe-modal__card fe-modal__card--md\" @click.stop>\n <header class=\"fe-modal__head\">\n <h2 class=\"fe-modal__title\">\n {{ locale === 'en' ? 'Tags' : 'Etiketler' }} — {{ tagPickerNode.basename }}\n </h2>\n <button class=\"fe-modal__close\" aria-label=\"Close\" @click=\"showTagPicker = false\">×</button>\n </header>\n <div class=\"fe-modal__body\">\n <TagPicker\n :node-id=\"tagPickerNode.id\"\n :api-base=\"props.config.apiBase ?? ''\"\n :auth-headers=\"() => buildAuthHeaders()\"\n :auth-credentials=\"api.credentialsMode()\"\n @error=\"(msg: string) => emit('error', { message: msg, context: { op: 'tags' } })\"\n />\n </div>\n </div>\n </div>\n </transition>\n\n <!-- cila:c wiring — command palette (Ctrl/Cmd+K) + shortcuts help (?) -->\n <CommandPalette\n :open=\"showPalette\"\n :locale=\"locale\"\n :files=\"files\"\n :view-mode=\"viewMode\"\n :can-write=\"canWriteHere && !atVirtualRoot && !trashActive\"\n :can-go-up=\"canGoUp\"\n :global-search=\"paletteGlobalSearch\"\n @close=\"showPalette = false\"\n @open-hit=\"openSearchHit\"\n @open-node=\"openNode\"\n @navigate=\"(p: string) => load(p)\"\n @new-folder=\"showNewFolder = true\"\n @upload=\"triggerUpload\"\n @toggle-view=\"setDisplayedViewMode(displayedViewMode === 'list' ? 'grid' : displayedViewMode === 'grid' ? 'gallery' : 'list') /* wiring:d2 + ui-fix — 3 mod döngüsü, aktif panele */\"\n @open-trash=\"loadTrash\"\n @refresh=\"() => load()\"\n @go-up=\"goUp\"\n @open-theme=\"showThemeGallery = true /* wiring:int */\"\n @open-shortcut-settings=\"showShortcutSettings = true /* wiring:int */\"\n @start-tour=\"startTour() /* wiring:int */\"\n :split-enabled=\"!isNarrow /* wiring:d1 */\"\n @tab-new=\"newTabHere() /* wiring:d1 */\"\n @split-toggle=\"toggleSplit() /* wiring:d1 */\"\n />\n <ShortcutsHelp\n :open=\"showShortcutsHelp\"\n :locale=\"locale\"\n @close=\"showShortcutsHelp = false\"\n @customize=\"showShortcutsHelp = false; showShortcutSettings = true /* wiring:c2 */\"\n />\n <!-- /cila:c wiring -->\n\n <!-- wiring:c1 — tema galerisi -->\n <ThemeGallery\n :open=\"showThemeGallery\"\n :locale=\"locale\"\n :theme=\"config.theme || 'auto'\"\n :dark=\"themeResolvedDark\"\n :current=\"activeThemeId\"\n @close=\"showThemeGallery = false\"\n @select=\"setActiveTheme\"\n />\n <!-- /wiring:c1 -->\n\n <input\n ref=\"fileInputEl\"\n type=\"file\"\n multiple\n class=\"fe__file-input\"\n @change=\"onFilePicked\"\n />\n\n <transition name=\"fe-toast\">\n <div\n v-if=\"toast\"\n class=\"fe-toast\"\n :class=\"{ 'fe-toast--action': !!toast.actionLabel }\"\n role=\"status\"\n @click=\"dismissToast\"\n >\n <span class=\"fe-toast__msg\">{{ toast.message }}</span>\n <button\n v-if=\"toast.actionLabel && toast.action\"\n type=\"button\"\n class=\"fe-toast__action\"\n @click.stop=\"runToastAction\"\n >{{ toast.actionLabel }}</button>\n </div>\n </transition>\n\n <!-- wiring:c2 — shortcut settings modal + Space quick-look overlay -->\n <ShortcutSettings\n :open=\"showShortcutSettings\"\n :locale=\"locale\"\n :theme=\"config.theme || 'auto'\"\n @close=\"showShortcutSettings = false\"\n />\n <QuickLook\n :open=\"quickLookOpen\"\n :locale=\"locale\"\n :file=\"quickLookTarget\"\n :theme=\"config.theme || 'auto'\"\n :preview-url=\"(p: string) => e2ePreviewSrc(p) /* wiring:e2 */\"\n :download-url=\"(p: string) => (e2eUnlocked ? e2ePreviewSrc(p) : api.downloadUrl(p)) /* wiring:e2 */\"\n :only-office-base=\"e2eActive ? null : effectiveOnlyOfficeBase /* wiring:e2 */\"\n :only-office-config-endpoint=\"effectiveOnlyOfficeConfigEndpoint\"\n :auth-headers=\"() => buildAuthHeaders({ 'Content-Type': 'application/json' })\"\n :auth-credentials=\"api.credentialsMode()\"\n :drawio-url=\"effectiveDrawioUrl\"\n :pdf-worker-url=\"props.config.pdfWorkerUrl || null\"\n :viewer-base-url=\"props.config.viewerBaseUrl || null\"\n @close=\"quickLookOpen = false\"\n @nav=\"quickLookNav\"\n @open-full=\"quickLookOpenFull\"\n />\n <!-- /wiring:c2 -->\n <!-- wiring:c4 — onboarding coach-mark tour (teleports itself to body) -->\n <OnboardingTour\n :open=\"showTour\"\n :locale=\"locale\"\n :root=\"rootEl\"\n :theme=\"config.theme || 'auto'\"\n @close=\"onTourClose\"\n />\n <!-- /wiring:c4 -->\n </div>\n</template>\n\n<style src=\"./styles/variables.css\"></style>\n<style src=\"./styles/base.css\"></style>\n"],"names":["isExternalUsable","s","resolveEndpoints","config","base","derive","path","autoSegment","manager","resolveToken","t","out","normalizeAuth","auth","useFileApi","endpoints","authConf","authHeaders","extra","h","token","creds","authHeadersSync","credentialsMode","statusMessage","status","tr","e","jsonFetch","url","init","headers","res","text","err","permissionsUrl","sub","listPermissions","resolveEmail","email","searchUsers","q","addPermission","body","updatePermission","id","level","deletePermission","invitePermission","shareMail","qs","params","sp","k","v","managerUrl","action","sep","index","search","filter","globalSearch","query","opts","data","subfolders","newFolder","name","rename","item","move","items","target","p","deleteItems","copy","source","moveAsync","sourceDir","deleteAsync","restore","listTrash","storageName","restoreIds","ids","restored","uploadMultipart","files","onProgress","fd","f","resolve","reject","xhr","ev","downloadUrl","previewUrl","fetchBlob","blob","mime","fetchArrayBuffer","limits","capabilities","createShare","payload","listShares","revokeShare","uuid","archiveList","archiveExtract","members","archiveAdd","versionsUrl","listVersions","nodeId","restoreVersion","versionId","snapshotCurrent","snapshotVersion","commentsUrl","listComments","addComment","deleteComment","wsTicket","useUploadChunked","api","DEFAULT_CHUNK","DEFAULT_PARALLEL","uploadFile","chunkSize","parallel","job","cancelled","aborters","a","report","_a","actualChunk","partProgress","completed","cursor","uploadPart","entry","start","end","ctl","prev","delta","etag","blobSize","MAX_RETRIES","uploadPartWithRetry","attempt","leaked","delay","r","worker","workers","i","b","final","asError","_b","useSelection","selected","ref","anchor","click","mod","list","aIdx","n","bIdx","lo","hi","next","clear","selectAll","has","add","remove","size","computed","isEmpty","nodes","SHORTCUT_ACTIONS","HANDLER_KEY","SHORTCUTS_LS_KEY","readOverrides","raw","parsed","overrides","writeOverrides","defOf","effectiveCombo","o","setShortcutOverride","combo","def","resetShortcut","resetAllShortcuts","findShortcutConflict","excludeId","KEY_TOKEN_MAP","MODIFIER_KEYS","keyToken","mapped","comboFromEvent","key","parts","printableSymbol","useShortcutList","fixed","c","useKeyboardShortcuts","rootEl","handlers","comboMap","m","onKey","inForm","fn","onMounted","onBeforeUnmount","en","messages","useLocale","localeRef","lookup","code","vars","acc","formatSize","bytes","units","div","val","nodeDisplayName","node","POLL_MS","RETAIN_MS","normalizeOp","num","vals","str","rawStatus","sources","opType","usePendingOps","ops","announced","settledAt","firstPollDone","hasActive","timer","startPolling","poll","stopPolling","incoming","op","localIds","visibleIncoming","visibleIds","local","merged","now","after","at","register","dismiss","PING_INTERVAL_MS","MAX_BACKOFF_MS","RealtimeClient","__publicField","file","ticket","ws","msg","active","obj","RELOAD_DEBOUNCE_MS","POLL_INTERVAL_MS","useRealtime","presenceUsers","connected","degraded","client","pendingSubscribe","reloadTimer","pollTimer","debouncedReload","onPresence","onFallback","subscribe","wire","setFocus","stop","MAX_CACHED","useThumbs","apiBase","urls","order","failed","pending","resolveUrl","src","got","load","evict","monacoPromise","highlightPromise","monacoCached","highlightCached","preloadEditor","ensureMonaco","ensureHighlight","getMonaco","getHighlight","useMonacoLoader","EXPAND_KEY","props","__props","others","u","expanded","toggleExpanded","keyOf","initials","hue","label","_createElementBlock","_normalizeClass","_openBlock","_hoisted_1","_Fragment","_renderList","_createElementVNode","_normalizeStyle","_createTextVNode","_toDisplayString","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_8","_hoisted_9","_hoisted_11","_unref","_hoisted_12","emit","__emit","open","x","y","targetNodes","menuEl","anchorX","anchorY","prevFocus","show","nextTick","sheetEl","clampToViewport","focusItem","el","rect","margin","vw","vh","flipped","hide","sheetDragging","sheetDragY","menuItems","host","idx","moveFocus","cur","sheetDragStart","onSheetDragStart","t0","onSheetDragMove","onSheetDragEnd","shouldClose","sheetStyle","pick","visibleActions","vis","prefersDark","mq","syncPrefersDark","themeClass","__expose","_createBlock","_Teleport","_createVNode","_Transition","$event","_hoisted_7","_hoisted_10","_hoisted_13","DENSITY_LS_KEY","WIDE_MORE_BTN_W","density","toggleDensity","searchEl","localSearch","watch","debounce","onSearchInput","focusSearch","searchOpen","mode","toolbarItems","primaryEl","measureEl","wideMoreBtnEl","wideMoreRef","visibleActionCount","visibleToolbarItems","overflowToolbarItems","recalcFold","cont","meas","gap","child","widths","total","w","avail","used","count","foldRo","openWideMore","fire","openSearch","closeSearch","coarse","coarseMq","syncCoarse","moreBtnEl","moreRef","moreActions","writable","openMore","onMoreSelect","_hoisted_26","ContextMenu","_cache","_hoisted_6","_hoisted_18","_hoisted_19","tags","loading","adding","newTag","palette","colorFor","tag","arr","buildHeaders","persist","previous","_withKeys","limit","fmtTime","diff","_hoisted_2","OVERFLOW_THRESHOLD","confinedRel","floorLabel","rel","crumbs","adapterPrefix","floor","below","part","collapsed","leadCrumbs","middleCrumbs","tailCrumbs","overflowOpen","moreWrapEl","onOverflowPick","crumb","onDocClick","wrap","onDocKeydown","onClick","onContext","onCrumbDragOver","onCrumbDrop","editing","pathDraft","pathInput","startEdit","trimmed","submitPath","clean","slash","adapter","cancelEdit","EXT_FAMILIES","reg","family","exts","iconFamilyFor","ext","FILE_BASE","GLYPHS","SVG_CACHE","iconSvg","svg","fileIconSvg","snippetSegments","snippet","re","last","matchedInContent","matched","applyDragGhost","dt","badge","toggle","SORT_LS_KEY","isSelected","onRowClick","onRowDbl","onRowCtx","onItemDragStart","dropTargetPath","onItemDragOver","onItemDragLeave","onItemDrop","pressTimer","pressTarget","onTouchStart","cancelPress","specialEmojiFor","isPinnedSpecial","displayDate","ms","parentDir","stripped","rowSnippet","rowInContent","sortKey","sortDir","defaultDir","toggleSort","ariaSort","modifiedMs","rows","pinned","rest","dir","am","bm","monthFmt","bucketFor","d","dayStart","today","day","DAY","segments","seg","_hoisted_14","StarButton","_hoisted_16","_hoisted_17","_hoisted_21","_hoisted_22","_hoisted_23","si","_hoisted_24","_hoisted_25","_hoisted_27","thumbOf","onDbl","onCtx","cardSnippet","snippetTitle","metaFor","date","mapStatus","jobs","j","percentOf","single","isMulti","isFile","multiTotal","thumb","shortHash","formatDate","formatDateStr","copyText","effectivePerm","own","canManagePerms","permLabel","versionsState","versions","confirmVersionId","snapshotFirst","versionBusy","sharesState","shares","refreshSeq","refresh","seq","loadVersions","askRestore","confirmRestore","takeSnapshot","commentsState","comments","commentDraft","commentBusy","commentNodeId","commentSeq","loadComments","sendComment","removeComment","relativeTime","iso","diffS","abs","rtf","unit","secs","_hoisted_15","_hoisted_20","_hoisted_28","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_59","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_64","_hoisted_65","_hoisted_66","_hoisted_67","_hoisted_68","_hoisted_69","_hoisted_71","EVERYWHERE_MIN_CHARS","EVERYWHERE_LIMIT","EVERYWHERE_DEBOUNCE_MS","SAVED_LS_KEY","SAVED_MAX","inputEl","listEl","matchScore","sc","gotoItems","fileItems","scored","commandItems","everywhere","everywhereLoading","everywhereTimer","everywhereSeq","scheduleEverywhere","hits","hitCrumb","parent","storage","hitItems","savedSearches","readSavedSearches","writeSavedSearches","saveSearch","removeSavedSearch","flat","savedItems","fileOffset","hitOffset","savedOffset","cmdOffset","choose","it","_withModifiers","_hoisted_29","FOCUSABLE","cardEl","modalSeq","titleId","focusable","first","onBackdrop","_renderSlot","_ctx","$slots","groups","map","Modal","g","THEME_LS_KEY","DEFAULT_THEME_ID","THEMES","themeById","ALL_TOKEN_KEYS","readStoredThemeId","themeId","setTheme","valid","useThemeState","applyThemeToEl","dark","theme","value","STYLE_ATTR","cssDecls","generateThemeCss","light","darkSelectors","autoDarkSelectors","syncThemeStyle","css","cardVars","th","DEFAULT_ID","anyOverridden","capturingId","conflict","labelOf","beginCapture","cancelCapture","attemptAssign","clash","confirmConflictTake","dismissConflict","onReset","onResetAll","onWindowKeydown","onClose","MAX_TEXT_BYTES","ONLYOFFICE_SCRIPT_ID","IMAGE","VIDEO","AUDIO","CODE_LANGS","TEXT_PLAIN","OFFICE","VIEWER_MAP","kind","wantEdit","viewerCmp","shallowRef","viewerLoadError","pdfFallbackToNative","loadViewerFor","extension","loader","onPdfFallback","viewerProps","stripAdapter","openInNewTab","buildAndOpenStandalone","openEditInNewTab","EDITABLE_EXTS","canEditKind","download","fetchError","rawText","tooLarge","mdDirty","mdSaving","mdReRenderTimer","mdAutosaveTimer","onMdInput","renderMarkdown","saveMarkdown","fetchText","markdownHtml","markdownEl","Md","sanitizeHtml","enrichMarkdown","html","root","blocks","mermaid","katex","block","cls","isMermaid","isMath","_c","codeHtml","highlightCode","language","hljs","result","monacoEl","monacoEditor","codeAutosaveTimer","monacoReady","saving","saveOk","saveError","disposeMonaco","monacoLanguageFor","tryMountMonaco","monaco","editable","saveCode","txt","runOrchestration","officeError","disposeOnlyOfficeEditor","lang","mountOnlyOfficeEditor","codeLanguage","officeEl","officeEditor","documentServerUrl","loadOnlyOfficeScript","mountId","formatOnlyOfficeError","W","existing","script","_resolveDynamicComponent","_mergeProps","inFormControl","onKeydown","PreviewModal","RING_R","history","hasError","overall","runningCount","visible","RING_C","ringOffset","ringSpin","pctText","badgeAria","KIND_ICONS","kindLabel","rowTitle","statusText","chipText","onDocPointerDown","DONE_LINGER_MS","HISTORY_CAP","toOperation","input","terminal","useOperations","actions","retired","lingerTimers","clearTimer","tm","retire","scheduleLinger","acts","sync","group","prefix","present","changed","cancel","retry","clearHistory","errorCount","overallPercent","running","sum","frac","getCurrentScope","onScopeDispose","PAD","GAP","byTitle","STEPS","activeSteps","stepIdx","step","resolveSteps","spot","cardStyle","place","cw","ch","top","left","onViewportChange","back","skip","dragIndex","overIndex","onDragStart","onDragOver","onDragLeave","onDrop","onDragEnd","onTabMiddleDown","onAux","tab","E2E_MARKER_NAME","E2E_MAGIC","E2E_VERSION","E2E_DEFAULT_ITERATIONS","E2E_MIN_ITERATIONS","E2E_MAX_FILE_BYTES","E2E_MIN_PASSWORD_LEN","VERIFY_PLAINTEXT","MAGIC_BYTES","HEADER_LEN","WRAP_IV_OFF","WRAPPED_DEK_OFF","WRAPPED_DEK_LEN","DATA_IV_OFF","IV_LEN","E2eDecryptError","bytesToB64","b64ToBytes","deriveKek","password","salt","iterations","material","createMarker","iter","kek","iv","ct","verify","parseMarker","verifyPassword","marker","pt","hasMagic","buf","encryptFile","content","rawDek","dek","wrapIV","dataIV","wrappedDek","decryptFile","createKeyRing","keys","filterInternalEntries","SHOW_HIDDEN_LS_KEY","readShowHidden","showHiddenFiles","setShowHiddenFiles","filterHiddenEntries","showHidden","filterListing","isStorageRootDir","dirname","isTrashListing","makeTrashRow","injectTrashRow","trashVisible","hydrateTrashRow","entries","row","newest","ts","FE_DND_MIME","FE_DND_SRC_MIME","error","isStorageRow","atVirtualRoot","loadPane","requested","resp","segs","showRootCrumb","crumbGo","onViewClick","multi","onViewContext","onBgContext","onViewDropInto","dropBg","acceptDrag","handleDropPayload","clearSelection","onRowDragStart","targetWire","origin","onBgDragOver","onBgDragLeave","onBgDrop","goUp","selectedNodes","openSelected","reload","getPath","ListView","GridView","GalleryView","makeId","useTabs","tabs","activeId","activeTab","activeIndex","hasMultiple","vm","rawSplit","split","seed","viewMode","syncActive","patch","openTab","closeTab","wasActive","activate","from","to","setSplit","password2","ack","submit","isOpen","usePin","expiresAt","maxDownloads","toast","shQuote","cliCommand","sh","iframeRef","formats","selectedTo","srcExt","fromFmt","ins","toList","seen","uniq","iframeSrc","msgId","send","cmd","transfer","onMessage","loadFormats","tt","doConvert","outName","fb","L","pathParts","canManage","direct","inherited","storageRbac","busy","notice","noAccount","createRole","inviteResult","suggestions","showSuggest","searchTimer","levels","levelLabel","shareBusy","sharePwd","shareExpiry","shareResult","shareErr","copied","shareMailTo","shareMailBusy","shareMailNotice","expiryOptions","dropPwd","dropExpiry","dropShowAdv","dropMaxFiles","dropMaxSizeMB","dropAllowedExt","dropAskName","dropBusy","dropErr","dropResult","dropMailTo","dropMailBusy","dropMailNotice","splitEmails","mailResultNotice","sent","reloadShares","onEmailInput","pickUser","lvl","submitEmail","addr","inviteCreateUser","gotoShareWithMail","changeLevel","newLevel","removeGrant","glabel","ginitial","expiresAtISO","createLink","sendShareMail","detail","dropExpiresAtISO","createDropLink","drop_settings","sendDropMail","revoke","canShare","humanSize","exp","expiryLine","days","shareBody","pin","title","lines","sz","dropBody","folder","maxFiles","maxMB","nativeShare","_hoisted_70","_hoisted_72","_hoisted_73","_hoisted_74","_hoisted_75","_hoisted_76","_hoisted_77","_hoisted_78","_hoisted_79","_hoisted_80","_hoisted_81","_hoisted_82","_hoisted_83","_hoisted_85","_hoisted_86","_hoisted_87","_hoisted_88","_hoisted_89","_hoisted_90","_hoisted_91","_hoisted_93","_hoisted_94","VIEW_MODE_KEY","INSPECTOR_LS_KEY","PATH_LS_KEY","TOUR_LS_KEY","TABS_LS_BASE","locale","realtime","realtimeDegraded","realtimeRoom","vp","qualify","currentPath","thumbs","chunked","opUndo","pendingOps","undo","flashToast","undoToast","verb","splitPaneRef","rootPathProp","rootFloor","initialFloorPath","dirPerm","notFoundPath","loadError","loadErrorPath","retryLoad","customRef","track","trigger","stored","searchQuery","trashMode","trashOrigin","trashActive","soleStorageName","multiStorageRoot","canGoUp","selection","focusFiles","clipboard","capabilitiesData","starredIds","showRecents","showTagPicker","tagPickerNode","recentRefreshKey","loadStarred","buildAuthHeaders","onStarChange","markRecent","openTagPickerFor","onRecentOpen","openNode","effectiveOnlyOfficeBase","effectiveOnlyOfficeConfigEndpoint","effectiveDrawioUrl","override","effectiveConvertUrl","uploadJobs","fileInputEl","showNewFolder","showRename","showDelete","showShare","showPreview","renameTarget","mutationInPane","shareTarget","activeShare","previewTarget","previewMode","showConvert","convertTarget","showPerm","permTarget","showInspector","persistInspector","toggleInspector","openInspector","closeInspector","inspectorDirLabel","onInspectorManage","permCanEdit","selPerm","sel","canWriteHere","emptyCanUpload","ctxRef","toolbarRef","isNarrow","isCoarse","narrowRO","syncCoarsePointer","toastTimer","showToast","state","message","dismissToast","runToastAction","act","splitVirtualPath","virtualToWire","wireToVirtual","virtualStorageRows","toggleHiddenFiles","e2eRoot","hydrateTrashRowShared","leaveNotFound","writePersistedPath","loadTrash","wireBasename","wireParent","sameDir","norm","pre","wireJoin","registerMoveUndo","opId","originWire","movedPaths","persistMode","hashPersistEnabled","safeDecode","readLsPath","readHashPath","readPersistedPath","fromHash","encoded","onHashChange","fromPersist","cap","showPalette","showShortcutsHelp","paletteGlobalSearch","openSearchHit","hit","isDir","targetRel","configured","paneIsActive","psel","paneCtxTargets","paneCut","cut","paneCopy","copyToClipboard","panePaste","paste","quickLookToggle","newTabHere","closeTabById","tabsActiveId","nextTab","prevTab","OFFICE_EXTS","e2eUnlocked","e2eOpenPreview","e2eLocked","previewModeForExt","VIEW_DEFAULT_EXTS","restoreSelection","targets","previewNode","openNodeInNewTab","e2eActive","ctxMode","breadcrumbCtxPath","breadcrumbCtxLabel","selectionMode","onToolbarAction","dispatchItemAction","onContextTarget","onContextCanvas","onCrumbContext","onPaneContext","activePane","contextActions","selectionActionList","any","trimmedPath","view","tagsLabel","singleHasId","copyIdLabel","accessLabel","toolbarActions","onContextAction","onCopyPath","downloadFile","openConvert","openShare","duplicate","openNodeInTab","cb","e2eDownload","submitNewFolder","inPane","dirWire","submitRename","oldPath","oldName","newPath","confirmDelete","nodeIds","restoreUndo","onConvertDone","submitShare","share","closeShare","triggerUpload","onFilePicked","uploadFiles","e2eEncryptUploads","canChunk","chunkedUpload","legacyUpload","percent","registered","dragCounter","dragOver","isExternalFileDrag","hasFile","onDragEnter","onDropUpload","d1Origin","d1Here","d1Items","transferItems","onWindowDragOver","onWindowDrop","clippedPaths","moveSourcesAsync","targetDir","opLabel","originOverride","onItemDropInto","dndOrigin","onCrumbDropInto","adapterPath","onCancelUpload","onDismissUpload","onNavigate","showThemeGallery","activeThemeId","setActiveTheme","themeMq","themeOsDark","onThemeMqChange","themeResolvedDark","showShortcutSettings","quickLookOpen","quickLookTarget","e2eFetchDecrypted","quickLookNav","onlyFiles","quickLookOpenFull","opsCenter","retryUploadJob","patchRetry","showTour","tourTimer","tourAlreadyDone","startTour","onTourClose","onTourRestartEvent","tabsStorageKey","tabsApi","tabsRestored","tabsVisible","activeSplit","tabLabel","tabItems","tb","applyTabLocation","activateTab","onListAuxClick","onListMiddleDown","splitVisible","toggleSplit","closeSplit","onPaneNavigate","onPaneOpenTrash","paneViewMode","setPaneViewMode","displayedViewMode","setDisplayedViewMode","setPaneMain","mainPaneFocus","paneToUser","paneClamp","pane","wireAdapterOf","forceCopy","targetAdapter","cross","onPaneTransfer","e2eRing","e2eRingVer","e2eUrls","e2ePw","e2eUnlockBusy","e2eUnlockErr","showEncFolder","e2eCreateBusy","e2eKek","e2eRevokeAll","e2eUnlock","markerText","e2eLock","E2E_MIME","e2eMimeFor","cached","plain","e2ePreviewSrc","submitEncryptedFolder","markerFile","newDirWire","TabBar","Toolbar","Breadcrumb","PresenceBar","SecondaryPane","InspectorPanel","UploadProgress","PendingOpsTray","OperationsCenter","NewFolderModal","EncryptedFolderModal","RenameModal","DeleteConfirmModal","ShareModal","ConvertModal","PermissionsModal","RecentlyOpened","TagPicker","CommandPalette","ShortcutsHelp","ThemeGallery","ShortcutSettings","QuickLook","OnboardingTour"],"mappings":"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"}