@react-trace-enhancer/plugin-preview 0.0.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["FolderIcon","IS_MAC","KbdGroup","Kbd","Button","bundledThemesInfo","Combobox","loader","bundledThemes","Button","SaveIcon","IconButton","CollapseIcon","ExpandIcon","Editor","panelPopupStyle","FolderIcon","Tooltip","ToolbarButton","Popover"],"sources":["../src/FolderAccessPrompt.tsx","../src/fs.ts","../src/store.ts","../src/PreviewSettings.tsx","../src/highlight.ts","../src/monaco.ts","../src/styles.ts","../src/utils.ts","../src/SourcePreview.tsx","../src/index.tsx"],"sourcesContent":["import { IS_MAC } from '@react-trace-enhancer/core'\nimport { Button, FolderIcon, Kbd, KbdGroup } from '@react-trace-enhancer/ui-components'\n\nexport function FolderAccessPrompt({\n root,\n onGrant,\n onCancel,\n}: {\n root: string | undefined\n onGrant(): void\n onCancel(): void\n}) {\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 12,\n padding: '20px 16px',\n height: '100%',\n boxSizing: 'border-box',\n textAlign: 'center',\n fontFamily: 'system-ui, sans-serif',\n }}\n >\n <span style={{ color: '#52525b' }}>\n <FolderIcon />\n </span>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>\n <span style={{ fontSize: 13, fontWeight: 600, color: '#fafafa' }}>\n Folder access needed\n </span>\n <span style={{ fontSize: 12, color: '#71717a', lineHeight: 1.5 }}>\n {root ? (\n <span style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n <span>\n The project root path will be copied to your clipboard. Navigate\n to it in the folder picker.\n </span>\n {IS_MAC && (\n <span>\n <KbdGroup>\n <Kbd>⌘</Kbd>\n <Kbd>⇧</Kbd>\n <Kbd>G</Kbd>\n </KbdGroup>\n <span> to paste the path directly.</span>\n </span>\n )}\n </span>\n ) : (\n 'Grant access to your project folder to preview source files.'\n )}\n </span>\n {root && (\n <span\n style={{\n fontSize: 11,\n fontFamily: 'ui-monospace, monospace',\n color: '#3b82f6',\n wordBreak: 'break-all',\n }}\n >\n {root}\n </span>\n )}\n </div>\n <div style={{ display: 'flex', gap: 8 }}>\n <Button variant=\"secondary\" onClick={onCancel}>\n Cancel\n </Button>\n <Button variant=\"primary\" onClick={onGrant}>\n Grant access\n </Button>\n </div>\n </div>\n )\n}\n\n/**\n * Copies the root path to clipboard then calls requestAccess().\n */\nexport async function handleGrantAccess(\n root: string,\n requestAccess: () => Promise<boolean>,\n): Promise<boolean> {\n await navigator.clipboard.writeText(root).catch(() => {})\n return requestAccess()\n}\n","export interface FileSystemService {\n /** Whether the File System Access API is available in this browser */\n isSupported: boolean\n /** Whether the user has already granted directory access */\n hasAccess: boolean\n /**\n * Silently try to restore a previously granted directory handle from\n * IndexedDB and re-request permission. Resolves true if successful.\n * Call this on app mount to avoid prompting on every reload.\n */\n tryRestore(): Promise<boolean>\n /**\n * Prompt the user to pick the project root directory via showDirectoryPicker().\n * The handle is persisted in IndexedDB for future sessions.\n */\n requestAccess(): Promise<boolean>\n /**\n * Subscribe to hasAccess changes (e.g. after requestAccess / tryRestore).\n * Returns an unsubscribe function.\n */\n subscribe(listener: () => void): () => void\n /**\n * Read a file by its relative path (relative to the granted directory).\n * If no access has been granted yet, triggers requestAccess() first.\n */\n read(relativePath: string): Promise<string>\n /**\n * Write content to a file by its relative path. Triggers requestAccess() if needed.\n * Written files trigger HMR automatically in the dev server.\n */\n write(relativePath: string, content: string): Promise<void>\n}\n\nconst IDB_NAME = 'react-trace'\nconst IDB_STORE = 'handles'\nconst IDB_KEY = 'root-directory'\n\nfunction openDB(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(IDB_NAME, 1)\n req.onupgradeneeded = () => req.result.createObjectStore(IDB_STORE)\n req.onsuccess = () => resolve(req.result)\n req.onerror = () => reject(req.error)\n })\n}\n\nasync function saveHandle(handle: FileSystemDirectoryHandle): Promise<void> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(IDB_STORE, 'readwrite')\n tx.objectStore(IDB_STORE).put(handle, IDB_KEY)\n tx.oncomplete = () => resolve()\n tx.onerror = () => reject(tx.error)\n })\n}\n\nasync function loadHandle(): Promise<FileSystemDirectoryHandle | null> {\n try {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(IDB_STORE, 'readonly')\n const req = tx.objectStore(IDB_STORE).get(IDB_KEY)\n req.onsuccess = () =>\n resolve((req.result as FileSystemDirectoryHandle) ?? null)\n req.onerror = () => reject(req.error)\n })\n } catch {\n return null\n }\n}\n\n/**\n * Traverses the directory handle tree to reach the target file.\n * Returns null if any segment of the path doesn't exist.\n */\nasync function getFileHandle(\n dir: FileSystemDirectoryHandle,\n relativePath: string,\n create = false,\n): Promise<FileSystemFileHandle | null> {\n const parts = relativePath.split('/').filter(Boolean)\n if (parts.length === 0) return null\n\n let current: FileSystemDirectoryHandle = dir\n\n for (let i = 0; i < parts.length - 1; i++) {\n try {\n current = await current.getDirectoryHandle(parts[i]!, { create })\n } catch {\n return null\n }\n }\n\n try {\n return await current.getFileHandle(parts.at(-1)!, { create })\n } catch {\n return null\n }\n}\n\nclass FileSystemServiceImpl implements FileSystemService {\n private _handle: FileSystemDirectoryHandle | null = null\n private _listeners = new Set<() => void>()\n\n get isSupported(): boolean {\n return typeof window !== 'undefined' && 'showDirectoryPicker' in window\n }\n\n get hasAccess(): boolean {\n return this._handle !== null\n }\n\n subscribe(listener: () => void): () => void {\n this._listeners.add(listener)\n return () => this._listeners.delete(listener)\n }\n\n private notify(): void {\n this._listeners.forEach((l) => l())\n }\n\n async tryRestore(): Promise<boolean> {\n if (!this.isSupported) return false\n try {\n const handle = await loadHandle()\n if (!handle) return false\n const perm = await handle.requestPermission({ mode: 'readwrite' })\n if (perm === 'granted') {\n this._handle = handle\n this.notify()\n return true\n }\n } catch {\n // handle gone or permission denied — fall through\n }\n return false\n }\n\n async requestAccess(): Promise<boolean> {\n if (!this.isSupported) return false\n try {\n const handle = await window.showDirectoryPicker({ mode: 'readwrite' })\n await saveHandle(handle)\n this._handle = handle\n this.notify()\n return true\n } catch {\n // User cancelled the picker\n return false\n }\n }\n\n /** Ensure we have access — try restore silently first, then prompt. */\n private async ensureAccess(): Promise<boolean> {\n if (this._handle) return true\n const restored = await this.tryRestore()\n if (restored) return true\n return this.requestAccess()\n }\n\n async read(relativePath: string): Promise<string> {\n const ok = await this.ensureAccess()\n if (!ok || !this._handle)\n throw new Error('[react-trace] File system access denied')\n\n const file = await getFileHandle(this._handle, relativePath)\n if (!file) throw new Error(`[react-trace] File not found: ${relativePath}`)\n\n return (await file.getFile()).text()\n }\n\n async write(relativePath: string, content: string): Promise<void> {\n const ok = await this.ensureAccess()\n if (!ok || !this._handle)\n throw new Error('[react-trace] File system access denied')\n\n const file = await getFileHandle(this._handle, relativePath, true)\n if (!file)\n throw new Error(\n `[react-trace] Cannot open file for writing: ${relativePath}`,\n )\n\n const writable = await file.createWritable()\n await writable.write(content)\n await writable.close()\n }\n}\n\nexport const fileSystemService: FileSystemService = new FileSystemServiceImpl()\n","import type { TraceSettings } from '@react-trace-enhancer/core'\nimport { settingsPluginAtom } from '@react-trace-enhancer/core'\nimport type { WritableAtom } from 'jotai'\nimport type { BundledTheme } from 'shiki'\n\ndeclare module '@react-trace-enhancer/core' {\n interface TraceSettings {\n preview?: {\n disabled: boolean\n theme: BundledTheme\n }\n }\n}\n\nexport const previewSettingsAtom = settingsPluginAtom(\n 'preview',\n) as WritableAtom<TraceSettings['preview'], [TraceSettings['preview']], void>\n","import { useWidgetPortalContainer } from '@react-trace-enhancer/core'\nimport { Combobox } from '@react-trace-enhancer/ui-components'\nimport { useAtom } from 'jotai'\nimport type { CSSProperties } from 'react'\nimport { useRef, useState } from 'react'\nimport type { BundledTheme } from 'shiki'\nimport { bundledThemesInfo } from 'shiki'\n\nimport { previewSettingsAtom } from './store'\n\nconst themes = bundledThemesInfo.map((theme) => ({\n value: theme.id as BundledTheme,\n label: theme.displayName,\n}))\n\nconst themesLookup = themes.reduce<\n Record<(typeof themes)[number]['value'], (typeof themes)[number]>\n>(\n (acc, theme) => {\n acc[theme.value] = theme\n return acc\n },\n {} as Record<(typeof themes)[number]['value'], (typeof themes)[number]>,\n)\n\nconst LABEL_STYLE: CSSProperties = {\n fontSize: 12,\n color: '#d4d4d8',\n fontFamily: 'system-ui, sans-serif',\n}\n\nexport function PreviewSettings() {\n const portalContainer = useWidgetPortalContainer()\n const [themesOpen, setThemesOpen] = useState(false)\n\n const [\n previewSettings = { disabled: false, theme: 'one-dark-pro' },\n setPreviewSettings,\n ] = useAtom(previewSettingsAtom)\n\n const anchorRef = useRef<HTMLDivElement>(null)\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n <label style={LABEL_STYLE}>\n <input\n type=\"checkbox\"\n checked={previewSettings.disabled ?? false}\n onChange={(e) =>\n setPreviewSettings({\n ...previewSettings,\n disabled: e.target.checked,\n })\n }\n />{' '}\n Code editing disabled\n </label>\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n <label style={LABEL_STYLE}>Theme</label>\n <Combobox.Root\n value={themesLookup[previewSettings.theme]}\n onValueChange={(theme) => {\n if (theme) {\n setPreviewSettings({ ...previewSettings, theme: theme.value })\n }\n }}\n items={themes}\n open={themesOpen}\n onOpenChange={setThemesOpen}\n >\n <div ref={anchorRef}>\n <Combobox.Trigger\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n >\n <Combobox.Input />\n </Combobox.Trigger>\n </div>\n\n <Combobox.Portal container={portalContainer}>\n <Combobox.Positioner\n style={{ zIndex: 100000000, pointerEvents: 'auto' }}\n anchor={anchorRef}\n >\n <Combobox.Popup>\n <Combobox.Empty>No themes found</Combobox.Empty>\n <Combobox.List\n style={{\n overscrollBehavior: 'contain',\n maxHeight: 500,\n overflowY: 'auto',\n }}\n >\n {(option: (typeof themes)[number]) => (\n <Combobox.Item\n key={option.value}\n value={option}\n onClick={(e) => e.stopPropagation()}\n >\n <span>{option.label}</span>\n </Combobox.Item>\n )}\n </Combobox.List>\n </Combobox.Popup>\n </Combobox.Positioner>\n </Combobox.Portal>\n </Combobox.Root>\n </div>\n </div>\n )\n}\n","/** Injects the CSS animation for the highlighted source line — idempotent. */\nexport function ensureHighlightStyle() {\n if (document.getElementById('react-trace-highlighted-line')) return\n\n const style = document.createElement('style')\n style.id = 'react-trace-highlighted-line'\n style.textContent = `\n .react-trace-highlighted-line {\n background-color: rgba(0, 200, 255, 0.25);\n animation: react-trace-highlight-flash 1.2s ease-out;\n }\n\n @keyframes react-trace-highlight-flash {\n from { background-color: rgba(0, 200, 255, 0.6); }\n to { background-color: rgba(0, 200, 255, 0.25); }\n }\n `\n document.head.appendChild(style)\n}\n","import { loader } from '@monaco-editor/react'\nimport type { Monaco } from '@monaco-editor/react'\nimport { shikiToMonaco } from '@shikijs/monaco'\nimport { bundledThemes, createHighlighter } from 'shiki'\n\n// Kick off the Monaco CDN download as soon as the plugin module is imported\nloader.init()\n\nexport const langs = ['typescript', 'javascript', 'graphql', 'css']\n\nexport const highlighterPromise = createHighlighter({\n themes: Object.values(bundledThemes),\n langs,\n})\n\n/**\n * Monaco `beforeMount` callback — disables the built-in TS/JS language server\n * (no project types available in the browser) and wires Shiki for highlighting.\n */\nexport function configureBefore(monaco: Monaco) {\n const noValidation = {\n noSemanticValidation: true,\n noSyntaxValidation: true,\n }\n const { typescriptDefaults, javascriptDefaults } = monaco.languages.typescript\n\n typescriptDefaults.setDiagnosticsOptions(noValidation)\n javascriptDefaults.setDiagnosticsOptions(noValidation)\n\n const compilerOptions = {\n jsx: monaco.languages.typescript.JsxEmit.ReactJSX,\n allowJs: true,\n }\n typescriptDefaults.setCompilerOptions(compilerOptions)\n javascriptDefaults.setCompilerOptions(compilerOptions)\n\n for (const id of langs) monaco.languages.register({ id })\n highlighterPromise.then((h) => shikiToMonaco(h, monaco))\n}\n","export const LINE_HEIGHT = 19\nexport const INLINE_LINES = 12\nexport const INLINE_HEIGHT = INLINE_LINES * LINE_HEIGHT\nexport const EDITOR_WIDTH = 480\nexport const TOOLBAR_HEIGHT = 33\n","import type { Monaco } from '@monaco-editor/react'\nimport type { Uri } from 'monaco-types'\n\nexport function detectLanguage(fileName: string): string {\n const ext = fileName.split('.').pop()?.toLowerCase() ?? ''\n const map: Record<string, string> = {\n ts: 'typescript',\n tsx: 'typescript',\n js: 'javascript',\n jsx: 'javascript',\n mjs: 'javascript',\n cjs: 'javascript',\n }\n return map[ext] ?? 'plaintext'\n}\n\n/** Convert a file path (URL or absolute) to a monaco file:// URI. */\nexport function pathToUri(monaco: Monaco, path: string): Uri {\n try {\n const { pathname } = new URL(path)\n return monaco.Uri.parse(`file://${pathname}`)\n } catch {\n const normalized = path.replace(/\\\\/g, '/')\n return monaco.Uri.parse(\n normalized.startsWith('/')\n ? `file://${normalized}`\n : `file:///${normalized}`,\n )\n }\n}\n","import Editor from '@monaco-editor/react'\nimport { useProjectRoot, useSelectedSource } from '@react-trace-enhancer/core'\nimport {\n Button,\n CollapseIcon,\n ExpandIcon,\n IconButton,\n panelPopupStyle,\n SaveIcon,\n} from '@react-trace-enhancer/ui-components'\nimport { useAtom } from 'jotai'\nimport type { editor } from 'monaco-types'\nimport { useRef, useState } from 'react'\n\nimport { FolderAccessPrompt, handleGrantAccess } from './FolderAccessPrompt'\nimport { fileSystemService } from './fs'\nimport { ensureHighlightStyle } from './highlight'\nimport { configureBefore } from './monaco'\nimport { previewSettingsAtom } from './store'\nimport {\n EDITOR_WIDTH,\n INLINE_HEIGHT,\n LINE_HEIGHT,\n TOOLBAR_HEIGHT,\n} from './styles'\nimport type { PreviewPluginOptions } from './types'\nimport { detectLanguage, pathToUri } from './utils'\n\ntype LoadState = 'needs-access' | 'loading' | 'ready'\n\ntype SourcePreviewProps = {\n options: PreviewPluginOptions\n}\nexport function SourcePreview({ options }: SourcePreviewProps) {\n let { theme = 'one-dark-pro', disabled = false } = options\n const [persistedOptions, setPreviewSettings] = useAtom(previewSettingsAtom)\n if (!persistedOptions) {\n setPreviewSettings({ theme, disabled })\n }\n theme = persistedOptions?.theme || theme\n disabled = persistedOptions?.disabled ?? disabled\n\n const root = useProjectRoot()\n const source = useSelectedSource()\n const [expanded, setExpanded] = useState(false)\n const [dirty, setDirty] = useState(false)\n const [loadState, setLoadState] = useState<LoadState>(\n fileSystemService.hasAccess ? 'loading' : 'needs-access',\n )\n const editorRef = useRef<editor.ICodeEditor>(null)\n\n if (!source) return null\n\n const currentPath = source.relativePath\n\n const handleGrant = async () => {\n const granted = await handleGrantAccess(root, () =>\n fileSystemService.requestAccess(),\n )\n if (granted) setLoadState('loading')\n }\n\n const handleSave = () => {\n const val = editorRef.current?.getValue()\n if (val != null) {\n fileSystemService\n .write(currentPath, val)\n .then(() => setDirty(false))\n .catch(() => {})\n }\n }\n\n const editorHeight = expanded\n ? `calc(80vh - ${!disabled ? TOOLBAR_HEIGHT : 0}px)`\n : INLINE_HEIGHT - (!disabled ? TOOLBAR_HEIGHT : 0)\n\n const toolbar = !disabled ? (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n height: TOOLBAR_HEIGHT,\n padding: '0 10px',\n borderBottom: '1px solid #27272a',\n flexShrink: 0,\n }}\n >\n <span\n style={{\n fontSize: 11,\n fontFamily: 'ui-monospace, monospace',\n color: '#52525b',\n }}\n >\n {source.relativePath.split('/').slice(-2).join('/')}\n <span style={{ color: '#3f3f46' }}>:{source.lineNumber}</span>\n </span>\n <div style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\n {dirty && (\n <Button variant=\"accent\" onClick={handleSave} title=\"Save (⌘S)\">\n <SaveIcon /> Save\n </Button>\n )}\n <IconButton\n onClick={() => setExpanded((prev) => !prev)}\n title={expanded ? 'Collapse (Esc)' : 'Expand'}\n >\n {expanded ? <CollapseIcon /> : <ExpandIcon />}\n </IconButton>\n </div>\n </div>\n ) : null\n\n const [dismissed, setDismissed] = useState(false)\n\n const content =\n loadState === 'needs-access' && !dismissed ? (\n <FolderAccessPrompt\n root={root}\n onGrant={handleGrant}\n onCancel={() => setDismissed(true)}\n />\n ) : (\n <Editor\n height={editorHeight}\n width=\"100%\"\n theme={theme}\n options={{\n readOnly: disabled,\n minimap: { enabled: false },\n lineNumbers: 'on',\n scrollBeyondLastLine: false,\n fontSize: 12,\n lineHeight: LINE_HEIGHT,\n folding: false,\n glyphMargin: false,\n automaticLayout: true,\n padding: { top: 6, bottom: 6 },\n fixedOverflowWidgets: true,\n }}\n beforeMount={configureBefore}\n onMount={(editor, monaco) => {\n editorRef.current = editor\n if (!disabled) {\n editor.addCommand(\n monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS,\n handleSave,\n )\n editor.addCommand(monaco.KeyCode.Escape, () => setExpanded(false))\n }\n editor.updateOptions({ theme })\n\n const key = source.relativePath\n const uri = pathToUri(monaco, key)\n\n fileSystemService\n .read(key)\n .then((fileContent) => {\n if (!monaco.editor.getModel(uri)) {\n monaco.editor.createModel(fileContent, detectLanguage(key), uri)\n }\n const model = monaco.editor.getModel(uri)\n if (model) {\n const { lineNumber } = source\n editor.setModel(model)\n editor.revealLineInCenter(lineNumber)\n\n ensureHighlightStyle()\n const highlight = editor.createDecorationsCollection()\n highlight.set([\n {\n range: new monaco.Range(lineNumber, 1, lineNumber, 1),\n options: {\n isWholeLine: true,\n className: 'react-trace-highlighted-line',\n },\n },\n ])\n }\n })\n .catch(() => {})\n }}\n onChange={() => setDirty(true)}\n loading={\n <div style={{ padding: '8px 12px', color: '#52525b', fontSize: 11 }}>\n Loading…\n </div>\n }\n />\n )\n\n // stopPropagation on keydown prevents Base UI's Menu from capturing letter\n // keys for its typeahead navigation (which would swallow 'a', 'b', etc.)\n const panel = (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n height: '100%',\n background: '#18181b',\n overflow: 'hidden',\n }}\n onKeyDown={(e) => e.stopPropagation()}\n >\n {toolbar}\n {content}\n </div>\n )\n\n if (!expanded) {\n return (\n <div onClick={(e) => e.stopPropagation()} style={{ width: EDITOR_WIDTH }}>\n {panel}\n </div>\n )\n }\n\n return (\n <div\n ref={(el) => {\n const parentElement = el?.parentElement?.parentElement\n if (!parentElement) return\n const transform = parentElement.style.transform\n parentElement.style.transform = ''\n return () => {\n parentElement.style.transform = transform\n }\n }}\n style={{\n position: 'absolute',\n inset: 0,\n zIndex: 9999999,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n onClick={() => setExpanded(false)}\n >\n <div\n style={{\n ...panelPopupStyle,\n position: 'fixed',\n top: '10vw',\n left: '10vw',\n overflow: 'hidden',\n width: '80vw',\n height: '80vh',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {panel}\n </div>\n </div>\n )\n}\n","import type { TracePlugin } from '@react-trace-enhancer/core'\nimport {\n useDeactivateInspector,\n useProjectRoot,\n useWidgetPortalContainer,\n} from '@react-trace-enhancer/core'\nimport {\n FolderIcon,\n Popover,\n ToolbarButton,\n Tooltip,\n} from '@react-trace-enhancer/ui-components'\nimport { useEffect, useRef, useState, useSyncExternalStore } from 'react'\n\nimport { FolderAccessPrompt, handleGrantAccess } from './FolderAccessPrompt'\nimport { fileSystemService } from './fs'\nimport { PreviewSettings } from './PreviewSettings'\nimport { SourcePreview } from './SourcePreview'\nimport type { PreviewPluginOptions } from './types'\n\nexport type { PreviewPluginOptions }\n\nfunction FolderToolbarIcon({ hasAccess }: { hasAccess: boolean }) {\n return (\n <span style={{ position: 'relative', display: 'inline-flex' }}>\n <FolderIcon />\n {hasAccess && (\n <span\n style={{\n position: 'absolute',\n top: -4,\n right: -4,\n width: 6,\n height: 6,\n borderRadius: '50%',\n background: '#22c55e',\n border: '1.5px solid #18181b',\n pointerEvents: 'none',\n }}\n />\n )}\n </span>\n )\n}\n\nfunction PreviewToolbar() {\n const projectRoot = useProjectRoot()\n const portalContainer = useWidgetPortalContainer()\n const deactivateInspector = useDeactivateInspector()\n const buttonRef = useRef<HTMLButtonElement>(null)\n const [isPromptOpen, setIsPromptOpen] = useState(false)\n const hasAccess = useSyncExternalStore(\n fileSystemService.subscribe.bind(fileSystemService),\n () => fileSystemService.hasAccess,\n () => false,\n )\n\n // Silently try to restore a previously granted FS handle on mount\n useEffect(() => {\n fileSystemService.tryRestore().catch(() => {})\n }, [])\n\n const handleClick = () => {\n deactivateInspector()\n\n if (fileSystemService.hasAccess) {\n fileSystemService.requestAccess().catch(() => {})\n return\n }\n\n setIsPromptOpen(true)\n }\n\n const handleGrant = async () => {\n const granted = await handleGrantAccess(projectRoot, () =>\n fileSystemService.requestAccess(),\n )\n if (granted) setIsPromptOpen(false)\n }\n\n return (\n <>\n <Tooltip\n label={hasAccess ? 'Project folder connected' : 'Select project folder'}\n container={portalContainer}\n render={<ToolbarButton ref={buttonRef} />}\n aria-label=\"Project folder\"\n style={{\n color: hasAccess ? '#22c55e' : '#52525b',\n }}\n onClick={handleClick}\n >\n <FolderToolbarIcon hasAccess={hasAccess} />\n </Tooltip>\n\n <Popover.Root\n open={isPromptOpen}\n onOpenChange={(open: boolean) => {\n if (!open) setIsPromptOpen(false)\n }}\n >\n <Popover.Portal container={portalContainer}>\n <Popover.Positioner\n anchor={buttonRef.current}\n side=\"top\"\n align=\"end\"\n sideOffset={8}\n collisionPadding={8}\n positionMethod=\"fixed\"\n style={{ zIndex: 9999999, pointerEvents: 'auto' }}\n >\n <Popover.Popup\n style={{ width: 280, overflow: 'hidden' }}\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => event.stopPropagation()}\n >\n <FolderAccessPrompt\n root={projectRoot}\n onGrant={handleGrant}\n onCancel={() => setIsPromptOpen(false)}\n />\n </Popover.Popup>\n </Popover.Positioner>\n </Popover.Portal>\n </Popover.Root>\n </>\n )\n}\n\nexport function PreviewPlugin(options: PreviewPluginOptions = {}): TracePlugin {\n function PreviewActionPanel() {\n return <SourcePreview options={options} />\n }\n\n return {\n name: 'preview',\n toolbar: PreviewToolbar,\n actionPanel: PreviewActionPanel,\n settings: PreviewSettings,\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { t as PreviewPluginOptions } from "./types-DM7rB7J1.cjs";
2
+ import { TracePlugin } from "@react-trace-enhancer/core";
3
+
4
+ //#region src/index.d.ts
5
+ declare function PreviewPlugin(options?: PreviewPluginOptions): TracePlugin;
6
+ //#endregion
7
+ export { PreviewPlugin, type PreviewPluginOptions };
8
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.tsx"],"mappings":";;;;iBAiIgB,aAAA,CAAc,OAAA,GAAS,oBAAA,GAA4B,WAAA"}
@@ -0,0 +1,8 @@
1
+ import { t as PreviewPluginOptions } from "./types-uxyW_RVb.js";
2
+ import { TracePlugin } from "@react-trace-enhancer/core";
3
+
4
+ //#region src/index.d.ts
5
+ declare function PreviewPlugin(options?: PreviewPluginOptions): TracePlugin;
6
+ //#endregion
7
+ export { PreviewPlugin, type PreviewPluginOptions };
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.tsx"],"mappings":";;;;iBAiIgB,aAAA,CAAc,OAAA,GAAS,oBAAA,GAA4B,WAAA"}