// Bootstrap window.app for the browse tool. Mirrors the convention // used by every other ZDDC tool — ./build's CSS/JS concat order means // this file runs FIRST inside the IIFE-of-IIFEs. (function () { 'use strict'; if (!window.app) { window.app = { modules: {}, state: {} }; } window.app.state = { // Source: 'server' | 'fs' | null. Determines how the loader // resolves entries. source: null, // For server-source: the URL path of the directory currently // being viewed. Always starts with '/' and ends with '/'. // For fs-source: the displayed path string (no semantic // meaning — just for the toolbar). currentPath: '/', // FileSystemAccessAPI root handle (null in server mode). rootHandle: null, // Sort state. key: 'name' | 'size' | 'ext' | 'date'. dir: 1 or -1. sort: { key: 'name', dir: 1 }, // Currently-selected tree node id (for highlight + pop-out). selectedId: null, lastPreviewedNodeId: null, // View mode: 'browse' (tree + preview, default) | 'grid' (classifier). viewMode: 'browse', // The tree's in-memory representation. Each node: // { id, name, isDir, size, modTime, ext, url, depth, // parentId, expanded, loaded, childIds, isZip, zipFile, // zipPath } // - isZip: set when the node IS a .zip file we know how to // expand inline (server file or FS handle). // - zipFile: cached JSZip instance for this archive (set // after first expand). // - zipPath: relative path WITHIN a zip (set on virtual // children of an expanded zip; null otherwise). // Stored flat in a Map keyed by id; render order derived // from a depth-first walk. nodes: new Map(), rootIds: [], nextId: 1, // Single shared popup window for file preview (across // multiple file clicks). Same pattern as archive's preview. previewWindow: null, // Cascade-resolved scope flags, refreshed on each listing // fetch from response headers. // scopeDropTarget: cascade's drop_target at currentPath scopeDropTarget: false }; })();