@forgeax/view 0.5.0-dev.13243.3f46e0e6d62f → 0.5.0-dev.13598.ab27e992befc
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -7
- package/dist/build-revision.json +1 -1
- package/dist/modules/backend.mjs +12 -12
- package/dist/modules/browser.mjs +16 -16
- package/dist/modules/chunks/{App-E3M52XTQ.mjs → App-4XQ5SNNT.mjs} +2 -2
- package/dist/modules/chunks/{chunk-3GIGTM7E.mjs → chunk-27XASYEH.mjs} +2 -2
- package/dist/modules/chunks/{chunk-UAGQZPAB.mjs → chunk-2Z5KEV6L.mjs} +2 -2
- package/dist/modules/chunks/{chunk-4NGODRIE.mjs → chunk-46UEGAXY.mjs} +4 -4
- package/dist/modules/chunks/{chunk-UZHTLAIZ.mjs → chunk-47RJSHLM.mjs} +2 -2
- package/dist/modules/chunks/{chunk-ACOMGSSB.mjs → chunk-5PHAXNFO.mjs} +2 -2
- package/dist/modules/chunks/{chunk-IXPBGENY.mjs → chunk-6I7RY73G.mjs} +3 -3
- package/dist/modules/chunks/{chunk-NF6KRVDK.mjs → chunk-7725LLBM.mjs} +3 -3
- package/dist/modules/chunks/{chunk-45ZU2HHR.mjs → chunk-B6QUJ33G.mjs} +27 -23
- package/dist/modules/chunks/chunk-B6QUJ33G.mjs.map +7 -0
- package/dist/modules/chunks/{chunk-GK4TW3KT.mjs → chunk-BGWAT7SI.mjs} +12 -12
- package/dist/modules/chunks/{chunk-FKLYSAVN.mjs → chunk-CXOD7FW6.mjs} +7 -4
- package/dist/modules/chunks/chunk-CXOD7FW6.mjs.map +7 -0
- package/dist/modules/chunks/{chunk-CRNEX7YH.mjs → chunk-D25SR5FS.mjs} +2 -2
- package/dist/modules/chunks/{chunk-VKAISRA4.mjs → chunk-D5GUFI74.mjs} +6 -6
- package/dist/modules/chunks/{chunk-7FP7COI6.mjs → chunk-DZRJQVJF.mjs} +4 -4
- package/dist/modules/chunks/{chunk-MHE5EBU4.mjs → chunk-E3PJGTLI.mjs} +22 -14
- package/dist/modules/chunks/chunk-E3PJGTLI.mjs.map +7 -0
- package/dist/modules/chunks/{chunk-3Q26HNFS.mjs → chunk-FICPCJKR.mjs} +2 -2
- package/dist/modules/chunks/{chunk-CWNB67UF.mjs → chunk-FMCHH5R4.mjs} +2 -2
- package/dist/modules/chunks/{chunk-MO5LILCP.mjs → chunk-HWZCLROY.mjs} +6 -2
- package/dist/modules/chunks/chunk-HWZCLROY.mjs.map +7 -0
- package/dist/modules/chunks/{chunk-BRJHP7CU.mjs → chunk-I5KQUTEE.mjs} +6 -6
- package/dist/modules/chunks/{chunk-BRJHP7CU.mjs.map → chunk-I5KQUTEE.mjs.map} +1 -1
- package/dist/modules/chunks/{chunk-2VJPRNYB.mjs → chunk-IZAHIOFU.mjs} +4 -4
- package/dist/modules/chunks/{chunk-IBNFKPW4.mjs → chunk-JK7K7RG3.mjs} +2 -2
- package/dist/modules/chunks/{chunk-BGK4ZEQ5.mjs → chunk-KX2WU5Z6.mjs} +2 -2
- package/dist/modules/chunks/{chunk-M5X56JWH.mjs → chunk-PW5CE2Y6.mjs} +3 -3
- package/dist/modules/chunks/{chunk-OHVTNEQ2.mjs → chunk-PZIAKZJC.mjs} +2 -2
- package/dist/modules/chunks/{chunk-D5BEXMH5.mjs → chunk-RJ4PIQRU.mjs} +4 -4
- package/dist/modules/chunks/{chunk-D5BEXMH5.mjs.map → chunk-RJ4PIQRU.mjs.map} +1 -1
- package/dist/modules/chunks/{chunk-7UQ7UUHG.mjs → chunk-SYE5RTD4.mjs} +3 -3
- package/dist/modules/chunks/{chunk-N2GEQFFK.mjs → chunk-U5J7OTEB.mjs} +2 -2
- package/dist/modules/chunks/{chunk-N2GEQFFK.mjs.map → chunk-U5J7OTEB.mjs.map} +2 -2
- package/dist/modules/chunks/{chunk-JZ3V27HQ.mjs → chunk-U64FRQKP.mjs} +3 -3
- package/dist/modules/chunks/{chunk-W46L4HSP.mjs → chunk-U6UMATPV.mjs} +3 -3
- package/dist/modules/chunks/{chunk-7ICJKZYO.mjs → chunk-VKNIYV2W.mjs} +26 -21
- package/dist/modules/chunks/chunk-VKNIYV2W.mjs.map +7 -0
- package/dist/modules/chunks/{chunk-7R6CGQDU.mjs → chunk-VW2ZF3P4.mjs} +4 -4
- package/dist/modules/chunks/{chunk-AIIYGGGC.mjs → chunk-X4NNZ5X6.mjs} +2 -2
- package/dist/modules/chunks/{chunk-5AKXNYKX.mjs → chunk-XE6ITXHT.mjs} +2 -2
- package/dist/modules/chunks/{chunk-KSF2EQTE.mjs → chunk-YCMZAYBM.mjs} +2 -2
- package/dist/modules/chunks/chunk-YCMZAYBM.mjs.map +7 -0
- package/dist/modules/chunks/{chunk-6WCG6WPC.mjs → chunk-YNHEYXDG.mjs} +3 -3
- package/dist/modules/chunks/{chunk-7MJUWNVI.mjs → chunk-ZGOGO7SS.mjs} +1 -1
- package/dist/modules/chunks/{chunk-VXSD4FK5.mjs → chunk-ZHO2G4JR.mjs} +3 -3
- package/dist/modules/cli-contributions.mjs +3 -3
- package/dist/modules/cli.mjs +2 -2
- package/dist/modules/command-executor.mjs +2 -2
- package/dist/modules/embedded.mjs +100 -21
- package/dist/modules/embedded.mjs.map +3 -3
- package/dist/modules/frontend-root.mjs +15 -15
- package/dist/modules/index.mjs +26 -26
- package/dist/modules/plugin.mjs +14 -14
- package/dist/modules/plugins/asset/frontend.mjs +4 -4
- package/dist/modules/plugins/asset/identity.mjs +3 -3
- package/dist/modules/plugins/asset/ui.mjs +2 -2
- package/dist/modules/plugins/content-browser/ui.mjs +2 -2
- package/dist/modules/plugins/inspector/ui.mjs +2 -2
- package/dist/modules/plugins/material/frontend.mjs +4 -4
- package/dist/modules/plugins/material/identity.mjs +3 -3
- package/dist/modules/plugins/material/ui.mjs +5 -5
- package/dist/modules/plugins/mesh/frontend.mjs +4 -4
- package/dist/modules/plugins/mesh/identity.mjs +3 -3
- package/dist/modules/plugins/mesh/ui.mjs +5 -5
- package/dist/modules/plugins/plugins/ui/panel.mjs +2 -2
- package/dist/modules/plugins/plugins/ui.mjs +3 -3
- package/dist/modules/plugins/scene-tree/ui.mjs +2 -2
- package/dist/modules/plugins/texture/frontend.mjs +4 -4
- package/dist/modules/plugins/texture/identity.mjs +3 -3
- package/dist/modules/plugins/texture/ui.mjs +5 -5
- package/dist/modules/plugins/viewport/frontend.mjs +1 -1
- package/dist/modules/product.mjs +14 -14
- package/dist/modules/shell/frontend.mjs +1 -1
- package/dist/modules/start-cli.mjs +1 -1
- package/dist/modules/start.mjs +1 -1
- package/dist/modules/viewer/catalog/backend.mjs +10 -10
- package/dist/modules/viewer/catalog/frontend.mjs +14 -14
- package/dist/modules/viewer/catalog/shared.mjs +7 -7
- package/dist/modules/viewer/catalog.mjs +17 -17
- package/dist/modules/viewer-host/frontend.mjs +16 -16
- package/dist/modules/viewer.mjs +17 -17
- package/dist/modules/workspace/backend.mjs +2 -2
- package/dist/modules/workspace/broker.mjs +1 -1
- package/dist/modules/workspace/preview-surface.mjs +1 -1
- package/dist/modules/workspace/resident.mjs +1 -1
- package/dist/modules/workspace/resource-page.mjs +2 -2
- package/dist/viewer/assets/{embedded-DWrXFZbD.js → embedded-Ch4NawY-.js} +2 -2
- package/dist/viewer/assets/{embedded-DWrXFZbD.js.map → embedded-Ch4NawY-.js.map} +1 -1
- package/dist/viewer/assets/main-DUQJ1NlR.js +22 -0
- package/dist/viewer/assets/main-DUQJ1NlR.js.map +1 -0
- package/dist/viewer/assets/{panels-lazy-CUTQACqc.js → panels-lazy-DbOAvYN1.js} +3 -3
- package/dist/viewer/assets/{panels-lazy-CUTQACqc.js.map → panels-lazy-DbOAvYN1.js.map} +1 -1
- package/dist/viewer/assets/panels-ui-DICIsCag.js +12 -0
- package/dist/viewer/assets/panels-ui-DICIsCag.js.map +1 -0
- package/dist/viewer/assets/style-gOtSMZif.css +2 -0
- package/dist/viewer/index.html +4 -4
- package/dist/viewer/panels.js +1 -1
- package/package.json +3 -4
- package/scripts/browser-proof-workload.mjs +0 -1
- package/scripts/verify-runtime-content-engine.mjs +13 -6
- package/dist/modules/chunks/chunk-45ZU2HHR.mjs.map +0 -7
- package/dist/modules/chunks/chunk-7ICJKZYO.mjs.map +0 -7
- package/dist/modules/chunks/chunk-FKLYSAVN.mjs.map +0 -7
- package/dist/modules/chunks/chunk-KSF2EQTE.mjs.map +0 -7
- package/dist/modules/chunks/chunk-MHE5EBU4.mjs.map +0 -7
- package/dist/modules/chunks/chunk-MO5LILCP.mjs.map +0 -7
- package/dist/viewer/assets/main-D0JG9szD.js +0 -22
- package/dist/viewer/assets/main-D0JG9szD.js.map +0 -1
- package/dist/viewer/assets/panels-ui-Kvu5G7za.js +0 -12
- package/dist/viewer/assets/panels-ui-Kvu5G7za.js.map +0 -1
- package/dist/viewer/assets/style-BM0losky.css +0 -2
- package/scripts/verify-game3d-workspace.mjs +0 -318
- /package/dist/modules/chunks/{App-E3M52XTQ.mjs.map → App-4XQ5SNNT.mjs.map} +0 -0
- /package/dist/modules/chunks/{chunk-3GIGTM7E.mjs.map → chunk-27XASYEH.mjs.map} +0 -0
- /package/dist/modules/chunks/{chunk-UAGQZPAB.mjs.map → chunk-2Z5KEV6L.mjs.map} +0 -0
- /package/dist/modules/chunks/{chunk-4NGODRIE.mjs.map → chunk-46UEGAXY.mjs.map} +0 -0
- /package/dist/modules/chunks/{chunk-UZHTLAIZ.mjs.map → chunk-47RJSHLM.mjs.map} +0 -0
- /package/dist/modules/chunks/{chunk-ACOMGSSB.mjs.map → chunk-5PHAXNFO.mjs.map} +0 -0
- /package/dist/modules/chunks/{chunk-IXPBGENY.mjs.map → chunk-6I7RY73G.mjs.map} +0 -0
- /package/dist/modules/chunks/{chunk-NF6KRVDK.mjs.map → chunk-7725LLBM.mjs.map} +0 -0
- /package/dist/modules/chunks/{chunk-GK4TW3KT.mjs.map → chunk-BGWAT7SI.mjs.map} +0 -0
- /package/dist/modules/chunks/{chunk-CRNEX7YH.mjs.map → chunk-D25SR5FS.mjs.map} +0 -0
- /package/dist/modules/chunks/{chunk-VKAISRA4.mjs.map → chunk-D5GUFI74.mjs.map} +0 -0
- /package/dist/modules/chunks/{chunk-7FP7COI6.mjs.map → chunk-DZRJQVJF.mjs.map} +0 -0
- /package/dist/modules/chunks/{chunk-3Q26HNFS.mjs.map → chunk-FICPCJKR.mjs.map} +0 -0
- /package/dist/modules/chunks/{chunk-CWNB67UF.mjs.map → chunk-FMCHH5R4.mjs.map} +0 -0
- /package/dist/modules/chunks/{chunk-2VJPRNYB.mjs.map → chunk-IZAHIOFU.mjs.map} +0 -0
- /package/dist/modules/chunks/{chunk-IBNFKPW4.mjs.map → chunk-JK7K7RG3.mjs.map} +0 -0
- /package/dist/modules/chunks/{chunk-BGK4ZEQ5.mjs.map → chunk-KX2WU5Z6.mjs.map} +0 -0
- /package/dist/modules/chunks/{chunk-M5X56JWH.mjs.map → chunk-PW5CE2Y6.mjs.map} +0 -0
- /package/dist/modules/chunks/{chunk-OHVTNEQ2.mjs.map → chunk-PZIAKZJC.mjs.map} +0 -0
- /package/dist/modules/chunks/{chunk-7UQ7UUHG.mjs.map → chunk-SYE5RTD4.mjs.map} +0 -0
- /package/dist/modules/chunks/{chunk-JZ3V27HQ.mjs.map → chunk-U64FRQKP.mjs.map} +0 -0
- /package/dist/modules/chunks/{chunk-W46L4HSP.mjs.map → chunk-U6UMATPV.mjs.map} +0 -0
- /package/dist/modules/chunks/{chunk-7R6CGQDU.mjs.map → chunk-VW2ZF3P4.mjs.map} +0 -0
- /package/dist/modules/chunks/{chunk-AIIYGGGC.mjs.map → chunk-X4NNZ5X6.mjs.map} +0 -0
- /package/dist/modules/chunks/{chunk-5AKXNYKX.mjs.map → chunk-XE6ITXHT.mjs.map} +0 -0
- /package/dist/modules/chunks/{chunk-6WCG6WPC.mjs.map → chunk-YNHEYXDG.mjs.map} +0 -0
- /package/dist/modules/chunks/{chunk-7MJUWNVI.mjs.map → chunk-ZGOGO7SS.mjs.map} +0 -0
- /package/dist/modules/chunks/{chunk-VXSD4FK5.mjs.map → chunk-ZHO2G4JR.mjs.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../packages/view-plugin-content-browser/src/ui/mount.tsx", "../../../packages/view-plugin-content-browser/src/ui/ContentBrowserPanel.tsx", "../../../packages/view-plugin-content-browser/src/i18n/useTranslation.ts", "../../../packages/view-plugin-content-browser/src/ui/CBDetailsList.tsx", "../../../packages/view-plugin-content-browser/src/ui/format.ts", "../../../packages/view-plugin-content-browser/src/ui/icons.ts", "../../../packages/view-plugin-content-browser/src/ui/derived-view.ts", "../../../packages/view-plugin-content-browser/src/ui/CBGrid.tsx", "../../../packages/view-plugin-content-browser/src/ui/CBNavigationBar.tsx", "../../../packages/view-plugin-content-browser/src/ui/CBPreviewPanel.tsx", "../../../packages/view-plugin-content-browser/src/ui/preview/media-preview-policy.ts", "../../../packages/view-plugin-content-browser/src/ui/preview/MediaPreview.tsx", "../../../packages/view-plugin-content-browser/src/ui/preview/CodePreview.tsx", "../../../packages/view-plugin-content-browser/src/ui/preview/ext-language.ts", "../../../packages/view-plugin-content-browser/src/ui/preview/code-preview-policy.ts", "../../../packages/view-plugin-content-browser/src/ui/preview/highlighter.ts", "../../../packages/view-plugin-content-browser/src/ui/preview/FileContentPreview.tsx", "../../../packages/view-plugin-content-browser/src/ui/resize-handle.tsx", "../../../packages/view-plugin-content-browser/src/ui/RuntimePacksPanel.tsx", "../../../packages/view-plugin-content-browser/src/ui/runtime-packs.ts", "../../../packages/view-plugin-content-browser/src/ui/runtime-packs.css", "../../../packages/view-plugin-content-browser/src/ui/workspace-catalog.ts", "../../../packages/view-plugin-content-browser/src/ui/content-browser.css"],
|
|
4
|
+
"sourcesContent": ["import type { ComponentProps } from 'react';\nimport '@forgeax/view-components/styles.css';\nimport { OverlayRootProvider } from '@forgeax/view-components';\nimport '../i18n/index.ts';\nimport { createRoot } from 'react-dom/client';\nimport { ContentBrowserPanel } from './ContentBrowserPanel';\nimport './content-browser.css';\n\nexport async function mountContentBrowserPanel(props: ComponentProps<typeof ContentBrowserPanel> & { mountElement: HTMLElement; overlayRoot?: HTMLElement }) {\n if (!props.mountElement) throw new TypeError('mountContentBrowserPanel requires mountElement');\n const root = createRoot(props.mountElement);\n root.render(\n <OverlayRootProvider root={props.overlayRoot ?? props.mountElement}>\n <ContentBrowserPanel\n client={props.client}\n />\n </OverlayRootProvider>,\n );\n return async () => root.unmount();\n}\n", "import type { WorkspaceState } from '@forgeax/view-workspace-core/contract';\nimport {\n ArrowDownWideNarrow,\n ArrowUpDown,\n ArrowUpNarrowWide,\n CaseSensitive,\n ChevronDown,\n Clock,\n Copy,\n Filter,\n Folder,\n FolderOpen,\n Grid2X2,\n HardDrive,\n List,\n Settings2,\n Shapes,\n Star,\n StarOff,\n Table2,\n} from 'lucide-react';\nimport {\n Button,\n Checkbox,\n ContextMenu,\n EmptyState,\n FloatingMenu,\n IconButton,\n PanelHeader,\n RangeInput,\n SearchField,\n Switch,\n Toolbar,\n anchorRectFromPoint,\n type AnchorRect,\n type MenuItem as FxMenuItem,\n useWorkspaceClientConnected,\n} from '@forgeax/view-components';\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type MouseEvent,\n type ReactNode,\n} from 'react';\nimport type { ViewWorkspaceClient } from '@forgeax/view-workspace-core/client';\nimport { VIEW_FILE_GET_SERVICE, VIEW_WORKSPACE_TAB_ID, workspaceUiFingerprint } from '@forgeax/view-workspace-core/contract';\nimport { useTranslation } from '../i18n/useTranslation';\nimport { CONTENT_BROWSER_ACTIONS } from '../schema.ts';\nimport { CBDetailsList } from './CBDetailsList';\nimport { CBGrid } from './CBGrid';\nimport { CBNavigationBar } from './CBNavigationBar';\nimport { CBPreviewPanel } from './CBPreviewPanel';\nimport { RuntimePacksPanel } from './RuntimePacksPanel';\nimport {\n buildFamilyFilters,\n buildKindFilters,\n deriveViewItems,\n fileKindLabel,\n nextSortState,\n setSortDir,\n toggleFilterId,\n} from './derived-view';\nimport { normalizePathInput, viewItemKey } from './format';\nimport { familyIcon, itemIcon, kindIcon } from './icons';\nimport { projectCatalog, visibleCatalogFolders, type CatalogAsset } from './workspace-catalog';\nimport { ResizeHandle, useLocalSize } from './resize-handle';\nimport type {\n CBFilterFamily,\n CBSortDir,\n CBSortKey,\n CBSortState,\n CBViewItem,\n CBViewMode,\n PreviewFileInfo,\n} from './types';\n\ntype BrowserMenuItem =\n | { kind: 'title'; label: string; icon?: ReactNode }\n | { kind: 'separator' }\n | {\n kind: 'item';\n id: string;\n label: string;\n icon?: ReactNode;\n shortcut?: string;\n disabled?: boolean;\n danger?: boolean;\n action: () => void;\n };\ntype ContextMenuState = { anchor: AnchorRect; items: BrowserMenuItem[] } | null;\n\nconst DEFAULT_CONTENT_FOLDER = 'assets';\n\nfunction hasContentFolder(folders: readonly { path: string }[], folder: string) {\n const prefix = `${folder}/`;\n return folders.some((entry) => entry.path === folder || entry.path.startsWith(prefix));\n}\n\nconst LAYOUT_OPTIONS: readonly { mode: CBViewMode; icon: ReactNode; labelKey: string }[] = [\n { mode: 'grid', icon: <Grid2X2 size={14} />, labelKey: 'contentBrowser.layoutGrid' },\n { mode: 'list', icon: <List size={14} />, labelKey: 'contentBrowser.layoutList' },\n { mode: 'column', icon: <Table2 size={14} />, labelKey: 'contentBrowser.layoutColumn' },\n];\nconst SORT_KEYS: readonly CBSortKey[] = ['name', 'kind', 'packModifiedAt', 'estimatedSize'];\nconst SORT_KEY_ICONS: Record<CBSortKey, typeof CaseSensitive> = {\n name: CaseSensitive,\n kind: Shapes,\n packModifiedAt: Clock,\n estimatedSize: HardDrive,\n};\n\nfunction isContextMenuAnchor(element: HTMLElement) {\n return element.classList.contains('cb-grid-item')\n || element.classList.contains('cb-fe-card')\n || element.classList.contains('cb-details-row')\n || element.classList.contains('cb-source-row');\n}\n\nfunction toFxMenuItems(items: BrowserMenuItem[], close?: () => void): FxMenuItem[] {\n return items.map((item) => {\n if (item.kind === 'separator') return { type: 'separator' };\n if (item.kind === 'title') {\n return { type: 'title', label: <span className=\"cb-menu-title\">{item.icon}{item.label}</span> };\n }\n return {\n id: item.id,\n label: item.label,\n icon: item.icon,\n shortcut: item.shortcut,\n disabled: item.disabled,\n danger: item.danger,\n buttonProps: { 'data-operation': item.id },\n onSelect: () => {\n item.action();\n close?.();\n },\n };\n });\n}\n\nexport function ContentBrowserPanel({\n client,\n}: {\n client?: ViewWorkspaceClient;\n}) {\n const { t } = useTranslation();\n const [snapshot, setSnapshot] = useState<WorkspaceState>({});\n const [loadFailed, setLoadFailed] = useState(false);\n const [actionError, setActionError] = useState('');\n const [runtimeOpen, setRuntimeOpen] = useState(false);\n const [loading, setLoading] = useState(false);\n const [openingKeys, setOpeningKeys] = useState(new Set<string>());\n const project = snapshot.project;\n const projectLabel = project?.name ?? project?.root ?? 'No project';\n const catalog = useMemo(() => projectCatalog(project?.root ?? '', snapshot.assets ?? []), [project?.root, snapshot.assets]);\n const files = catalog.files;\n const folders = catalog.folders;\n const clientRef = useRef(client);\n clientRef.current = client;\n const connected = useWorkspaceClientConnected(client);\n const readPreview = useCallback((path: string, options?: { signal?: AbortSignal }) => {\n const transport = clientRef.current?.transport;\n if (typeof transport?.request !== 'function') return Promise.resolve(null);\n return transport.request(VIEW_FILE_GET_SERVICE, { path }, options) as Promise<PreviewFileInfo | null>;\n }, []);\n const refresh = useCallback(async (signal?: AbortSignal) => {\n if (!connected || !project || !client) return;\n setLoading(true);\n try {\n await client.listAssets(project.id, { tabId: VIEW_WORKSPACE_TAB_ID, signal });\n if (!signal?.aborted) setLoadFailed(false);\n } catch {\n if (!signal?.aborted) setLoadFailed(true);\n } finally { if (!signal?.aborted) setLoading(false); }\n }, [client, connected, project?.id]);\n useEffect(() => {\n if (!client || !connected) {\n if (!client) setLoadFailed(true);\n return;\n }\n const controller = new AbortController();\n setSnapshot({});\n const accept = (next: typeof snapshot) => {\n if (controller.signal.aborted) return;\n setSnapshot((current) => {\n if ((next.revision ?? 0) < (current.revision ?? 0)) return current;\n if (workspaceUiFingerprint(next) === workspaceUiFingerprint(current)) return current;\n return next;\n });\n setLoadFailed(false);\n };\n const unsubscribe = client.subscribe(accept);\n void client.getState({ signal: controller.signal }).then(accept).catch(() => {\n if (!controller.signal.aborted) setLoadFailed(true);\n });\n return () => { controller.abort(); unsubscribe?.(); };\n }, [client, connected]);\n useEffect(() => {\n if (!connected) return;\n const controller = new AbortController();\n void refresh(controller.signal);\n return () => controller.abort();\n }, [connected, refresh]);\n const [layout, setLayout] = useState<CBViewMode>('grid');\n const [thumbnailSize, setThumbnailSize] = useState(80);\n const [detailPanelOpen, setDetailPanelOpen] = useState(true);\n const [query, setQuery] = useState('');\n const [activeFamilies, setActiveFamilies] = useState<Set<CBFilterFamily>>(new Set());\n const [activeKinds, setActiveKinds] = useState<Set<string>>(new Set());\n const [sortState, setSortState] = useState<CBSortState>({ key: 'name', dir: 'asc' });\n const [history, setHistory] = useState(['']);\n const [historyIndex, setHistoryIndex] = useState(0);\n const openEpoch = useRef(0);\n const landedForEpoch = useRef(-1);\n const userMovedEpoch = useRef(-1);\n const [menu, setMenu] = useState<'settings' | 'filter' | 'sort' | null>(null);\n const [contextMenu, setContextMenu] = useState<ContextMenuState>(null);\n const [toolbarMenuAnchor, setToolbarMenuAnchor] = useState<AnchorRect | null>(null);\n const filterButtonRef = useRef<HTMLButtonElement>(null);\n const sortButtonRef = useRef<HTMLButtonElement>(null);\n const settingsButtonRef = useRef<HTMLButtonElement>(null);\n const splitRef = useRef<HTMLDivElement>(null);\n const [groups, setGroups] = useState({ favorites: true, project: true });\n const [favorites, setFavorites] = useState(new Set<string>());\n const [collapsed, setCollapsed] = useState(new Set<string>());\n const [expandedPacks, setExpandedPacks] = useState<Set<string>>(new Set());\n const [selectedIds, setSelectedIds] = useState(new Set<string>());\n const [selectionAnchor, setSelectionAnchor] = useState<string | null>(null);\n const [previewKey, setPreviewKey] = useState<string | null>(null);\n const previewItem = [...folders, ...files.flatMap((file) => [file, ...file.assets])]\n .find((item) => viewItemKey(item) === previewKey) ?? null;\n const [srcWidth, setSrcWidth] = useLocalSize('view.cb.sourceWidth', 200, 140, 420);\n const [previewWidth, setPreviewWidth] = useLocalSize('view.cb.previewWidth', 280, 180, 560);\n useEffect(() => {\n openEpoch.current += 1;\n setHistory(['']);\n setHistoryIndex(0);\n setSelectedIds(new Set());\n setSelectionAnchor(null);\n setPreviewKey(null);\n setExpandedPacks(new Set());\n setFavorites(new Set());\n setQuery('');\n }, [project?.id]);\n useEffect(() => {\n const epoch = openEpoch.current;\n if (landedForEpoch.current === epoch) return;\n if (!project?.id) return;\n if (userMovedEpoch.current === epoch) {\n landedForEpoch.current = epoch;\n return;\n }\n const catalogReady = Array.isArray(snapshot.assets);\n if (!catalogReady) return;\n landedForEpoch.current = epoch;\n if (!hasContentFolder(folders, DEFAULT_CONTENT_FOLDER)) return;\n setHistory(['', DEFAULT_CONTENT_FOLDER]);\n setHistoryIndex(1);\n }, [folders, project?.id, snapshot.assets]);\n const folder = history[historyIndex] ?? '';\n const familyFilters = useMemo(() => buildFamilyFilters(activeFamilies, t), [activeFamilies, t]);\n const kindFilters = useMemo(() => buildKindFilters(activeKinds, t), [activeKinds, t]);\n const activeFilterCount = activeFamilies.size + activeKinds.size;\n const labeledFiles = useMemo(\n () => files.map((file) => ({ ...file, kindLabel: fileKindLabel(file, t) })),\n [files, t],\n );\n const derived = useMemo(\n () => deriveViewItems({\n folders,\n files: labeledFiles,\n currentPath: folder,\n searchQuery: query,\n activeFamilies,\n activeKinds,\n sortState,\n expandedPacks,\n withKindLabel: (file) => file,\n }),\n [activeFamilies, activeKinds, expandedPacks, folder, folders, labeledFiles, query, sortState],\n );\n const { viewItems, foldersInPath, searchActive } = derived;\n\n const navigate = (path: string) => {\n userMovedEpoch.current = openEpoch.current;\n const normalized = normalizePathInput(path);\n if (normalized === folder) return;\n const next = history.slice(0, historyIndex + 1);\n next.push(normalized);\n setHistory(next);\n setHistoryIndex(next.length - 1);\n };\n\n const selectItem = (item: CBViewItem, event?: Pick<MouseEvent, 'ctrlKey' | 'metaKey' | 'shiftKey'>) => {\n setActionError('');\n const key = viewItemKey(item);\n const toggleOff = Boolean((event?.ctrlKey || event?.metaKey) && selectedIds.has(key));\n setSelectedIds((current) => {\n if (event?.shiftKey && selectionAnchor) {\n const start = viewItems.findIndex((entry) => viewItemKey(entry) === selectionAnchor);\n const end = viewItems.findIndex((entry) => viewItemKey(entry) === key);\n if (start >= 0 && end >= 0) {\n const range = viewItems.slice(Math.min(start, end), Math.max(start, end) + 1).map((entry) => viewItemKey(entry));\n return new Set(event.ctrlKey || event.metaKey ? [...current, ...range] : range);\n }\n }\n if (event?.ctrlKey || event?.metaKey) {\n const next = new Set(current);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n }\n return new Set([key]);\n });\n setSelectionAnchor(key);\n setPreviewKey(viewItemKey(item));\n if (!toggleOff && item.type === 'asset' && client && project) {\n void client.inspectAsset(item.guid, { projectId: project.id, tabId: VIEW_WORKSPACE_TAB_ID }).catch(() => {});\n }\n };\n\n const assetToOpen = (item: CBViewItem) => item.type === 'asset'\n ? item\n : item.type === 'file' ? item.assets.find(asset => asset.kind === 'scene') ?? item.assets[0] : undefined;\n const canActivate = (item: CBViewItem) => item.type === 'folder' || (!!client && !!project && !!assetToOpen(item));\n const activateItem = (item: CBViewItem) => {\n setActionError('');\n if (item.type === 'folder') {\n navigate(item.path);\n return;\n }\n if (!client || !project) return;\n const guid = assetToOpen(item)?.guid;\n if (!guid) return;\n const key = viewItemKey(item);\n if (openingKeys.has(key)) return;\n setOpeningKeys((current) => new Set(current).add(key));\n void client.openAsset(guid, { projectId: project.id, tabId: VIEW_WORKSPACE_TAB_ID })\n .catch((error: unknown) => setActionError(error instanceof Error ? error.message : String(error)))\n .finally(() => {\n setOpeningKeys((current) => {\n if (!current.has(key)) return current;\n const next = new Set(current);\n next.delete(key);\n return next;\n });\n });\n };\n\n const toggleFavorite = (path: string) => setFavorites((current) => {\n const next = new Set(current);\n if (next.has(path)) next.delete(path);\n else next.add(path);\n return next;\n });\n\n const togglePackExpansion = (path: string) => setExpandedPacks((current) => {\n const next = new Set(current);\n if (next.has(path)) next.delete(path);\n else next.add(path);\n return next;\n });\n\n const toggleCollapsed = (path: string) => setCollapsed((current) => {\n const next = new Set(current);\n if (next.has(path)) next.delete(path);\n else next.add(path);\n return next;\n });\n\n useEffect(() => {\n if (menu !== 'filter' && menu !== 'sort' && menu !== 'settings') setToolbarMenuAnchor(null);\n }, [menu]);\n\n const showMenu = (event: MouseEvent, items: BrowserMenuItem[]) => {\n event.preventDefault();\n event.stopPropagation();\n setMenu(null);\n setToolbarMenuAnchor(null);\n const target = event.currentTarget as HTMLElement;\n const anchor = isContextMenuAnchor(target)\n ? target.getBoundingClientRect()\n : anchorRectFromPoint(event.clientX, event.clientY);\n setContextMenu({ anchor, items });\n };\n\n const openToolbarMenu = (kind: 'filter' | 'sort' | 'settings') => {\n if (menu === kind) {\n setMenu(null);\n return;\n }\n const ref = kind === 'filter' ? filterButtonRef : kind === 'sort' ? sortButtonRef : settingsButtonRef;\n const rect = ref.current?.getBoundingClientRect();\n if (rect) setToolbarMenuAnchor(rect);\n setMenu(kind);\n };\n\n const folderMenu = (path: string, name: string): BrowserMenuItem[] => [\n { kind: 'title', label: name, icon: <Folder className=\"cb-folder-icon\" size={14} /> },\n { kind: 'item', id: 'open', label: t('contentBrowser.menu.open'), icon: <FolderOpen size={14} />, action: () => navigate(path) },\n {\n kind: 'item',\n id: 'copy-path',\n label: t('contentBrowser.menu.copyPath'),\n icon: <Copy size={14} />,\n action: () => void navigator.clipboard?.writeText(path || projectLabel),\n },\n {\n kind: 'item',\n id: 'favorite',\n label: favorites.has(path) ? t('contentBrowser.menu.removeFromFavorites') : t('contentBrowser.menu.addToFavorites'),\n icon: favorites.has(path) ? <StarOff size={14} /> : <Star size={14} />,\n action: () => toggleFavorite(path),\n },\n ];\n const itemMenu = (item: CBViewItem): BrowserMenuItem[] => {\n const Icon = itemIcon(item);\n if (item.type === 'folder') return folderMenu(item.path, item.name);\n return [\n { kind: 'title', label: item.name, icon: <Icon size={14} /> },\n ...(canActivate(item) ? [{ kind: 'item' as const, id: 'open', label: t('contentBrowser.menu.open'), shortcut: 'Enter', action: () => activateItem(item) }] : []),\n ...(item.type === 'asset'\n ? [{\n kind: 'item' as const,\n id: 'copy-guid',\n label: t('contentBrowser.menu.copyGuid'),\n icon: <Copy size={14} />,\n action: () => void navigator.clipboard?.writeText(item.guid),\n }]\n : []),\n {\n kind: 'item',\n id: 'copy-path',\n label: t('contentBrowser.menu.copyAssetPath'),\n icon: <Copy size={14} />,\n shortcut: 'Ctrl+Shift+C',\n action: () => void navigator.clipboard?.writeText(item.type === 'asset' ? item.packPath : item.path),\n },\n ];\n };\n const blankMenu: BrowserMenuItem[] = [\n { kind: 'title', label: t('contentBrowser.readOnlyTitle') },\n {\n kind: 'item',\n id: 'copy-path',\n label: t('contentBrowser.menu.copyCurrentPath'),\n icon: <Copy size={14} />,\n action: () => void navigator.clipboard?.writeText(folder || projectLabel),\n },\n ];\n\n const applyFilter = (filterId: string) => {\n const next = toggleFilterId(filterId, activeFamilies, activeKinds);\n setActiveFamilies(next.families);\n setActiveKinds(next.kinds);\n };\n\n const renderTreeRow = (path: string, name: string, depth: number, favorite = false) => {\n const hasChildren = folders.some((entry) => entry.path.startsWith(`${path}/`));\n const open = !collapsed.has(path);\n const folderItem = folders.find((entry) => entry.path === path);\n const selected = folder === path;\n const inPath = folder.startsWith(`${path}/`);\n const row = (\n <button\n type=\"button\"\n className={`cb-source-row${selected ? ' is-sel' : inPath ? ' is-path' : ''}${hasChildren && !open ? ' collapsed' : ''}`}\n style={{ paddingLeft: `calc(var(--fx-ref-space-16) + ${depth} * (var(--fx-ref-space-12) + var(--fx-ref-space-2)))` } as CSSProperties}\n onClick={() => {\n navigate(path);\n if (folderItem) {\n setPreviewKey(viewItemKey(folderItem));\n setSelectedIds(new Set([path]));\n setSelectionAnchor(path);\n }\n }}\n onDoubleClick={() => hasChildren && toggleCollapsed(path)}\n onContextMenu={(event) => showMenu(event, folderMenu(path, name))}\n >\n <span\n className={`cb-source-chev${hasChildren ? '' : ' hidden'}${open ? '' : ' collapsed'}`}\n onClick={(event) => {\n if (!hasChildren) return;\n event.stopPropagation();\n toggleCollapsed(path);\n }}\n >\n <ChevronDown size={12} />\n </span>\n <span className=\"cb-source-icon\">{open ? <FolderOpen size={15} /> : <Folder size={15} />}</span>\n <span className=\"cb-source-name\">{name}</span>\n </button>\n );\n if (!favorite) return <div key={`tree-${path}`}>{row}</div>;\n return (\n <div\n className={`cb-source-fav-row${selected ? ' is-sel' : inPath ? ' is-path' : ''}`}\n key={`fav-${path}`}\n >\n {row}\n <button\n type=\"button\"\n className=\"cb-source-unfav\"\n data-action={CONTENT_BROWSER_ACTIONS.toggleFavorite}\n title={t('contentBrowser.unfavorite')}\n aria-label={t('contentBrowser.unfavorite')}\n onClick={(event) => {\n event.stopPropagation();\n toggleFavorite(path);\n }}\n >\n <Star size={11} fill=\"currentColor\" />\n </button>\n </div>\n );\n };\n\n const filterLabel = activeFilterCount === 0\n ? t('contentBrowser.filterAll')\n : activeFilterCount === 1\n ? (familyFilters.find((item) => item.active) ?? kindFilters.find((item) => item.active))!.label\n : t('contentBrowser.filterByType');\n const sortLabels: Record<CBSortKey, string> = {\n name: t('contentBrowser.sort.name'),\n kind: t('contentBrowser.sort.kind'),\n packModifiedAt: t('contentBrowser.sort.modified'),\n estimatedSize: t('contentBrowser.sort.size'),\n };\n\n return (\n <div className=\"cb-root\" data-testid=\"panel-content-browser\">\n {client && project ? <>\n <Toolbar><Button size=\"compact\" aria-expanded={runtimeOpen} onClick={() => setRuntimeOpen(!runtimeOpen)}>Runtime content</Button></Toolbar>\n {runtimeOpen ? <RuntimePacksPanel client={client} /> : null}\n </> : null}\n <div\n className=\"cb-split\"\n ref={splitRef}\n style={{ '--cb-src-w': `${srcWidth}px`, '--cb-preview-w': `${previewWidth}px` } as CSSProperties}\n >\n <aside className=\"cb-source-panel\">\n <div className=\"cb-source-tree\">\n <section className=\"cb-source-group\">\n <button type=\"button\" data-action={CONTENT_BROWSER_ACTIONS.toggleSourceGroup} className={`cb-source-group-head${groups.favorites ? '' : ' collapsed'}`} onClick={() => setGroups((current) => ({ ...current, favorites: !current.favorites }))}>\n <span className=\"cb-source-chev\"><ChevronDown size={12} /></span><Star className=\"cb-source-group-icon\" size={15} /><span className=\"cb-source-group-name\">{t('contentBrowser.favorites')}</span>\n </button>\n {groups.favorites ? (\n <div className=\"cb-source-group-body\">\n {favorites.size ? [...favorites].map((path) => renderTreeRow(path, path.split('/').at(-1) ?? path, 0, true)) : <div className=\"cb-source-empty\">{t('contentBrowser.noFavorites')}</div>}\n </div>\n ) : null}\n </section>\n <section className=\"cb-source-group\">\n <button type=\"button\" data-action={CONTENT_BROWSER_ACTIONS.toggleSourceGroup} className={`cb-source-group-head${folder === '' ? ' is-sel' : ''}${groups.project ? '' : ' collapsed'}`} aria-expanded={groups.project} onClick={() => navigate('')} onDoubleClick={() => setGroups((current) => ({ ...current, project: !current.project }))} onContextMenu={(event) => showMenu(event, folderMenu('', projectLabel))}>\n <span className=\"cb-source-chev\" onClick={(event) => { event.stopPropagation(); setGroups((current) => ({ ...current, project: !current.project })); }}><ChevronDown size={12} /></span><FolderOpen className=\"cb-source-group-icon cb-folder-icon\" size={15} /><span className=\"cb-source-group-name\">{projectLabel}</span>\n </button>\n {groups.project ? (\n <div className=\"cb-source-group-body\">\n {visibleCatalogFolders(folders, collapsed).map((entry) => renderTreeRow(entry.path, entry.name, entry.path.split('/').length - 1))}\n </div>\n ) : null}\n </section>\n </div>\n </aside>\n <ResizeHandle\n title={t('contentBrowser.actions.resizeFolderTree')}\n onDrag={(delta) => {\n const next = srcWidth + delta;\n setSrcWidth(next);\n splitRef.current?.style.setProperty('--cb-src-w', `${Math.min(420, Math.max(140, next))}px`);\n }}\n />\n <section className=\"cb-asset-view\">\n <PanelHeader\n className=\"cb-toolbar\"\n center={\n <CBNavigationBar\n currentPath={folder}\n projectLabel={projectLabel}\n allDirs={folders.map((entry) => entry.path)}\n canGoBack={historyIndex > 0}\n canGoForward={historyIndex < history.length - 1}\n refreshDisabled={!project || loading}\n onBack={() => setHistoryIndex((index) => Math.max(0, index - 1))}\n onForward={() => setHistoryIndex((index) => Math.min(history.length - 1, index + 1))}\n onRefresh={() => void refresh()}\n onNavigate={navigate}\n />\n }\n end={<IconButton ref={settingsButtonRef} size=\"compact\" variant=\"quiet\" label={t('contentBrowser.settings')} icon={<Settings2 size={14} />} onClick={() => openToolbarMenu('settings')} />}\n />\n\n <div className=\"cb-content-body\">\n <div className=\"cb-grid-column\">\n <Toolbar className=\"cb-filter-bar\">\n <Button size=\"compact\" variant=\"quiet\" data-action={CONTENT_BROWSER_ACTIONS.activate}\n disabled={selectedIds.size !== 1 || !previewItem || !canActivate(previewItem)}\n loading={Boolean(previewItem && openingKeys.has(viewItemKey(previewItem)))}\n title={t('contentBrowser.openHint')}\n onClick={() => { if (previewItem) activateItem(previewItem); }}>{t('contentBrowser.menu.open')}</Button>\n <Button ref={filterButtonRef} size=\"compact\" variant=\"quiet\" data-action={CONTENT_BROWSER_ACTIONS.setFilter} className={activeFilterCount ? 'is-active' : undefined} leadingIcon={<Filter size={14} />} onClick={() => openToolbarMenu('filter')}>{filterLabel}</Button>\n <SearchField className=\"cb-search-box\" data-action={CONTENT_BROWSER_ACTIONS.search} value={query} onChange={(event) => setQuery(event.target.value)} onClear={() => setQuery('')} placeholder={t('contentBrowser.searchPlaceholder')} label={t('contentBrowser.search')} />\n <Button ref={sortButtonRef} size=\"compact\" variant=\"quiet\" data-action={CONTENT_BROWSER_ACTIONS.setSort} leadingIcon={<ArrowUpDown size={14} />} onClick={() => openToolbarMenu('sort')}>{sortLabels[sortState.key]}</Button>\n </Toolbar>\n\n {loading ? <div role=\"status\">Loading assets...</div> : null}\n {actionError ? <div role=\"alert\">{actionError}</div> : null}\n {loadFailed ? (\n <EmptyState\n className=\"cb-empty\"\n title={t('contentBrowser.unavailable')}\n description={client ? t('contentBrowser.loadErrorDescription') : t('contentBrowser.unavailableDescription')}\n icon={<FolderOpen size={28} />}\n />\n ) : !project ? (\n <EmptyState className=\"cb-empty\" title={t('contentBrowser.noProject')} description={t('contentBrowser.openProjectHint')} icon={<FolderOpen size={28} />} />\n ) : viewItems.length === 0 ? (\n <EmptyState className=\"cb-empty\" title={t('contentBrowser.emptyTitle')} description={t('contentBrowser.emptyDescription')} icon={<FolderOpen size={28} />} />\n ) : layout === 'column' ? (\n <CBDetailsList\n items={viewItems}\n selectedIds={selectedIds}\n openingKeys={openingKeys}\n sortState={sortState}\n onSort={(key) => setSortState((current) => nextSortState(current, key))}\n onSelect={selectItem}\n onActivate={activateItem}\n onContextMenu={(event, item) => showMenu(event, itemMenu(item))}\n onBlankClick={() => setSelectedIds(new Set())}\n />\n ) : (\n <CBGrid\n items={viewItems}\n thumbnailSize={thumbnailSize}\n layout={layout}\n searchActive={searchActive}\n expandedPacks={expandedPacks}\n selectedIds={selectedIds}\n openingKeys={openingKeys}\n onSelect={selectItem}\n onActivate={activateItem}\n onContextMenu={(event, item) => showMenu(event, itemMenu(item))}\n onTogglePackExpansion={togglePackExpansion}\n onBlankClick={() => setSelectedIds(new Set())}\n />\n )}\n <footer className=\"cb-status\">\n <span>\n {selectedIds.size\n ? t('contentBrowser.statusSelected', { count: viewItems.length, selected: selectedIds.size })\n : t('contentBrowser.statusCount', { count: viewItems.length })}\n </span>\n <span>{folder || projectLabel}</span>\n </footer>\n </div>\n {detailPanelOpen ? (\n <CBPreviewPanel\n previewItem={previewItem}\n foldersInPath={folders}\n diskFiles={labeledFiles}\n projectLabel={projectLabel}\n readPreview={readPreview}\n onClose={() => setPreviewKey(null)}\n onDrag={(delta) => {\n const next = previewWidth - delta;\n setPreviewWidth(next);\n splitRef.current?.style.setProperty('--cb-preview-w', `${Math.min(560, Math.max(180, next))}px`);\n }}\n onDragEnd={() => undefined}\n />\n ) : null}\n </div>\n </section>\n </div>\n\n <FloatingMenu\n open={Boolean(toolbarMenuAnchor && menu === 'filter')}\n anchorRect={toolbarMenuAnchor}\n onClose={() => setMenu(null)}\n ignorePointerWithin={[filterButtonRef]}\n className=\"cb-filter-menu\"\n containerProps={{ onPointerDown: (event) => event.stopPropagation() }}\n >\n <div className=\"cb-filter-menu-body\" data-action={CONTENT_BROWSER_ACTIONS.setFilter}>\n <div className=\"cb-filter-section\">{t('contentBrowser.fileTypeSection')}</div>\n {familyFilters.map((item) => {\n const Icon = familyIcon(item.family);\n return (\n <button type=\"button\" className=\"cb-filter-option\" data-active={item.active ? 'true' : 'false'} key={item.id} onClick={() => applyFilter(item.id)}>\n <Checkbox checked={item.active} onChange={() => applyFilter(item.id)} tabIndex={-1} hideLabel label={item.label} className=\"cb-filter-check\" />\n <Icon size={14} className={`cb-filter-option-icon${item.family === 'dir' ? ' cb-folder-icon' : ''}`} />\n {item.label}\n </button>\n );\n })}\n <div className=\"cb-filter-separator\" />\n <div className=\"cb-filter-section\">{t('contentBrowser.assetTypeSection')}</div>\n {kindFilters.map((item) => {\n const Icon = kindIcon(item.kind);\n return (\n <button type=\"button\" className=\"cb-filter-option\" data-active={item.active ? 'true' : 'false'} key={item.id} onClick={() => applyFilter(item.id)}>\n <Checkbox checked={item.active} onChange={() => applyFilter(item.id)} tabIndex={-1} hideLabel label={item.label} className=\"cb-filter-check\" />\n <Icon size={14} className=\"cb-filter-option-icon\" />\n {item.label}\n </button>\n );\n })}\n <div className=\"cb-filter-separator\" />\n <button type=\"button\" className=\"cb-filter-option cb-filter-clear\" disabled={activeFilterCount === 0} onClick={() => { setActiveFamilies(new Set()); setActiveKinds(new Set()); }}>\n {t('contentBrowser.clearFilters')}\n </button>\n </div>\n </FloatingMenu>\n\n <FloatingMenu\n open={Boolean(toolbarMenuAnchor && menu === 'sort')}\n anchorRect={toolbarMenuAnchor}\n onClose={() => setMenu(null)}\n ignorePointerWithin={[sortButtonRef]}\n containerProps={{ onPointerDown: (event) => event.stopPropagation() }}\n >\n <div className=\"cb-filter-menu-body\">\n <div className=\"cb-filter-section\">{t('contentBrowser.sort.by')}</div>\n {SORT_KEYS.map((key) => {\n const Icon = SORT_KEY_ICONS[key];\n const active = sortState.key === key;\n return (\n <button type=\"button\" className=\"cb-filter-option\" data-active={active ? 'true' : 'false'} key={key} onClick={() => setSortState((current) => nextSortState(current, key))}>\n <span className=\"cb-radio-menu\" data-checked={active ? 'true' : 'false'} />\n <Icon size={14} className=\"cb-filter-option-icon\" />\n {sortLabels[key]}\n </button>\n );\n })}\n <div className=\"cb-filter-separator\" />\n <div className=\"cb-filter-section\">{t('contentBrowser.sort.order')}</div>\n {([['asc', ArrowUpNarrowWide], ['desc', ArrowDownWideNarrow]] as const).map(([dir, Icon]) => {\n const active = sortState.dir === dir;\n return (\n <button type=\"button\" className=\"cb-filter-option\" data-active={active ? 'true' : 'false'} key={dir} onClick={() => setSortState((current) => setSortDir(current, dir as CBSortDir))}>\n <span className=\"cb-radio-menu\" data-checked={active ? 'true' : 'false'} />\n <Icon size={14} className=\"cb-filter-option-icon\" />\n {t(dir === 'asc' ? 'contentBrowser.sort.asc' : 'contentBrowser.sort.desc')}\n </button>\n );\n })}\n </div>\n </FloatingMenu>\n\n <FloatingMenu\n open={Boolean(toolbarMenuAnchor && menu === 'settings')}\n anchorRect={toolbarMenuAnchor}\n onClose={() => setMenu(null)}\n ignorePointerWithin={[settingsButtonRef]}\n containerProps={{ onPointerDown: (event) => event.stopPropagation() }}\n >\n <div className=\"cb-settings-menu\">\n <strong>{t('contentBrowser.layout')}</strong>\n <div className=\"fx-segmented cb-layout-switch\">\n {LAYOUT_OPTIONS.map(({ mode, icon, labelKey }) => (\n <button\n type=\"button\"\n data-action={CONTENT_BROWSER_ACTIONS.setView}\n className=\"fx-segmented__item fx-segmented__item--stacked\"\n data-checked={layout === mode ? 'true' : 'false'}\n key={mode}\n onClick={() => setLayout(mode)}\n >\n {icon}<span>{t(labelKey)}</span>\n </button>\n ))}\n </div>\n <label className=\"cb-settings-row\">\n <span className=\"cb-settings-label\">{t('contentBrowser.thumbnailSize')}</span>\n <RangeInput\n data-action={CONTENT_BROWSER_ACTIONS.setThumbnailSize}\n className=\"cb-settings-range\"\n min={48}\n max={200}\n step={4}\n value={thumbnailSize}\n onChange={(event) => setThumbnailSize(Number(event.target.value))}\n title={t('contentBrowser.actions.thumbnailSize', { size: thumbnailSize })}\n />\n </label>\n <Switch\n layout=\"row\"\n className=\"cb-settings-switch-row\"\n label={t('contentBrowser.actions.detailPanel')}\n checked={detailPanelOpen}\n data-action={CONTENT_BROWSER_ACTIONS.toggleDetailPanel}\n onCheckedChange={setDetailPanelOpen}\n />\n </div>\n </FloatingMenu>\n\n <ContextMenu\n open={Boolean(contextMenu)}\n anchorRect={contextMenu?.anchor ?? null}\n items={contextMenu ? toFxMenuItems(contextMenu.items) : []}\n onClose={() => setContextMenu(null)}\n label={t('contentBrowser.contextMenu')}\n containerProps={{ 'data-action': CONTENT_BROWSER_ACTIONS.showContextMenu }}\n />\n </div>\n );\n}\n", "import { useCallback, useSyncExternalStore } from 'react';\n\nimport { getLocale, subscribeLocale, t as translate } from './index.ts';\n\nexport function useTranslation() {\n const locale = useSyncExternalStore(subscribeLocale, getLocale, getLocale);\n const t = useCallback(\n (key: string, vars?: Record<string, string | number>) => translate(key, vars),\n [locale],\n );\n return { t, locale };\n}\n", "import { type CSSProperties, type MouseEvent } from 'react';\nimport { Spinner } from '@forgeax/view-components';\nimport { useTranslation } from '../i18n/useTranslation';\nimport { CONTENT_BROWSER_ACTIONS } from '../schema.ts';\nimport { formatBytes, formatDate, viewItemKey } from './format';\nimport { itemIcon } from './icons';\nimport { assetKindLabel, fileKindLabel } from './derived-view';\nimport type { CBSortKey, CBSortState, CBViewItem } from './types';\n\nconst COLUMNS: readonly { key: CBSortKey; labelKey: string; track: string }[] = [\n { key: 'name', labelKey: 'contentBrowser.details.colName', track: 'minmax(160px, 1fr)' },\n { key: 'kind', labelKey: 'contentBrowser.details.colType', track: '160px' },\n { key: 'estimatedSize', labelKey: 'contentBrowser.details.colSize', track: '90px' },\n { key: 'packModifiedAt', labelKey: 'contentBrowser.details.colModified', track: '130px' },\n];\n\nexport function CBDetailsList({\n items,\n selectedIds,\n openingKeys,\n sortState,\n onSort,\n onSelect,\n onActivate,\n onContextMenu,\n onBlankClick,\n}: {\n items: CBViewItem[];\n selectedIds: ReadonlySet<string>;\n openingKeys?: ReadonlySet<string>;\n sortState: CBSortState;\n onSort: (key: CBSortKey) => void;\n onSelect: (item: CBViewItem, event: MouseEvent) => void;\n onActivate: (item: CBViewItem) => void;\n onContextMenu: (event: MouseEvent, item: CBViewItem) => void;\n onBlankClick: () => void;\n}) {\n const { t } = useTranslation();\n const gridStyle = { '--cb-details-cols': COLUMNS.map((column) => column.track).join(' ') } as CSSProperties;\n\n return (\n <div\n className=\"cb-details-view cb-details-column\"\n role=\"grid\"\n style={gridStyle}\n onClick={(event) => { if (event.target === event.currentTarget) onBlankClick(); }}\n >\n <div className=\"cb-details-header\" role=\"row\">\n {COLUMNS.map((column) => {\n const active = sortState.key === column.key;\n return (\n <button\n key={column.key}\n type=\"button\"\n role=\"columnheader\"\n className={`cb-details-cell cb-details-th${active ? ' active' : ''}`}\n data-active={active ? 'true' : 'false'}\n aria-sort={active ? (sortState.dir === 'asc' ? 'ascending' : 'descending') : 'none'}\n onClick={() => onSort(column.key)}\n >\n <span>{t(column.labelKey)}</span>\n {active ? <span className=\"cb-details-sort-arrow\" aria-hidden=\"true\">{sortState.dir === 'asc' ? '\\u25b2' : '\\u25bc'}</span> : null}\n </button>\n );\n })}\n </div>\n <div className=\"cb-details-body\">\n {items.map((item) => {\n const key = viewItemKey(item);\n const selected = selectedIds.has(key);\n const opening = openingKeys?.has(key) ?? false;\n const Icon = itemIcon(item);\n const typeLabel = item.type === 'folder'\n ? t('contentBrowser.details.typeFolder')\n : item.type === 'file'\n ? item.kindLabel || fileKindLabel(item, t)\n : assetKindLabel(item.kind, t);\n const sizeLabel = item.type === 'folder'\n ? t('contentBrowser.details.itemCount', { count: item.childCount })\n : formatBytes(item.type === 'file' ? item.estimatedSize : item.estimatedSize);\n const modifiedLabel = item.type === 'folder' ? '' : formatDate(item.packModifiedAt);\n return (\n <div\n role=\"row\"\n tabIndex={0}\n className={`cb-details-row${selected ? ' sel' : ''}${opening ? ' is-busy' : ''}`}\n key={key}\n data-action={CONTENT_BROWSER_ACTIONS.select}\n aria-selected={selected}\n aria-busy={opening || undefined}\n onClick={(event) => onSelect(item, event)}\n onDoubleClick={() => onActivate(item)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n onActivate(item);\n } else if (event.key === ' ') {\n event.preventDefault();\n onSelect(item, event as unknown as MouseEvent);\n }\n }}\n onContextMenu={(event) => onContextMenu(event, item)}\n >\n <div className=\"cb-details-cell cb-details-name\" role=\"gridcell\">\n <span className={`cb-details-icon${item.type === 'folder' ? ' cb-folder-icon' : ''}`}><Icon size={16} /></span>\n <span className=\"cb-details-label\">{item.name}</span>\n {opening ? <Spinner className=\"cb-item-busy-inline\" label={t('contentBrowser.opening')} /> : null}\n </div>\n <div className=\"cb-details-cell cb-details-type\" role=\"gridcell\">{typeLabel}</div>\n <div className=\"cb-details-cell cb-details-size\" role=\"gridcell\">{sizeLabel}</div>\n <div className=\"cb-details-cell cb-details-modified\" role=\"gridcell\">{modifiedLabel}</div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n", "import type { CBFile, CBFileFamily, CBViewItem } from './types';\n\nexport const ALL_FILTER_FAMILIES = [\n 'dir', 'scene', 'pack', 'meta', 'model', 'image', 'audio', 'font', 'ui', 'code', 'config', 'doc', 'data',\n] as const;\n\n/** Sub-asset kinds for the filter menu. `scene` is omitted \u2014 use file type Scene instead. */\nexport const FILTERABLE_ASSET_KINDS = [\n 'plugin',\n 'mesh',\n 'material',\n 'texture',\n 'equirect',\n 'cube-texture',\n 'animation-clip',\n 'skeleton',\n 'audio',\n 'font',\n 'ui',\n] as const;\n\nconst SOURCE_TEXT_FAMILIES: ReadonlySet<CBFileFamily> = new Set([\n 'code', 'config', 'doc', 'data', 'pack', 'meta', 'scene',\n]);\nconst SOURCE_VIEW_EXTENSIONS = new Set(['ts', 'tsx', 'js', 'jsx', 'mjs', 'cjs', 'json']);\n\nexport function dirOfPath(path: string): string {\n const index = path.lastIndexOf('/');\n return index < 0 ? '' : path.slice(0, index);\n}\n\nexport function childPath(parent: string, name: string): string {\n return parent ? `${parent}/${name}` : name;\n}\n\n/** Sanitise a typed address into a project-relative path (`''` = root). */\nexport function normalizePathInput(raw: string): string {\n return raw.trim().replace(/\\\\/g, '/').replace(/\\/+/g, '/').replace(/^\\/+|\\/+$/g, '');\n}\n\nexport function viewItemKey(item: CBViewItem): string {\n return item.type === 'asset' ? item.guid : item.path;\n}\n\nexport function isResourceGroup(assetCount: number): boolean {\n return assetCount > 1;\n}\n\nexport function fileFamilyOf(name: string): CBFileFamily {\n const lower = name.toLowerCase();\n if (lower.endsWith('.meta.json')) return 'meta';\n if (lower.endsWith('.pack.ts')) return 'pack';\n if (lower.endsWith('.pack.json')) return lower.includes('scene') ? 'scene' : 'pack';\n if (lower.endsWith('.scene.json') || lower === 'scene.json') return 'scene';\n if (lower.endsWith('.colliders.json')) return 'data';\n const ext = lower.split('.').pop() ?? '';\n if (['html', 'css', 'ts', 'tsx', 'js', 'jsx', 'mjs', 'cjs', 'py'].includes(ext)) return 'code';\n if (['json', 'lock'].includes(ext)) return 'config';\n if (['md', 'markdown', 'txt'].includes(ext)) return 'doc';\n if (['png', 'jpg', 'jpeg', 'webp', 'gif', 'svg', 'ico', 'hdr'].includes(ext)) return 'image';\n if (['mp3', 'wav', 'ogg', 'flac', 'aac', 'm4a', 'opus'].includes(ext)) return 'audio';\n if (['glb', 'gltf', 'fbx'].includes(ext)) return 'model';\n if (['ttf', 'otf', 'woff', 'woff2'].includes(ext)) return 'font';\n return 'other';\n}\n\nexport function fileFamilyOfWithAssets(\n name: string,\n assets: readonly { kind: string }[],\n): CBFileFamily {\n if (name.toLowerCase().endsWith('.pack.ts')) return 'pack';\n const byName = fileFamilyOf(name);\n if (byName === 'pack' && assets.some((asset) => asset.kind === 'scene')) return 'scene';\n return byName;\n}\n\nexport function isSourceViewableFileName(name: string): boolean {\n const lower = name.toLowerCase();\n if (lower.endsWith('.pack.json') || lower.endsWith('.pack.ts')) return true;\n const ext = lower.includes('.') ? lower.slice(lower.lastIndexOf('.') + 1) : lower;\n return SOURCE_VIEW_EXTENSIONS.has(ext);\n}\n\nexport function fileSupportsDualPreview(\n file: Pick<CBFile, 'family' | 'assets' | 'name'>,\n): boolean {\n if (file.assets.length === 0) return false;\n return SOURCE_TEXT_FAMILIES.has(file.family) || isSourceViewableFileName(file.name);\n}\n\nexport function resolveDualPreviewFile(\n item: CBViewItem,\n diskFiles: readonly CBFile[],\n): CBFile | undefined {\n if (item.type === 'file') return item;\n if (item.type === 'asset') return diskFiles.find((file) => file.path === item.packPath);\n return undefined;\n}\n\nexport function formatBytes(bytes: number | undefined): string {\n if (bytes === undefined || bytes <= 0) return '';\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport function formatDate(ms: number | undefined): string {\n if (!ms) return '';\n try {\n return new Date(ms).toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });\n } catch {\n return '';\n }\n}\n\nexport function compareItems(\n a: CBViewItem,\n b: CBViewItem,\n key: 'name' | 'kind' | 'packModifiedAt' | 'estimatedSize',\n dir: 'asc' | 'desc',\n): number {\n const sign = dir === 'desc' ? -1 : 1;\n if (key === 'kind') {\n return sign * itemKind(a).localeCompare(itemKind(b)) || sign * a.name.localeCompare(b.name);\n }\n if (key === 'packModifiedAt') {\n return sign * ((itemModified(a) - itemModified(b)) || a.name.localeCompare(b.name));\n }\n if (key === 'estimatedSize') {\n return sign * ((itemSize(a) - itemSize(b)) || a.name.localeCompare(b.name));\n }\n return sign * a.name.localeCompare(b.name);\n}\n\nfunction itemKind(item: CBViewItem): string {\n if (item.type === 'folder') return 'folder';\n if (item.type === 'file') return item.kindLabel || item.family;\n return item.kind;\n}\n\nfunction itemModified(item: CBViewItem): number {\n if (item.type === 'asset') return item.packModifiedAt ?? 0;\n if (item.type === 'file') return item.packModifiedAt ?? 0;\n return 0;\n}\n\nfunction itemSize(item: CBViewItem): number {\n if (item.type === 'asset') return item.estimatedSize ?? 0;\n if (item.type === 'file') return item.estimatedSize ?? 0;\n return 0;\n}\n\nexport function matchesSearch(item: CBViewItem, query: string): boolean {\n if (!query) return true;\n if (item.type === 'folder') {\n return item.name.toLowerCase().includes(query) || item.path.toLowerCase().includes(query);\n }\n if (item.type === 'file') {\n return item.name.toLowerCase().includes(query)\n || item.path.toLowerCase().includes(query)\n || item.assets.some((asset) => asset.name.toLowerCase().includes(query) || asset.kind.toLowerCase().includes(query));\n }\n return item.name.toLowerCase().includes(query)\n || item.guid.toLowerCase().startsWith(query)\n || item.kind.toLowerCase().includes(query);\n}\n", "import {\n Bone,\n Box,\n Braces,\n Clapperboard,\n Database,\n File,\n FileCode2,\n FileText,\n Film,\n Folder,\n FolderOpen,\n Globe,\n Image,\n Layers,\n Music,\n Package,\n Paintbrush,\n Puzzle,\n Type,\n type LucideIcon,\n} from 'lucide-react';\nimport type { CBFileFamily, CBFilterFamily, CBViewItem } from './types';\n\nconst FAMILY_ICONS: Record<CBFilterFamily, LucideIcon> = {\n dir: Folder,\n scene: Clapperboard,\n pack: Package,\n meta: Layers,\n model: Box,\n image: Image,\n audio: Music,\n font: Type,\n ui: Paintbrush,\n code: FileCode2,\n config: Braces,\n doc: FileText,\n data: Database,\n other: File,\n};\n\nconst KIND_ICONS: Record<string, LucideIcon> = {\n plugin: Puzzle,\n mesh: Box,\n material: Paintbrush,\n texture: Image,\n image: Image,\n equirect: Globe,\n 'cube-texture': Globe,\n sampler: Layers,\n 'animation-clip': Film,\n 'animation-graph': Film,\n skeleton: Bone,\n skin: Bone,\n scene: Clapperboard,\n ui: Paintbrush,\n audio: Music,\n font: Type,\n video: Film,\n tileset: Layers,\n 'particle-effect': Layers,\n 'render-pipeline': Layers,\n};\n\nexport function familyIcon(family: CBFilterFamily | CBFileFamily): LucideIcon {\n return FAMILY_ICONS[family] ?? File;\n}\n\nexport function kindIcon(kind: string): LucideIcon {\n return KIND_ICONS[kind] ?? Package;\n}\n\nexport function itemIcon(item: CBViewItem, folderOpen = false): LucideIcon {\n if (item.type === 'folder') return folderOpen ? FolderOpen : Folder;\n if (item.type === 'file') return familyIcon(item.family);\n return kindIcon(item.kind);\n}\n", "import {\n ALL_FILTER_FAMILIES,\n FILTERABLE_ASSET_KINDS,\n compareItems,\n dirOfPath,\n matchesSearch,\n} from './format';\nimport type {\n CBAsset,\n CBFile,\n CBFilter,\n CBFilterFamily,\n CBFolder,\n CBKindFilter,\n CBSortDir,\n CBSortKey,\n CBSortState,\n CBViewItem,\n} from './types';\n\nexport function translatedOrFallback(\n t: (key: string) => string,\n key: string,\n fallbackKey: string,\n): string {\n const label = t(key);\n return label === key ? t(fallbackKey) : label;\n}\n\nexport function assetKindLabel(\n kind: string,\n t: (key: string) => string,\n): string {\n return translatedOrFallback(\n t,\n `contentBrowser.assetKinds.${kind}`,\n 'contentBrowser.assetKinds.default',\n );\n}\n\nexport function buildFamilyFilters(\n activeFamilies: ReadonlySet<CBFilterFamily>,\n t: (key: string) => string,\n): CBFilter[] {\n return ALL_FILTER_FAMILIES.map((family) => ({\n id: `family:${family}`,\n family,\n label: translatedOrFallback(\n t,\n family === 'dir' ? 'contentBrowser.fileKinds.dir' : `contentBrowser.fileKinds.${family}`,\n 'contentBrowser.fileKinds.other',\n ),\n active: activeFamilies.has(family),\n }));\n}\n\nexport function buildKindFilters(\n activeKinds: ReadonlySet<string>,\n t: (key: string) => string,\n): CBKindFilter[] {\n return FILTERABLE_ASSET_KINDS.map((kind) => ({\n id: `kind:${kind}`,\n kind,\n label: assetKindLabel(kind, t),\n active: activeKinds.has(kind),\n }));\n}\n\nexport function toggleFilterId(\n filterId: string,\n activeFamilies: ReadonlySet<CBFilterFamily>,\n activeKinds: ReadonlySet<string>,\n): { families: Set<CBFilterFamily>; kinds: Set<string> } {\n const [scope, value] = filterId.split(':');\n const families = new Set(activeFamilies);\n const kinds = new Set(activeKinds);\n if (scope === 'kind' && value) {\n if (kinds.has(value)) kinds.delete(value);\n else kinds.add(value);\n return { families, kinds };\n }\n const family = value as CBFilterFamily;\n if (families.has(family)) families.delete(family);\n else families.add(family);\n return { families, kinds };\n}\n\nexport function fileKindLabel(\n file: Pick<CBFile, 'isAssetPackage' | 'family'>,\n t: (key: string) => string,\n): string {\n return file.isAssetPackage\n ? t('contentBrowser.fileKinds.assetPackage')\n : translatedOrFallback(\n t,\n `contentBrowser.fileKinds.${file.family}`,\n 'contentBrowser.fileKinds.other',\n );\n}\n\nexport function deriveViewItems({\n folders,\n files,\n currentPath,\n searchQuery,\n activeFamilies,\n activeKinds,\n sortState,\n expandedPacks,\n withKindLabel,\n}: {\n folders: readonly CBFolder[];\n files: readonly CBFile[];\n currentPath: string;\n searchQuery: string;\n activeFamilies: ReadonlySet<CBFilterFamily>;\n activeKinds: ReadonlySet<string>;\n sortState: CBSortState;\n expandedPacks: ReadonlySet<string>;\n withKindLabel: (file: CBFile) => CBFile;\n}): {\n foldersInPath: CBFolder[];\n filesInPath: CBFile[];\n viewItems: CBViewItem[];\n searchActive: boolean;\n kindFilterActive: boolean;\n} {\n const query = searchQuery.trim().toLowerCase();\n const searchActive = query !== '';\n const kindFilterActive = activeKinds.size > 0;\n const labeledFiles = files.map(withKindLabel);\n\n const foldersInPath = folders\n .filter((folder) => dirOfPath(folder.path) === currentPath)\n .filter(() => activeFamilies.size === 0 || activeFamilies.has('dir'))\n .filter((folder) => {\n if (!query) return true;\n const prefix = `${folder.path}/`;\n return matchesSearch(folder, query)\n || labeledFiles.some((file) => file.path.startsWith(prefix) && matchesSearch(file, query));\n })\n .toSorted((a, b) => compareItems(a, b, 'name', sortState.dir));\n\n const filesInPath = labeledFiles\n .filter((file) => dirOfPath(file.path) === currentPath)\n .filter((file) => activeFamilies.size === 0 || activeFamilies.has(file.family))\n .filter((file) => !query || matchesSearch(file, query))\n .toSorted((a, b) => compareItems(a, b, sortState.key, sortState.dir));\n\n if (kindFilterActive) {\n const seen = new Set<string>();\n const out: CBAsset[] = [];\n for (const file of filesInPath) {\n for (const asset of file.assets) {\n if (seen.has(asset.guid) || !activeKinds.has(asset.kind)) continue;\n if (query && !matchesSearch(asset, query) && !file.name.toLowerCase().includes(query)) continue;\n seen.add(asset.guid);\n out.push(asset);\n }\n }\n out.sort((a, b) => a.name.localeCompare(b.name));\n return { foldersInPath: [], filesInPath, viewItems: out, searchActive, kindFilterActive };\n }\n\n const items: CBViewItem[] = [...foldersInPath];\n for (const file of filesInPath) {\n if (file.assets.length === 0) {\n items.push(file);\n continue;\n }\n if (file.assets.length === 1) {\n items.push(...file.assets);\n continue;\n }\n items.push(file);\n if (searchActive || expandedPacks.has(file.path)) items.push(...file.assets);\n }\n return { foldersInPath, filesInPath, viewItems: items, searchActive, kindFilterActive };\n}\n\nexport function nextSortState(current: CBSortState, key: CBSortKey): CBSortState {\n if (current.key === key) return { key, dir: current.dir === 'asc' ? 'desc' : 'asc' };\n return { key, dir: 'asc' };\n}\n\nexport function setSortDir(current: CBSortState, dir: CBSortDir): CBSortState {\n return current.dir === dir ? current : { ...current, dir };\n}\n", "import { ChevronDown } from 'lucide-react';\nimport { Spinner } from '@forgeax/view-components';\nimport {\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type MouseEvent,\n type ReactNode,\n} from 'react';\nimport { useTranslation } from '../i18n/useTranslation';\nimport { CONTENT_BROWSER_ACTIONS } from '../schema.ts';\nimport { viewItemKey } from './format';\nimport { itemIcon } from './icons';\nimport { assetKindLabel } from './derived-view';\nimport type { CBFile, CBViewItem, CBViewMode } from './types';\n\nexport function CBGrid({\n items,\n thumbnailSize,\n layout,\n searchActive,\n expandedPacks,\n selectedIds,\n openingKeys,\n onSelect,\n onActivate,\n onContextMenu,\n onTogglePackExpansion,\n onBlankClick,\n}: {\n items: CBViewItem[];\n thumbnailSize: number;\n layout: Exclude<CBViewMode, 'column'>;\n searchActive: boolean;\n expandedPacks: ReadonlySet<string>;\n selectedIds: ReadonlySet<string>;\n openingKeys?: ReadonlySet<string>;\n onSelect: (item: CBViewItem, event: MouseEvent) => void;\n onActivate: (item: CBViewItem) => void;\n onContextMenu: (event: MouseEvent, item: CBViewItem) => void;\n onTogglePackExpansion: (path: string) => void;\n onBlankClick: () => void;\n}) {\n const { t } = useTranslation();\n const rootRef = useRef<HTMLDivElement>(null);\n const [backdrops, setBackdrops] = useState<{ key: string; left: number; top: number; width: number; height: number; radius: string }[]>([]);\n const grouping = !searchActive;\n\n const measureGroups = useCallback(() => {\n const container = rootRef.current;\n if (!container) { setBackdrops((prev) => (prev.length ? [] : prev)); return; }\n const members = container.querySelectorAll<HTMLElement>('[data-cb-group]');\n if (members.length === 0) { setBackdrops((prev) => (prev.length ? [] : prev)); return; }\n const byGroup = new Map<string, HTMLElement[]>();\n members.forEach((el) => {\n const key = el.dataset.cbGroup;\n if (!key) return;\n const list = byGroup.get(key);\n if (list) list.push(el);\n else byGroup.set(key, [el]);\n });\n const pad = layout === 'list' ? 2 : 4;\n const radius = 8;\n // Padding-box right edge (inside any scrollbar). Do not clamp card bounds to\n // this \u2014 clamping cuts the backdrop short of the last card once a scrollbar\n // appears. Only the wrapped-row continuation uses it as a full-width edge.\n const containerRight = container.clientWidth;\n const next: typeof backdrops = [];\n for (const [key, els] of byGroup) {\n const rows: { top: number; els: HTMLElement[] }[] = [];\n for (const el of els) {\n const top = el.offsetTop;\n const row = rows.find((entry) => Math.abs(entry.top - top) <= 4);\n if (row) row.els.push(el);\n else rows.push({ top, els: [el] });\n }\n const multiRow = rows.length > 1;\n rows.forEach((row, idx) => {\n let left = Infinity;\n let right = -Infinity;\n let top = Infinity;\n let bottom = -Infinity;\n for (const el of row.els) {\n left = Math.min(left, el.offsetLeft);\n right = Math.max(right, el.offsetLeft + el.offsetWidth);\n top = Math.min(top, el.offsetTop);\n bottom = Math.max(bottom, el.offsetTop + el.offsetHeight);\n }\n const extendLeft = multiRow && idx > 0;\n const extendRight = multiRow && idx < rows.length - 1;\n const x0 = extendLeft ? 0 : left - pad;\n const x1 = extendRight ? containerRight : right + pad;\n next.push({\n key: `${key}#${idx}`,\n left: x0,\n top: top - pad,\n width: x1 - x0,\n height: bottom - top + pad * 2,\n radius: `${extendLeft ? 0 : radius}px ${extendRight ? 0 : radius}px ${extendRight ? 0 : radius}px ${extendLeft ? 0 : radius}px`,\n });\n });\n }\n setBackdrops(next);\n }, [layout]);\n\n useLayoutEffect(() => {\n measureGroups();\n const container = rootRef.current;\n if (!container) return;\n let raf = 0;\n const schedule = () => { cancelAnimationFrame(raf); raf = requestAnimationFrame(measureGroups); };\n const observer = new ResizeObserver(schedule);\n observer.observe(container);\n container.querySelectorAll<HTMLElement>('[data-cb-group]').forEach((el) => observer.observe(el));\n return () => { cancelAnimationFrame(raf); observer.disconnect(); };\n }, [measureGroups, items, expandedPacks, thumbnailSize, searchActive]);\n\n const renderCard = (item: CBViewItem, expanded = false, groupKey?: string): ReactNode => {\n const key = viewItemKey(item);\n const selected = selectedIds.has(key);\n const opening = openingKeys?.has(key) ?? false;\n const Icon = itemIcon(item);\n const isFolder = item.type === 'folder';\n const isFile = item.type === 'file';\n const groupCount = grouping && isFile && item.assets.length >= 2 ? item.assets.length : 0;\n const stacked = groupCount >= 2;\n const meta = isFolder\n ? null\n : isFile\n ? item.kindLabel\n : assetKindLabel(item.kind, t);\n return (\n <div\n role=\"button\"\n tabIndex={0}\n className={`cb-grid-item cb-fe-card${isFolder ? ' cb-grid-folder' : ''}${isFile ? ' cb-file-card' : ''}${selected ? ' sel' : ''}${expanded ? ' cb-pack-expanded' : ''}${stacked ? ' cb-group-card' : ''}${groupKey ? ' cb-group-member' : ''}${opening ? ' is-busy' : ''}`}\n key={key}\n data-action={CONTENT_BROWSER_ACTIONS.select}\n data-cb-group={groupKey}\n aria-selected={selected}\n aria-busy={opening || undefined}\n onClick={(event) => onSelect(item, event)}\n onDoubleClick={() => onActivate(item)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n onActivate(item);\n } else if (event.key === ' ') {\n event.preventDefault();\n onSelect(item, event as unknown as MouseEvent);\n }\n }}\n onContextMenu={(event) => onContextMenu(event, item)}\n >\n <span className={`cb-grid-thumb cb-fe-thumb${isFile ? ' cb-file-thumb' : ''}${isFolder ? ' cb-folder-thumb' : ''}`}>\n <span className={isFolder ? 'cb-folder-icon' : 'cb-grid-icon'}><Icon /></span>\n {groupCount >= 1 ? (\n <button\n type=\"button\"\n className={`cb-group-badge${expanded ? ' open' : ''}`}\n data-action={CONTENT_BROWSER_ACTIONS.togglePackExpansion}\n title={t('contentBrowser.menu.expandSubAssets')}\n onClick={(event) => {\n event.stopPropagation();\n onSelect(item, event);\n onTogglePackExpansion((item as CBFile).path);\n }}\n >\n <span className=\"cb-group-badge-num\">{groupCount}</span>\n <ChevronDown size={11} />\n </button>\n ) : null}\n </span>\n <span className={`cb-grid-label cb-fe-label${meta ? ' has-kind' : ''}`}>\n <span className=\"cb-fe-name\">{item.name}</span>\n {meta ? <span className=\"cb-card-meta\">{meta}</span> : null}\n </span>\n {opening ? (\n layout === 'list' ? (\n <Spinner className=\"cb-item-busy-inline\" label={t('contentBrowser.opening')} />\n ) : (\n <span className=\"cb-item-busy-veil\">\n <Spinner label={t('contentBrowser.opening')} />\n </span>\n )\n ) : null}\n </div>\n );\n };\n\n const nodes: ReactNode[] = [];\n for (let index = 0; index < items.length; ) {\n const item = items[index];\n if (!item) { index += 1; continue; }\n if (grouping && item.type === 'file' && item.assets.length >= 2 && expandedPacks.has(item.path)) {\n const guids = new Set(item.assets.map((asset) => asset.guid));\n nodes.push(renderCard(item, true, item.path));\n let nextIndex = index + 1;\n for (; nextIndex < items.length; nextIndex += 1) {\n const next = items[nextIndex];\n if (!next || next.type !== 'asset' || !guids.has(next.guid)) break;\n nodes.push(renderCard(next, false, item.path));\n }\n index = nextIndex;\n continue;\n }\n nodes.push(renderCard(item));\n index += 1;\n }\n\n return (\n <div\n ref={rootRef}\n className={`cb-grid-view cb-fe-grid cb-layout-${layout}`}\n style={{ '--cb-thumb': `${thumbnailSize}px` } as CSSProperties}\n onClick={(event) => { if (event.target === event.currentTarget) onBlankClick(); }}\n >\n {backdrops.length > 0 ? (\n <div className=\"cb-group-backdrops\" aria-hidden=\"true\">\n {backdrops.map((backdrop) => (\n <div key={backdrop.key} className=\"cb-group-backdrop\" style={{ left: backdrop.left, top: backdrop.top, width: backdrop.width, height: backdrop.height, borderRadius: backdrop.radius }} />\n ))}\n </div>\n ) : null}\n {nodes}\n </div>\n );\n}\n", "import { ChevronLeft, ChevronRight, Folder, RefreshCw } from 'lucide-react';\nimport { IconButton, MenuDropdown, Toolbar } from '@forgeax/view-components';\nimport { useCallback, useState, type KeyboardEvent, type MouseEvent } from 'react';\nimport { useTranslation } from '../i18n/useTranslation';\nimport { CONTENT_BROWSER_ACTIONS } from '../schema.ts';\nimport { normalizePathInput } from './format';\n\nfunction immediateChildren(allDirs: readonly string[], path: string): { name: string; path: string }[] {\n const prefix = path ? `${path}/` : '';\n const depth = path ? path.split('/').length : 0;\n const out: { name: string; path: string }[] = [];\n for (const dir of allDirs) {\n if (path && dir === path) continue;\n if (!dir.startsWith(prefix)) continue;\n if (dir.split('/').length !== depth + 1) continue;\n out.push({ name: dir.split('/').pop() ?? dir, path: dir });\n }\n return out.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nfunction LevelChevron({\n levelPath,\n activeNextSeg,\n allDirs,\n onNavigate,\n label,\n}: {\n levelPath: string;\n activeNextSeg: string | null;\n allDirs: readonly string[];\n onNavigate: (path: string) => void;\n label: string;\n}) {\n const children = immediateChildren(allDirs, levelPath);\n if (children.length === 0) {\n return (\n <span className=\"cb-crumb-chevron\" aria-hidden=\"true\">\n <ChevronRight size={12} />\n </span>\n );\n }\n return (\n <span className=\"cb-crumb-chevron\" onClick={(event) => event.stopPropagation()}>\n <MenuDropdown\n label={label}\n align=\"start\"\n className=\"cb-crumb-menu\"\n trigger={\n <button\n type=\"button\"\n className=\"cb-crumb-chevron-btn\"\n aria-label={label}\n title={label}\n onClick={(event) => event.stopPropagation()}\n >\n <ChevronRight size={12} />\n </button>\n }\n items={children.map((child) => ({\n id: child.path,\n label: child.name,\n icon: <Folder size={14} />,\n buttonProps: child.name === activeNextSeg ? { 'data-active': '' } : undefined,\n onSelect: () => onNavigate(child.path),\n }))}\n />\n </span>\n );\n}\n\nexport function CBNavigationBar({\n currentPath,\n projectLabel,\n allDirs,\n canGoBack,\n canGoForward,\n refreshDisabled,\n onBack,\n onForward,\n onRefresh,\n onNavigate,\n}: {\n currentPath: string;\n projectLabel: string;\n allDirs: readonly string[];\n canGoBack: boolean;\n canGoForward: boolean;\n refreshDisabled: boolean;\n onBack: () => void;\n onForward: () => void;\n onRefresh: () => void;\n onNavigate: (path: string) => void;\n}) {\n const { t } = useTranslation();\n const segments = currentPath ? currentPath.split('/').filter(Boolean) : [];\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState('');\n\n const beginEdit = useCallback(() => {\n setDraft(currentPath);\n setEditing(true);\n }, [currentPath]);\n\n const commit = useCallback(() => {\n onNavigate(normalizePathInput(draft));\n setEditing(false);\n }, [draft, onNavigate]);\n\n const onInputKeyDown = useCallback((event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n commit();\n } else if (event.key === 'Escape') {\n event.preventDefault();\n setEditing(false);\n }\n }, [commit]);\n\n const onAddressKeyDown = useCallback((event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n beginEdit();\n }\n }, [beginEdit]);\n\n const stopAndNavigate = (event: MouseEvent<HTMLButtonElement>, path: string) => {\n event.stopPropagation();\n onNavigate(path);\n };\n\n return (\n <Toolbar className=\"cb-navigation-bar\">\n <IconButton\n size=\"compact\"\n variant=\"quiet\"\n label={t('contentBrowser.back')}\n icon={<ChevronLeft size={14} />}\n data-action={CONTENT_BROWSER_ACTIONS.navigateBack}\n disabled={!canGoBack}\n onClick={onBack}\n />\n <IconButton\n size=\"compact\"\n variant=\"quiet\"\n label={t('contentBrowser.forward')}\n icon={<ChevronRight size={14} />}\n data-action={CONTENT_BROWSER_ACTIONS.navigateForward}\n disabled={!canGoForward}\n onClick={onForward}\n />\n <IconButton\n size=\"compact\"\n variant=\"quiet\"\n label={t('contentBrowser.refresh')}\n disabled={refreshDisabled}\n icon={<RefreshCw size={13} />}\n data-action={CONTENT_BROWSER_ACTIONS.refresh}\n onClick={onRefresh}\n />\n <div className=\"cb-address-slot\">\n {editing ? (\n <input\n autoFocus\n spellCheck={false}\n className=\"cb-address-input\"\n value={draft}\n placeholder={t('contentBrowser.actions.editPathPlaceholder')}\n onChange={(event) => setDraft(event.target.value)}\n onKeyDown={onInputKeyDown}\n onBlur={() => setEditing(false)}\n onFocus={(event) => event.currentTarget.select()}\n />\n ) : (\n <div\n className=\"cb-address\"\n role=\"button\"\n tabIndex={0}\n title={t('contentBrowser.actions.editPath')}\n onClick={beginEdit}\n onKeyDown={onAddressKeyDown}\n >\n <div className=\"cb-address-crumb\">\n <button\n type=\"button\"\n className={segments.length ? 'cb-crumb-item' : 'cb-crumb-item cb-crumb-current'}\n aria-current={segments.length === 0 ? 'page' : undefined}\n data-action={CONTENT_BROWSER_ACTIONS.navigate}\n onClick={(event) => stopAndNavigate(event, '')}\n >\n {projectLabel}\n </button>\n {segments.map((segment, index) => {\n const path = segments.slice(0, index + 1).join('/');\n const parentPath = segments.slice(0, index).join('/');\n const parentLabel = index === 0 ? projectLabel : (segments[index - 1] ?? projectLabel);\n const isCurrent = index === segments.length - 1;\n return (\n <span className=\"cb-crumb-segment\" key={path}>\n <LevelChevron\n levelPath={parentPath}\n activeNextSeg={segment}\n allDirs={allDirs}\n onNavigate={onNavigate}\n label={t('contentBrowser.actions.openSubfolders', { name: parentLabel })}\n />\n <button\n type=\"button\"\n className={isCurrent ? 'cb-crumb-item cb-crumb-current' : 'cb-crumb-item'}\n aria-current={isCurrent ? 'page' : undefined}\n data-action={CONTENT_BROWSER_ACTIONS.navigate}\n onClick={(event) => stopAndNavigate(event, path)}\n >\n {segment}\n </button>\n </span>\n );\n })}\n </div>\n </div>\n )}\n </div>\n </Toolbar>\n );\n}\n", "import { X } from 'lucide-react';\nimport { IconButton } from '@forgeax/view-components';\nimport { useEffect, useState } from 'react';\nimport { useTranslation } from '../i18n/useTranslation';\nimport { dirOfPath, fileSupportsDualPreview, resolveDualPreviewFile } from './format';\nimport { itemIcon } from './icons';\nimport { assetKindLabel, fileKindLabel } from './derived-view';\nimport { FileContentPreview } from './preview/FileContentPreview';\nimport { ResizeHandle } from './resize-handle';\nimport type { CBFile, CBFilePreviewMode, CBFolder, CBViewItem, PreviewFileInfo } from './types';\n\nexport function CBPreviewPanel({\n previewItem,\n foldersInPath,\n diskFiles,\n projectLabel,\n readPreview,\n onClose,\n onDrag,\n onDragEnd,\n}: {\n previewItem: CBViewItem | null;\n foldersInPath: CBFolder[];\n diskFiles: CBFile[];\n projectLabel: string;\n readPreview?: (path: string, options?: { signal?: AbortSignal }) => Promise<PreviewFileInfo | null>;\n onClose: () => void;\n onDrag: (delta: number) => void;\n onDragEnd: () => void;\n}) {\n const { t } = useTranslation();\n const [filePreviewMode, setFilePreviewMode] = useState<CBFilePreviewMode>('assets');\n const [previewInfo, setPreviewInfo] = useState<PreviewFileInfo | null>(null);\n const [previewStatus, setPreviewStatus] = useState<'idle' | 'loading' | 'ready'>('idle');\n const dualPreviewFile = previewItem ? resolveDualPreviewFile(previewItem, diskFiles) : undefined;\n const showDualPreview = dualPreviewFile !== undefined && fileSupportsDualPreview(dualPreviewFile);\n const previewKey = previewItem ? (previewItem.type === 'asset' ? previewItem.guid : previewItem.path) : null;\n const previewSourcePath = dualPreviewFile?.diskPath || dualPreviewFile?.path || null;\n const dualAssetCount = dualPreviewFile?.assets.length ?? 0;\n const dualSupportsPreview = dualPreviewFile ? fileSupportsDualPreview(dualPreviewFile) : false;\n const embeddedSourcePreview = dualPreviewFile?.sourcePreview ?? null;\n const canReadPreview = typeof readPreview === 'function';\n\n useEffect(() => {\n setFilePreviewMode('assets');\n }, [previewKey]);\n\n useEffect(() => {\n if (!previewSourcePath) {\n setPreviewInfo(null);\n setPreviewStatus('idle');\n return;\n }\n const needsSource = dualAssetCount === 0\n || (dualSupportsPreview && filePreviewMode === 'source');\n if (!needsSource) {\n setPreviewInfo(null);\n setPreviewStatus('idle');\n return;\n }\n if (embeddedSourcePreview != null && !canReadPreview) {\n setPreviewInfo({\n path: dualPreviewFile?.path ?? previewSourcePath,\n kind: 'text',\n mime: 'text/plain; charset=utf-8',\n size: dualPreviewFile?.estimatedSize ?? embeddedSourcePreview.length,\n mtime: dualPreviewFile?.packModifiedAt ?? 0,\n content: embeddedSourcePreview,\n });\n setPreviewStatus('ready');\n return;\n }\n if (!canReadPreview || !readPreview) {\n setPreviewInfo(null);\n setPreviewStatus('ready');\n return;\n }\n let cancelled = false;\n setPreviewInfo(null);\n setPreviewStatus('loading');\n const controller = new AbortController();\n void readPreview(previewSourcePath, { signal: controller.signal })\n .then((info) => {\n if (cancelled) return;\n setPreviewInfo(info);\n setPreviewStatus('ready');\n })\n .catch(() => {\n if (cancelled) return;\n setPreviewInfo(null);\n setPreviewStatus('ready');\n });\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [\n canReadPreview,\n dualAssetCount,\n dualSupportsPreview,\n embeddedSourcePreview,\n filePreviewMode,\n previewSourcePath,\n readPreview,\n ]);\n\n if (!previewItem) {\n return (\n <>\n <ResizeHandle onDrag={onDrag} onDragEnd={onDragEnd} title={t('contentBrowser.actions.resizePreview')} />\n <aside className=\"cb-preview-panel cb-preview-empty\">\n <div className=\"cb-preview-body\">\n <div className=\"cb-preview-note\">{t('contentBrowser.preview.nothingSelected')}</div>\n </div>\n </aside>\n </>\n );\n }\n\n const Icon = itemIcon(previewItem, true);\n const meta = previewItem.type === 'folder'\n ? t('contentBrowser.preview.folderMeta', { path: previewItem.path || projectLabel })\n : previewItem.type === 'file'\n ? t('contentBrowser.preview.fileMeta', { kind: previewItem.kindLabel, path: previewItem.path })\n : t('contentBrowser.preview.assetMeta', { kind: assetKindLabel(previewItem.kind, t), path: previewItem.packPath });\n\n let body;\n if (previewItem.type === 'folder') {\n const kids = [\n ...foldersInPath.filter((folder) => dirOfPath(folder.path) === previewItem.path),\n ...diskFiles.filter((entry) => dirOfPath(entry.path) === previewItem.path),\n ].slice(0, 40);\n body = kids.length === 0 ? (\n <div className=\"cb-preview-note\">{t('contentBrowser.preview.emptyFolder')}</div>\n ) : (\n <div className=\"cb-preview-list\">\n {kids.map((child) => {\n const ChildIcon = itemIcon(child);\n return (\n <div className=\"cb-preview-list-item\" key={child.path}>\n <span className={`cb-preview-list-ico${child.type === 'folder' ? ' cb-folder-icon' : ''}`}><ChildIcon size={15} /></span>\n <span>{child.name}</span>\n <span className=\"sub\">\n {child.type === 'folder'\n ? t('contentBrowser.preview.items', { count: child.childCount })\n : child.kindLabel || fileKindLabel(child, t)}\n </span>\n </div>\n );\n })}\n </div>\n );\n } else if (previewItem.type === 'file') {\n const showSource = filePreviewMode === 'source' && showDualPreview;\n if (previewItem.assets.length > 0 && !showSource) {\n body = <FileAssetList file={previewItem} t={t} />;\n } else {\n body = (\n <FileContentPreview\n file={showDualPreview ? dualPreviewFile ?? previewItem : previewItem}\n previewInfo={previewInfo}\n status={previewStatus}\n pendingRemote={isFilePreviewPending(canReadPreview, previewStatus, previewInfo, showDualPreview ? dualPreviewFile ?? previewItem : previewItem)}\n t={t}\n />\n );\n }\n } else {\n const showSource = showDualPreview && filePreviewMode === 'source' && dualPreviewFile;\n body = showSource ? (\n <FileContentPreview\n file={dualPreviewFile}\n previewInfo={previewInfo}\n status={previewStatus}\n pendingRemote={isFilePreviewPending(canReadPreview, previewStatus, previewInfo, dualPreviewFile)}\n t={t}\n />\n ) : (\n <>\n <div className=\"cb-preview-media cb-preview-asset-hero\">\n <span className=\"cb-preview-hero-icon\"><Icon size={64} /></span>\n </div>\n <div className=\"cb-preview-asset-list\">\n <div className=\"cb-preview-asset-row\">\n <span className=\"cb-preview-list-ico\"><Icon size={15} /></span>\n <div className=\"cb-preview-asset-main\" title={previewItem.packPath}>\n <div title={previewItem.name}>{previewItem.name}</div>\n <div className=\"kind\" title={previewItem.packPath}>{previewItem.packPath}</div>\n </div>\n <span className=\"guid\" title={previewItem.guid}>{previewItem.guid}</span>\n </div>\n </div>\n </>\n );\n }\n\n return (\n <>\n <ResizeHandle onDrag={onDrag} onDragEnd={onDragEnd} title={t('contentBrowser.actions.resizePreview')} />\n <aside className=\"cb-preview-panel\" data-subject-id={previewItem.type === 'asset' ? previewItem.guid : previewItem.path}>\n <div className=\"cb-preview-head\">\n <span className={`cb-preview-ico${previewItem.type === 'folder' ? ' cb-folder-icon' : ''}`}><Icon size={15} /></span>\n <div className=\"cb-preview-title\">\n <div className=\"name\">{previewItem.name}</div>\n <div className=\"meta\">{meta}</div>\n </div>\n <IconButton\n size=\"compact\"\n variant=\"quiet\"\n className=\"cb-preview-close\"\n label={t('contentBrowser.preview.close')}\n icon={<X size={14} />}\n onClick={onClose}\n />\n </div>\n {showDualPreview ? (\n <div className=\"cb-preview-mode-bar\" role=\"tablist\" aria-label={t('contentBrowser.preview.modeAssets')}>\n <button type=\"button\" role=\"tab\" className={`cb-preview-mode-btn${filePreviewMode === 'assets' ? ' is-active' : ''}`} aria-selected={filePreviewMode === 'assets'} onClick={() => setFilePreviewMode('assets')}>\n {t('contentBrowser.preview.modeAssets')}\n </button>\n <button type=\"button\" role=\"tab\" className={`cb-preview-mode-btn${filePreviewMode === 'source' ? ' is-active' : ''}`} aria-selected={filePreviewMode === 'source'} onClick={() => setFilePreviewMode('source')}>\n {t('contentBrowser.preview.modeSource')}\n </button>\n </div>\n ) : null}\n <div className=\"cb-preview-body\">{body}</div>\n </aside>\n </>\n );\n}\n\nfunction FileAssetList({ file, t }: { file: CBFile; t: (key: string, vars?: Record<string, string | number>) => string }) {\n return (\n <div className=\"cb-preview-asset-list\">\n {file.assets.map((asset) => {\n const Icon = itemIcon(asset);\n return (\n <div className=\"cb-preview-asset-row\" key={asset.guid}>\n <span className=\"cb-preview-list-ico\"><Icon size={15} /></span>\n <div className=\"cb-preview-asset-main\">\n <div title={asset.name}>{asset.name}</div>\n <div className=\"kind\" title={assetKindLabel(asset.kind, t)}>{assetKindLabel(asset.kind, t)}</div>\n </div>\n <span className=\"guid\" title={asset.guid}>{asset.guid}</span>\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction isFilePreviewPending(\n canReadPreview: boolean,\n status: 'idle' | 'loading' | 'ready',\n previewInfo: PreviewFileInfo | null,\n file: CBFile,\n): boolean {\n if (!canReadPreview || status !== 'idle') return false;\n if (previewInfo) return false;\n return file.sourcePreview == null;\n}\n", "import type { CBFileFamily, PreviewFileInfo } from '../types';\n\n/** Keep in sync with `view-workspace-core/src/file-preview.ts`. */\nexport const MAX_BINARY_PREVIEW_BYTES = 10 * 1024 * 1024;\n\nexport function isBrowserMediaPreviewKind(kind: string): boolean {\n return kind === 'image' || kind === 'audio' || kind === 'video';\n}\n\nexport function isFontPreviewInfo(info: Pick<PreviewFileInfo, 'kind' | 'mime'>): boolean {\n return info.kind === 'binary' && info.mime.startsWith('font/');\n}\n\nexport function familySuggestsMediaPreview(family: CBFileFamily): boolean {\n return family === 'image' || family === 'audio' || family === 'font';\n}\n\nexport function familySuggestsEnginePreview(family: CBFileFamily): boolean {\n return family === 'model';\n}\n\nexport function svgMarkupSrc(content: string): string {\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(content)}`;\n}\n\nexport function mediaPreviewBlockedReason(\n info: PreviewFileInfo,\n): 'too-large' | 'unavailable' | null {\n if (info.dataUrl || (info.kind === 'image' && info.content)) return null;\n if (info.size > MAX_BINARY_PREVIEW_BYTES) return 'too-large';\n return 'unavailable';\n}\n", "import {\n isBrowserMediaPreviewKind,\n isFontPreviewInfo,\n mediaPreviewBlockedReason,\n svgMarkupSrc,\n} from './media-preview-policy';\nimport type { PreviewFileInfo } from '../types';\n\nexport function MediaPreview({\n info,\n fileName,\n t,\n}: {\n info: PreviewFileInfo;\n fileName: string;\n t: (key: string) => string;\n}) {\n if (isFontPreviewInfo(info)) {\n return <FontPreview info={info} sample={fileName} t={t} />;\n }\n if (!isBrowserMediaPreviewKind(info.kind)) {\n return <div className=\"cb-preview-note\">{t('contentBrowser.preview.noMediaPreview')}</div>;\n }\n\n const blocked = mediaPreviewBlockedReason(info);\n if (blocked === 'too-large') {\n return <div className=\"cb-preview-note\">{t('contentBrowser.preview.previewTooLarge')}</div>;\n }\n if (blocked === 'unavailable') {\n return <div className=\"cb-preview-note\">{t('contentBrowser.preview.noMediaPreview')}</div>;\n }\n\n const src = info.dataUrl ?? (info.content ? svgMarkupSrc(info.content) : undefined);\n if (!src) {\n return <div className=\"cb-preview-note\">{t('contentBrowser.preview.noMediaPreview')}</div>;\n }\n\n if (info.kind === 'audio') {\n return (\n <div className=\"cb-preview-media\">\n <audio className=\"cb-preview-audio\" controls preload=\"metadata\" src={src} aria-label={fileName} />\n </div>\n );\n }\n if (info.kind === 'video') {\n return (\n <div className=\"cb-preview-media\">\n <video className=\"cb-preview-video\" controls preload=\"metadata\" src={src} aria-label={fileName} />\n </div>\n );\n }\n return (\n <div className=\"cb-preview-media\">\n <img className=\"cb-preview-image\" src={src} alt={fileName} decoding=\"async\" />\n </div>\n );\n}\n\nfunction FontPreview({\n info,\n sample,\n t,\n}: {\n info: PreviewFileInfo;\n sample: string;\n t: (key: string) => string;\n}) {\n const blocked = mediaPreviewBlockedReason(info);\n if (blocked === 'too-large') {\n return <div className=\"cb-preview-note\">{t('contentBrowser.preview.previewTooLarge')}</div>;\n }\n if (!info.dataUrl) {\n return <div className=\"cb-preview-note\">{t('contentBrowser.preview.noMediaPreview')}</div>;\n }\n const fontId = `cb-preview-font-${info.path.replace(/[^\\w-]+/g, '-')}`;\n return (\n <div className=\"cb-preview-media cb-preview-font\">\n <style>{`@font-face{font-family:${fontId};src:url(${info.dataUrl});font-display:swap;}`}</style>\n <p className=\"cb-preview-font-sample\" style={{ fontFamily: fontId }}>\n {t('contentBrowser.preview.fontSample')}\n </p>\n <p className=\"cb-preview-font-meta\">{sample}</p>\n </div>\n );\n}\n", "import { useEffect, useState } from 'react';\nimport { useTranslation } from '../../i18n/useTranslation';\nimport { decideHighlight } from './code-preview-policy';\nimport { resolveLanguage } from './ext-language';\nimport { highlightToHtml, type HighlightAppearance } from './highlighter';\n\nfunction readDocumentAppearance(): HighlightAppearance {\n if (typeof document === 'undefined') return 'light';\n return document.documentElement.dataset.theme === 'dark' ? 'dark' : 'light';\n}\n\nfunction useDocumentAppearance(): HighlightAppearance {\n const [appearance, setAppearance] = useState<HighlightAppearance>(readDocumentAppearance);\n useEffect(() => {\n const root = document.documentElement;\n const sync = () => setAppearance(readDocumentAppearance());\n sync();\n const observer = new MutationObserver(sync);\n observer.observe(root, { attributes: true, attributeFilter: ['data-theme'] });\n return () => observer.disconnect();\n }, []);\n return appearance;\n}\n\nexport function CodePreview({\n name,\n ext,\n size,\n content,\n}: {\n name: string;\n ext: string;\n size: number;\n content: string;\n}) {\n const { t } = useTranslation();\n const appearance = useDocumentAppearance();\n const decision = decideHighlight({ ext, size, content });\n const targetLang = decision.highlight ? decision.lang : null;\n const label = resolveLanguage(ext)?.label ?? ext.toUpperCase();\n const [html, setHtml] = useState<string | null>(null);\n\n useEffect(() => {\n setHtml(null);\n if (targetLang == null) return;\n let cancelled = false;\n void highlightToHtml(content, targetLang, appearance)\n .then((out) => { if (!cancelled) setHtml(out); })\n .catch(() => { if (!cancelled) setHtml(null); });\n return () => { cancelled = true; };\n }, [appearance, content, targetLang]);\n\n const skippedForSize = !decision.highlight && decision.reason === 'too-large';\n\n return (\n <div className=\"cb-preview-code\" data-lang={resolveLanguage(ext)?.lang ?? 'text'}>\n <div className=\"cb-preview-code-head\">\n <span className=\"cb-preview-code-badge\">{label}</span>\n {skippedForSize ? <span className=\"cb-preview-code-hint\">{t('contentBrowser.preview.highlightSkipped')}</span> : null}\n </div>\n {html != null\n ? <div className=\"cb-preview-code-shiki\" dangerouslySetInnerHTML={{ __html: html }} />\n : <pre className=\"cb-preview-code-plain\" aria-label={name}>{content}</pre>}\n </div>\n );\n}\n", "export interface LanguageResolution {\n readonly lang: string;\n readonly label: string;\n}\n\nconst EXT_LANGUAGE: Readonly<Record<string, LanguageResolution>> = {\n ts: { lang: 'typescript', label: 'TypeScript' },\n mts: { lang: 'typescript', label: 'TypeScript' },\n cts: { lang: 'typescript', label: 'TypeScript' },\n tsx: { lang: 'tsx', label: 'TSX' },\n js: { lang: 'javascript', label: 'JavaScript' },\n mjs: { lang: 'javascript', label: 'JavaScript' },\n cjs: { lang: 'javascript', label: 'JavaScript' },\n jsx: { lang: 'jsx', label: 'JSX' },\n json: { lang: 'json', label: 'JSON' },\n jsonc: { lang: 'jsonc', label: 'JSONC' },\n json5: { lang: 'json5', label: 'JSON5' },\n css: { lang: 'css', label: 'CSS' },\n scss: { lang: 'scss', label: 'SCSS' },\n html: { lang: 'html', label: 'HTML' },\n htm: { lang: 'html', label: 'HTML' },\n md: { lang: 'markdown', label: 'Markdown' },\n markdown: { lang: 'markdown', label: 'Markdown' },\n py: { lang: 'python', label: 'Python' },\n rs: { lang: 'rust', label: 'Rust' },\n wgsl: { lang: 'wgsl', label: 'WGSL' },\n glsl: { lang: 'glsl', label: 'GLSL' },\n vert: { lang: 'glsl', label: 'GLSL' },\n frag: { lang: 'glsl', label: 'GLSL' },\n sh: { lang: 'shellscript', label: 'Shell' },\n bash: { lang: 'shellscript', label: 'Shell' },\n zsh: { lang: 'shellscript', label: 'Shell' },\n yaml: { lang: 'yaml', label: 'YAML' },\n yml: { lang: 'yaml', label: 'YAML' },\n toml: { lang: 'toml', label: 'TOML' },\n xml: { lang: 'xml', label: 'XML' },\n};\n\nexport function resolveLanguage(ext: string): LanguageResolution | undefined {\n const key = ext.replace(/^\\./, '').toLowerCase();\n return EXT_LANGUAGE[key];\n}\n", "import { resolveLanguage } from './ext-language';\n\nexport const MAX_HIGHLIGHT_BYTES = 200 * 1024;\nexport const MAX_HIGHLIGHT_LINES = 5_000;\n\nexport type HighlightDecision =\n | { readonly highlight: true; readonly lang: string; readonly label: string }\n | { readonly highlight: false; readonly reason: 'no-content' | 'unknown-language' | 'too-large' };\n\nexport interface HighlightPolicyInput {\n readonly ext: string;\n readonly size: number;\n readonly content?: string;\n}\n\nfunction countLines(text: string): number {\n let lines = 1;\n for (let index = 0; index < text.length; index += 1) {\n if (text.charCodeAt(index) === 10) lines += 1;\n }\n return lines;\n}\n\nexport function decideHighlight(input: HighlightPolicyInput): HighlightDecision {\n const { ext, size, content } = input;\n if (content == null) return { highlight: false, reason: 'no-content' };\n const resolved = resolveLanguage(ext);\n if (!resolved) return { highlight: false, reason: 'unknown-language' };\n const byteSize = Math.max(size, content.length);\n if (byteSize > MAX_HIGHLIGHT_BYTES || countLines(content) > MAX_HIGHLIGHT_LINES) {\n return { highlight: false, reason: 'too-large' };\n }\n return { highlight: true, lang: resolved.lang, label: resolved.label };\n}\n", "// shiki stays a content-browser dependency. Specifiers are static so Vite\n// resolves them from this package's node_modules and code-splits grammars.\n\ntype HighlighterCore = {\n loadLanguage: (lang: unknown) => Promise<unknown>;\n codeToHtml: (code: string, options: { lang: string; theme: string }) => string;\n};\ntype LanguageInput = unknown;\ntype ThemeRegistrationRaw = unknown;\n\nexport type HighlightAppearance = 'light' | 'dark';\n\nexport const HIGHLIGHT_THEMES = {\n light: 'github-light-default',\n dark: 'github-dark-default',\n} as const;\n\ntype LangModule = { readonly default: LanguageInput };\n\nconst LANG_LOADERS: Readonly<Record<string, () => Promise<LangModule>>> = {\n typescript: () => import('shiki/langs/typescript.mjs'),\n tsx: () => import('shiki/langs/tsx.mjs'),\n javascript: () => import('shiki/langs/javascript.mjs'),\n jsx: () => import('shiki/langs/jsx.mjs'),\n json: () => import('shiki/langs/json.mjs'),\n jsonc: () => import('shiki/langs/jsonc.mjs'),\n json5: () => import('shiki/langs/json5.mjs'),\n css: () => import('shiki/langs/css.mjs'),\n scss: () => import('shiki/langs/scss.mjs'),\n html: () => import('shiki/langs/html.mjs'),\n markdown: () => import('shiki/langs/markdown.mjs'),\n python: () => import('shiki/langs/python.mjs'),\n rust: () => import('shiki/langs/rust.mjs'),\n wgsl: () => import('shiki/langs/wgsl.mjs'),\n glsl: () => import('shiki/langs/glsl.mjs'),\n shellscript: () => import('shiki/langs/shellscript.mjs'),\n yaml: () => import('shiki/langs/yaml.mjs'),\n toml: () => import('shiki/langs/toml.mjs'),\n xml: () => import('shiki/langs/xml.mjs'),\n};\n\nlet corePromise: Promise<HighlighterCore> | null = null;\nconst loadedLangs = new Set<string>();\nconst inFlightLangs = new Map<string, Promise<boolean>>();\n\nasync function getCore(): Promise<HighlighterCore> {\n if (!corePromise) {\n corePromise = (async () => {\n const [coreMod, engineMod, darkTheme, lightTheme] = await Promise.all([\n import('shiki/core'),\n import('shiki/engine/javascript'),\n import('shiki/themes/github-dark-default.mjs'),\n import('shiki/themes/github-light-default.mjs'),\n ]);\n const core = await coreMod.createHighlighterCore({\n themes: [darkTheme.default, lightTheme.default],\n langs: [],\n engine: engineMod.createJavaScriptRegexEngine({ forgiving: true }),\n });\n return core as unknown as HighlighterCore;\n })();\n }\n return corePromise as Promise<HighlighterCore>;\n}\n\nasync function ensureLanguage(core: HighlighterCore, lang: string): Promise<boolean> {\n if (loadedLangs.has(lang)) return true;\n const loader = LANG_LOADERS[lang];\n if (!loader) return false;\n let pending = inFlightLangs.get(lang);\n if (!pending) {\n pending = (async () => {\n const mod = await loader();\n await core.loadLanguage(mod.default);\n loadedLangs.add(lang);\n return true;\n })();\n inFlightLangs.set(lang, pending);\n }\n return pending;\n}\n\nexport async function highlightToHtml(\n code: string,\n lang: string,\n appearance: HighlightAppearance = 'dark',\n): Promise<string | null> {\n const core = await getCore();\n const ready = await ensureLanguage(core, lang);\n if (!ready) return null;\n return core.codeToHtml(code, { lang, theme: HIGHLIGHT_THEMES[appearance] });\n}\n", "import type { CBFile, PreviewFileInfo } from '../types';\nimport { familySuggestsEnginePreview, familySuggestsMediaPreview, isBrowserMediaPreviewKind, isFontPreviewInfo } from './media-preview-policy';\nimport { MediaPreview } from './MediaPreview';\nimport { CodePreview } from './CodePreview';\nimport { resolveLanguage } from './ext-language';\n\nexport function FileContentPreview({\n file,\n previewInfo,\n status,\n pendingRemote,\n t,\n}: {\n file: CBFile;\n previewInfo: PreviewFileInfo | null;\n status: 'idle' | 'loading' | 'ready';\n pendingRemote?: boolean;\n t: (key: string) => string;\n}) {\n if (status === 'loading' || pendingRemote) {\n return <div className=\"cb-preview-note\">{t('contentBrowser.preview.loadingSource')}</div>;\n }\n\n if (previewInfo && (isBrowserMediaPreviewKind(previewInfo.kind) || isFontPreviewInfo(previewInfo))) {\n return <MediaPreview info={previewInfo} fileName={file.name} t={t} />;\n }\n if (previewInfo?.kind === 'model' || familySuggestsEnginePreview(file.family)) {\n return <div className=\"cb-preview-note\">{t('contentBrowser.preview.previewEngineRequired')}</div>;\n }\n if (!previewInfo && familySuggestsMediaPreview(file.family)) {\n return <div className=\"cb-preview-note\">{t('contentBrowser.preview.noMediaPreview')}</div>;\n }\n\n const content = previewInfo?.content ?? file.sourcePreview;\n if (content == null) {\n return <div className=\"cb-preview-note\">{t('contentBrowser.preview.noTextPreview')}</div>;\n }\n const dotIndex = file.name.lastIndexOf('.');\n const ext = dotIndex >= 0 ? file.name.slice(dotIndex + 1).toLowerCase() : '';\n if (resolveLanguage(ext)) {\n return (\n <CodePreview\n name={file.name}\n ext={ext}\n size={previewInfo?.size ?? file.estimatedSize ?? 0}\n content={content}\n />\n );\n }\n return (\n <pre className=\"cb-preview-source\">\n <code>{content}</code>\n </pre>\n );\n}\n", "import { useEffect, useRef, useState, type PointerEvent } from 'react';\n\nexport function useLocalSize(\n key: string,\n initial: number,\n min: number,\n max: number,\n): readonly [number, (next: number | ((prev: number) => number)) => void] {\n const clamp = (value: number) => Math.min(max, Math.max(min, value));\n const [value, setValueRaw] = useState<number>(() => {\n if (typeof window === 'undefined') return initial;\n try {\n const raw = window.localStorage.getItem(key);\n if (!raw) return initial;\n const parsed = Number(raw);\n return Number.isFinite(parsed) ? clamp(parsed) : initial;\n } catch {\n return initial;\n }\n });\n useEffect(() => {\n try {\n window.localStorage.setItem(key, String(value));\n } catch {\n /* ignore quota / privacy mode */\n }\n }, [key, value]);\n const setValue = (next: number | ((prev: number) => number)) => {\n setValueRaw((prev) => clamp(typeof next === 'function' ? next(prev) : next));\n };\n return [value, setValue] as const;\n}\n\nexport function ResizeHandle({\n onDrag,\n onDragEnd,\n title,\n}: {\n onDrag: (delta: number) => void;\n onDragEnd?: () => void;\n title?: string;\n}) {\n const startRef = useRef<number | null>(null);\n const onPointerDown = (event: PointerEvent<HTMLDivElement>) => {\n event.preventDefault();\n event.currentTarget.setPointerCapture(event.pointerId);\n startRef.current = event.clientX;\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n };\n const onPointerMove = (event: PointerEvent<HTMLDivElement>) => {\n if (startRef.current == null) return;\n const delta = event.clientX - startRef.current;\n startRef.current = event.clientX;\n onDrag(delta);\n };\n const finish = (event: PointerEvent<HTMLDivElement>) => {\n if (startRef.current == null) return;\n startRef.current = null;\n try {\n event.currentTarget.releasePointerCapture(event.pointerId);\n } catch {\n /* already released */\n }\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n onDragEnd?.();\n };\n return (\n <div\n className=\"cb-resize-handle\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={finish}\n onPointerCancel={finish}\n title={title}\n role=\"separator\"\n aria-orientation=\"vertical\"\n />\n );\n}\n", "import { Button, EmptyState, PropertyRow, Toolbar } from '@forgeax/view-components';\nimport type { ViewWorkspaceClient } from '@forgeax/view-workspace-core/client';\nimport { createWorkspaceStateReader } from '@forgeax/view-workspace-core/workspace-state';\nimport { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';\nimport { type RuntimeParameter as Parameter, parameterDrafts, parameterValues, runtimePackTarget } from './runtime-packs.ts';\nimport './runtime-packs.css';\n\ntype Instance = { schemaVersion: '3.0.0'; packageId: string; parent: string; values?: Record<string, unknown> };\ntype Execution = { instance: Instance; status: string; lastKnownGood?: { generation: number }; error?: unknown };\ntype Pack = { source: { packageId: string; source?: string; kind?: string; parameters?: Parameter[] } };\ntype Inspection = { packs: Pack[]; executions: Execution[] };\ntype Installation = { uid: number; state: string };\ntype Asset = { guid: string; kind: string; name?: string; sourceKey?: string };\n\nexport function RuntimePacksPanel({ client }: { client: ViewWorkspaceClient }) {\n const reader = useMemo(() => createWorkspaceStateReader(client), [client]);\n const workspace = useSyncExternalStore(reader.subscribe, reader.getSnapshot, reader.getSnapshot);\n const target = runtimePackTarget(workspace);\n const key = target ? `${target.projectId}/${target.targetId}/${target.worldId}` : '';\n // A replacement project gets fresh drafts and cancels all old requests.\n return target ? <BoundRuntimePacks key={key} client={client} target={target} /> :\n <EmptyState title=\"Runtime content unavailable\" description=\"Wait for the project target to be ready.\" />;\n}\n\nfunction BoundRuntimePacks({ client, target }: { client: ViewWorkspaceClient; target: { projectId: string; targetId: string; worldId: string } }) {\n const [inspection, setInspection] = useState<Inspection>({ packs: [], executions: [] });\n const [plugins, setPlugins] = useState<Installation[]>([]);\n const [assets, setAssets] = useState<Asset[]>([]);\n const [selected, setSelected] = useState('');\n const [instanceId, setInstanceId] = useState('');\n const [drafts, setDrafts] = useState<Record<string, string>>({});\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState('');\n const lifetime = useRef<AbortController | null>(null);\n const upload = useRef<HTMLInputElement>(null);\n const generators = inspection.packs.filter(pack => pack.source.kind === 'scriptable-pack-source');\n const generator = generators.find(pack => pack.source.packageId === selected);\n const parameters = generator?.source.parameters ?? [];\n const executions = inspection.executions.filter(item => item.instance.parent === selected && item.status !== 'withdrawn');\n const execution = executions.find(item => item.instance.packageId === instanceId);\n const call = useCallback((operation: string, args = {}) => client.call(`runtime-pack.${operation}`, { ...args, ...target }, { signal: lifetime.current?.signal }), [client, target.projectId, target.targetId, target.worldId]);\n const refresh = useCallback(async (signal = lifetime.current?.signal) => {\n const [contents, installed, listed] = await Promise.all([\n client.call('runtime-pack.inspect', target, { signal }),\n client.call('runtime-pack.plugin-inspect', target, { signal }),\n client.listAssets(target.projectId, { signal }),\n ]);\n if (signal?.aborted) return;\n setInspection(contents as Inspection);\n setPlugins((installed as { plugins: Installation[] }).plugins);\n setAssets((listed as { assets: Asset[] }).assets);\n }, [client, target.projectId, target.targetId, target.worldId]);\n useEffect(() => {\n const controller = new AbortController();\n lifetime.current = controller;\n setBusy(true);\n void refresh(controller.signal).catch(cause => { if (!controller.signal.aborted) setError(String(cause)); })\n .finally(() => { if (!controller.signal.aborted) setBusy(false); });\n return () => controller.abort();\n }, [refresh]);\n async function act(operation: () => Promise<unknown>) {\n if (busy || lifetime.current?.signal.aborted) return;\n setBusy(true);\n setError('');\n const signal = lifetime.current?.signal;\n let operationFailed = false;\n try { await operation(); }\n catch (cause) { operationFailed = true; if (!signal?.aborted) setError(String(cause)); }\n finally {\n if (!signal?.aborted) {\n try { await refresh(signal); } catch (cause) { if (!signal?.aborted && !operationFailed) setError(String(cause)); }\n if (!signal?.aborted) setBusy(false);\n }\n }\n }\n function choose(parent: string, id = '') {\n const pack = generators.find(item => item.source.packageId === parent);\n const item = inspection.executions.find(item => item.instance.packageId === id);\n setSelected(parent); setInstanceId(id);\n setDrafts(parameterDrafts(pack?.source.parameters ?? [], item?.instance.values));\n }\n async function save() {\n const snapshot = await call('snapshot');\n if (lifetime.current?.signal.aborted) return;\n const url = URL.createObjectURL(new Blob([JSON.stringify(snapshot)], { type: 'application/json' }));\n try {\n const link = document.createElement('a');\n link.href = url; link.download = `${target.projectId}-runtime-content.json`; link.click();\n } finally { URL.revokeObjectURL(url); }\n }\n return <section className=\"cb-runtime\" aria-label=\"Runtime content\" data-testid=\"runtime-content\">\n <Toolbar>\n <strong>Runtime content</strong>\n <Button size=\"compact\" disabled={busy} onClick={() => void act(async () => {})}>Refresh</Button>\n <Button size=\"compact\" disabled={busy} onClick={() => upload.current?.click()}>Import content</Button>\n <Button size=\"compact\" disabled={busy} onClick={() => void act(save)}>Save content</Button>\n <input ref={upload} type=\"file\" accept=\".json,application/json\" hidden onChange={event => {\n const file = event.target.files?.[0]; event.target.value = '';\n if (file) void act(async () => {\n const value = JSON.parse(await file.text());\n return value.schemaVersion === 'runtime-pack-source/2' ? call('restore', { snapshot: value }) : call('admit', { content: value });\n });\n }} />\n </Toolbar>\n {error ? <p role=\"alert\">{error}</p> : null}\n {busy ? <p role=\"status\">Waiting for Engine...</p> : null}\n <details><summary>Admitted packs ({inspection.packs.length})</summary>\n {inspection.packs.map(pack => <PropertyRow key={pack.source.packageId} label={pack.source.source ?? pack.source.packageId}>\n <Button size=\"compact\" disabled={busy} onClick={() => void act(() => call('withdraw', { packageId: pack.source.packageId }))}>Withdraw pack</Button>\n </PropertyRow>)}\n </details>\n <div className=\"cb-runtime-columns\">\n <fieldset disabled={busy}>\n <legend>Generate assets</legend>\n <PropertyRow label=\"Generator\"><select aria-label=\"Generator\" value={selected} onChange={event => choose(event.target.value)}>\n <option value=\"\">Choose a generator</option>\n {generators.map(pack => <option key={pack.source.packageId} value={pack.source.packageId}>{pack.source.source ?? pack.source.packageId}</option>)}\n </select></PropertyRow>\n {generator ? <>\n <PropertyRow label=\"Instance\"><select aria-label=\"Instance\" value={instanceId} onChange={event => choose(selected, event.target.value)}>\n <option value=\"\">New instance</option>\n {executions.map(item => <option key={item.instance.packageId} value={item.instance.packageId}>{item.instance.packageId}</option>)}\n </select></PropertyRow>\n {parameters.map(parameter => <PropertyRow key={parameter.name} label={parameter.name}>\n {parameter.type === 'bool' || parameter.type === 'enum' ?\n <select aria-label={parameter.name} value={drafts[parameter.name] ?? ''} onChange={event => setDrafts({ ...drafts, [parameter.name]: event.target.value })}>\n {(parameter.type === 'bool' ? [true, false] : parameter.values ?? []).map(value => <option key={String(value)} value={String(value)}>{String(value)}</option>)}\n </select> : <input aria-label={parameter.name} value={drafts[parameter.name] ?? ''} onChange={event => setDrafts({ ...drafts, [parameter.name]: event.target.value })} />}\n </PropertyRow>)}\n <Button size=\"compact\" onClick={() => void act(async () => {\n const id = instanceId || crypto.randomUUID();\n const instance: Instance = { schemaVersion: '3.0.0', packageId: id, parent: selected, values: parameterValues(parameters, drafts) };\n setInstanceId(id);\n await call('generate', { instance });\n })}>Generate</Button>\n {execution ? <p role=\"status\">{execution.status}{execution.lastKnownGood ? ` \u00B7 Published generation ${execution.lastKnownGood.generation}` : ''}{execution.status !== 'current' && execution.lastKnownGood ? ' \u00B7 Previous successful result' : ''}</p> : null}\n {execution?.error ? <pre>{JSON.stringify(execution.error, null, 2)}</pre> : null}\n {instanceId ? <Button size=\"compact\" onClick={() => void act(async () => { await call('withdraw', { packageId: instanceId }); choose(selected); })}>Withdraw instance</Button> : null}\n </> : <p>{generators.length ? 'Select an admitted definition to edit parameters.' : 'No runtime generators have been admitted.'}</p>}\n </fieldset>\n <fieldset disabled={busy}>\n <legend>Plugin assets</legend>\n {assets.filter(asset => asset.kind === 'plugin').map(asset => <PropertyRow key={asset.guid} label={asset.name ?? asset.sourceKey ?? asset.guid}>\n <Button size=\"compact\" onClick={() => void act(() => call('plugin-install', { guid: asset.guid }))}>Install</Button>\n </PropertyRow>)}\n <p>Installations owned by this View connection</p>\n {plugins.length ? plugins.map(plugin => <PropertyRow key={plugin.uid} label={`#${plugin.uid} \u00B7 ${plugin.state}`}>\n <Button size=\"compact\" onClick={() => void act(() => call('plugin-dispose', { uid: plugin.uid }))}>Dispose</Button>\n </PropertyRow>) : <p>No installations.</p>}\n <p>Generated outputs appear in the asset browser below. Open an output for its dedicated preview.</p>\n </fieldset>\n </div>\n </section>;\n}\n", "import type { WorkspaceState } from '@forgeax/view-workspace-core/contract';\nexport type RuntimeParameter = { name: string; type: string; default: unknown; minimum?: number; maximum?: number; values?: (string | number | boolean)[] };\n/** UI drafts only; Engine validates parameters and owns all execution state. */\nexport function parameterDrafts(parameters: readonly RuntimeParameter[], values: Record<string, unknown> = {}): Record<string, string> {\n return Object.fromEntries(parameters.map(parameter => {\n const value = values[parameter.name] ?? parameter.default;\n return [parameter.name, typeof value === 'string' ? value : JSON.stringify(value) ?? ''];\n }));\n}\n\nexport function parameterValues(parameters: readonly RuntimeParameter[], drafts: Record<string, string>): Record<string, unknown> {\n return Object.fromEntries(parameters.map(parameter => {\n const text = drafts[parameter.name];\n if (['string', 'asset-guid'].includes(parameter.type)) return [parameter.name, text];\n if (parameter.type === 'enum') {\n const value = parameter.values?.find(value => String(value) === text);\n if (value === undefined) throw new TypeError(`Choose a value for ${parameter.name}`);\n return [parameter.name, value];\n }\n if (typeof text !== 'string' || !text.trim()) throw new TypeError(`Enter ${parameter.name}`);\n return [parameter.name, JSON.parse(text)];\n }));\n}\n\n/** Bind to the project App, never the selected preview or independent AI run. */\nexport function runtimePackTarget(workspace: WorkspaceState | null | undefined) {\n const target = workspace?.projectTarget;\n if (!workspace?.project?.id || !target?.targetId || !target?.worldId || target.worldId.startsWith('pending:')) return undefined;\n return { projectId: workspace.project.id, targetId: target.targetId, worldId: target.worldId };\n}\n", "\n const css = \"/* packages/view-plugin-content-browser/src/ui/runtime-packs.css */\\n.cb-runtime {\\n flex: 0 0 auto;\\n max-height: 60%;\\n overflow: auto;\\n padding: 12px;\\n border-bottom: 1px solid var(--fx-color-border-subtle);\\n}\\n.cb-runtime-columns {\\n display: grid;\\n grid-template-columns: repeat(2, minmax(0, 1fr));\\n gap: 16px;\\n}\\n.cb-runtime fieldset {\\n min-width: 0;\\n margin: 8px 0;\\n padding: 12px;\\n border: 1px solid var(--fx-color-border-subtle);\\n}\\n.cb-runtime select,\\n.cb-runtime input {\\n box-sizing: border-box;\\n width: 100%;\\n padding: 4px 6px;\\n color: inherit;\\n background: var(--fx-color-surface-inset);\\n border: 1px solid var(--fx-color-border-subtle);\\n}\\n.cb-runtime pre {\\n max-height: 100px;\\n overflow: auto;\\n white-space: pre-wrap;\\n}\\n.cb-runtime [role=alert] {\\n color: var(--fx-color-status-error-fg);\\n}\\n@media (max-width: 640px) {\\n .cb-runtime-columns {\\n grid-template-columns: minmax(0, 1fr);\\n }\\n}\\n\";\n if (typeof document !== 'undefined' && !document.querySelector('style[data-forgeax-css=\"4965ef01ecbfe4d4e11b539b0fbb50c454a5bf50e12bb5cd1916ae6e073f851d\"]')) {\n const style = document.createElement('style');\n style.dataset.forgeaxCss = \"4965ef01ecbfe4d4e11b539b0fbb50c454a5bf50e12bb5cd1916ae6e073f851d\";\n style.textContent = css;\n document.head.append(style);\n }\n export default css;\n ", "import { fileFamilyOfWithAssets, isResourceGroup } from './format';\nimport type { CBAsset, CBFile, CBFolder } from './types';\n\nexport interface CatalogAsset {\n guid: string;\n kind: string;\n name?: string;\n label?: string;\n sourceKey?: string | number;\n sourcePath?: string;\n path?: string;\n}\n\n/** Presentation of the Engine catalog, not a filesystem inventory. */\nexport function projectCatalog(root: string, assets: readonly CatalogAsset[]) {\n const files = new Map<string, CBFile>();\n const prefix = `${root.replaceAll('\\\\', '/').replace(/\\/$/, '')}/`;\n for (const asset of assets) {\n const source = (asset.sourcePath ?? asset.path ?? asset.guid).replaceAll('\\\\', '/');\n const relative = source.startsWith(prefix) ? source.slice(prefix.length) : source;\n const external = relative.startsWith('/') || /^[a-z]:\\//i.test(relative) || relative.split('/').includes('..');\n // External catalog sources are a presentation group, never project navigation segments.\n const path = external ? `External assets/${encodeURIComponent(source)}` : relative.replace(/^\\.\\//, '');\n let file = files.get(path);\n if (!file) {\n file = { type: 'file', path, diskPath: source, name: source.split('/').at(-1)!,\n family: 'pack', assets: [], isAssetPackage: false, kindLabel: '' };\n files.set(path, file);\n }\n const item: CBAsset = { type: 'asset', guid: asset.guid, kind: asset.kind,\n name: String((source.toLowerCase().endsWith('.pack.ts') ? asset.sourceKey : undefined)\n ?? asset.name ?? asset.label ?? asset.guid), packPath: path };\n file.assets.push(item);\n file.family = fileFamilyOfWithAssets(file.name, file.assets);\n file.isAssetPackage = isResourceGroup(file.assets.length);\n }\n const folders = new Map<string, CBFolder>();\n for (const file of files.values()) {\n const parts = file.path.split('/').filter(Boolean).slice(0, -1);\n for (let index = 0; index < parts.length; index++) {\n const path = parts.slice(0, index + 1).join('/');\n if (!folders.has(path)) folders.set(path, { type: 'folder', path, name: parts[index]!, childCount: 0 });\n }\n }\n for (const folder of folders.values()) {\n folder.childCount = [...folders.values(), ...files.values()].filter((item) =>\n item.path.slice(0, item.path.lastIndexOf('/')) === folder.path).length;\n }\n return { files: [...files.values()], folders: [...folders.values()] };\n}\n\nexport function visibleCatalogFolders(folders: readonly CBFolder[], collapsed: ReadonlySet<string>) {\n return folders.filter((folder) => {\n const parts = folder.path.split('/');\n return parts.every((_, index) => index === 0 || !collapsed.has(parts.slice(0, index).join('/')));\n }).sort((left, right) => {\n const a = left.path.split('/');\n const b = right.path.split('/');\n for (let index = 0; index < Math.min(a.length, b.length); index++) {\n const order = a[index]!.localeCompare(b[index]!);\n if (order !== 0) return order;\n }\n return a.length - b.length;\n });\n}\n", "\n const css = \"/* packages/view-plugin-content-browser/src/ui/content-browser.css */\\n.cb-root {\\n --cb-layout-min-width: calc(var(--fx-component-panel-chat-min-width) + var(--fx-ref-space-48) + var(--fx-ref-space-32));\\n --cb-source-width: calc(var(--fx-component-panel-config-min-width) - var(--fx-ref-space-48));\\n --cb-source-min-width: calc(var(--fx-ref-space-48) * 2 + var(--fx-ref-space-32) + var(--fx-ref-space-12));\\n --cb-resize-width: var(--fx-ref-space-6);\\n --cb-resize-offset: calc(-1 * var(--fx-ref-space-2));\\n --cb-grid-min-width: calc(var(--fx-ref-space-48) * 2 + var(--fx-ref-space-24));\\n --cb-grid-min-height: calc(var(--fx-ref-space-48) * 2 + var(--fx-ref-space-32) + var(--fx-ref-space-12));\\n --cb-thumb-default: calc(var(--fx-ref-space-48) + var(--fx-ref-space-32) + var(--fx-ref-space-8));\\n --cb-import-pop-left: calc(var(--fx-component-navigation-rail-width) + var(--fx-ref-space-12));\\n --cb-card-line: 13px;\\n --cb-folder-icon: #c9a86a;\\n --cb-group-stack: 6px;\\n position: relative;\\n display: flex;\\n flex-direction: column;\\n width: 100%;\\n height: 100%;\\n min-width: var(--cb-layout-min-width);\\n min-height: 0;\\n overflow: hidden;\\n background: var(--fx-color-surface-canvas);\\n color: var(--fx-color-text-secondary);\\n font: var(--fx-type-compact-font-weight) var(--fx-type-compact-font-size)/var(--fx-type-compact-line-height) var(--fx-type-compact-font-family);\\n user-select: none;\\n}\\n.cb-root * {\\n box-sizing: border-box;\\n}\\n.cb-root :where(input, textarea, .cb-address, .cb-address-input, .cb-preview-source, .cb-preview-code-plain, .cb-preview-code-shiki) {\\n user-select: text;\\n}\\n.cb-root button,\\n.cb-root input {\\n font: inherit;\\n}\\n.cb-split {\\n display: flex;\\n flex: 1;\\n min-height: 0;\\n overflow: hidden;\\n}\\n.cb-source-panel {\\n flex: 0 0 var(--cb-src-w, var(--cb-source-width));\\n width: var(--cb-src-w, var(--cb-source-width));\\n min-width: var(--cb-source-min-width);\\n overflow: auto;\\n background: var(--fx-color-surface-sidebar);\\n}\\n.cb-resize-handle {\\n position: relative;\\n z-index: var(--fx-layer-sticky);\\n flex: 0 0 var(--cb-resize-width);\\n width: var(--cb-resize-width);\\n margin: 0 var(--cb-resize-offset);\\n cursor: col-resize;\\n}\\n.cb-resize-handle::after {\\n content: \\\"\\\";\\n position: absolute;\\n inset: 0 auto 0 50%;\\n width: var(--fx-border-width);\\n background: var(--fx-color-border-subtle);\\n}\\n.cb-resize-handle:hover::after {\\n background: var(--fx-color-border-focus);\\n}\\n.cb-source-tree {\\n min-width: 0;\\n padding: var(--fx-ref-space-4) 0;\\n}\\n.cb-source-group + .cb-source-group {\\n margin-top: var(--fx-ref-space-2);\\n}\\n.cb-source-group-head,\\n.cb-source-row {\\n appearance: none;\\n display: flex;\\n align-items: center;\\n width: 100%;\\n min-width: 0;\\n border: var(--fx-border-width) solid transparent;\\n text-align: left;\\n cursor: pointer;\\n}\\n.cb-source-group-head {\\n gap: var(--fx-ref-space-4);\\n padding: var(--fx-ref-space-4) var(--fx-ref-space-8);\\n background: var(--fx-color-surface-raised);\\n color: var(--fx-color-text-secondary);\\n font-weight: var(--fx-ref-font-weight-600);\\n}\\n.cb-source-group-head:hover,\\n.cb-source-row:hover {\\n background: var(--fx-color-surface-hover);\\n color: var(--fx-color-text-primary);\\n}\\n.cb-source-group-head.collapsed .cb-source-chev,\\n.cb-source-chev.collapsed {\\n transform: rotate(-90deg);\\n}\\n.cb-source-group-icon {\\n flex: 0 0 auto;\\n color: var(--fx-color-text-muted);\\n}\\n.cb-source-group-head .cb-folder-icon {\\n color: var(--cb-folder-icon);\\n}\\n.cb-source-group-name,\\n.cb-source-name {\\n min-width: 0;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.cb-source-group-body {\\n padding: var(--fx-ref-space-2) 0 var(--fx-ref-space-4);\\n}\\n.cb-source-empty {\\n padding: var(--fx-ref-space-4) var(--fx-ref-space-12) var(--fx-ref-space-4) var(--fx-ref-space-16);\\n color: var(--fx-color-text-muted);\\n font-size: var(--fx-type-caption-font-size);\\n font-style: italic;\\n}\\n.cb-source-row {\\n gap: var(--fx-ref-space-4);\\n min-height: var(--fx-component-editor-row-height);\\n padding-top: var(--fx-ref-space-4);\\n padding-right: var(--fx-ref-space-12);\\n padding-bottom: var(--fx-ref-space-4);\\n background: transparent;\\n color: var(--fx-color-text-secondary);\\n}\\n.cb-source-row.is-path:not(.is-sel) {\\n background: color-mix(in srgb, var(--fx-color-surface-hover) 55%, transparent);\\n color: var(--fx-color-text-primary);\\n}\\n.cb-source-group-head.is-sel,\\n.cb-source-row.is-sel {\\n background: var(--fx-color-selection-bg);\\n color: var(--fx-color-selection-fg);\\n box-shadow: inset var(--fx-border-focus-width) 0 0 var(--fx-color-selection-indicator);\\n}\\n.cb-source-row:focus-visible,\\n.cb-source-group-head:focus-visible {\\n outline: var(--fx-border-focus-width) solid var(--fx-color-border-focus);\\n outline-offset: calc(-1 * var(--fx-border-focus-width));\\n}\\n.cb-source-chev {\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n width: var(--fx-component-choice-size);\\n height: var(--fx-component-choice-size);\\n flex: 0 0 var(--fx-component-choice-size);\\n color: var(--fx-color-text-muted);\\n transition: transform var(--fx-motion-hover) var(--fx-motion-ease);\\n}\\n.cb-source-chev.hidden {\\n visibility: hidden;\\n}\\n.cb-source-icon {\\n display: inline-flex;\\n flex: 0 0 var(--fx-component-choice-size);\\n color: var(--cb-folder-icon);\\n}\\n.cb-source-name {\\n flex: 1;\\n}\\n.cb-source-fav-row {\\n display: flex;\\n align-items: stretch;\\n width: 100%;\\n min-width: 0;\\n}\\n.cb-source-fav-row .cb-source-row {\\n flex: 1;\\n width: auto;\\n min-width: 0;\\n padding-right: var(--fx-ref-space-4);\\n background: transparent;\\n box-shadow: none;\\n}\\n.cb-source-fav-row .cb-source-row:hover {\\n background: transparent;\\n}\\n.cb-source-fav-row:hover {\\n background: var(--fx-color-surface-hover);\\n color: var(--fx-color-text-primary);\\n}\\n.cb-source-fav-row.is-path:not(.is-sel) {\\n background: color-mix(in srgb, var(--fx-color-surface-hover) 55%, transparent);\\n color: var(--fx-color-text-primary);\\n}\\n.cb-source-fav-row.is-sel {\\n background: var(--fx-color-selection-bg);\\n color: var(--fx-color-selection-fg);\\n box-shadow: inset var(--fx-border-focus-width) 0 0 var(--fx-color-selection-indicator);\\n}\\n.cb-source-unfav {\\n appearance: none;\\n flex: 0 0 auto;\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n width: var(--fx-component-control-icon-hit-area-min);\\n padding: 0;\\n border: 0;\\n background: transparent;\\n color: var(--fx-color-status-warning-fg);\\n cursor: pointer;\\n}\\n.cb-source-unfav:hover {\\n color: var(--fx-color-text-primary);\\n}\\n.cb-asset-view {\\n position: relative;\\n display: flex;\\n flex: 1;\\n flex-direction: column;\\n min-width: 0;\\n min-height: 0;\\n overflow: hidden;\\n}\\n.cb-toolbar {\\n position: relative;\\n flex: 0 0 var(--fx-component-panel-header-height);\\n gap: var(--fx-ref-space-6);\\n min-width: 0;\\n padding: 0 var(--fx-ref-space-8);\\n}\\n.cb-toolbar > .fx-panel-header__slot:nth-child(2) {\\n flex: 1 1 auto;\\n}\\n.cb-toolbar-group {\\n flex: 0 0 auto;\\n}\\n.cb-navigation-bar {\\n flex: 1 1 auto;\\n min-width: calc(var(--fx-ref-space-48) + var(--fx-ref-space-32));\\n overflow: hidden;\\n}\\n.cb-address-slot {\\n display: flex;\\n flex: 1 1 auto;\\n align-items: center;\\n min-width: var(--fx-ref-space-32);\\n height: var(--fx-component-control-height-compact);\\n}\\n.cb-address,\\n.cb-address-input {\\n width: 100%;\\n height: var(--fx-component-control-height-compact);\\n min-width: 0;\\n box-sizing: border-box;\\n border: var(--fx-border-width) solid var(--fx-color-border-control);\\n border-radius: var(--fx-radius-control);\\n background: var(--fx-color-surface-inset);\\n color: var(--fx-color-text-secondary);\\n}\\n.cb-address {\\n display: flex;\\n align-items: center;\\n padding: 0 var(--fx-ref-space-8);\\n overflow: hidden;\\n cursor: text;\\n}\\n.cb-address-crumb {\\n display: flex;\\n flex: 0 1 auto;\\n align-items: center;\\n min-width: 0;\\n overflow: hidden;\\n}\\n.cb-root .cb-address:focus-visible,\\n.cb-root .cb-address-input:focus,\\n.cb-root .cb-address-input:focus-visible {\\n outline: none;\\n border-color: var(--fx-color-border-essential);\\n}\\n.cb-address-input {\\n margin: 0;\\n padding: 0 var(--fx-ref-space-8);\\n font: inherit;\\n color: var(--fx-color-text-primary);\\n appearance: none;\\n outline: none;\\n}\\n.cb-address-input::placeholder {\\n color: var(--fx-color-text-muted);\\n}\\n.cb-crumb-segment {\\n display: inline-flex;\\n align-items: center;\\n min-width: 0;\\n color: var(--fx-color-text-muted);\\n}\\n.cb-crumb-item {\\n min-width: 0;\\n padding: var(--fx-ref-space-2) var(--fx-ref-space-4);\\n border: 0;\\n border-radius: var(--fx-ref-radius-4);\\n background: transparent;\\n color: var(--fx-color-text-muted);\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n cursor: pointer;\\n}\\n.cb-crumb-item:hover {\\n background: var(--fx-color-surface-hover);\\n color: var(--fx-color-text-primary);\\n}\\n.cb-crumb-current {\\n color: var(--fx-color-text-primary);\\n font-weight: var(--fx-ref-font-weight-600);\\n}\\n.cb-crumb-chevron {\\n display: inline-flex;\\n align-items: center;\\n flex-shrink: 0;\\n color: var(--fx-color-text-muted);\\n}\\n.cb-crumb-chevron-btn {\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n width: var(--fx-ref-space-16);\\n height: var(--fx-component-control-height-compact);\\n padding: 0;\\n border: 0;\\n border-radius: var(--fx-ref-radius-4);\\n background: transparent;\\n color: var(--fx-color-text-muted);\\n cursor: pointer;\\n appearance: none;\\n}\\n.cb-crumb-chevron-btn > svg {\\n transition: transform 0.12s ease;\\n}\\n.cb-crumb-chevron-btn:hover {\\n background: var(--fx-color-surface-hover);\\n color: var(--fx-color-text-primary);\\n}\\n.cb-crumb-chevron-btn[aria-expanded=true] {\\n color: var(--fx-color-text-primary);\\n}\\n.cb-crumb-chevron-btn[aria-expanded=true] > svg {\\n transform: rotate(90deg);\\n}\\n.cb-crumb-chevron .fx-menu-dropdown__anchor {\\n display: inline-flex;\\n}\\n.cb-crumb-menu .fx-menu {\\n max-height: 320px;\\n overflow-y: auto;\\n}\\n.cb-crumb-menu .fx-menu__item[data-active] {\\n color: var(--fx-color-text-primary);\\n font-weight: var(--fx-ref-font-weight-600);\\n}\\n.cb-content-body {\\n display: flex;\\n flex: 1;\\n min-width: 0;\\n min-height: 0;\\n overflow: hidden;\\n}\\n.cb-grid-column {\\n display: flex;\\n flex: 1;\\n flex-direction: column;\\n min-width: 0;\\n min-height: var(--cb-grid-min-height);\\n overflow: hidden;\\n}\\n.cb-filter-bar {\\n position: relative;\\n flex: 0 0 var(--fx-component-panel-header-height);\\n gap: var(--fx-ref-space-6);\\n padding: var(--fx-ref-space-6) var(--fx-ref-space-8);\\n border-bottom: var(--fx-border-width) solid var(--fx-color-border-subtle);\\n}\\n.cb-filter-bar .is-active {\\n color: var(--fx-color-brand-text);\\n background: var(--fx-color-brand-soft);\\n}\\n.cb-search-box {\\n flex: 0 0 auto;\\n width: var(--fx-component-menu-min-width);\\n max-width: 100%;\\n}\\n.cb-search-box .fx-input {\\n height: var(--fx-component-control-height-compact);\\n}\\n.cb-pop {\\n position: absolute;\\n z-index: var(--fx-layer-popover);\\n}\\n.cb-pop-create {\\n top: var(--fx-component-panel-header-height);\\n left: var(--fx-ref-space-8);\\n}\\n.cb-pop-import {\\n top: var(--fx-component-panel-header-height);\\n left: var(--cb-import-pop-left);\\n}\\n.cb-settings-menu {\\n min-width: var(--fx-component-menu-min-width);\\n padding: var(--fx-ref-space-6);\\n border: var(--fx-border-width) solid var(--fx-color-border-default);\\n border-radius: var(--fx-radius-popover);\\n background: var(--fx-color-surface-raised);\\n color: var(--fx-color-text-primary);\\n box-shadow: var(--fx-shadow-floating);\\n}\\n.cb-settings-menu > strong {\\n display: block;\\n padding: var(--fx-ref-space-6) var(--fx-ref-space-8);\\n color: var(--fx-color-text-muted);\\n font-size: var(--fx-type-caption-font-size);\\n}\\n.cb-menu-title {\\n display: inline-flex;\\n align-items: center;\\n gap: var(--fx-ref-space-6);\\n}\\n.cb-menu-icon-placeholder {\\n width: var(--fx-component-control-icon-size);\\n}\\n.cb-layout-switch {\\n padding: var(--fx-ref-space-2) var(--fx-ref-space-8) var(--fx-ref-space-6);\\n}\\n.cb-settings-row {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n gap: var(--fx-ref-space-12);\\n padding: var(--fx-ref-space-8);\\n}\\n.cb-settings-label {\\n color: var(--fx-color-text-secondary);\\n white-space: nowrap;\\n}\\n.cb-settings-range {\\n flex: 0 0 auto;\\n}\\n.cb-settings-switch-row {\\n margin: 0 var(--fx-ref-space-2);\\n}\\n.cb-grid-view {\\n position: relative;\\n flex: 1;\\n min-width: 0;\\n min-height: 0;\\n overflow-x: hidden;\\n overflow-y: auto;\\n}\\n.cb-fe-grid {\\n display: grid;\\n width: 100%;\\n max-width: 100%;\\n min-width: 0;\\n grid-template-columns: repeat(auto-fill, minmax(0, var(--cb-thumb, 88px)));\\n grid-auto-rows: max-content;\\n align-content: start;\\n justify-content: start;\\n gap: calc(var(--fx-ref-space-8) + var(--cb-group-stack));\\n padding: var(--fx-ref-space-12);\\n overflow-x: hidden;\\n}\\n.cb-grid-item {\\n position: relative;\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n width: 100%;\\n max-width: 100%;\\n min-width: 0;\\n overflow: hidden;\\n padding: var(--fx-ref-space-4);\\n border: var(--fx-border-width) solid transparent;\\n border-radius: var(--fx-radius-control);\\n background: var(--fx-color-surface-raised);\\n color: var(--fx-color-text-secondary);\\n cursor: pointer;\\n}\\n.cb-grid-folder {\\n background: transparent;\\n}\\n.cb-grid-item:hover {\\n background: var(--fx-color-surface-hover);\\n}\\n.cb-grid-item.sel {\\n border-color: var(--fx-color-selection-indicator);\\n background: var(--fx-color-selection-bg);\\n box-shadow: 0 0 0 var(--fx-border-width) var(--fx-color-selection-indicator);\\n}\\n.cb-grid-item:focus-visible {\\n outline: var(--fx-border-focus-width) solid var(--fx-color-border-focus);\\n outline-offset: var(--fx-border-focus-offset);\\n}\\n.cb-grid-item.is-busy,\\n.cb-details-row.is-busy {\\n cursor: progress;\\n}\\n.cb-item-busy-veil {\\n position: absolute;\\n inset: 0;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n background: color-mix(in srgb, var(--fx-color-surface-raised) 55%, transparent);\\n pointer-events: none;\\n}\\n.cb-item-busy-veil .fx-spinner,\\n.cb-item-busy-inline {\\n width: 14px;\\n height: 14px;\\n flex: 0 0 14px;\\n}\\n.cb-grid-view.cb-layout-list .cb-item-busy-inline {\\n margin-left: auto;\\n}\\n.cb-grid-thumb {\\n position: relative;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 100%;\\n aspect-ratio: 1;\\n overflow: hidden;\\n border-radius: var(--fx-radius-control);\\n background: var(--fx-color-surface-inset);\\n}\\n.cb-grid-icon {\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n width: 100%;\\n height: 100%;\\n color: var(--fx-color-text-muted);\\n}\\n.cb-grid-icon svg {\\n width: 46%;\\n height: 46%;\\n}\\n.cb-folder-icon {\\n color: var(--cb-folder-icon);\\n}\\n.cb-preview-ico.cb-folder-icon,\\n.cb-preview-list-ico.cb-folder-icon,\\n.cb-details-icon.cb-folder-icon,\\n.cb-filter-option-icon.cb-folder-icon {\\n color: var(--cb-folder-icon);\\n}\\n.cb-grid-thumb .cb-folder-icon {\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n width: 100%;\\n height: 100%;\\n}\\n.cb-grid-thumb .cb-folder-icon svg {\\n width: 86%;\\n height: 86%;\\n color: currentColor;\\n}\\n.cb-grid-label {\\n width: 100%;\\n margin-top: var(--fx-ref-space-4);\\n overflow: hidden;\\n text-align: center;\\n}\\n.cb-fe-label {\\n display: flex;\\n flex-direction: column;\\n justify-content: flex-start;\\n width: 100%;\\n flex: 0 0 auto;\\n height: calc(var(--cb-card-line) * 4);\\n overflow: hidden;\\n}\\n.cb-fe-name {\\n display: -webkit-box;\\n margin-top: 0;\\n overflow: hidden;\\n color: var(--fx-color-text-primary);\\n font-size: var(--fx-type-caption-font-size);\\n line-height: var(--cb-card-line);\\n text-align: center;\\n white-space: normal;\\n word-break: normal;\\n overflow-wrap: anywhere;\\n -webkit-box-orient: vertical;\\n -webkit-line-clamp: 4;\\n}\\n.cb-fe-label.has-kind .cb-fe-name {\\n min-height: calc(var(--cb-card-line) * 3);\\n -webkit-line-clamp: 3;\\n}\\n.cb-card-meta,\\n.cb-card-kind {\\n width: 100%;\\n flex: 0 0 auto;\\n margin-top: auto;\\n overflow: hidden;\\n color: var(--fx-color-text-muted);\\n font-size: var(--fx-type-caption-font-size);\\n line-height: var(--cb-card-line);\\n text-align: center;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.cb-fe-grid.cb-layout-list {\\n grid-template-columns: minmax(0, 1fr);\\n grid-auto-rows: auto;\\n gap: var(--fx-ref-space-2);\\n padding: var(--fx-ref-space-4) var(--fx-ref-space-6);\\n overflow-x: hidden;\\n}\\n.cb-grid-view.cb-layout-list .cb-grid-item {\\n flex-direction: row;\\n align-items: center;\\n width: 100%;\\n min-width: 0;\\n min-height: 40px;\\n padding: var(--fx-ref-space-4) var(--fx-ref-space-8);\\n gap: var(--fx-ref-space-8);\\n overflow: hidden;\\n box-shadow: none;\\n}\\n.cb-grid-view.cb-layout-list .cb-grid-item.sel {\\n box-shadow: none;\\n}\\n.cb-grid-view.cb-layout-list .cb-grid-thumb {\\n width: 32px;\\n height: 32px;\\n flex: 0 0 32px;\\n aspect-ratio: auto;\\n overflow: visible;\\n}\\n.cb-grid-view.cb-layout-list .cb-file-thumb {\\n position: static;\\n}\\n.cb-grid-view.cb-layout-list .cb-grid-thumb svg {\\n width: 20px;\\n height: 20px;\\n}\\n.cb-layout-list .cb-fe-label {\\n flex: 1 1 auto;\\n min-width: 0;\\n height: auto;\\n overflow: hidden;\\n flex-direction: row;\\n align-items: center;\\n text-align: left;\\n}\\n.cb-layout-list .cb-fe-name,\\n.cb-layout-list .cb-fe-label.has-kind .cb-fe-name {\\n display: block;\\n flex: 1;\\n min-width: 0;\\n min-height: 0;\\n overflow: hidden;\\n text-align: left;\\n white-space: nowrap;\\n text-overflow: ellipsis;\\n -webkit-line-clamp: unset;\\n}\\n.cb-layout-list .cb-card-meta,\\n.cb-layout-list .cb-card-kind {\\n margin-top: 0;\\n}\\n.cb-layout-list .cb-card-meta {\\n display: none;\\n}\\n.cb-grid-view.cb-layout-list .cb-group-card:not(.cb-pack-expanded),\\n.cb-grid-view.cb-layout-list .cb-group-card.sel:not(.cb-pack-expanded) {\\n box-shadow: none;\\n}\\n.cb-grid-view.cb-layout-list .cb-group-member:not(.sel) {\\n background: transparent;\\n}\\n.cb-grid-view.cb-layout-list .cb-group-member:not(.sel):hover {\\n background: var(--fx-color-surface-hover);\\n}\\n.cb-grid-view.cb-layout-list .cb-group-card,\\n.cb-grid-view.cb-layout-list .cb-pack-expanded {\\n padding-right: calc(var(--fx-ref-space-8) + 44px);\\n}\\n.cb-grid-view.cb-layout-list .cb-group-badge {\\n top: 50%;\\n right: var(--fx-ref-space-8);\\n bottom: auto;\\n transform: translateY(-50%);\\n}\\n.cb-details-view {\\n display: flex;\\n flex: 1;\\n flex-direction: column;\\n min-height: 0;\\n overflow: auto;\\n padding: 0 var(--fx-ref-space-6) var(--fx-ref-space-8);\\n --cb-details-cols: minmax(160px, 1fr) 160px 90px 130px;\\n}\\n.cb-details-header,\\n.cb-details-row {\\n display: grid;\\n grid-template-columns: var(--cb-details-cols);\\n align-items: center;\\n}\\n.cb-details-header {\\n position: sticky;\\n z-index: var(--fx-layer-sticky);\\n top: 0;\\n min-height: var(--fx-component-editor-row-height);\\n border-bottom: var(--fx-border-width) solid var(--fx-color-border-default);\\n background: var(--fx-color-surface-canvas);\\n color: var(--fx-color-text-muted);\\n font-size: var(--fx-type-caption-font-size);\\n}\\n.cb-details-th {\\n display: flex;\\n align-items: center;\\n gap: var(--fx-ref-space-4);\\n height: 100%;\\n padding: var(--fx-ref-space-4) var(--fx-ref-space-8);\\n border: 0;\\n background: transparent;\\n color: inherit;\\n text-align: left;\\n cursor: pointer;\\n}\\n.cb-details-th:hover {\\n color: var(--fx-color-text-primary);\\n}\\n.cb-details-th.active,\\n.cb-details-th[data-active=true] {\\n color: var(--fx-color-brand-text);\\n}\\n.cb-details-sort-arrow {\\n font-size: 9px;\\n}\\n.cb-details-body {\\n display: flex;\\n flex-direction: column;\\n}\\n.cb-details-row {\\n position: relative;\\n width: 100%;\\n border-radius: var(--fx-ref-radius-4);\\n color: var(--fx-color-text-secondary);\\n cursor: pointer;\\n}\\n.cb-details-row:hover {\\n background: var(--fx-color-surface-hover);\\n}\\n.cb-details-row.sel {\\n background: var(--fx-color-selection-bg);\\n box-shadow: inset var(--fx-border-focus-width) 0 0 var(--fx-color-selection-indicator);\\n}\\n.cb-details-row:focus-visible {\\n outline: var(--fx-border-focus-width) solid var(--fx-color-border-focus);\\n outline-offset: -2px;\\n}\\n.cb-details-cell {\\n min-width: 0;\\n padding: var(--fx-ref-space-4) var(--fx-ref-space-8);\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.cb-details-name {\\n display: flex;\\n align-items: center;\\n gap: var(--fx-ref-space-6);\\n}\\n.cb-details-icon {\\n display: inline-flex;\\n width: 16px;\\n height: 16px;\\n flex: 0 0 16px;\\n}\\n.cb-details-icon svg {\\n width: 16px;\\n height: 16px;\\n}\\n.cb-details-type,\\n.cb-details-size,\\n.cb-details-modified {\\n color: var(--fx-color-text-muted);\\n}\\n.cb-empty {\\n grid-column: 1 / -1;\\n color: var(--fx-color-text-muted);\\n}\\n.cb-status {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n flex: 0 0 var(--fx-component-editor-row-height);\\n min-height: var(--fx-component-editor-row-height);\\n padding: var(--fx-ref-space-4) var(--fx-ref-space-8);\\n border-top: var(--fx-border-width) solid var(--fx-color-border-subtle);\\n color: var(--fx-color-text-muted);\\n font-size: var(--fx-type-caption-font-size);\\n}\\n.cb-file-thumb {\\n position: relative;\\n}\\n.cb-group-card:not(.cb-pack-expanded) {\\n box-shadow:\\n 3px 3px 0 0 var(--fx-color-surface-raised),\\n 3px 3px 0 1px var(--fx-color-border-subtle),\\n 6px 6px 0 0 var(--fx-color-surface-raised),\\n 6px 6px 0 1px var(--fx-color-border-subtle);\\n}\\n.cb-group-card.sel:not(.cb-pack-expanded) {\\n box-shadow:\\n 0 0 0 var(--fx-border-width) var(--fx-color-selection-indicator),\\n 3px 3px 0 0 var(--fx-color-surface-raised),\\n 3px 3px 0 1px var(--fx-color-border-subtle),\\n 6px 6px 0 0 var(--fx-color-surface-raised),\\n 6px 6px 0 1px var(--fx-color-border-subtle);\\n}\\n.cb-group-badge {\\n position: absolute;\\n right: 3px;\\n bottom: 3px;\\n z-index: 2;\\n display: flex;\\n align-items: center;\\n gap: 3px;\\n height: 22px;\\n padding: 0 8px;\\n border: 0;\\n border-radius: 11px;\\n background: color-mix(in srgb, var(--fx-color-surface-canvas) 62%, transparent);\\n color: var(--fx-color-text-inverse);\\n font-size: 11px;\\n font-weight: var(--fx-ref-font-weight-600);\\n cursor: pointer;\\n}\\n.cb-group-badge:hover {\\n background: rgb(0 0 0 / 62%);\\n color: #fff;\\n}\\n.cb-group-badge svg {\\n width: 11px;\\n height: 11px;\\n transition: transform var(--fx-motion-hover) var(--fx-motion-ease);\\n}\\n.cb-group-backdrops {\\n position: absolute;\\n inset: 0;\\n z-index: 0;\\n pointer-events: none;\\n}\\n.cb-group-backdrop {\\n position: absolute;\\n background: rgb(0 0 0 / 10%);\\n}\\n.cb-group-member {\\n z-index: 1;\\n}\\n.cb-group-badge.open svg {\\n transform: rotate(180deg);\\n}\\n.cb-preview-panel {\\n display: flex;\\n flex: 0 0 var(--cb-preview-w, 280px);\\n flex-direction: column;\\n width: var(--cb-preview-w, 280px);\\n min-width: 180px;\\n max-width: 560px;\\n min-height: 0;\\n overflow: hidden;\\n border-left: var(--fx-border-width) solid var(--fx-color-border-subtle);\\n background: var(--fx-color-surface-canvas);\\n}\\n.cb-preview-head {\\n display: flex;\\n align-items: center;\\n gap: var(--fx-ref-space-8);\\n padding: var(--fx-ref-space-8) var(--fx-ref-space-8);\\n border-bottom: var(--fx-border-width) solid var(--fx-color-border-subtle);\\n flex-shrink: 0;\\n}\\n.cb-preview-mode-bar {\\n display: flex;\\n gap: var(--fx-ref-space-4);\\n padding: var(--fx-ref-space-6) var(--fx-ref-space-8);\\n border-bottom: var(--fx-border-width) solid var(--fx-color-border-subtle);\\n flex-shrink: 0;\\n}\\n.cb-preview-mode-btn {\\n flex: 1 1 0;\\n min-width: 0;\\n height: 24px;\\n padding: 0 var(--fx-ref-space-8);\\n overflow: hidden;\\n border: var(--fx-border-width) solid var(--fx-color-border-subtle);\\n border-radius: var(--fx-radius-control);\\n background: transparent;\\n color: var(--fx-color-text-muted);\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n cursor: pointer;\\n}\\n.cb-preview-mode-btn:hover {\\n color: var(--fx-color-text-primary);\\n background: var(--fx-color-surface-hover);\\n}\\n.cb-preview-mode-btn.is-active {\\n color: var(--fx-color-text-primary);\\n border-color: var(--fx-color-border-strong);\\n background: var(--fx-color-surface-raised);\\n}\\n.cb-preview-ico,\\n.cb-preview-list-ico {\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n flex: 0 0 28px;\\n width: 28px;\\n height: 28px;\\n border-radius: var(--fx-radius-control);\\n background: var(--fx-color-surface-raised);\\n color: var(--fx-color-text-muted);\\n}\\n.cb-preview-list-ico {\\n flex-basis: 16px;\\n width: 16px;\\n height: 16px;\\n background: transparent;\\n}\\n.cb-preview-title {\\n flex: 1;\\n min-width: 0;\\n}\\n.cb-preview-title .name {\\n overflow: hidden;\\n color: var(--fx-color-text-primary);\\n font-weight: var(--fx-ref-font-weight-600);\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.cb-preview-title .meta {\\n overflow: hidden;\\n color: var(--fx-color-text-muted);\\n font: var(--fx-type-code-font-weight) var(--fx-type-caption-font-size)/var(--fx-type-caption-line-height) var(--fx-type-code-font-family);\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.cb-preview-close {\\n width: 24px;\\n height: 24px;\\n}\\n.cb-preview-body {\\n flex: 1;\\n min-height: 0;\\n overflow: auto;\\n padding: var(--fx-ref-space-8);\\n}\\n.cb-preview-empty .cb-preview-body {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n text-align: center;\\n color: var(--fx-color-text-muted);\\n}\\n.cb-preview-list,\\n.cb-preview-asset-list {\\n display: flex;\\n flex-direction: column;\\n gap: var(--fx-ref-space-4);\\n}\\n.cb-preview-list-item,\\n.cb-preview-asset-row {\\n display: flex;\\n align-items: center;\\n gap: var(--fx-ref-space-8);\\n min-width: 0;\\n padding: var(--fx-ref-space-4) var(--fx-ref-space-6);\\n border-radius: var(--fx-radius-control);\\n color: var(--fx-color-text-secondary);\\n}\\n.cb-preview-list-item:hover,\\n.cb-preview-asset-row:hover {\\n background: var(--fx-color-surface-hover);\\n}\\n.cb-preview-list-item > span:nth-of-type(2) {\\n flex: 1 1 0;\\n min-width: 0;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.cb-preview-list-item .sub,\\n.cb-preview-asset-row .guid,\\n.cb-preview-asset-row .kind {\\n color: var(--fx-color-text-muted);\\n font: var(--fx-type-code-font-weight) var(--fx-type-caption-font-size)/var(--fx-type-caption-line-height) var(--fx-type-code-font-family);\\n}\\n.cb-preview-list-item .sub {\\n flex: 0 1 38%;\\n min-width: 0;\\n margin-left: auto;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.cb-preview-asset-row > .cb-preview-asset-main {\\n flex: 1 1 0;\\n min-width: 0;\\n}\\n.cb-preview-asset-row > .cb-preview-asset-main > div {\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.cb-preview-asset-row .kind {\\n margin-left: 0;\\n}\\n.cb-preview-asset-row .guid {\\n flex: 0 1 auto;\\n max-width: 42%;\\n min-width: 0;\\n margin-left: auto;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.cb-preview-media {\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n justify-content: center;\\n gap: var(--fx-ref-space-8);\\n min-height: 0;\\n}\\n.cb-preview-image {\\n display: block;\\n max-width: 100%;\\n max-height: min(360px, 50vh);\\n object-fit: contain;\\n border-radius: var(--fx-radius-control);\\n background: var(--fx-color-surface-inset);\\n}\\n.cb-preview-audio,\\n.cb-preview-video {\\n width: 100%;\\n max-width: 100%;\\n}\\n.cb-preview-video {\\n max-height: min(360px, 50vh);\\n border-radius: var(--fx-radius-control);\\n background: #000;\\n}\\n.cb-preview-font-sample {\\n margin: 0;\\n color: var(--fx-color-text-primary);\\n font-size: 1.35rem;\\n line-height: 1.4;\\n text-align: center;\\n}\\n.cb-preview-font-meta {\\n margin: 0;\\n max-width: 100%;\\n overflow: hidden;\\n color: var(--fx-color-text-muted);\\n font: var(--fx-type-caption-font-size)/var(--fx-type-caption-line-height) var(--fx-type-code-font-family);\\n text-align: center;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.cb-preview-asset-hero {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n padding: var(--fx-ref-space-16) 0 var(--fx-ref-space-8);\\n}\\n.cb-preview-hero-icon {\\n color: var(--fx-color-text-muted);\\n}\\n.cb-preview-note {\\n padding: var(--fx-ref-space-8) var(--fx-ref-space-8);\\n overflow: hidden;\\n border: var(--fx-border-width) solid var(--fx-color-border-subtle);\\n border-radius: var(--fx-radius-control);\\n background: var(--fx-color-surface-raised);\\n color: var(--fx-color-text-muted);\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.cb-preview-source {\\n margin: 0;\\n padding: var(--fx-ref-space-8);\\n overflow: auto;\\n border: var(--fx-border-width) solid var(--fx-color-border-subtle);\\n border-radius: var(--fx-radius-control);\\n background: var(--fx-color-surface-inset);\\n color: var(--fx-color-text-secondary);\\n font: var(--fx-type-code-font-weight) var(--fx-type-code-font-size)/var(--fx-type-code-line-height) var(--fx-type-code-font-family);\\n white-space: pre-wrap;\\n}\\n.cb-preview-code {\\n display: flex;\\n flex-direction: column;\\n gap: var(--fx-ref-space-6);\\n min-height: 0;\\n}\\n.cb-preview-code-head {\\n display: flex;\\n align-items: center;\\n gap: var(--fx-ref-space-8);\\n}\\n.cb-preview-code-badge {\\n padding: var(--fx-ref-space-2) var(--fx-ref-space-8);\\n border-radius: var(--fx-radius-pill);\\n background: var(--fx-color-surface-hover);\\n color: var(--fx-color-text-muted);\\n font: var(--fx-type-code-font-weight) var(--fx-type-caption-font-size)/var(--fx-type-caption-line-height) var(--fx-type-code-font-family);\\n letter-spacing: 0.03em;\\n text-transform: uppercase;\\n}\\n.cb-preview-code-hint {\\n color: var(--fx-color-text-disabled);\\n font-size: var(--fx-type-caption-font-size);\\n}\\n.cb-preview-code-plain,\\n.cb-preview-code-shiki pre.shiki {\\n margin: 0;\\n white-space: pre-wrap;\\n word-break: break-word;\\n font: var(--fx-type-code-font-weight) var(--fx-type-code-font-size)/var(--fx-type-code-line-height) var(--fx-type-code-font-family);\\n}\\n.cb-preview-code-plain {\\n color: var(--fx-color-text-secondary);\\n}\\n.cb-preview-code-shiki pre.shiki {\\n background: transparent !important;\\n}\\n.cb-preview-code-shiki pre.shiki code {\\n background: transparent;\\n padding: 0;\\n border-radius: 0;\\n color: inherit;\\n font-size: inherit;\\n}\\n.cb-filter-menu-body {\\n min-width: 220px;\\n padding: var(--fx-ref-space-4);\\n border: var(--fx-border-width) solid var(--fx-color-border-default);\\n border-radius: var(--fx-radius-popover);\\n background: var(--fx-color-surface-raised);\\n box-shadow: var(--fx-shadow-floating);\\n}\\n.cb-filter-section {\\n padding: var(--fx-ref-space-6) var(--fx-ref-space-8) var(--fx-ref-space-4);\\n color: var(--fx-color-text-muted);\\n font-size: var(--fx-type-caption-font-size);\\n font-weight: var(--fx-ref-font-weight-600);\\n}\\n.cb-filter-separator {\\n height: var(--fx-border-width);\\n margin: var(--fx-ref-space-4) 0;\\n background: var(--fx-color-border-subtle);\\n}\\n.cb-filter-option {\\n display: flex;\\n align-items: center;\\n gap: var(--fx-ref-space-8);\\n width: 100%;\\n min-height: var(--fx-component-editor-row-height);\\n padding: var(--fx-ref-space-4) var(--fx-ref-space-8);\\n border: 0;\\n border-radius: var(--fx-radius-control);\\n background: transparent;\\n color: var(--fx-color-text-secondary);\\n text-align: left;\\n cursor: pointer;\\n}\\n.cb-filter-option:hover {\\n background: var(--fx-color-surface-hover);\\n color: var(--fx-color-text-primary);\\n}\\n.cb-filter-option:disabled {\\n color: var(--fx-color-text-disabled);\\n cursor: default;\\n}\\n.cb-filter-option-icon {\\n flex: 0 0 14px;\\n width: 14px;\\n color: var(--fx-color-text-muted);\\n}\\n.cb-filter-check {\\n flex: 0 0 var(--fx-component-choice-size);\\n pointer-events: none;\\n}\\n.cb-filter-check.fx-choice {\\n align-items: center;\\n gap: 0;\\n min-height: 0;\\n margin: 0;\\n}\\n.cb-filter-check .fx-choice__text {\\n display: none;\\n}\\n.cb-radio-menu {\\n width: 14px;\\n height: 14px;\\n flex: 0 0 14px;\\n border: var(--fx-border-width) solid var(--fx-color-border-control);\\n border-radius: 999px;\\n}\\n.cb-radio-menu[data-checked=true] {\\n border-color: var(--fx-color-choice-indicator);\\n background:\\n radial-gradient(\\n circle at center,\\n var(--fx-color-choice-indicator) 4px,\\n transparent 5px);\\n}\\n@container (max-width: 660px) {\\n .cb-toolbar-group .fx-button {\\n width: var(--fx-component-control-height-compact);\\n padding: 0;\\n font-size: 0;\\n }\\n}\\n\";\n if (typeof document !== 'undefined' && !document.querySelector('style[data-forgeax-css=\"1ef84f0e3fb40317f76b77e1b83b84b7c994dc8c43c3bc38be5abb2446c7740b\"]')) {\n const style = document.createElement('style');\n style.dataset.forgeaxCss = \"1ef84f0e3fb40317f76b77e1b83b84b7c994dc8c43c3bc38be5abb2446c7740b\";\n style.textContent = css;\n document.head.append(style);\n }\n export default css;\n "],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["ChevronDown", "Folder", "FolderOpen", "useCallback", "useEffect", "useMemo", "useRef", "useState", "t", "t", "t", "useCallback", "jsx", "jsxs", "t", "useCallback", "Folder", "useCallback", "useState", "jsx", "jsxs", "Folder", "t", "useState", "useCallback", "useEffect", "useState", "jsx", "jsxs", "t", "useState", "jsx", "jsxs", "useState", "t", "jsx", "t", "useEffect", "useRef", "useState", "jsx", "value", "jsx", "jsxs", "t", "useState", "useEffect", "useCallback", "useEffect", "useRef", "useState", "useSyncExternalStore", "value", "Fragment", "jsx", "jsxs", "useSyncExternalStore", "useState", "useRef", "useCallback", "useEffect", "item", "Fragment", "jsx", "jsxs", "t", "useState", "useMemo", "useRef", "useCallback", "useEffect", "Folder", "FolderOpen", "ChevronDown", "css", "jsx"]
|
|
7
|
+
}
|
|
@@ -8,16 +8,16 @@ import {
|
|
|
8
8
|
InspectorForm,
|
|
9
9
|
OverlayRootProvider,
|
|
10
10
|
PanelHeader
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-CXOD7FW6.mjs";
|
|
12
12
|
import {
|
|
13
13
|
unwrapWorkspaceInspection
|
|
14
14
|
} from "./chunk-ZYTHV373.mjs";
|
|
15
15
|
import {
|
|
16
16
|
RESOURCE_KINDS
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-FMCHH5R4.mjs";
|
|
18
18
|
import {
|
|
19
19
|
bindWorkspacePreviewSurface
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-B6QUJ33G.mjs";
|
|
21
21
|
import {
|
|
22
22
|
selectWorkspaceResourcePreview,
|
|
23
23
|
selectWorkspaceResourceSubject
|
|
@@ -232,4 +232,4 @@ export {
|
|
|
232
232
|
mountTexturePreviewPanel,
|
|
233
233
|
mountTexturePropertiesPanel
|
|
234
234
|
};
|
|
235
|
-
//# sourceMappingURL=chunk-
|
|
235
|
+
//# sourceMappingURL=chunk-VW2ZF3P4.mjs.map
|