@pstdio/ui 0.20.1 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{MermaidComponent-BVMyKttu.js → MermaidComponent-D92GMhht.js} +3 -3
- package/dist/{MermaidComponent-BVMyKttu.js.map → MermaidComponent-D92GMhht.js.map} +1 -1
- package/dist/chat-ui.d.ts +2 -0
- package/dist/chat-ui.js +3 -7
- package/dist/chat-ui.js.map +1 -1
- package/dist/components/data-table/build-columns.d.ts +2 -0
- package/dist/components/data-table/data-table-column-menu.d.ts +2 -0
- package/dist/components/data-table/data-table-row-display.d.ts +11 -0
- package/dist/components/data-table/data-table-table-parts.d.ts +1 -0
- package/dist/components/data-table/edit-mode-data-table-body.d.ts +1 -0
- package/dist/components/data-table/edit-mode-data-table-cell.d.ts +1 -0
- package/dist/components/data-table/edit-mode-data-table-header.d.ts +1 -0
- package/dist/components/data-table/types.d.ts +1 -0
- package/dist/components/diff-viewer/code-editor.d.ts +8 -2
- package/dist/components/diff-viewer/index.d.ts +1 -0
- package/dist/components/kanban-renderer/collection-badge.d.ts +7 -0
- package/dist/components/kanban-renderer/index.d.ts +1 -1
- package/dist/components/kanban-renderer/kanban-renderer-helpers.d.ts +2 -1
- package/dist/components/kanban-renderer/types.d.ts +20 -1
- package/dist/components/list-row/list-row-content.d.ts +1 -0
- package/dist/components/param-editor/param-editor-presentation.d.ts +1 -1
- package/dist/components/param-editor/param-editor.types.d.ts +5 -193
- package/dist/components/rich-text/shared/markdown-ast.d.ts +1 -0
- package/dist/components/rich-text/shared/markdown-source-document.d.ts +7 -0
- package/dist/components/rich-text/shared/markdown-source-links.d.ts +11 -0
- package/dist/components/rich-text/shared/markdown-source-map.d.ts +10 -0
- package/dist/components/rich-text/utils/inferResourceType.d.ts +1 -1
- package/dist/components/tag-editor/tag-editor-row.d.ts +2 -1
- package/dist/components/tag-editor/tag-editor.types.d.ts +13 -0
- package/dist/components/tag-editor/tag-settings-panel.d.ts +1 -1
- package/dist/components/tree-list/tree-list-drag-provider.d.ts +13 -0
- package/dist/components/tree-list/tree-list-order.store.d.ts +4 -1
- package/dist/components/tree-list/tree-list-reorder.d.ts +14 -3
- package/dist/components/tree-list/tree-list-sortable.d.ts +2 -0
- package/dist/components/tree-list/tree-list-visibility-filter.d.ts +2 -2
- package/dist/components/tree-list/tree-list.d.ts +3 -0
- package/dist/components/tree-list/tree-list.types.d.ts +4 -0
- package/dist/data-table.d.ts +2 -0
- package/dist/data-table.js +740 -704
- package/dist/data-table.js.map +1 -1
- package/dist/diff.d.ts +2 -0
- package/dist/diff.js +532 -533
- package/dist/diff.js.map +1 -1
- package/dist/edit-mode-data-table-DGgRuSW3.js +846 -0
- package/dist/edit-mode-data-table-DGgRuSW3.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1603 -1492
- package/dist/index.js.map +1 -1
- package/dist/{kanban-renderer-toolbar-CpegGbwq.js → kanban-renderer-toolbar-Bl8xXdwU.js} +527 -469
- package/dist/kanban-renderer-toolbar-Bl8xXdwU.js.map +1 -0
- package/dist/kanban-renderer.d.ts +2 -0
- package/dist/kanban-renderer.js +21 -21
- package/dist/kanban-renderer.js.map +1 -1
- package/dist/lazy-markdown-editor-CCOchoJX.js +235 -0
- package/dist/lazy-markdown-editor-CCOchoJX.js.map +1 -0
- package/dist/list-row-DCgdza1i.js +812 -0
- package/dist/list-row-DCgdza1i.js.map +1 -0
- package/dist/markdown-CASvn1Z2.js +1643 -0
- package/dist/markdown-CASvn1Z2.js.map +1 -0
- package/dist/markdown-editor-C4GCyebp.js +1019 -0
- package/dist/markdown-editor-C4GCyebp.js.map +1 -0
- package/dist/{mermaid-renderer-H3IhLqnQ.js → mermaid-renderer-CVnuKs-A.js} +2 -2
- package/dist/{mermaid-renderer-H3IhLqnQ.js.map → mermaid-renderer-CVnuKs-A.js.map} +1 -1
- package/dist/mermaid.d.ts +2 -0
- package/dist/mermaid.js +1 -1
- package/dist/monaco-browser-CgvlArN7.js +21 -0
- package/dist/monaco-browser-CgvlArN7.js.map +1 -0
- package/dist/{param-editor-B8Ff9Nm8.js → param-editor-CkDq623X.js} +2 -2
- package/dist/{param-editor-B8Ff9Nm8.js.map → param-editor-CkDq623X.js.map} +1 -1
- package/dist/param-editor-field-DRgbnL7-.js +2809 -0
- package/dist/param-editor-field-DRgbnL7-.js.map +1 -0
- package/dist/rich-message-DARuDVOX.js +628 -0
- package/dist/{rich-message-DdFYRzTo.js.map → rich-message-DARuDVOX.js.map} +1 -1
- package/dist/rich-text.d.ts +2 -0
- package/dist/rich-text.js +48 -47
- package/dist/rich-text.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/terminal.d.ts +2 -0
- package/dist/terminal.js +1 -1
- package/dist/terminal.js.map +1 -1
- package/dist/theme/primitives/sizes.d.ts +9 -0
- package/dist/{theme-BH4fSst9.js → theme-B-l5_a6F.js} +69 -50
- package/dist/theme-B-l5_a6F.js.map +1 -0
- package/dist/theme-preference-Bpobguh4.js +114 -0
- package/dist/theme-preference-Bpobguh4.js.map +1 -0
- package/dist/theme.d.ts +2 -0
- package/dist/theme.js +1 -1
- package/dist/tree-list-AlO5ZmxQ.js +1262 -0
- package/dist/tree-list-AlO5ZmxQ.js.map +1 -0
- package/dist/utils/theme-preference.d.ts +4 -1
- package/dist/workspace-badge-BR_GgsAG.js +175 -0
- package/dist/workspace-badge-BR_GgsAG.js.map +1 -0
- package/package.json +5 -42
- package/dist/dialog-accept-shortcut-DAEBsoWW.js +0 -7
- package/dist/dialog-accept-shortcut-DAEBsoWW.js.map +0 -1
- package/dist/edit-mode-data-table-D6NeiDJx.js +0 -775
- package/dist/edit-mode-data-table-D6NeiDJx.js.map +0 -1
- package/dist/editor-config-D9OksZ93.js +0 -2416
- package/dist/editor-config-D9OksZ93.js.map +0 -1
- package/dist/kanban-renderer-toolbar-CpegGbwq.js.map +0 -1
- package/dist/lazy-markdown-editor-B7uP2ALS.js +0 -26
- package/dist/lazy-markdown-editor-B7uP2ALS.js.map +0 -1
- package/dist/list-row-9oxy-F0v.js +0 -796
- package/dist/list-row-9oxy-F0v.js.map +0 -1
- package/dist/monaco-browser-CO0NxK_Z.js +0 -19
- package/dist/monaco-browser-CO0NxK_Z.js.map +0 -1
- package/dist/number-input-WUfejtNx.js +0 -343
- package/dist/number-input-WUfejtNx.js.map +0 -1
- package/dist/param-editor-field-Cu4pto_a.js +0 -2845
- package/dist/param-editor-field-Cu4pto_a.js.map +0 -1
- package/dist/rich-message-DdFYRzTo.js +0 -658
- package/dist/theme-BH4fSst9.js.map +0 -1
- package/dist/theme-preference-DyymrYpR.js +0 -123
- package/dist/theme-preference-DyymrYpR.js.map +0 -1
- package/dist/tree-list-uV4UFj0x.js +0 -1116
- package/dist/tree-list-uV4UFj0x.js.map +0 -1
package/dist/terminal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.js","sources":["../src/components/terminal/bind-session.ts","../src/components/terminal/scripted-bridge.ts","../src/components/terminal/terminal-theme.ts","../src/components/terminal/use-terminal-session.ts","../src/components/terminal/terminal.tsx"],"sourcesContent":["import type { TerminalSessionAdapter } from \"./types\";\n\n/**\n * Minimal subset of xterm.js that the binding needs. Tests substitute a fake\n * sink so the wire-up logic can be exercised without a DOM.\n */\nexport interface TerminalSink {\n write(data: string | Uint8Array): void;\n onInput(handler: (data: string) => void): () => void;\n onResize(handler: (size: { cols: number; rows: number }) => void): () => void;\n}\n\nexport interface BindSessionOptions {\n /** Forwarded to the session when the user types in the sink. */\n onInput?: (data: string) => void;\n /** Called once the session exits; useful for surfacing status. */\n onExit?: (exit: { code: number | null; signal: string | null }) => void;\n /** Called on transport errors. */\n onError?: (error: { message: string }) => void;\n}\n\n/**\n * Wires a {@link TerminalSink} (typically xterm.js) to a\n * {@link TerminalSessionAdapter}. Returns a disposer that detaches every\n * subscription it created. The session itself is *not* killed — owning the\n * session lifecycle is the caller's responsibility.\n */\nexport const bindSessionToSink = (\n sink: TerminalSink,\n session: TerminalSessionAdapter,\n options: BindSessionOptions = {},\n) => {\n const disposers: Array<() => void> = [];\n\n disposers.push(session.onData((chunk) => sink.write(chunk)));\n\n disposers.push(\n sink.onInput((data) => {\n session.write(data);\n options.onInput?.(data);\n }),\n );\n\n disposers.push(\n sink.onResize(({ cols, rows }) => {\n session.resize(cols, rows);\n }),\n );\n\n if (options.onExit) disposers.push(session.onExit(options.onExit));\n if (options.onError) disposers.push(session.onError(options.onError));\n\n return () => {\n while (disposers.length > 0) {\n const dispose = disposers.pop();\n try {\n dispose?.();\n } catch {\n // Disposer errors during teardown are intentionally swallowed so a\n // partially-bound session still cleans up the remaining subscriptions.\n }\n }\n };\n};\n","import type { TerminalBridge, TerminalSessionAdapter, TerminalSessionError, TerminalSessionExit } from \"./types\";\n\nexport interface ScriptedTerminalStep {\n /** Bytes the host pushes back to the renderer (utf-8 string is encoded for you). */\n data?: string | Uint8Array;\n /** Milliseconds to wait before delivering this step. */\n delayMs?: number;\n /** Marks the session as exited after this step. */\n exit?: { code: number | null; signal?: string | null };\n /** Delivers a transport error after this step. */\n error?: string;\n}\n\nexport interface ScriptedBridgeOptions {\n /** Initial script delivered after the first data subscriber attaches. */\n initial?: ScriptedTerminalStep[];\n /**\n * Responds to user input. Return additional steps to play, or `undefined`\n * to ignore. Defaults to echoing the input followed by a newline.\n */\n onInput?: (input: string) => ScriptedTerminalStep[] | undefined;\n /** Called whenever the renderer requests a resize. */\n onResize?: (size: { cols: number; rows: number }) => void;\n /** Called once when the renderer kills the session. */\n onKill?: (signal?: string) => void;\n}\n\nconst encoder = new TextEncoder();\n\nconst toChunk = (data: string | Uint8Array) => (typeof data === \"string\" ? encoder.encode(data) : data);\n\nconst wait = (ms: number) => (ms > 0 ? new Promise<void>((resolve) => setTimeout(resolve, ms)) : Promise.resolve());\n\nconst defaultEcho = (input: string): ScriptedTerminalStep[] => [{ data: input.replace(/\\r/g, \"\\r\\n\") }];\n\ninterface SessionEmitter {\n isExited(): boolean;\n emitData(chunk: Uint8Array): void;\n emitExit(exit: TerminalSessionExit): void;\n emitError(error: TerminalSessionError): void;\n}\n\nconst runStep = (emitter: SessionEmitter, step: ScriptedTerminalStep) => {\n if (step.data !== undefined) emitter.emitData(toChunk(step.data));\n if (step.error !== undefined) emitter.emitError({ message: step.error });\n if (step.exit !== undefined) emitter.emitExit({ code: step.exit.code, signal: step.exit.signal ?? null });\n};\n\nconst playSteps = async (emitter: SessionEmitter, steps: ScriptedTerminalStep[]) => {\n for (const step of steps) {\n if (emitter.isExited()) return;\n await wait(step.delayMs ?? 0);\n if (emitter.isExited()) return;\n runStep(emitter, step);\n }\n};\n\nconst createScriptedSession = (\n options: ScriptedBridgeOptions,\n onInput: NonNullable<ScriptedBridgeOptions[\"onInput\"]>,\n) => {\n const dataHandlers = new Set<(chunk: Uint8Array) => void>();\n const exitHandlers = new Set<(exit: TerminalSessionExit) => void>();\n const errorHandlers = new Set<(error: TerminalSessionError) => void>();\n let exited = false;\n let startedInitial = false;\n\n const emitter: SessionEmitter = {\n isExited: () => exited,\n emitData(chunk) {\n for (const handler of dataHandlers) handler(chunk);\n },\n emitExit(exit) {\n if (exited) return;\n exited = true;\n for (const handler of exitHandlers) handler(exit);\n },\n emitError(error) {\n for (const handler of errorHandlers) handler(error);\n },\n };\n\n const session: TerminalSessionAdapter = {\n id: crypto.randomUUID(),\n write(data) {\n if (exited) return;\n const text = typeof data === \"string\" ? data : new TextDecoder().decode(data);\n const response = onInput(text);\n if (response) void playSteps(emitter, response);\n },\n resize(cols, rows) {\n options.onResize?.({ cols, rows });\n },\n kill(signal) {\n if (exited) return;\n options.onKill?.(signal);\n emitter.emitExit({ code: null, signal: signal ?? null });\n },\n onData(handler) {\n dataHandlers.add(handler);\n if (!startedInitial && options.initial) {\n startedInitial = true;\n void playSteps(emitter, options.initial);\n }\n return () => dataHandlers.delete(handler);\n },\n onExit(handler) {\n exitHandlers.add(handler);\n return () => exitHandlers.delete(handler);\n },\n onError(handler) {\n errorHandlers.add(handler);\n return () => errorHandlers.delete(handler);\n },\n };\n\n return { session };\n};\n\n/**\n * Deterministic in-memory bridge. Used by stories and tests to exercise the\n * terminal UI without a real PTY supervisor.\n */\nexport const createScriptedTerminalBridge = (options: ScriptedBridgeOptions = {}): TerminalBridge => {\n const onInput = options.onInput ?? defaultEcho;\n\n return {\n async openSession(_request) {\n const { session } = createScriptedSession(options, onInput);\n return session;\n },\n };\n};\n","import type { ITheme } from \"@xterm/xterm\";\n\n/**\n * xterm theme presets aligned with the workbench `bg.inverted` / `fg.inverted`\n * pairings so the terminal blends with the surrounding chrome without the\n * consuming extension touching xterm directly. Consumers can still pass any\n * `ITheme` they like via the `theme` prop.\n */\nexport type TerminalThemeName = \"light\" | \"dark\";\n\nconst baseTheme: Partial<ITheme> = {\n cursorAccent: \"#000000\",\n selectionForeground: undefined,\n};\n\nexport const lightTerminalTheme: ITheme = {\n ...baseTheme,\n background: \"#f4f4f5\",\n foreground: \"#171717\",\n cursor: \"#171717\",\n selectionBackground: \"#d4d4d8\",\n black: \"#27272a\",\n red: \"#dc2626\",\n green: \"#16a34a\",\n yellow: \"#ca8a04\",\n blue: \"#2563eb\",\n magenta: \"#c026d3\",\n cyan: \"#0891b2\",\n white: \"#e4e4e7\",\n brightBlack: \"#52525b\",\n brightRed: \"#ef4444\",\n brightGreen: \"#22c55e\",\n brightYellow: \"#eab308\",\n brightBlue: \"#3b82f6\",\n brightMagenta: \"#d946ef\",\n brightCyan: \"#06b6d4\",\n brightWhite: \"#fafafa\",\n};\n\nexport const darkTerminalTheme: ITheme = {\n ...baseTheme,\n background: \"#0a0a0a\",\n foreground: \"#fafafa\",\n cursor: \"#fafafa\",\n selectionBackground: \"#3f3f46\",\n black: \"#27272a\",\n red: \"#f87171\",\n green: \"#4ade80\",\n yellow: \"#facc15\",\n blue: \"#60a5fa\",\n magenta: \"#e879f9\",\n cyan: \"#22d3ee\",\n white: \"#e4e4e7\",\n brightBlack: \"#52525b\",\n brightRed: \"#fca5a5\",\n brightGreen: \"#86efac\",\n brightYellow: \"#fde047\",\n brightBlue: \"#93c5fd\",\n brightMagenta: \"#f0abfc\",\n brightCyan: \"#67e8f9\",\n brightWhite: \"#fafafa\",\n};\n\nexport const terminalThemes: Record<TerminalThemeName, ITheme> = {\n light: lightTerminalTheme,\n dark: darkTerminalTheme,\n};\n\nexport const resolveTerminalTheme = (theme: TerminalThemeName | ITheme | undefined) => {\n if (!theme) return terminalThemes.dark;\n if (typeof theme === \"string\") return terminalThemes[theme];\n return theme;\n};\n","import { useEffect, useState } from \"react\";\nimport type {\n TerminalBridge,\n TerminalSessionAdapter,\n TerminalSessionError,\n TerminalSessionExit,\n TerminalSessionRequest,\n} from \"./types\";\n\nexport type TerminalSessionStatus = \"idle\" | \"opening\" | \"open\" | \"exited\" | \"error\";\n\nexport interface UseTerminalSessionResult {\n session: TerminalSessionAdapter | null;\n status: TerminalSessionStatus;\n exit: TerminalSessionExit | null;\n error: TerminalSessionError | null;\n}\n\nexport interface UseTerminalSessionOptions {\n bridge: TerminalBridge | null;\n request: TerminalSessionRequest;\n /** Set to false to keep the session alive when the hook unmounts. */\n killOnUnmount?: boolean;\n}\n\nexport const createTerminalSessionRequestKey = (request: TerminalSessionRequest) =>\n JSON.stringify({\n command: request.command,\n cwd: request.cwd,\n env: request.env\n ? Object.fromEntries(Object.entries(request.env).sort(([left], [right]) => left.localeCompare(right)))\n : undefined,\n cols: request.cols,\n rows: request.rows,\n });\n\nconst readTerminalSessionRequestKey = (requestKey: string): TerminalSessionRequest => JSON.parse(requestKey);\n\n/**\n * Opens a terminal session via the provided bridge and surfaces its lifecycle\n * for the renderer. The session is killed on unmount unless explicitly opted\n * out; switching bridges or request contents triggers a fresh open.\n */\nexport const useTerminalSession = ({ bridge, request, killOnUnmount = true }: UseTerminalSessionOptions) => {\n const requestKey = createTerminalSessionRequestKey(request);\n const [state, setState] = useState<UseTerminalSessionResult>({\n session: null,\n status: \"idle\",\n exit: null,\n error: null,\n });\n\n useEffect(() => {\n if (!bridge) {\n setState({ session: null, status: \"idle\", exit: null, error: null });\n return;\n }\n\n let cancelled = false;\n let activeSession: TerminalSessionAdapter | null = null;\n let terminalState: TerminalSessionStatus = \"opening\";\n const disposers: Array<() => void> = [];\n\n setState({ session: null, status: \"opening\", exit: null, error: null });\n const requestSnapshot = readTerminalSessionRequestKey(requestKey);\n\n bridge\n .openSession(requestSnapshot)\n .then((session) => {\n if (cancelled) {\n void session.kill();\n return;\n }\n activeSession = session;\n disposers.push(\n session.onExit((exit) => {\n terminalState = \"exited\";\n setState((prev) => ({ ...prev, status: \"exited\", exit }));\n }),\n session.onError((error) => {\n terminalState = \"error\";\n setState((prev) => ({ ...prev, status: \"error\", error }));\n }),\n );\n terminalState = \"open\";\n setState({ session, status: \"open\", exit: null, error: null });\n })\n .catch((cause: unknown) => {\n if (cancelled) return;\n const message = cause instanceof Error ? cause.message : String(cause);\n terminalState = \"error\";\n setState({ session: null, status: \"error\", exit: null, error: { message } });\n });\n\n return () => {\n cancelled = true;\n while (disposers.length > 0) disposers.pop()?.();\n if (killOnUnmount && activeSession && terminalState !== \"exited\") void activeSession.kill();\n };\n }, [bridge, requestKey, killOnUnmount]);\n\n return state;\n};\n","import { FitAddon } from \"@xterm/addon-fit\";\nimport type { ITheme } from \"@xterm/xterm\";\nimport { Terminal as Xterm } from \"@xterm/xterm\";\nimport \"@xterm/xterm/css/xterm.css\";\nimport \"./terminal.css\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { bindSessionToSink, type TerminalSink } from \"./bind-session\";\nimport { resolveTerminalTheme, type TerminalThemeName } from \"./terminal-theme\";\nimport type { TerminalBridge, TerminalSessionAdapter, TerminalSessionRequest } from \"./types\";\nimport { useTerminalSession } from \"./use-terminal-session\";\n\nconst DEFAULT_FONT_FAMILY = '\"JetBrains Mono\", \"Fira Code\", Menlo, Consolas, monospace';\nconst DEFAULT_FONT_SIZE = 13;\nconst DEFAULT_COLS = 80;\nconst DEFAULT_ROWS = 24;\n\nexport const createInitialTerminalSessionRequest = (\n request?: Partial<TerminalSessionRequest>,\n): TerminalSessionRequest => ({\n ...request,\n cols: request?.cols ?? DEFAULT_COLS,\n rows: request?.rows ?? DEFAULT_ROWS,\n});\n\nexport const createTerminalSink = (xterm: Pick<Xterm, \"write\" | \"onData\" | \"onResize\">) => {\n const inputHandlers = new Set<(data: string) => void>();\n const pendingInput: string[] = [];\n const inputDisposable = xterm.onData((data) => {\n if (inputHandlers.size === 0) {\n pendingInput.push(data);\n return;\n }\n for (const handler of inputHandlers) handler(data);\n });\n\n return {\n write(data: string | Uint8Array) {\n xterm.write(data);\n },\n onInput(handler: (data: string) => void) {\n inputHandlers.add(handler);\n while (pendingInput.length > 0) handler(pendingInput.shift() as string);\n return () => inputHandlers.delete(handler);\n },\n onResize(handler: (size: { cols: number; rows: number }) => void) {\n const disposable = xterm.onResize(handler);\n return () => disposable.dispose();\n },\n dispose() {\n inputDisposable.dispose();\n inputHandlers.clear();\n pendingInput.length = 0;\n },\n } satisfies TerminalSink & { dispose(): void };\n};\n\nconst fitTerminal = (fit: FitAddon | null) => {\n try {\n fit?.fit();\n } catch {\n // fit() throws if the container has zero size (e.g. hidden via CSS).\n }\n};\n\nexport const resizeSessionToTerminalGeometry = (\n terminal: Pick<Xterm, \"cols\" | \"rows\">,\n session: Pick<TerminalSessionAdapter, \"resize\">,\n) => {\n session.resize(terminal.cols, terminal.rows);\n};\n\nexport const bindTerminalSession = (\n terminal: Pick<Xterm, \"cols\" | \"rows\">,\n sink: TerminalSink,\n session: TerminalSessionAdapter,\n options: Pick<TerminalProps, \"onSessionOpen\" | \"onSessionExit\">,\n) => {\n const unbind = bindSessionToSink(sink, session, {\n onExit: options.onSessionExit,\n });\n resizeSessionToTerminalGeometry(terminal, session);\n options.onSessionOpen?.(session.id);\n return unbind;\n};\n\nexport interface TerminalSessionCallbackRefs {\n onSessionOpen: React.RefObject<TerminalProps[\"onSessionOpen\"]>;\n onSessionExit: React.RefObject<TerminalProps[\"onSessionExit\"]>;\n}\n\nexport const bindTerminalSessionWithCallbackRefs = (\n terminal: Pick<Xterm, \"cols\" | \"rows\">,\n sink: TerminalSink,\n session: TerminalSessionAdapter,\n callbackRefs: TerminalSessionCallbackRefs,\n) =>\n bindTerminalSession(terminal, sink, session, {\n onSessionOpen: (sessionId) => callbackRefs.onSessionOpen.current?.(sessionId),\n onSessionExit: (exit) => callbackRefs.onSessionExit.current?.(exit),\n });\n\nexport interface TerminalProps {\n /** Bridge adapter the component opens its session through. */\n bridge: TerminalBridge;\n /**\n * Optional initial session request overrides. `cols`/`rows` default to\n * 80x24; container resizes are forwarded after the session opens.\n */\n request?: Partial<TerminalSessionRequest>;\n /** Theme preset name or full xterm theme. */\n theme?: TerminalThemeName | ITheme;\n /** Monospace font family. */\n fontFamily?: string;\n fontSize?: number;\n /** Whether to kill the session when the component unmounts. Defaults to true. */\n killOnUnmount?: boolean;\n /** Focus the terminal while it is the active surface. Defaults to true. */\n autoFocus?: boolean;\n /** Forwarded to the container element. */\n className?: string;\n style?: React.CSSProperties;\n /** Called once the session is open; useful for imperative refs. */\n onSessionOpen?: (sessionId: string) => void;\n /** Called once the session exits. */\n onSessionExit?: (exit: { code: number | null; signal: string | null }) => void;\n}\n\n/**\n * High-level terminal component. Mounts xterm.js inside a `<div>` and binds it\n * to the session opened from `bridge.openSession(...)`. Resize is driven by\n * `ResizeObserver` so the terminal fills its container and the host PTY\n * geometry stays in sync.\n */\nexport const Terminal = (props: TerminalProps) => {\n const {\n bridge,\n request,\n theme,\n fontFamily = DEFAULT_FONT_FAMILY,\n fontSize = DEFAULT_FONT_SIZE,\n killOnUnmount = true,\n autoFocus = true,\n className,\n style,\n onSessionOpen,\n onSessionExit,\n } = props;\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const xtermRef = useRef<Xterm | null>(null);\n const fitRef = useRef<FitAddon | null>(null);\n const sinkRef = useRef<ReturnType<typeof createTerminalSink> | null>(null);\n const [terminalReady, setTerminalReady] = useState(false);\n const initialSessionRequestRef = useRef<TerminalSessionRequest | null>(null);\n const onSessionOpenRef = useRef(onSessionOpen);\n const onSessionExitRef = useRef(onSessionExit);\n\n onSessionOpenRef.current = onSessionOpen;\n onSessionExitRef.current = onSessionExit;\n\n if (!initialSessionRequestRef.current) {\n initialSessionRequestRef.current = createInitialTerminalSessionRequest(request);\n }\n\n const resolvedTheme = resolveTerminalTheme(theme);\n\n // Mount xterm once on the container. Theme, font, and size updates flow\n // through the dedicated options-sync effect below to avoid a full remount on\n // every prop change.\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n let xterm: Xterm | undefined;\n let sink: ReturnType<typeof createTerminalSink> | undefined;\n let measureAnimationFrame: number | undefined;\n let measureTimeout: number | undefined;\n let observer: ResizeObserver | undefined;\n\n // Deferring construction skips React Strict Mode's disposable probe mount.\n // xterm schedules internal viewport work during construction that otherwise\n // runs after the probe instance has already been disposed.\n const initializationFrame = window.requestAnimationFrame(() => {\n xterm = new Xterm({\n cols: DEFAULT_COLS,\n rows: DEFAULT_ROWS,\n cursorBlink: true,\n convertEol: true,\n allowProposedApi: true,\n });\n const fit = new FitAddon();\n xterm.loadAddon(fit);\n xterm.open(container);\n sink = createTerminalSink(xterm);\n\n xtermRef.current = xterm;\n fitRef.current = fit;\n sinkRef.current = sink;\n\n const measure = () => fitTerminal(fit);\n measure();\n measureAnimationFrame = window.requestAnimationFrame(measure);\n measureTimeout = window.setTimeout(measure, 50);\n observer = new ResizeObserver(measure);\n observer.observe(container);\n setTerminalReady(true);\n });\n\n return () => {\n window.cancelAnimationFrame(initializationFrame);\n if (measureAnimationFrame !== undefined) window.cancelAnimationFrame(measureAnimationFrame);\n if (measureTimeout !== undefined) window.clearTimeout(measureTimeout);\n observer?.disconnect();\n sink?.dispose();\n xterm?.dispose();\n xtermRef.current = null;\n fitRef.current = null;\n sinkRef.current = null;\n };\n }, []);\n\n useEffect(() => {\n if (!terminalReady) return;\n const xterm = xtermRef.current;\n if (!xterm) return;\n xterm.options.theme = resolvedTheme;\n xterm.options.fontFamily = fontFamily;\n xterm.options.fontSize = fontSize;\n fitTerminal(fitRef.current);\n }, [terminalReady, resolvedTheme, fontFamily, fontSize]);\n\n const { session } = useTerminalSession({ bridge, request: initialSessionRequestRef.current, killOnUnmount });\n\n useEffect(() => {\n if (!terminalReady) return;\n const xterm = xtermRef.current;\n const sink = sinkRef.current;\n if (!xterm || !sink || !session) return;\n fitTerminal(fitRef.current);\n const animationFrame = window.requestAnimationFrame(() => fitTerminal(fitRef.current));\n const unbind = bindTerminalSessionWithCallbackRefs(xterm, sink, session, {\n onSessionOpen: onSessionOpenRef,\n onSessionExit: onSessionExitRef,\n });\n return () => {\n window.cancelAnimationFrame(animationFrame);\n unbind();\n };\n }, [session, terminalReady]);\n\n useEffect(() => {\n if (terminalReady && autoFocus) xtermRef.current?.focus();\n }, [autoFocus, terminalReady]);\n\n // The mount element fills its box absolutely so xterm sizes to the panel\n // rather than growing it: inside a scrollable host, a self-sized terminal\n // would define its own height and never fit, leaving the host to scroll it.\n return (\n <div\n className={className}\n style={{\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n backgroundColor: typeof resolvedTheme.background === \"string\" ? resolvedTheme.background : undefined,\n ...style,\n }}\n >\n <div ref={containerRef} className=\"pstdio-terminal\" style={{ position: \"absolute\", inset: 0 }} />\n </div>\n );\n};\n"],"names":["bindSessionToSink","sink","session","options","disposers","push","onData","chunk","write","onInput","data","onResize","cols","rows","resize","onExit","onError","length","dispose","pop","encoder","TextEncoder","toChunk","encode","wait","ms","Promise","resolve","setTimeout","defaultEcho","input","replace","runStep","emitter","step","undefined","emitData","error","emitError","message","exit","emitExit","code","signal","playSteps","steps","isExited","delayMs","createScriptedSession","dataHandlers","Set","exitHandlers","errorHandlers","exited","startedInitial","handler","id","crypto","randomUUID","text","TextDecoder","decode","response","kill","onKill","add","initial","delete","createScriptedTerminalBridge","openSession","_request","baseTheme","cursorAccent","selectionForeground","lightTerminalTheme","background","foreground","cursor","selectionBackground","black","red","green","yellow","blue","magenta","cyan","white","brightBlack","brightRed","brightGreen","brightYellow","brightBlue","brightMagenta","brightCyan","brightWhite","darkTerminalTheme","terminalThemes","light","dark","resolveTerminalTheme","theme","createTerminalSessionRequestKey","request","JSON","stringify","command","cwd","env","Object","fromEntries","entries","sort","left","right","localeCompare","readTerminalSessionRequestKey","requestKey","parse","useTerminalSession","t0","$","_c","bridge","killOnUnmount","t1","t2","t3","Symbol","for","status","state","setState","useState","t4","t5","cancelled","activeSession","terminalState","requestSnapshot","then","prev","prev_0","catch","cause","Error","String","useEffect","DEFAULT_FONT_FAMILY","DEFAULT_FONT_SIZE","DEFAULT_COLS","DEFAULT_ROWS","createInitialTerminalSessionRequest","createTerminalSink","xterm","inputHandlers","pendingInput","inputDisposable","size","shift","disposable","clear","fitTerminal","fit","resizeSessionToTerminalGeometry","terminal","bindTerminalSession","unbind","onSessionExit","onSessionOpen","bindTerminalSessionWithCallbackRefs","callbackRefs","sessionId","current","Terminal","props","fontFamily","fontSize","autoFocus","className","style","containerRef","useRef","xtermRef","fitRef","sinkRef","terminalReady","setTerminalReady","initialSessionRequestRef","onSessionOpenRef","onSessionExitRef","resolvedTheme","container","measureAnimationFrame","measureTimeout","observer","initializationFrame","window","requestAnimationFrame","Xterm","cursorBlink","convertEol","allowProposedApi","FitAddon","loadAddon","open","measure","ResizeObserver","observe","cancelAnimationFrame","clearTimeout","disconnect","animationFrame","focus","jsx","position","width","height","backgroundColor","inset"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"terminal.js","sources":["../src/components/terminal/bind-session.ts","../src/components/terminal/scripted-bridge.ts","../src/components/terminal/terminal-theme.ts","../src/components/terminal/use-terminal-session.ts","../src/components/terminal/terminal.tsx"],"sourcesContent":["import type { TerminalSessionAdapter } from \"./types\";\n\n/**\n * Minimal subset of xterm.js that the binding needs. Tests substitute a fake\n * sink so the wire-up logic can be exercised without a DOM.\n */\nexport interface TerminalSink {\n write(data: string | Uint8Array): void;\n onInput(handler: (data: string) => void): () => void;\n onResize(handler: (size: { cols: number; rows: number }) => void): () => void;\n}\n\nexport interface BindSessionOptions {\n /** Forwarded to the session when the user types in the sink. */\n onInput?: (data: string) => void;\n /** Called once the session exits; useful for surfacing status. */\n onExit?: (exit: { code: number | null; signal: string | null }) => void;\n /** Called on transport errors. */\n onError?: (error: { message: string }) => void;\n}\n\n/**\n * Wires a {@link TerminalSink} (typically xterm.js) to a\n * {@link TerminalSessionAdapter}. Returns a disposer that detaches every\n * subscription it created. The session itself is *not* killed — owning the\n * session lifecycle is the caller's responsibility.\n */\nexport const bindSessionToSink = (\n sink: TerminalSink,\n session: TerminalSessionAdapter,\n options: BindSessionOptions = {},\n) => {\n const disposers: Array<() => void> = [];\n\n disposers.push(session.onData((chunk) => sink.write(chunk)));\n\n disposers.push(\n sink.onInput((data) => {\n session.write(data);\n options.onInput?.(data);\n }),\n );\n\n disposers.push(\n sink.onResize(({ cols, rows }) => {\n session.resize(cols, rows);\n }),\n );\n\n if (options.onExit) disposers.push(session.onExit(options.onExit));\n if (options.onError) disposers.push(session.onError(options.onError));\n\n return () => {\n while (disposers.length > 0) {\n const dispose = disposers.pop();\n try {\n dispose?.();\n } catch {\n // Disposer errors during teardown are intentionally swallowed so a\n // partially-bound session still cleans up the remaining subscriptions.\n }\n }\n };\n};\n","import type { TerminalBridge, TerminalSessionAdapter, TerminalSessionError, TerminalSessionExit } from \"./types\";\n\nexport interface ScriptedTerminalStep {\n /** Bytes the host pushes back to the renderer (utf-8 string is encoded for you). */\n data?: string | Uint8Array;\n /** Milliseconds to wait before delivering this step. */\n delayMs?: number;\n /** Marks the session as exited after this step. */\n exit?: { code: number | null; signal?: string | null };\n /** Delivers a transport error after this step. */\n error?: string;\n}\n\nexport interface ScriptedBridgeOptions {\n /** Initial script delivered after the first data subscriber attaches. */\n initial?: ScriptedTerminalStep[];\n /**\n * Responds to user input. Return additional steps to play, or `undefined`\n * to ignore. Defaults to echoing the input followed by a newline.\n */\n onInput?: (input: string) => ScriptedTerminalStep[] | undefined;\n /** Called whenever the renderer requests a resize. */\n onResize?: (size: { cols: number; rows: number }) => void;\n /** Called once when the renderer kills the session. */\n onKill?: (signal?: string) => void;\n}\n\nconst encoder = new TextEncoder();\n\nconst toChunk = (data: string | Uint8Array) => (typeof data === \"string\" ? encoder.encode(data) : data);\n\nconst wait = (ms: number) => (ms > 0 ? new Promise<void>((resolve) => setTimeout(resolve, ms)) : Promise.resolve());\n\nconst defaultEcho = (input: string): ScriptedTerminalStep[] => [{ data: input.replace(/\\r/g, \"\\r\\n\") }];\n\ninterface SessionEmitter {\n isExited(): boolean;\n emitData(chunk: Uint8Array): void;\n emitExit(exit: TerminalSessionExit): void;\n emitError(error: TerminalSessionError): void;\n}\n\nconst runStep = (emitter: SessionEmitter, step: ScriptedTerminalStep) => {\n if (step.data !== undefined) emitter.emitData(toChunk(step.data));\n if (step.error !== undefined) emitter.emitError({ message: step.error });\n if (step.exit !== undefined) emitter.emitExit({ code: step.exit.code, signal: step.exit.signal ?? null });\n};\n\nconst playSteps = async (emitter: SessionEmitter, steps: ScriptedTerminalStep[]) => {\n for (const step of steps) {\n if (emitter.isExited()) return;\n await wait(step.delayMs ?? 0);\n if (emitter.isExited()) return;\n runStep(emitter, step);\n }\n};\n\nconst createScriptedSession = (\n options: ScriptedBridgeOptions,\n onInput: NonNullable<ScriptedBridgeOptions[\"onInput\"]>,\n) => {\n const dataHandlers = new Set<(chunk: Uint8Array) => void>();\n const exitHandlers = new Set<(exit: TerminalSessionExit) => void>();\n const errorHandlers = new Set<(error: TerminalSessionError) => void>();\n let exited = false;\n let startedInitial = false;\n\n const emitter: SessionEmitter = {\n isExited: () => exited,\n emitData(chunk) {\n for (const handler of dataHandlers) handler(chunk);\n },\n emitExit(exit) {\n if (exited) return;\n exited = true;\n for (const handler of exitHandlers) handler(exit);\n },\n emitError(error) {\n for (const handler of errorHandlers) handler(error);\n },\n };\n\n const session: TerminalSessionAdapter = {\n id: crypto.randomUUID(),\n write(data) {\n if (exited) return;\n const text = typeof data === \"string\" ? data : new TextDecoder().decode(data);\n const response = onInput(text);\n if (response) void playSteps(emitter, response);\n },\n resize(cols, rows) {\n options.onResize?.({ cols, rows });\n },\n kill(signal) {\n if (exited) return;\n options.onKill?.(signal);\n emitter.emitExit({ code: null, signal: signal ?? null });\n },\n onData(handler) {\n dataHandlers.add(handler);\n if (!startedInitial && options.initial) {\n startedInitial = true;\n void playSteps(emitter, options.initial);\n }\n return () => dataHandlers.delete(handler);\n },\n onExit(handler) {\n exitHandlers.add(handler);\n return () => exitHandlers.delete(handler);\n },\n onError(handler) {\n errorHandlers.add(handler);\n return () => errorHandlers.delete(handler);\n },\n };\n\n return { session };\n};\n\n/**\n * Deterministic in-memory bridge. Used by stories and tests to exercise the\n * terminal UI without a real PTY supervisor.\n */\nexport const createScriptedTerminalBridge = (options: ScriptedBridgeOptions = {}): TerminalBridge => {\n const onInput = options.onInput ?? defaultEcho;\n\n return {\n async openSession(_request) {\n const { session } = createScriptedSession(options, onInput);\n return session;\n },\n };\n};\n","import type { ITheme } from \"@xterm/xterm\";\n\n/**\n * xterm theme presets aligned with the workbench `bg.inverted` / `fg.inverted`\n * pairings so the terminal blends with the surrounding chrome without the\n * consuming extension touching xterm directly. Consumers can still pass any\n * `ITheme` they like via the `theme` prop.\n */\nexport type TerminalThemeName = \"light\" | \"dark\";\n\nconst baseTheme: Partial<ITheme> = {\n cursorAccent: \"#000000\",\n selectionForeground: undefined,\n};\n\nexport const lightTerminalTheme: ITheme = {\n ...baseTheme,\n background: \"#f4f4f5\",\n foreground: \"#171717\",\n cursor: \"#171717\",\n selectionBackground: \"#d4d4d8\",\n black: \"#27272a\",\n red: \"#dc2626\",\n green: \"#16a34a\",\n yellow: \"#ca8a04\",\n blue: \"#2563eb\",\n magenta: \"#c026d3\",\n cyan: \"#0891b2\",\n white: \"#e4e4e7\",\n brightBlack: \"#52525b\",\n brightRed: \"#ef4444\",\n brightGreen: \"#22c55e\",\n brightYellow: \"#eab308\",\n brightBlue: \"#3b82f6\",\n brightMagenta: \"#d946ef\",\n brightCyan: \"#06b6d4\",\n brightWhite: \"#fafafa\",\n};\n\nexport const darkTerminalTheme: ITheme = {\n ...baseTheme,\n background: \"#0a0a0a\",\n foreground: \"#fafafa\",\n cursor: \"#fafafa\",\n selectionBackground: \"#3f3f46\",\n black: \"#27272a\",\n red: \"#f87171\",\n green: \"#4ade80\",\n yellow: \"#facc15\",\n blue: \"#60a5fa\",\n magenta: \"#e879f9\",\n cyan: \"#22d3ee\",\n white: \"#e4e4e7\",\n brightBlack: \"#52525b\",\n brightRed: \"#fca5a5\",\n brightGreen: \"#86efac\",\n brightYellow: \"#fde047\",\n brightBlue: \"#93c5fd\",\n brightMagenta: \"#f0abfc\",\n brightCyan: \"#67e8f9\",\n brightWhite: \"#fafafa\",\n};\n\nexport const terminalThemes: Record<TerminalThemeName, ITheme> = {\n light: lightTerminalTheme,\n dark: darkTerminalTheme,\n};\n\nexport const resolveTerminalTheme = (theme: TerminalThemeName | ITheme | undefined) => {\n if (!theme) return terminalThemes.dark;\n if (typeof theme === \"string\") return terminalThemes[theme];\n return theme;\n};\n","import { useEffect, useState } from \"react\";\nimport type {\n TerminalBridge,\n TerminalSessionAdapter,\n TerminalSessionError,\n TerminalSessionExit,\n TerminalSessionRequest,\n} from \"./types\";\n\nexport type TerminalSessionStatus = \"idle\" | \"opening\" | \"open\" | \"exited\" | \"error\";\n\nexport interface UseTerminalSessionResult {\n session: TerminalSessionAdapter | null;\n status: TerminalSessionStatus;\n exit: TerminalSessionExit | null;\n error: TerminalSessionError | null;\n}\n\nexport interface UseTerminalSessionOptions {\n bridge: TerminalBridge | null;\n request: TerminalSessionRequest;\n /** Set to false to keep the session alive when the hook unmounts. */\n killOnUnmount?: boolean;\n}\n\nexport const createTerminalSessionRequestKey = (request: TerminalSessionRequest) =>\n JSON.stringify({\n command: request.command,\n cwd: request.cwd,\n env: request.env\n ? Object.fromEntries(Object.entries(request.env).sort(([left], [right]) => left.localeCompare(right)))\n : undefined,\n cols: request.cols,\n rows: request.rows,\n });\n\nconst readTerminalSessionRequestKey = (requestKey: string): TerminalSessionRequest => JSON.parse(requestKey);\n\n/**\n * Opens a terminal session via the provided bridge and surfaces its lifecycle\n * for the renderer. The session is killed on unmount unless explicitly opted\n * out; switching bridges or request contents triggers a fresh open.\n */\nexport const useTerminalSession = ({ bridge, request, killOnUnmount = true }: UseTerminalSessionOptions) => {\n const requestKey = createTerminalSessionRequestKey(request);\n const [state, setState] = useState<UseTerminalSessionResult>({\n session: null,\n status: \"idle\",\n exit: null,\n error: null,\n });\n\n useEffect(() => {\n if (!bridge) {\n setState({ session: null, status: \"idle\", exit: null, error: null });\n return;\n }\n\n let cancelled = false;\n let activeSession: TerminalSessionAdapter | null = null;\n let terminalState: TerminalSessionStatus = \"opening\";\n const disposers: Array<() => void> = [];\n\n setState({ session: null, status: \"opening\", exit: null, error: null });\n const requestSnapshot = readTerminalSessionRequestKey(requestKey);\n\n bridge\n .openSession(requestSnapshot)\n .then((session) => {\n if (cancelled) {\n if (killOnUnmount) void session.kill();\n return;\n }\n activeSession = session;\n disposers.push(\n session.onExit((exit) => {\n terminalState = \"exited\";\n setState((prev) => ({ ...prev, status: \"exited\", exit }));\n }),\n session.onError((error) => {\n terminalState = \"error\";\n setState((prev) => ({ ...prev, status: \"error\", error }));\n }),\n );\n terminalState = \"open\";\n setState({ session, status: \"open\", exit: null, error: null });\n })\n .catch((cause: unknown) => {\n if (cancelled) return;\n const message = cause instanceof Error ? cause.message : String(cause);\n terminalState = \"error\";\n setState({ session: null, status: \"error\", exit: null, error: { message } });\n });\n\n return () => {\n cancelled = true;\n while (disposers.length > 0) disposers.pop()?.();\n if (killOnUnmount && activeSession && terminalState !== \"exited\") void activeSession.kill();\n };\n }, [bridge, requestKey, killOnUnmount]);\n\n return state;\n};\n","import { FitAddon } from \"@xterm/addon-fit\";\nimport type { ITheme } from \"@xterm/xterm\";\nimport { Terminal as Xterm } from \"@xterm/xterm\";\nimport \"@xterm/xterm/css/xterm.css\";\nimport \"./terminal.css\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { bindSessionToSink, type TerminalSink } from \"./bind-session\";\nimport { resolveTerminalTheme, type TerminalThemeName } from \"./terminal-theme\";\nimport type { TerminalBridge, TerminalSessionAdapter, TerminalSessionRequest } from \"./types\";\nimport { useTerminalSession } from \"./use-terminal-session\";\n\nconst DEFAULT_FONT_FAMILY = '\"JetBrains Mono\", \"Fira Code\", Menlo, Consolas, monospace';\nconst DEFAULT_FONT_SIZE = 13;\nconst DEFAULT_COLS = 80;\nconst DEFAULT_ROWS = 24;\n\nexport const createInitialTerminalSessionRequest = (\n request?: Partial<TerminalSessionRequest>,\n): TerminalSessionRequest => ({\n ...request,\n cols: request?.cols ?? DEFAULT_COLS,\n rows: request?.rows ?? DEFAULT_ROWS,\n});\n\nexport const createTerminalSink = (xterm: Pick<Xterm, \"write\" | \"onData\" | \"onResize\">) => {\n const inputHandlers = new Set<(data: string) => void>();\n const pendingInput: string[] = [];\n const inputDisposable = xterm.onData((data) => {\n if (inputHandlers.size === 0) {\n pendingInput.push(data);\n return;\n }\n for (const handler of inputHandlers) handler(data);\n });\n\n return {\n write(data: string | Uint8Array) {\n xterm.write(data);\n },\n onInput(handler: (data: string) => void) {\n inputHandlers.add(handler);\n while (pendingInput.length > 0) handler(pendingInput.shift() as string);\n return () => inputHandlers.delete(handler);\n },\n onResize(handler: (size: { cols: number; rows: number }) => void) {\n const disposable = xterm.onResize(handler);\n return () => disposable.dispose();\n },\n dispose() {\n inputDisposable.dispose();\n inputHandlers.clear();\n pendingInput.length = 0;\n },\n } satisfies TerminalSink & { dispose(): void };\n};\n\nconst fitTerminal = (fit: FitAddon | null) => {\n try {\n fit?.fit();\n } catch {\n // fit() throws if the container has zero size (e.g. hidden via CSS).\n }\n};\n\nexport const resizeSessionToTerminalGeometry = (\n terminal: Pick<Xterm, \"cols\" | \"rows\">,\n session: Pick<TerminalSessionAdapter, \"resize\">,\n) => {\n session.resize(terminal.cols, terminal.rows);\n};\n\nexport const bindTerminalSession = (\n terminal: Pick<Xterm, \"cols\" | \"rows\">,\n sink: TerminalSink,\n session: TerminalSessionAdapter,\n options: Pick<TerminalProps, \"onSessionOpen\" | \"onSessionExit\">,\n) => {\n const unbind = bindSessionToSink(sink, session, {\n onExit: options.onSessionExit,\n });\n resizeSessionToTerminalGeometry(terminal, session);\n options.onSessionOpen?.(session.id);\n return unbind;\n};\n\nexport interface TerminalSessionCallbackRefs {\n onSessionOpen: React.RefObject<TerminalProps[\"onSessionOpen\"]>;\n onSessionExit: React.RefObject<TerminalProps[\"onSessionExit\"]>;\n}\n\nexport const bindTerminalSessionWithCallbackRefs = (\n terminal: Pick<Xterm, \"cols\" | \"rows\">,\n sink: TerminalSink,\n session: TerminalSessionAdapter,\n callbackRefs: TerminalSessionCallbackRefs,\n) =>\n bindTerminalSession(terminal, sink, session, {\n onSessionOpen: (sessionId) => callbackRefs.onSessionOpen.current?.(sessionId),\n onSessionExit: (exit) => callbackRefs.onSessionExit.current?.(exit),\n });\n\nexport interface TerminalProps {\n /** Bridge adapter the component opens its session through. */\n bridge: TerminalBridge;\n /**\n * Optional initial session request overrides. `cols`/`rows` default to\n * 80x24; container resizes are forwarded after the session opens.\n */\n request?: Partial<TerminalSessionRequest>;\n /** Theme preset name or full xterm theme. */\n theme?: TerminalThemeName | ITheme;\n /** Monospace font family. */\n fontFamily?: string;\n fontSize?: number;\n /** Whether to kill the session when the component unmounts. Defaults to true. */\n killOnUnmount?: boolean;\n /** Focus the terminal while it is the active surface. Defaults to true. */\n autoFocus?: boolean;\n /** Forwarded to the container element. */\n className?: string;\n style?: React.CSSProperties;\n /** Called once the session is open; useful for imperative refs. */\n onSessionOpen?: (sessionId: string) => void;\n /** Called once the session exits. */\n onSessionExit?: (exit: { code: number | null; signal: string | null }) => void;\n}\n\n/**\n * High-level terminal component. Mounts xterm.js inside a `<div>` and binds it\n * to the session opened from `bridge.openSession(...)`. Resize is driven by\n * `ResizeObserver` so the terminal fills its container and the host PTY\n * geometry stays in sync.\n */\nexport const Terminal = (props: TerminalProps) => {\n const {\n bridge,\n request,\n theme,\n fontFamily = DEFAULT_FONT_FAMILY,\n fontSize = DEFAULT_FONT_SIZE,\n killOnUnmount = true,\n autoFocus = true,\n className,\n style,\n onSessionOpen,\n onSessionExit,\n } = props;\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const xtermRef = useRef<Xterm | null>(null);\n const fitRef = useRef<FitAddon | null>(null);\n const sinkRef = useRef<ReturnType<typeof createTerminalSink> | null>(null);\n const [terminalReady, setTerminalReady] = useState(false);\n const initialSessionRequestRef = useRef<TerminalSessionRequest | null>(null);\n const onSessionOpenRef = useRef(onSessionOpen);\n const onSessionExitRef = useRef(onSessionExit);\n\n onSessionOpenRef.current = onSessionOpen;\n onSessionExitRef.current = onSessionExit;\n\n if (!initialSessionRequestRef.current) {\n initialSessionRequestRef.current = createInitialTerminalSessionRequest(request);\n }\n\n const resolvedTheme = resolveTerminalTheme(theme);\n\n // Mount xterm once on the container. Theme, font, and size updates flow\n // through the dedicated options-sync effect below to avoid a full remount on\n // every prop change.\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n let xterm: Xterm | undefined;\n let sink: ReturnType<typeof createTerminalSink> | undefined;\n let measureAnimationFrame: number | undefined;\n let measureTimeout: number | undefined;\n let observer: ResizeObserver | undefined;\n\n // Deferring construction skips React Strict Mode's disposable probe mount.\n // xterm schedules internal viewport work during construction that otherwise\n // runs after the probe instance has already been disposed.\n const initializationFrame = window.requestAnimationFrame(() => {\n xterm = new Xterm({\n cols: DEFAULT_COLS,\n rows: DEFAULT_ROWS,\n cursorBlink: true,\n convertEol: true,\n allowProposedApi: true,\n });\n const fit = new FitAddon();\n xterm.loadAddon(fit);\n xterm.open(container);\n sink = createTerminalSink(xterm);\n\n xtermRef.current = xterm;\n fitRef.current = fit;\n sinkRef.current = sink;\n\n const measure = () => fitTerminal(fit);\n measure();\n measureAnimationFrame = window.requestAnimationFrame(measure);\n measureTimeout = window.setTimeout(measure, 50);\n observer = new ResizeObserver(measure);\n observer.observe(container);\n setTerminalReady(true);\n });\n\n return () => {\n window.cancelAnimationFrame(initializationFrame);\n if (measureAnimationFrame !== undefined) window.cancelAnimationFrame(measureAnimationFrame);\n if (measureTimeout !== undefined) window.clearTimeout(measureTimeout);\n observer?.disconnect();\n sink?.dispose();\n xterm?.dispose();\n xtermRef.current = null;\n fitRef.current = null;\n sinkRef.current = null;\n };\n }, []);\n\n useEffect(() => {\n if (!terminalReady) return;\n const xterm = xtermRef.current;\n if (!xterm) return;\n xterm.options.theme = resolvedTheme;\n xterm.options.fontFamily = fontFamily;\n xterm.options.fontSize = fontSize;\n fitTerminal(fitRef.current);\n }, [terminalReady, resolvedTheme, fontFamily, fontSize]);\n\n const { session } = useTerminalSession({ bridge, request: initialSessionRequestRef.current, killOnUnmount });\n\n useEffect(() => {\n if (!terminalReady) return;\n const xterm = xtermRef.current;\n const sink = sinkRef.current;\n if (!xterm || !sink || !session) return;\n fitTerminal(fitRef.current);\n const animationFrame = window.requestAnimationFrame(() => fitTerminal(fitRef.current));\n const unbind = bindTerminalSessionWithCallbackRefs(xterm, sink, session, {\n onSessionOpen: onSessionOpenRef,\n onSessionExit: onSessionExitRef,\n });\n return () => {\n window.cancelAnimationFrame(animationFrame);\n unbind();\n };\n }, [session, terminalReady]);\n\n useEffect(() => {\n if (terminalReady && autoFocus) xtermRef.current?.focus();\n }, [autoFocus, terminalReady]);\n\n // The mount element fills its box absolutely so xterm sizes to the panel\n // rather than growing it: inside a scrollable host, a self-sized terminal\n // would define its own height and never fit, leaving the host to scroll it.\n return (\n <div\n className={className}\n style={{\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n backgroundColor: typeof resolvedTheme.background === \"string\" ? resolvedTheme.background : undefined,\n ...style,\n }}\n >\n <div ref={containerRef} className=\"pstdio-terminal\" style={{ position: \"absolute\", inset: 0 }} />\n </div>\n );\n};\n"],"names":["bindSessionToSink","sink","session","options","disposers","push","onData","chunk","write","onInput","data","onResize","cols","rows","resize","onExit","onError","length","dispose","pop","encoder","TextEncoder","toChunk","encode","wait","ms","Promise","resolve","setTimeout","defaultEcho","input","replace","runStep","emitter","step","undefined","emitData","error","emitError","message","exit","emitExit","code","signal","playSteps","steps","isExited","delayMs","createScriptedSession","dataHandlers","Set","exitHandlers","errorHandlers","exited","startedInitial","handler","id","crypto","randomUUID","text","TextDecoder","decode","response","kill","onKill","add","initial","delete","createScriptedTerminalBridge","openSession","_request","baseTheme","cursorAccent","selectionForeground","lightTerminalTheme","background","foreground","cursor","selectionBackground","black","red","green","yellow","blue","magenta","cyan","white","brightBlack","brightRed","brightGreen","brightYellow","brightBlue","brightMagenta","brightCyan","brightWhite","darkTerminalTheme","terminalThemes","light","dark","resolveTerminalTheme","theme","createTerminalSessionRequestKey","request","JSON","stringify","command","cwd","env","Object","fromEntries","entries","sort","left","right","localeCompare","readTerminalSessionRequestKey","requestKey","parse","useTerminalSession","t0","$","_c","bridge","killOnUnmount","t1","t2","t3","Symbol","for","status","state","setState","useState","t4","t5","cancelled","activeSession","terminalState","requestSnapshot","then","prev","prev_0","catch","cause","Error","String","useEffect","DEFAULT_FONT_FAMILY","DEFAULT_FONT_SIZE","DEFAULT_COLS","DEFAULT_ROWS","createInitialTerminalSessionRequest","createTerminalSink","xterm","inputHandlers","pendingInput","inputDisposable","size","shift","disposable","clear","fitTerminal","fit","resizeSessionToTerminalGeometry","terminal","bindTerminalSession","unbind","onSessionExit","onSessionOpen","bindTerminalSessionWithCallbackRefs","callbackRefs","sessionId","current","Terminal","props","fontFamily","fontSize","autoFocus","className","style","containerRef","useRef","xtermRef","fitRef","sinkRef","terminalReady","setTerminalReady","initialSessionRequestRef","onSessionOpenRef","onSessionExitRef","resolvedTheme","container","measureAnimationFrame","measureTimeout","observer","initializationFrame","window","requestAnimationFrame","Xterm","cursorBlink","convertEol","allowProposedApi","FitAddon","loadAddon","open","measure","ResizeObserver","observe","cancelAnimationFrame","clearTimeout","disconnect","animationFrame","focus","jsx","position","width","height","backgroundColor","inset"],"mappings":";;;;;;AA2BO,MAAMA,IAAoBA,CAC/BC,GACAC,GACAC,IAA8B,CAAA,MAC3B;AACH,QAAMC,IAA+B,CAAA;AAErCA,SAAAA,EAAUC,KAAKH,EAAQI,OAAQC,CAAAA,MAAUN,EAAKO,MAAMD,CAAK,CAAC,CAAC,GAE3DH,EAAUC,KACRJ,EAAKQ,QAASC,CAAAA,MAAS;AACrBR,IAAAA,EAAQM,MAAME,CAAI,GAClBP,EAAQM,UAAUC,CAAI;AAAA,EACxB,CAAC,CACH,GAEAN,EAAUC,KACRJ,EAAKU,SAAS,CAAC;AAAA,IAAEC,MAAAA;AAAAA,IAAMC,MAAAA;AAAAA,EAAAA,MAAW;AAChCX,IAAAA,EAAQY,OAAOF,GAAMC,CAAI;AAAA,EAC3B,CAAC,CACH,GAEIV,EAAQY,UAAQX,EAAUC,KAAKH,EAAQa,OAAOZ,EAAQY,MAAM,CAAC,GAC7DZ,EAAQa,WAASZ,EAAUC,KAAKH,EAAQc,QAAQb,EAAQa,OAAO,CAAC,GAE7D,MAAM;AACX,WAAOZ,EAAUa,SAAS,KAAG;AAC3B,YAAMC,IAAUd,EAAUe,IAAAA;AAC1B,UAAI;AACFD,QAAAA,IAAAA;AAAAA,MACF,QAAQ;AAAA,MAEN;AAAA,IAEJ;AAAA,EACF;AACF,GCpCME,IAAU,IAAIC,YAAAA,GAEdC,IAAUA,CAACZ,MAA+B,OAAOA,KAAS,WAAWU,EAAQG,OAAOb,CAAI,IAAIA,GAE5Fc,IAAOA,CAACC,MAAgBA,IAAK,IAAI,IAAIC,QAAeC,CAAAA,MAAYC,WAAWD,GAASF,CAAE,CAAC,IAAIC,QAAQC,QAAAA,GAEnGE,IAAcA,CAACC,MAA0C,CAAC;AAAA,EAAEpB,MAAMoB,EAAMC,QAAQ,OAAO;AAAA,CAAM;AAAE,CAAC,GAShGC,IAAUA,CAACC,GAAyBC,MAA+B;AACvE,EAAIA,EAAKxB,SAASyB,UAAWF,EAAQG,SAASd,EAAQY,EAAKxB,IAAI,CAAC,GAC5DwB,EAAKG,UAAUF,UAAWF,EAAQK,UAAU;AAAA,IAAEC,SAASL,EAAKG;AAAAA,EAAAA,CAAO,GACnEH,EAAKM,SAASL,UAAWF,EAAQQ,SAAS;AAAA,IAAEC,MAAMR,EAAKM,KAAKE;AAAAA,IAAMC,QAAQT,EAAKM,KAAKG,UAAU;AAAA,EAAA,CAAM;AAC1G,GAEMC,IAAY,OAAOX,GAAyBY,MAAkC;AAClF,aAAWX,KAAQW,GAAO;AAGxB,QAFIZ,EAAQa,eACZ,MAAMtB,EAAKU,EAAKa,WAAW,CAAC,GACxBd,EAAQa,YAAY;AACxBd,IAAAA,EAAQC,GAASC,CAAI;AAAA,EACvB;AACF,GAEMc,IAAwBA,CAC5B7C,GACAM,MACG;AACH,QAAMwC,wBAAmBC,IAAAA,GACnBC,wBAAmBD,IAAAA,GACnBE,wBAAoBF,IAAAA;AAC1B,MAAIG,IAAS,IACTC,IAAiB;AAErB,QAAMrB,IAA0B;AAAA,IAC9Ba,UAAUA,MAAMO;AAAAA,IAChBjB,SAAS7B,GAAO;AACd,iBAAWgD,KAAWN,EAAcM,CAAAA,EAAQhD,CAAK;AAAA,IACnD;AAAA,IACAkC,SAASD,GAAM;AACb,UAAIa,CAAAA,GACJA;AAAAA,QAAAA,IAAS;AACT,mBAAWE,KAAWJ,EAAcI,CAAAA,EAAQf,CAAI;AAAA;AAAA,IAClD;AAAA,IACAF,UAAUD,GAAO;AACf,iBAAWkB,KAAWH,EAAeG,CAAAA,EAAQlB,CAAK;AAAA,IACpD;AAAA,EAAA;AAqCF,SAAO;AAAA,IAAEnC,SAlC+B;AAAA,MACtCsD,IAAIC,OAAOC,WAAAA;AAAAA,MACXlD,MAAME,GAAM;AACV,YAAI2C,EAAQ;AACZ,cAAMM,IAAO,OAAOjD,KAAS,WAAWA,IAAO,IAAIkD,YAAAA,EAAcC,OAAOnD,CAAI,GACtEoD,IAAWrD,EAAQkD,CAAI;AAC7B,QAAIG,KAAelB,EAAUX,GAAS6B,CAAQ;AAAA,MAChD;AAAA,MACAhD,OAAOF,GAAMC,GAAM;AACjBV,QAAAA,EAAQQ,WAAW;AAAA,UAAEC,MAAAA;AAAAA,UAAMC,MAAAA;AAAAA,QAAAA,CAAM;AAAA,MACnC;AAAA,MACAkD,KAAKpB,GAAQ;AACX,QAAIU,MACJlD,EAAQ6D,SAASrB,CAAM,GACvBV,EAAQQ,SAAS;AAAA,UAAEC,MAAM;AAAA,UAAMC,QAAQA,KAAU;AAAA,QAAA,CAAM;AAAA,MACzD;AAAA,MACArC,OAAOiD,GAAS;AACdN,eAAAA,EAAagB,IAAIV,CAAO,GACpB,CAACD,KAAkBnD,EAAQ+D,YAC7BZ,IAAiB,IACZV,EAAUX,GAAS9B,EAAQ+D,OAAO,IAElC,MAAMjB,EAAakB,OAAOZ,CAAO;AAAA,MAC1C;AAAA,MACAxC,OAAOwC,GAAS;AACdJ,eAAAA,EAAac,IAAIV,CAAO,GACjB,MAAMJ,EAAagB,OAAOZ,CAAO;AAAA,MAC1C;AAAA,MACAvC,QAAQuC,GAAS;AACfH,eAAAA,EAAca,IAAIV,CAAO,GAClB,MAAMH,EAAce,OAAOZ,CAAO;AAAA,MAC3C;AAAA,IAAA;AAAA,EAGOrD;AACX,GAMakE,KAA+BA,CAACjE,IAAiC,OAAuB;AACnG,QAAMM,IAAUN,EAAQM,WAAWoB;AAEnC,SAAO;AAAA,IACL,MAAMwC,YAAYC,GAAU;AAC1B,YAAM;AAAA,QAAEpE,SAAAA;AAAAA,MAAAA,IAAY8C,EAAsB7C,GAASM,CAAO;AAC1D,aAAOP;AAAAA,IACT;AAAA,EAAA;AAEJ,GC1HMqE,IAA6B;AAAA,EACjCC,cAAc;AAAA,EACdC,qBAAqBtC;AACvB,GAEauC,IAA6B;AAAA,EACxC,GAAGH;AAAAA,EACHI,YAAY;AAAA,EACZC,YAAY;AAAA,EACZC,QAAQ;AAAA,EACRC,qBAAqB;AAAA,EACrBC,OAAO;AAAA,EACPC,KAAK;AAAA,EACLC,OAAO;AAAA,EACPC,QAAQ;AAAA,EACRC,MAAM;AAAA,EACNC,SAAS;AAAA,EACTC,MAAM;AAAA,EACNC,OAAO;AAAA,EACPC,aAAa;AAAA,EACbC,WAAW;AAAA,EACXC,aAAa;AAAA,EACbC,cAAc;AAAA,EACdC,YAAY;AAAA,EACZC,eAAe;AAAA,EACfC,YAAY;AAAA,EACZC,aAAa;AACf,GAEaC,IAA4B;AAAA,EACvC,GAAGxB;AAAAA,EACHI,YAAY;AAAA,EACZC,YAAY;AAAA,EACZC,QAAQ;AAAA,EACRC,qBAAqB;AAAA,EACrBC,OAAO;AAAA,EACPC,KAAK;AAAA,EACLC,OAAO;AAAA,EACPC,QAAQ;AAAA,EACRC,MAAM;AAAA,EACNC,SAAS;AAAA,EACTC,MAAM;AAAA,EACNC,OAAO;AAAA,EACPC,aAAa;AAAA,EACbC,WAAW;AAAA,EACXC,aAAa;AAAA,EACbC,cAAc;AAAA,EACdC,YAAY;AAAA,EACZC,eAAe;AAAA,EACfC,YAAY;AAAA,EACZC,aAAa;AACf,GAEaE,IAAoD;AAAA,EAC/DC,OAAOvB;AAAAA,EACPwB,MAAMH;AACR,GAEaI,KAAuBA,CAACC,MAC9BA,IACD,OAAOA,KAAU,WAAiBJ,EAAeI,CAAK,IACnDA,IAFYJ,EAAeE,MC5CvBG,KAAkCA,CAACC,MAC9CC,KAAKC,UAAU;AAAA,EACbC,SAASH,EAAQG;AAAAA,EACjBC,KAAKJ,EAAQI;AAAAA,EACbC,KAAKL,EAAQK,MACTC,OAAOC,YAAYD,OAAOE,QAAQR,EAAQK,GAAG,EAAEI,KAAK,CAAC,CAACC,CAAI,GAAG,CAACC,CAAK,MAAMD,EAAKE,cAAcD,CAAK,CAAC,CAAC,IACnG9E;AAAAA,EACJvB,MAAM0F,EAAQ1F;AAAAA,EACdC,MAAMyF,EAAQzF;AAChB,CAAC,GAEGsG,KAAgCA,CAACC,MAA+Cb,KAAKc,MAAMD,CAAU,GAO9FE,KAAqBC,CAAAA,MAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GAAC;AAAA,IAAAC,QAAAA;AAAAA,IAAApB,SAAAA;AAAAA,IAAAqB,eAAAC;AAAAA,EAAAA,IAAAL,GAAmBI,IAAAC,MAAAzF,SAAA,KAAAyF;AAAoB,MAAAC;AAAA,EAAAL,SAAAlB,KACrDuB,IAAAxB,GAAgCC,CAAO,GAACkB,OAAAlB,GAAAkB,OAAAK,KAAAA,IAAAL,EAAA,CAAA;AAA3D,QAAAJ,IAAmBS;AAAyC,MAAAC;AAAA,EAAAN,EAAA,CAAA,MAAAO,uBAAAC,IAAA,2BAAA,KACCF,IAAA;AAAA,IAAA5H,SAClD;AAAA,IAAI+H,QACL;AAAA,IAAMzF,MACR;AAAA,IAAIH,OACH;AAAA,EAAA,GACRmF,OAAAM,KAAAA,IAAAN,EAAA,CAAA;AALD,QAAA,CAAAU,GAAAC,CAAA,IAA0BC,EAAmCN,CAK5D;AAAE,MAAAO,GAAAC;AAAA,SAAAd,EAAA,CAAA,MAAAE,KAAAF,SAAAG,KAAAH,EAAA,CAAA,MAAAJ,KAEOiB,IAAAA,MAAA;AACR,QAAI,CAACX,GAAM;AACTS,MAAAA,EAAS;AAAA,QAAAjI,SAAW;AAAA,QAAI+H,QAAU;AAAA,QAAMzF,MAAQ;AAAA,QAAIH,OAAS;AAAA,MAAA,CAAM;AAAC;AAAA,IAAA;AAItE,QAAAkG,IAAgB,IAChBC,IAAmD,MACnDC,IAA2C;AAC3C,UAAArI,IAAqC,CAAA;AAErC+H,IAAAA,EAAS;AAAA,MAAAjI,SAAW;AAAA,MAAI+H,QAAU;AAAA,MAASzF,MAAQ;AAAA,MAAIH,OAAS;AAAA,IAAA,CAAM;AACtE,UAAAqG,IAAwBvB,GAA8BC,CAAU;AAEhEM,WAAAA,EAAMrD,YACSqE,CAAe,EAACC,KACvBzI,CAAAA,MAAA;AACJ,UAAIqI,GAAS;AACX,QAAIZ,KAAoBzH,EAAO6D,KAAAA;AAAQ;AAAA,MAAA;AAGzCyE,MAAAA,IAAgBtI,GAChBE,EAASC,KACPH,EAAOa,OAAQyB,CAAAA,MAAA;AACbiG,QAAAA,IAAgBA,UAChBN,EAASS,CAAAA,OAAW;AAAA,UAAA,GAAKA;AAAAA,UAAIX,QAAU;AAAA,UAAQzF,MAAAA;AAAAA,QAAAA,EAAS;AAAA,MAAC,CAC1D,GACDtC,EAAOc,QAASqB,CAAAA,MAAA;AACdoG,QAAAA,IAAgBA,SAChBN,EAASU,CAAAA,OAAW;AAAA,UAAA,GAAKD;AAAAA,UAAIX,QAAU;AAAA,UAAO5F,OAAAA;AAAAA,QAAAA,EAAU;AAAA,MAAC,CAC1D,CACH,GACAoG,IAAgBA,QAChBN,EAAS;AAAA,QAAAjI,SAAAA;AAAAA,QAAA+H,QAAmB;AAAA,QAAMzF,MAAQ;AAAA,QAAIH,OAAS;AAAA,MAAA,CAAM;AAAA,IAAC,CAC/D,EAACyG,MACKC,CAAAA,MAAA;AACL,UAAIR;AAAS;AACb,YAAAhG,IAAgBwG,aAAiBC,QAAQD,EAAKxG,UAAW0G,OAAOF,CAAK;AACrEN,MAAAA,IAAgBA,SAChBN,EAAS;AAAA,QAAAjI,SAAW;AAAA,QAAI+H,QAAU;AAAA,QAAOzF,MAAQ;AAAA,QAAIH,OAAS;AAAA,UAAAE,SAAAA;AAAAA,QAAAA;AAAAA,MAAU,CAAG;AAAA,IAAC,CAC7E,GAEI,MAAA;AAEL,WADAgG,IAAYA,IACLnI,EAASa,SAAU;AAAGb,QAAAA,EAASe,QAAS;AAC/C,MAAIwG,KAAAa,KAAkCC,MAAkB,YAAeD,EAAazE,KAAAA;AAAAA,IAAQ;AAAA,EAC7F,GACAuE,KAACZ,GAAQN,GAAYO,CAAa,GAACH,OAAAE,GAAAF,OAAAG,GAAAH,OAAAJ,GAAAI,OAAAa,GAAAb,OAAAc,MAAAD,IAAAb,EAAA,CAAA,GAAAc,IAAAd,EAAA,CAAA,IA/CtC0B,EAAUb,GA+CPC,CAAmC,GAE/BJ;AAAK,GC1FRiB,KAAsB,6DACtBC,KAAoB,IACpBC,IAAe,IACfC,IAAe,IAERC,KAAsCA,CACjDjD,OAC4B;AAAA,EAC5B,GAAGA;AAAAA,EACH1F,MAAM0F,GAAS1F,QAAQyI;AAAAA,EACvBxI,MAAMyF,GAASzF,QAAQyI;AACzB,IAEaE,KAAqBA,CAACC,MAAwD;AACzF,QAAMC,wBAAoBxG,IAAAA,GACpByG,IAAyB,CAAA,GACzBC,IAAkBH,EAAMnJ,OAAQI,CAAAA,MAAS;AAC7C,QAAIgJ,EAAcG,SAAS,GAAG;AAC5BF,MAAAA,EAAatJ,KAAKK,CAAI;AACtB;AAAA,IACF;AACA,eAAW6C,KAAWmG,EAAenG,CAAAA,EAAQ7C,CAAI;AAAA,EACnD,CAAC;AAED,SAAO;AAAA,IACLF,MAAME,GAA2B;AAC/B+I,MAAAA,EAAMjJ,MAAME,CAAI;AAAA,IAClB;AAAA,IACAD,QAAQ8C,GAAiC;AAEvC,WADAmG,EAAczF,IAAIV,CAAO,GAClBoG,EAAa1I,SAAS,IAAGsC,CAAAA,EAAQoG,EAAaG,OAAiB;AACtE,aAAO,MAAMJ,EAAcvF,OAAOZ,CAAO;AAAA,IAC3C;AAAA,IACA5C,SAAS4C,GAAyD;AAChE,YAAMwG,IAAaN,EAAM9I,SAAS4C,CAAO;AACzC,aAAO,MAAMwG,EAAW7I,QAAAA;AAAAA,IAC1B;AAAA,IACAA,UAAU;AACR0I,MAAAA,EAAgB1I,QAAAA,GAChBwI,EAAcM,MAAAA,GACdL,EAAa1I,SAAS;AAAA,IACxB;AAAA,EAAA;AAEJ,GAEMgJ,IAAcA,CAACC,MAAyB;AAC5C,MAAI;AACFA,IAAAA,GAAKA,IAAAA;AAAAA,EACP,QAAQ;AAAA,EACN;AAEJ,GAEaC,KAAkCA,CAC7CC,GACAlK,MACG;AACHA,EAAAA,EAAQY,OAAOsJ,EAASxJ,MAAMwJ,EAASvJ,IAAI;AAC7C,GAEawJ,KAAsBA,CACjCD,GACAnK,GACAC,GACAC,MACG;AACH,QAAMmK,IAAStK,EAAkBC,GAAMC,GAAS;AAAA,IAC9Ca,QAAQZ,EAAQoK;AAAAA,EAAAA,CACjB;AACDJ,SAAAA,GAAgCC,GAAUlK,CAAO,GACjDC,EAAQqK,gBAAgBtK,EAAQsD,EAAE,GAC3B8G;AACT,GAOaG,KAAsCA,CACjDL,GACAnK,GACAC,GACAwK,MAEAL,GAAoBD,GAAUnK,GAAMC,GAAS;AAAA,EAC3CsK,eAAgBG,CAAAA,MAAcD,EAAaF,cAAcI,UAAUD,CAAS;AAAA,EAC5EJ,eAAgB/H,CAAAA,MAASkI,EAAaH,cAAcK,UAAUpI,CAAI;AACpE,CAAC,GAkCUqI,KAAWA,CAACC,MAAyB;AAChD,QAAM;AAAA,IACJpD,QAAAA;AAAAA,IACApB,SAAAA;AAAAA,IACAF,OAAAA;AAAAA,IACA2E,YAAAA,IAAa5B;AAAAA,IACb6B,UAAAA,IAAW5B;AAAAA,IACXzB,eAAAA,IAAgB;AAAA,IAChBsD,WAAAA,IAAY;AAAA,IACZC,WAAAA;AAAAA,IACAC,OAAAA;AAAAA,IACAX,eAAAA;AAAAA,IACAD,eAAAA;AAAAA,EAAAA,IACEO,GAEEM,IAAeC,EAA8B,IAAI,GACjDC,IAAWD,EAAqB,IAAI,GACpCE,IAASF,EAAwB,IAAI,GACrCG,IAAUH,EAAqD,IAAI,GACnE,CAACI,GAAeC,CAAgB,IAAItD,EAAS,EAAK,GAClDuD,IAA2BN,EAAsC,IAAI,GACrEO,IAAmBP,EAAOb,CAAa,GACvCqB,IAAmBR,EAAOd,CAAa;AAE7CqB,EAAAA,EAAiBhB,UAAUJ,GAC3BqB,EAAiBjB,UAAUL,GAEtBoB,EAAyBf,YAC5Be,EAAyBf,UAAUrB,GAAoCjD,CAAO;AAGhF,QAAMwF,IAAgB3F,GAAqBC,CAAK;AAKhD8C,EAAAA,EAAU,MAAM;AACd,UAAM6C,IAAYX,EAAaR;AAC/B,QAAI,CAACmB,EAAW;AAEhB,QAAItC,GACAxJ,GACA+L,GACAC,GACAC;AAKJ,UAAMC,IAAsBC,OAAOC,sBAAsB,MAAM;AAC7D5C,MAAAA,IAAQ,IAAI6C,EAAM;AAAA,QAChB1L,MAAMyI;AAAAA,QACNxI,MAAMyI;AAAAA,QACNiD,aAAa;AAAA,QACbC,YAAY;AAAA,QACZC,kBAAkB;AAAA,MAAA,CACnB;AACD,YAAMvC,IAAM,IAAIwC,EAAAA;AAChBjD,MAAAA,EAAMkD,UAAUzC,CAAG,GACnBT,EAAMmD,KAAKb,CAAS,GACpB9L,IAAOuJ,GAAmBC,CAAK,GAE/B6B,EAASV,UAAUnB,GACnB8B,EAAOX,UAAUV,GACjBsB,EAAQZ,UAAU3K;AAElB,YAAM4M,IAAUA,MAAM5C,EAAYC,CAAG;AACrC2C,MAAAA,EAAAA,GACAb,IAAwBI,OAAOC,sBAAsBQ,CAAO,GAC5DZ,IAAiBG,OAAOxK,WAAWiL,GAAS,EAAE,GAC9CX,IAAW,IAAIY,eAAeD,CAAO,GACrCX,EAASa,QAAQhB,CAAS,GAC1BL,EAAiB,EAAI;AAAA,IACvB,CAAC;AAED,WAAO,MAAM;AACXU,aAAOY,qBAAqBb,CAAmB,GAC3CH,MAA0B7J,UAAWiK,OAAOY,qBAAqBhB,CAAqB,GACtFC,MAAmB9J,UAAWiK,OAAOa,aAAahB,CAAc,GACpEC,GAAUgB,WAAAA,GACVjN,GAAMiB,QAAAA,GACNuI,GAAOvI,QAAAA,GACPoK,EAASV,UAAU,MACnBW,EAAOX,UAAU,MACjBY,EAAQZ,UAAU;AAAA,IACpB;AAAA,EACF,GAAG,CAAA,CAAE,GAEL1B,EAAU,MAAM;AACd,QAAI,CAACuC,EAAe;AACpB,UAAMhC,IAAQ6B,EAASV;AACvB,IAAKnB,MACLA,EAAMtJ,QAAQiG,QAAQ0F,GACtBrC,EAAMtJ,QAAQ4K,aAAaA,GAC3BtB,EAAMtJ,QAAQ6K,WAAWA,GACzBf,EAAYsB,EAAOX,OAAO;AAAA,EAC5B,GAAG,CAACa,GAAeK,GAAef,GAAYC,CAAQ,CAAC;AAEvD,QAAM;AAAA,IAAE9K,SAAAA;AAAAA,EAAAA,IAAYoH,GAAmB;AAAA,IAAEI,QAAAA;AAAAA,IAAQpB,SAASqF,EAAyBf;AAAAA,IAASjD,eAAAA;AAAAA,EAAAA,CAAe;AAE3GuB,SAAAA,EAAU,MAAM;AACd,QAAI,CAACuC,EAAe;AACpB,UAAMhC,IAAQ6B,EAASV,SACjB3K,IAAOuL,EAAQZ;AACrB,QAAI,CAACnB,KAAS,CAACxJ,KAAQ,CAACC,EAAS;AACjC+J,IAAAA,EAAYsB,EAAOX,OAAO;AAC1B,UAAMuC,IAAiBf,OAAOC,sBAAsB,MAAMpC,EAAYsB,EAAOX,OAAO,CAAC,GAC/EN,IAASG,GAAoChB,GAAOxJ,GAAMC,GAAS;AAAA,MACvEsK,eAAeoB;AAAAA,MACfrB,eAAesB;AAAAA,IAAAA,CAChB;AACD,WAAO,MAAM;AACXO,aAAOY,qBAAqBG,CAAc,GAC1C7C,EAAAA;AAAAA,IACF;AAAA,EACF,GAAG,CAACpK,GAASuL,CAAa,CAAC,GAE3BvC,EAAU,MAAM;AACd,IAAIuC,KAAiBR,KAAWK,EAASV,SAASwC,MAAAA;AAAAA,EACpD,GAAG,CAACnC,GAAWQ,CAAa,CAAC,GAM3B,gBAAA4B,EAAC,OAAA,EACC,WAAAnC,GACA,OAAO;AAAA,IACLoC,UAAU;AAAA,IACVC,OAAO;AAAA,IACPC,QAAQ;AAAA,IACRC,iBAAiB,OAAO3B,EAAcnH,cAAe,WAAWmH,EAAcnH,aAAaxC;AAAAA,IAC3F,GAAGgJ;AAAAA,EAAAA,GAGL,UAAA,gBAAAkC,EAAC,OAAA,EAAI,KAAKjC,GAAc,WAAU,mBAAkB,OAAO;AAAA,IAAEkC,UAAU;AAAA,IAAYI,OAAO;AAAA,EAAA,GAAI,EAAA,CAChG;AAEJ;"}
|
|
@@ -113,6 +113,15 @@ export declare const sizes: {
|
|
|
113
113
|
"tag-editor-add-row": {
|
|
114
114
|
value: string;
|
|
115
115
|
};
|
|
116
|
+
"tag-editor-lead": {
|
|
117
|
+
value: string;
|
|
118
|
+
};
|
|
119
|
+
"tag-editor-commands": {
|
|
120
|
+
value: string;
|
|
121
|
+
};
|
|
122
|
+
"tag-editor-trailing": {
|
|
123
|
+
value: string;
|
|
124
|
+
};
|
|
116
125
|
"segmented-control-sm": {
|
|
117
126
|
value: string;
|
|
118
127
|
};
|
|
@@ -34,8 +34,8 @@ const X = {
|
|
|
34
34
|
descriptionForeground: ["colors.fg.muted"],
|
|
35
35
|
disabledForeground: ["colors.fg.subtle"],
|
|
36
36
|
border: ["colors.border", "colors.border.subtle"]
|
|
37
|
-
}, M = (
|
|
38
|
-
const l = (
|
|
37
|
+
}, M = (o) => `colors.vscode.${o}`, P = (o) => o.replace(/^#/, ""), j = (o) => {
|
|
38
|
+
const l = (o.theme.tokenColors ?? []).flatMap((r) => (Array.isArray(r.scope) ? r.scope : r.scope ? [r.scope] : []).map((s) => ({
|
|
39
39
|
token: s,
|
|
40
40
|
...r.settings?.foreground ? {
|
|
41
41
|
foreground: P(r.settings.foreground)
|
|
@@ -45,13 +45,13 @@ const X = {
|
|
|
45
45
|
} : {}
|
|
46
46
|
})));
|
|
47
47
|
return {
|
|
48
|
-
base:
|
|
48
|
+
base: o.mode === "dark" ? "vs-dark" : "vs",
|
|
49
49
|
inherit: !0,
|
|
50
50
|
rules: l,
|
|
51
|
-
colors:
|
|
51
|
+
colors: o.theme.colors ?? {}
|
|
52
52
|
};
|
|
53
|
-
}, ro = (
|
|
54
|
-
const l = {}, r =
|
|
53
|
+
}, ro = (o) => {
|
|
54
|
+
const l = {}, r = o.theme.colors ?? {};
|
|
55
55
|
for (const [n, s] of Object.entries(r))
|
|
56
56
|
l[M(n)] = s;
|
|
57
57
|
for (const [n, s] of Object.entries(X)) {
|
|
@@ -60,12 +60,12 @@ const X = {
|
|
|
60
60
|
for (const m of s) l[m] = g;
|
|
61
61
|
}
|
|
62
62
|
return {
|
|
63
|
-
id:
|
|
64
|
-
mode:
|
|
63
|
+
id: o.id,
|
|
64
|
+
mode: o.mode,
|
|
65
65
|
tokens: l,
|
|
66
66
|
monacoTheme: j({
|
|
67
|
-
mode:
|
|
68
|
-
theme:
|
|
67
|
+
mode: o.mode,
|
|
68
|
+
theme: o.theme
|
|
69
69
|
})
|
|
70
70
|
};
|
|
71
71
|
}, U = {
|
|
@@ -762,7 +762,7 @@ const X = {
|
|
|
762
762
|
bold: {
|
|
763
763
|
value: 700
|
|
764
764
|
}
|
|
765
|
-
},
|
|
765
|
+
}, e = {
|
|
766
766
|
// 0px
|
|
767
767
|
25: "0.125rem",
|
|
768
768
|
// 2px
|
|
@@ -798,71 +798,71 @@ const X = {
|
|
|
798
798
|
value: "0"
|
|
799
799
|
},
|
|
800
800
|
"3xs": {
|
|
801
|
-
value:
|
|
801
|
+
value: e[25]
|
|
802
802
|
},
|
|
803
803
|
"2xs": {
|
|
804
|
-
value:
|
|
804
|
+
value: e[50]
|
|
805
805
|
},
|
|
806
806
|
xs: {
|
|
807
|
-
value:
|
|
807
|
+
value: e[100]
|
|
808
808
|
},
|
|
809
809
|
compact: {
|
|
810
810
|
value: "0.625rem"
|
|
811
811
|
},
|
|
812
812
|
sm: {
|
|
813
|
-
value:
|
|
813
|
+
value: e[150]
|
|
814
814
|
},
|
|
815
815
|
comfortable: {
|
|
816
816
|
value: "0.875rem"
|
|
817
817
|
},
|
|
818
818
|
md: {
|
|
819
|
-
value:
|
|
819
|
+
value: e[200]
|
|
820
820
|
},
|
|
821
821
|
lg: {
|
|
822
|
-
value:
|
|
822
|
+
value: e[300]
|
|
823
823
|
},
|
|
824
824
|
xl: {
|
|
825
|
-
value:
|
|
825
|
+
value: e[400]
|
|
826
826
|
},
|
|
827
827
|
"2xl": {
|
|
828
|
-
value:
|
|
828
|
+
value: e[500]
|
|
829
829
|
},
|
|
830
830
|
"3xl": {
|
|
831
|
-
value:
|
|
831
|
+
value: e[600]
|
|
832
832
|
},
|
|
833
833
|
"3.5xl": {
|
|
834
|
-
value:
|
|
834
|
+
value: e[700]
|
|
835
835
|
},
|
|
836
836
|
"4xl": {
|
|
837
|
-
value:
|
|
837
|
+
value: e[800]
|
|
838
838
|
},
|
|
839
839
|
"4.5xl": {
|
|
840
|
-
value:
|
|
840
|
+
value: e[900]
|
|
841
841
|
},
|
|
842
842
|
"5xl": {
|
|
843
|
-
value:
|
|
843
|
+
value: e[1600]
|
|
844
844
|
}
|
|
845
845
|
}, ce = {
|
|
846
846
|
"collection-row": {
|
|
847
847
|
value: "2.125rem"
|
|
848
848
|
},
|
|
849
849
|
"filter-pill": {
|
|
850
|
-
value:
|
|
850
|
+
value: e[300]
|
|
851
851
|
},
|
|
852
852
|
"icon-2xs": {
|
|
853
|
-
value:
|
|
853
|
+
value: e[150]
|
|
854
854
|
},
|
|
855
855
|
"icon-xs": {
|
|
856
856
|
value: "0.875rem"
|
|
857
857
|
},
|
|
858
858
|
"icon-sm": {
|
|
859
|
-
value:
|
|
859
|
+
value: e[200]
|
|
860
860
|
},
|
|
861
861
|
"icon-md": {
|
|
862
|
-
value:
|
|
862
|
+
value: e[250]
|
|
863
863
|
},
|
|
864
864
|
"tag-color-dot": {
|
|
865
|
-
value:
|
|
865
|
+
value: e[250]
|
|
866
866
|
},
|
|
867
867
|
"tag-icon-cell": {
|
|
868
868
|
value: "1.75rem"
|
|
@@ -880,28 +880,37 @@ const X = {
|
|
|
880
880
|
value: "0.625rem"
|
|
881
881
|
},
|
|
882
882
|
"tag-editor-row": {
|
|
883
|
-
value:
|
|
883
|
+
value: e[500]
|
|
884
884
|
},
|
|
885
885
|
"tag-editor-add-row": {
|
|
886
886
|
value: "2.25rem"
|
|
887
887
|
},
|
|
888
|
+
"tag-editor-lead": {
|
|
889
|
+
value: e[600]
|
|
890
|
+
},
|
|
891
|
+
"tag-editor-commands": {
|
|
892
|
+
value: "11.875rem"
|
|
893
|
+
},
|
|
894
|
+
"tag-editor-trailing": {
|
|
895
|
+
value: "1.625rem"
|
|
896
|
+
},
|
|
888
897
|
"segmented-control-sm": {
|
|
889
898
|
value: "1.75rem"
|
|
890
899
|
},
|
|
891
900
|
"segmented-control-xs": {
|
|
892
|
-
value:
|
|
901
|
+
value: e[300]
|
|
893
902
|
},
|
|
894
903
|
"segmented-control-item-sm": {
|
|
895
|
-
value:
|
|
904
|
+
value: e[300]
|
|
896
905
|
},
|
|
897
906
|
"segmented-control-item-xs": {
|
|
898
|
-
value:
|
|
907
|
+
value: e[250]
|
|
899
908
|
},
|
|
900
909
|
"tag-action-menu": {
|
|
901
|
-
value:
|
|
910
|
+
value: e[2e3]
|
|
902
911
|
},
|
|
903
912
|
"view-bar": {
|
|
904
|
-
value:
|
|
913
|
+
value: e[500]
|
|
905
914
|
},
|
|
906
915
|
"view-subheader": {
|
|
907
916
|
value: "2.25rem"
|
|
@@ -915,25 +924,25 @@ const X = {
|
|
|
915
924
|
value: "0"
|
|
916
925
|
},
|
|
917
926
|
"2xs": {
|
|
918
|
-
value:
|
|
927
|
+
value: e[25]
|
|
919
928
|
},
|
|
920
929
|
xs: {
|
|
921
|
-
value:
|
|
930
|
+
value: e[50]
|
|
922
931
|
},
|
|
923
932
|
compact: {
|
|
924
933
|
value: "0.375rem"
|
|
925
934
|
},
|
|
926
935
|
sm: {
|
|
927
|
-
value:
|
|
936
|
+
value: e[100]
|
|
928
937
|
},
|
|
929
938
|
md: {
|
|
930
|
-
value:
|
|
939
|
+
value: e[150]
|
|
931
940
|
},
|
|
932
941
|
lg: {
|
|
933
|
-
value:
|
|
942
|
+
value: e[200]
|
|
934
943
|
},
|
|
935
944
|
xl: {
|
|
936
|
-
value:
|
|
945
|
+
value: e[400]
|
|
937
946
|
},
|
|
938
947
|
full: {
|
|
939
948
|
value: "100%"
|
|
@@ -2584,27 +2593,27 @@ const X = {
|
|
|
2584
2593
|
color: "fg.inverted"
|
|
2585
2594
|
}
|
|
2586
2595
|
}
|
|
2587
|
-
}), Le = /* @__PURE__ */ new Set(["boxShadow", "boxShadowColor", "textShadow"]), p = /shadow/i, Ve = (
|
|
2588
|
-
if (!p.test(
|
|
2589
|
-
const l =
|
|
2596
|
+
}), Le = /* @__PURE__ */ new Set(["boxShadow", "boxShadowColor", "textShadow"]), p = /shadow/i, Ve = (o) => {
|
|
2597
|
+
if (!p.test(o)) return o;
|
|
2598
|
+
const l = o.split(",").map((r) => r.trim()).filter((r) => !p.test(r));
|
|
2590
2599
|
if (l.length !== 0)
|
|
2591
2600
|
return l.join(", ");
|
|
2592
|
-
}, b = (
|
|
2601
|
+
}, b = (o) => Array.isArray(o) ? o.map(b).filter((l) => l !== void 0) : typeof o == "string" ? Ve(o) : !o || typeof o != "object" ? o : Object.fromEntries(Object.entries(o).flatMap(([l, r]) => {
|
|
2593
2602
|
if (Le.has(l) || p.test(l)) return [];
|
|
2594
2603
|
const n = b(r);
|
|
2595
2604
|
return n === void 0 ? [] : [[l, n]];
|
|
2596
|
-
})), x = (
|
|
2605
|
+
})), x = (o) => {
|
|
2597
2606
|
const {
|
|
2598
2607
|
shadows: l,
|
|
2599
2608
|
...r
|
|
2600
|
-
} =
|
|
2609
|
+
} = o ?? {};
|
|
2601
2610
|
return r;
|
|
2602
2611
|
}, Ie = {
|
|
2603
2612
|
badge: ["surface"],
|
|
2604
2613
|
button: ["secondary", "surface"]
|
|
2605
|
-
}, Xe = (
|
|
2614
|
+
}, Xe = (o) => {
|
|
2606
2615
|
const l = {
|
|
2607
|
-
...
|
|
2616
|
+
...o ?? {}
|
|
2608
2617
|
};
|
|
2609
2618
|
for (const [r, n] of Object.entries(Ie)) {
|
|
2610
2619
|
const s = l[r];
|
|
@@ -3496,6 +3505,16 @@ const X = {
|
|
|
3496
3505
|
letterSpacing: "0.1px"
|
|
3497
3506
|
}
|
|
3498
3507
|
},
|
|
3508
|
+
"label/XS/caps": {
|
|
3509
|
+
value: {
|
|
3510
|
+
fontFamily: "label",
|
|
3511
|
+
fontSize: "xs",
|
|
3512
|
+
fontWeight: "600",
|
|
3513
|
+
lineHeight: "150%",
|
|
3514
|
+
letterSpacing: "0.9px",
|
|
3515
|
+
textTransform: "uppercase"
|
|
3516
|
+
}
|
|
3517
|
+
},
|
|
3499
3518
|
"label/XS/medium": {
|
|
3500
3519
|
value: {
|
|
3501
3520
|
fontFamily: "label",
|
|
@@ -3651,4 +3670,4 @@ export {
|
|
|
3651
3670
|
j as c,
|
|
3652
3671
|
lo as t
|
|
3653
3672
|
};
|
|
3654
|
-
//# sourceMappingURL=theme-
|
|
3673
|
+
//# sourceMappingURL=theme-B-l5_a6F.js.map
|