@industry-theme/xterm-terminal-panel 0.1.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.
@@ -0,0 +1,9 @@
1
+ import type { Theme } from '@principal-ade/industry-theme';
2
+ import '@xterm/xterm/css/xterm.css';
3
+ import type { ThemedTerminalProps, ThemedTerminalRef } from '../types/terminal.types';
4
+ import '../styles/terminal-theme.css';
5
+ export interface ThemedTerminalComponentProps extends ThemedTerminalProps {
6
+ theme: Theme;
7
+ }
8
+ export declare const ThemedTerminal: import("react").ForwardRefExoticComponent<ThemedTerminalComponentProps & import("react").RefAttributes<ThemedTerminalRef>>;
9
+ //# sourceMappingURL=ThemedTerminal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThemedTerminal.d.ts","sourceRoot":"","sources":["../../../src/components/ThemedTerminal.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAwB3D,OAAO,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAEV,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,8BAA8B,CAAC;AAEtC,MAAM,WAAW,4BAA6B,SAAQ,mBAAmB;IACvE,KAAK,EAAE,KAAK,CAAC;CACd;AAsBD,eAAO,MAAM,cAAc,4HA4sB1B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ThemedTerminalProps, ThemedTerminalRef } from '../types/terminal.types';
2
+ export declare const ThemedTerminalWithProvider: import("react").ForwardRefExoticComponent<ThemedTerminalProps & import("react").RefAttributes<ThemedTerminalRef>>;
3
+ //# sourceMappingURL=ThemedTerminalWithProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThemedTerminalWithProvider.d.ts","sourceRoot":"","sources":["../../../src/components/ThemedTerminalWithProvider.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AA2BtF,eAAO,MAAM,0BAA0B,mHAOrC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type Theme } from '@principal-ade/industry-theme';
2
+ import type { ITerminalOptions } from '@xterm/xterm';
3
+ export interface UseThemedTerminalReturn {
4
+ theme: Theme;
5
+ getTerminalOptions: (overrides?: Partial<ITerminalOptions>) => ITerminalOptions;
6
+ getCSSVariables: () => Record<string, string>;
7
+ }
8
+ export declare function useThemedTerminal(): UseThemedTerminalReturn;
9
+ //# sourceMappingURL=useThemedTerminal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useThemedTerminal.d.ts","sourceRoot":"","sources":["../../../src/hooks/useThemedTerminal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,KAAK,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAKrD,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,KAAK,CAAC;IACb,kBAAkB,EAAE,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,KAAK,gBAAgB,CAAC;IAChF,eAAe,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/C;AAKD,wBAAgB,iBAAiB,IAAI,uBAAuB,CAyC3D"}
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import type { PanelComponentProps, PanelContextValue, PanelEventEmitter, TerminalSessionInfo, TerminalPanelActions } from '../panel-types';
3
+ export declare const mockTerminalSessions: TerminalSessionInfo[];
4
+ export declare const createMockContext: (overrides?: Partial<PanelContextValue>) => PanelContextValue;
5
+ export declare const createMockActions: (overrides?: Partial<TerminalPanelActions>) => TerminalPanelActions;
6
+ export declare const createMockEvents: () => PanelEventEmitter;
7
+ export declare const MockPanelProvider: React.FC<{
8
+ children: (props: PanelComponentProps) => React.ReactNode;
9
+ contextOverrides?: Partial<PanelContextValue>;
10
+ actionsOverrides?: Partial<TerminalPanelActions>;
11
+ }>;
12
+ //# sourceMappingURL=panelContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panelContext.d.ts","sourceRoot":"","sources":["../../../src/mocks/panelContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EACV,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EAGjB,mBAAmB,EACnB,oBAAoB,EAGrB,MAAM,gBAAgB,CAAC;AAKxB,eAAO,MAAM,oBAAoB,EAAE,mBAAmB,EAUrD,CAAC;AAuEF,eAAO,MAAM,iBAAiB,GAC5B,YAAY,OAAO,CAAC,iBAAiB,CAAC,KACrC,iBAqEF,CAAC;AAKF,eAAO,MAAM,iBAAiB,GAC5B,YAAY,OAAO,CAAC,oBAAoB,CAAC,KACxC,oBAwCD,CAAC;AAKH,eAAO,MAAM,gBAAgB,QAAO,iBAwCnC,CAAC;AASF,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC;IACvC,QAAQ,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,KAAK,CAAC,SAAS,CAAC;IAC1D,gBAAgB,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC9C,gBAAgB,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;CAClD,CA+CA,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { TabbedTerminalPanel } from './panels/TabbedTerminalPanel';
2
+ import type { PanelDefinition } from './panel-types';
3
+ export declare const panels: PanelDefinition[];
4
+ export declare const onPackageLoad: () => Promise<void>;
5
+ export declare const onPackageUnload: () => Promise<void>;
6
+ export { TabbedTerminalPanel };
7
+ //# sourceMappingURL=panel-exports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel-exports.d.ts","sourceRoot":"","sources":["../../src/panel-exports.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAqB,MAAM,eAAe,CAAC;AAMxE,eAAO,MAAM,MAAM,EAAE,eAAe,EAkCnC,CAAC;AAMF,eAAO,MAAM,aAAa,qBAGzB,CAAC;AAMF,eAAO,MAAM,eAAe,qBAG3B,CAAC;AAGF,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,90 @@
1
+ export type { PanelComponentProps, PanelContextValue, PanelActions, PanelEventEmitter, PanelEvent, PanelEventType, PanelDefinition, PanelMetadata, PanelLifecycleHooks, DataSlice, RepositoryMetadata, WorkspaceMetadata, } from '@principal-ade/panel-framework-core';
2
+ import type { PanelActions as CorePanelActions, PanelContextValue, DataSlice } from '@principal-ade/panel-framework-core';
3
+ export type TerminalEventType = 'terminal:data' | 'terminal:exit' | 'terminal:created' | 'terminal:title-change' | 'terminal:cwd-change';
4
+ export interface TerminalSessionInfo {
5
+ id: string;
6
+ pid: number;
7
+ cwd: string;
8
+ shell: string;
9
+ createdAt: number;
10
+ lastActivity: number;
11
+ repositoryPath?: string;
12
+ context?: string;
13
+ }
14
+ export interface CreateTerminalSessionOptions {
15
+ cwd?: string;
16
+ command?: string;
17
+ env?: Record<string, string>;
18
+ context?: string;
19
+ }
20
+ export interface OwnershipStatus {
21
+ exists: boolean;
22
+ ownedByWindowId: number | null;
23
+ ownedByThisWindow?: boolean;
24
+ canClaim: boolean;
25
+ ownerWindowExists?: boolean;
26
+ }
27
+ export interface OwnershipResult {
28
+ success: boolean;
29
+ reason?: string;
30
+ ownedByWindowId?: number;
31
+ }
32
+ export interface PortReadyData {
33
+ sessionId: string;
34
+ writable: boolean;
35
+ ownershipToken?: string;
36
+ }
37
+ export interface TerminalPanelActions extends CorePanelActions {
38
+ createTerminalSession?: (options?: CreateTerminalSessionOptions) => Promise<string>;
39
+ destroyTerminalSession?: (sessionId: string) => Promise<void>;
40
+ writeToTerminal?: (sessionId: string, data: string) => void;
41
+ resizeTerminal?: (sessionId: string, cols: number, rows: number, force?: boolean) => void;
42
+ clearTerminal?: (sessionId: string) => void;
43
+ onTerminalPortReady?: (callback: (data: PortReadyData, port: MessagePort) => void) => () => void;
44
+ checkTerminalOwnership?: (sessionId: string) => Promise<OwnershipStatus>;
45
+ claimTerminalOwnership?: (sessionId: string, force?: boolean) => Promise<OwnershipResult>;
46
+ releaseTerminalOwnership?: (sessionId: string) => Promise<OwnershipResult>;
47
+ onOwnershipLost?: (callback: (data: {
48
+ sessionId: string;
49
+ newOwnerWindowId: number;
50
+ }) => void) => () => void;
51
+ refreshTerminal?: (sessionId: string) => Promise<boolean>;
52
+ requestTerminalDataPort?: (sessionId: string) => Promise<{
53
+ success: boolean;
54
+ reason?: string;
55
+ }>;
56
+ onTerminalData?: (sessionId: string, callback: (data: string) => void) => () => void;
57
+ listTerminalSessions?: () => Promise<TerminalSessionInfo[]>;
58
+ }
59
+ export declare function getTerminalSessions(context: PanelContextValue): TerminalSessionInfo[];
60
+ export declare function getTerminalSession(context: PanelContextValue, sessionId: string): TerminalSessionInfo | undefined;
61
+ export declare function isTerminalLoading(context: PanelContextValue): boolean;
62
+ export type TerminalScope = 'repository' | 'workspace';
63
+ export interface TerminalPanelProps extends Omit<import('@principal-ade/panel-framework-core').PanelComponentProps, 'context' | 'actions' | 'events'> {
64
+ context: PanelContextValue;
65
+ actions: TerminalPanelActions;
66
+ events: import('@principal-ade/panel-framework-core').PanelEventEmitter;
67
+ terminalScope?: TerminalScope;
68
+ }
69
+ export declare function getRepositoryPath(context: PanelContextValue): string | null;
70
+ export declare function getWorkspacePath(context: PanelContextValue): string | null;
71
+ export declare function getTerminalDirectory(context: PanelContextValue, terminalScope?: TerminalScope): string | null;
72
+ export declare function getTerminalSlice(context: PanelContextValue): DataSlice<TerminalSessionInfo[]> | undefined;
73
+ export interface TerminalTab {
74
+ id: string;
75
+ label: string;
76
+ directory: string;
77
+ command?: string;
78
+ isActive: boolean;
79
+ }
80
+ export interface TabbedTerminalPanelProps extends Omit<TerminalPanelProps, 'terminalScope'> {
81
+ terminalContext: string;
82
+ directory: string;
83
+ hideHeader?: boolean;
84
+ isVisible?: boolean;
85
+ onTabsChange?: (tabs: TerminalTab[]) => void;
86
+ initialTabs?: TerminalTab[];
87
+ showAllTerminals?: boolean;
88
+ onShowAllTerminalsChange?: (showAll: boolean) => void;
89
+ }
90
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/panel-types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import type { TabbedTerminalPanelProps } from '../panel-types';
3
+ export interface TerminalTabContentRef {
4
+ scrollToBottom: () => void;
5
+ toggleScrollLock: () => void;
6
+ }
7
+ export declare const TabbedTerminalPanel: React.FC<TabbedTerminalPanelProps>;
8
+ //# sourceMappingURL=TabbedTerminalPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabbedTerminalPanel.d.ts","sourceRoot":"","sources":["../../../src/panels/TabbedTerminalPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAKN,MAAM,OAAO,CAAC;AAKf,OAAO,KAAK,EACV,wBAAwB,EAGzB,MAAM,gBAAgB,CAAC;AAsBxB,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,gBAAgB,EAAE,MAAM,IAAI,CAAC;CAC9B;AAgUD,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CA+tBlE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { TerminalPanelProps } from '../panel-types';
2
+ export declare const TerminalPanel: React.FC<TerminalPanelProps>;
3
+ //# sourceMappingURL=TerminalPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TerminalPanel.d.ts","sourceRoot":"","sources":["../../../src/panels/TerminalPanel.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAiB,MAAM,gBAAgB,CAAC;AAoBxE,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CA0ZtD,CAAC"}
@@ -0,0 +1,71 @@
1
+ import type { ISearchOptions } from '@xterm/addon-search';
2
+ import type { Terminal } from '@xterm/xterm';
3
+ export interface TerminalOverlayState {
4
+ message: string;
5
+ subtitle?: string;
6
+ actions?: Array<{
7
+ label: string;
8
+ onClick: () => void;
9
+ primary?: boolean;
10
+ icon?: React.ReactNode;
11
+ }>;
12
+ opacity?: number;
13
+ }
14
+ export interface TerminalHeaderBadge {
15
+ label: string;
16
+ color?: string;
17
+ }
18
+ export interface TerminalScrollPosition {
19
+ isAtTop: boolean;
20
+ isAtBottom: boolean;
21
+ isScrollLocked: boolean;
22
+ }
23
+ export interface ThemedTerminalProps {
24
+ onData?: (data: string) => void;
25
+ onResize?: (cols: number, rows: number) => void;
26
+ onReady?: (cols: number, rows: number) => void;
27
+ onLinkClick?: (url: string, isLocalhost: boolean) => void;
28
+ onScrollPositionChange?: (position: TerminalScrollPosition) => void;
29
+ className?: string;
30
+ hideHeader?: boolean;
31
+ headerTitle?: string;
32
+ headerSubtitle?: string;
33
+ headerBadge?: TerminalHeaderBadge;
34
+ autoFocus?: boolean;
35
+ isVisible?: boolean;
36
+ scrollbarStyle?: 'overlay' | 'thin' | 'hidden' | 'auto-hide';
37
+ onClose?: () => void;
38
+ onDestroy?: () => void;
39
+ onPopOut?: () => void;
40
+ overlayState?: TerminalOverlayState;
41
+ convertEol?: boolean;
42
+ cursorBlink?: boolean;
43
+ cursorStyle?: 'block' | 'underline' | 'bar';
44
+ scrollback?: number;
45
+ fontFamily?: string;
46
+ fontSize?: number;
47
+ enableWebGL?: boolean;
48
+ enableUnicode11?: boolean;
49
+ enableSearch?: boolean;
50
+ enableWebLinks?: boolean;
51
+ }
52
+ export interface ThemedTerminalRef {
53
+ write: (data: string | Uint8Array) => void;
54
+ writeln: (data: string) => void;
55
+ scrollToBottom: () => void;
56
+ focus: () => void;
57
+ blur: () => void;
58
+ clear: () => void;
59
+ reset: () => void;
60
+ getTerminal: () => Terminal | null;
61
+ fit: () => void;
62
+ resize: (cols: number, rows: number) => void;
63
+ selectAll: () => void;
64
+ clearSelection: () => void;
65
+ findNext: (searchTerm: string, searchOptions?: ISearchOptions) => boolean;
66
+ findPrevious: (searchTerm: string, searchOptions?: ISearchOptions) => boolean;
67
+ clearSearch: () => void;
68
+ isScrollLocked: () => boolean;
69
+ getScrollPosition: () => TerminalScrollPosition;
70
+ }
71
+ //# sourceMappingURL=terminal.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.types.d.ts","sourceRoot":"","sources":["../../../src/types/terminal.types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Theme } from '@principal-ade/industry-theme';
2
+ import type { ITheme } from '@xterm/xterm';
3
+ export declare function createTerminalTheme(theme: Theme): ITheme;
4
+ export declare function getTerminalCSSVariables(theme: Theme): Record<string, string>;
5
+ //# sourceMappingURL=terminalTheme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminalTheme.d.ts","sourceRoot":"","sources":["../../../src/utils/terminalTheme.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAK3C,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CA2BxD;AAKD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAS5E"}
@@ -0,0 +1,136 @@
1
+ /* Terminal container base styles */
2
+ .terminal-container-fix {
3
+ box-sizing: border-box;
4
+ padding: 0;
5
+ margin: 0;
6
+ }
7
+
8
+ /* Remove default xterm padding */
9
+ .terminal-container-fix .xterm {
10
+ padding: 5px 0 0 5px;
11
+ margin: 0;
12
+ height: 100%;
13
+ width: 100%;
14
+ /* Ensure consistent font rendering */
15
+ font-variant-ligatures: none;
16
+ -webkit-font-smoothing: antialiased;
17
+ -moz-osx-font-smoothing: grayscale;
18
+ }
19
+
20
+ /* Ensure the xterm-helper-textarea is properly positioned */
21
+ .xterm-helper-textarea {
22
+ position: absolute !important;
23
+ opacity: 0 !important;
24
+ left: -9999em !important;
25
+ top: 0 !important;
26
+ width: 0 !important;
27
+ height: 0 !important;
28
+ z-index: -5 !important;
29
+ white-space: nowrap !important;
30
+ overflow: hidden !important;
31
+ resize: none !important;
32
+ }
33
+
34
+ /* Viewport scrolling */
35
+ .xterm-viewport {
36
+ overflow-y: auto !important;
37
+ overflow-x: hidden !important;
38
+ }
39
+
40
+ /* ===== SCROLLBAR CUSTOMIZATION ===== */
41
+
42
+ /* Option 1: Overlay scrollbar that doesn't take space (recommended) */
43
+ .terminal-container-fix .xterm-viewport {
44
+ /* Make scrollbar overlay the content */
45
+ overflow-y: overlay !important;
46
+ /* Fallback for browsers that don't support overlay */
47
+ overflow-y: auto !important;
48
+ scrollbar-width: thin; /* Firefox */
49
+ }
50
+
51
+ /* Custom webkit scrollbar styling (Chrome, Edge, Electron) */
52
+ .terminal-container-fix .xterm-viewport::-webkit-scrollbar {
53
+ width: 10px;
54
+ background: transparent;
55
+ }
56
+
57
+ .terminal-container-fix .xterm-viewport::-webkit-scrollbar-track {
58
+ background: rgba(0, 0, 0, 0.1);
59
+ border-radius: 10px;
60
+ }
61
+
62
+ .terminal-container-fix .xterm-viewport::-webkit-scrollbar-thumb {
63
+ background: rgba(255, 255, 255, 0.2);
64
+ border-radius: 10px;
65
+ border: 2px solid transparent;
66
+ background-clip: content-box;
67
+ }
68
+
69
+ .terminal-container-fix .xterm-viewport::-webkit-scrollbar-thumb:hover {
70
+ background: rgba(255, 255, 255, 0.3);
71
+ background-clip: content-box;
72
+ }
73
+
74
+ .terminal-container-fix .xterm-viewport::-webkit-scrollbar-thumb:active {
75
+ background: rgba(255, 255, 255, 0.4);
76
+ background-clip: content-box;
77
+ }
78
+
79
+ /* Option 2: Hide scrollbar but keep scroll functionality */
80
+ .terminal-container-fix.hide-scrollbar .xterm-viewport {
81
+ scrollbar-width: none; /* Firefox */
82
+ -ms-overflow-style: none; /* IE and Edge */
83
+ }
84
+
85
+ .terminal-container-fix.hide-scrollbar .xterm-viewport::-webkit-scrollbar {
86
+ display: none; /* Chrome, Safari, Opera */
87
+ }
88
+
89
+ /* Option 3: Ultra-thin scrollbar */
90
+ .terminal-container-fix.thin-scrollbar .xterm-viewport::-webkit-scrollbar {
91
+ width: 4px;
92
+ }
93
+
94
+ .terminal-container-fix.thin-scrollbar
95
+ .xterm-viewport::-webkit-scrollbar-track {
96
+ background: transparent;
97
+ }
98
+
99
+ .terminal-container-fix.thin-scrollbar
100
+ .xterm-viewport::-webkit-scrollbar-thumb {
101
+ background: rgba(255, 255, 255, 0.15);
102
+ border-radius: 4px;
103
+ }
104
+
105
+ /* Option 4: Auto-hiding scrollbar (shows on hover) */
106
+ .terminal-container-fix.auto-hide-scrollbar .xterm-viewport::-webkit-scrollbar {
107
+ width: 10px;
108
+ opacity: 0;
109
+ transition: opacity 0.3s;
110
+ }
111
+
112
+ .terminal-container-fix.auto-hide-scrollbar:hover
113
+ .xterm-viewport::-webkit-scrollbar {
114
+ opacity: 1;
115
+ }
116
+
117
+ .terminal-container-fix.auto-hide-scrollbar
118
+ .xterm-viewport::-webkit-scrollbar-thumb {
119
+ background: rgba(255, 255, 255, 0);
120
+ transition: background 0.3s;
121
+ }
122
+
123
+ .terminal-container-fix.auto-hide-scrollbar:hover
124
+ .xterm-viewport::-webkit-scrollbar-thumb {
125
+ background: rgba(255, 255, 255, 0.2);
126
+ }
127
+
128
+ /* CSS Custom Properties for theming */
129
+ :root {
130
+ --terminal-bg: #1e1e1e;
131
+ --terminal-fg: #cccccc;
132
+ --terminal-border: #3c3c3c;
133
+ --terminal-header-bg: #2d2d2d;
134
+ --terminal-font-family: 'Menlo', 'Monaco', 'Courier New', monospace;
135
+ --terminal-font-size: 14px;
136
+ }
package/package.json ADDED
@@ -0,0 +1,125 @@
1
+ {
2
+ "name": "@industry-theme/xterm-terminal-panel",
3
+ "version": "0.1.0",
4
+ "description": "Industry-themed xterm.js terminal components with panel framework integration",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "module": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.js",
14
+ "default": "./dist/index.js"
15
+ },
16
+ "./styles.css": "./dist/styles.css",
17
+ "./package.json": "./package.json"
18
+ },
19
+ "scripts": {
20
+ "build": "bun run clean && bun run build:esm && bun run build:types && bun run build:styles",
21
+ "build:esm": "NODE_ENV=production bun build ./index.ts --outdir ./dist --entry-naming [dir]/[name].[ext] --format esm --target browser --external react --external react-dom --external @xterm/xterm --external @xterm/addon-fit --external @xterm/addon-search --external @xterm/addon-web-links --external @xterm/addon-unicode11 --external @xterm/addon-webgl --external @principal-ade/industry-theme --external @principal-ade/panel-framework-core --external lucide-react --external clsx",
22
+ "build:types": "tsc --project tsconfig.build.json --emitDeclarationOnly --declaration --declarationMap",
23
+ "build:styles": "cp src/styles/terminal-theme.css dist/styles.css",
24
+ "dev": "bun run build --watch",
25
+ "test": "bun test",
26
+ "test:watch": "bun test --watch",
27
+ "typecheck": "tsc --noEmit",
28
+ "lint": "eslint . --ext .ts,.tsx",
29
+ "lint:fix": "eslint . --ext .ts,.tsx --fix",
30
+ "format": "prettier --write .",
31
+ "format:check": "prettier --check .",
32
+ "clean": "rm -rf dist coverage",
33
+ "storybook": "storybook dev -p 6009",
34
+ "build-storybook": "storybook build"
35
+ },
36
+ "keywords": [
37
+ "terminal",
38
+ "xterm",
39
+ "xterm.js",
40
+ "pty",
41
+ "theme",
42
+ "industry",
43
+ "panel",
44
+ "panel-framework"
45
+ ],
46
+ "author": "Principal ADE Team",
47
+ "license": "MIT",
48
+ "dependencies": {
49
+ "@principal-ade/industry-theme": "^0.1.2",
50
+ "@principal-ade/panel-framework-core": "^0.1.2",
51
+ "clsx": "^2.1.1"
52
+ },
53
+ "peerDependencies": {
54
+ "@xterm/addon-fit": ">=0.10.0",
55
+ "@xterm/addon-search": ">=0.15.0",
56
+ "@xterm/addon-unicode11": ">=0.8.0",
57
+ "@xterm/addon-web-links": ">=0.11.0",
58
+ "@xterm/addon-webgl": ">=0.18.0",
59
+ "@xterm/xterm": ">=5.5.0",
60
+ "lucide-react": ">=0.263.0",
61
+ "react": ">=19.0.0",
62
+ "react-dom": ">=19.0.0"
63
+ },
64
+ "peerDependenciesMeta": {
65
+ "@xterm/addon-unicode11": {
66
+ "optional": true
67
+ },
68
+ "@xterm/addon-webgl": {
69
+ "optional": true
70
+ },
71
+ "lucide-react": {
72
+ "optional": true
73
+ }
74
+ },
75
+ "devDependencies": {
76
+ "@eslint/js": "^9.32.0",
77
+ "@storybook/addon-essentials": "^8.6.0",
78
+ "@storybook/addon-interactions": "^8.6.0",
79
+ "@storybook/addon-links": "^8.6.0",
80
+ "@storybook/addon-onboarding": "^8.6.0",
81
+ "@storybook/blocks": "^8.6.0",
82
+ "@storybook/react": "^8.6.0",
83
+ "@storybook/react-vite": "^8.6.0",
84
+ "@storybook/test": "^8.6.0",
85
+ "@types/bun": "latest",
86
+ "@types/node": "^22.15.26",
87
+ "@types/react": "^19.1.12",
88
+ "@types/react-dom": "^19.1.8",
89
+ "@typescript-eslint/eslint-plugin": "^8.38.0",
90
+ "@typescript-eslint/parser": "^8.38.0",
91
+ "@vitejs/plugin-react": "^4.3.4",
92
+ "@xterm/addon-fit": "^0.10.0",
93
+ "@xterm/addon-search": "^0.15.0",
94
+ "@xterm/addon-unicode11": "^0.8.0",
95
+ "@xterm/addon-web-links": "^0.11.0",
96
+ "@xterm/addon-webgl": "^0.18.0",
97
+ "@xterm/xterm": "^5.5.0",
98
+ "esbuild": "^0.25.8",
99
+ "eslint": "^9.32.0",
100
+ "eslint-config-prettier": "^10.1.8",
101
+ "eslint-import-resolver-typescript": "^4.4.4",
102
+ "eslint-plugin-import": "^2.32.0",
103
+ "eslint-plugin-react": "^7.37.2",
104
+ "eslint-plugin-react-hooks": "^5.0.0",
105
+ "eslint-plugin-storybook": "^0.11.1",
106
+ "lucide-react": "^0.552.0",
107
+ "prettier": "^3.6.2",
108
+ "react": "^19.1.1",
109
+ "react-dom": "^19.1.1",
110
+ "storybook": "^8.6.0",
111
+ "typescript": "^5.0.4",
112
+ "typescript-eslint": "^8.38.0",
113
+ "vite": "^6.0.7"
114
+ },
115
+ "files": [
116
+ "dist",
117
+ "README.md",
118
+ "LICENSE"
119
+ ],
120
+ "repository": {
121
+ "type": "git",
122
+ "url": "git+https://github.com/industry-theme/xterm-terminal-panel.git"
123
+ },
124
+ "homepage": "https://principal-ade.com"
125
+ }