treesap 0.1.11 → 0.1.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +217 -0
- package/dist/components/Terminal.js +1 -1
- package/dist/components/Terminal.js.map +1 -1
- package/dist/services/websocket.d.ts +4 -1
- package/dist/services/websocket.d.ts.map +1 -1
- package/dist/services/websocket.js +26 -0
- package/dist/services/websocket.js.map +1 -1
- package/dist/static/components/Terminal.js +97 -9
- package/dist/static/styles/main.css +8 -5
- package/package.json +1 -1
- package/src/components/Terminal.tsx +5 -5
- package/src/services/websocket.ts +32 -1
- package/src/static/components/Terminal.js +97 -9
- package/src/static/styles/main.css +8 -5
package/README.md
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
# Treesap
|
|
2
|
+
|
|
3
|
+
**AI Agent Framework for Distributed Development Teams**
|
|
4
|
+
|
|
5
|
+
Treesap is a revolutionary development platform that enables multiple AI agents and human developers to collaborate in real-time through persistent terminal sessions and WebSocket-based coordination. Built for the future of software development where AI agents work alongside humans in coordinated teams.
|
|
6
|
+
|
|
7
|
+
## 🌟 Key Features
|
|
8
|
+
|
|
9
|
+
- **Multi-Agent Terminal Orchestration** - Multiple AI agents can work simultaneously across different terminal sessions
|
|
10
|
+
- **Real-Time Cross-Session Monitoring** - External agents can observe and control multiple terminal sessions
|
|
11
|
+
- **Mobile-Responsive Terminal Interface** - Chat-style input for better mobile development experience
|
|
12
|
+
- **WebSocket-Based Architecture** - Real-time bidirectional communication between terminals, web UI, and external agents
|
|
13
|
+
- **Framework Agnostic** - Works with any development stack (Hono, Vite, React, etc.)
|
|
14
|
+
- **Persistent Terminal Sessions** - Sessions survive across browser refreshes and disconnections
|
|
15
|
+
- **Live Preview Integration** - Built-in development server with live reload
|
|
16
|
+
|
|
17
|
+
## 🚀 Quick Start
|
|
18
|
+
|
|
19
|
+
### Installation
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install treesap
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### Basic Setup
|
|
26
|
+
|
|
27
|
+
1. Create a `treesap.config.ts` file in your project root:
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
import type { TreesapConfig } from 'treesap';
|
|
31
|
+
|
|
32
|
+
const config: TreesapConfig = {
|
|
33
|
+
port: 1235, // Treesap server port
|
|
34
|
+
previewPort: 5173, // Your app's dev server port
|
|
35
|
+
devCommand: "npm run dev", // Command to start your dev server
|
|
36
|
+
devPort: 5173, // Port your dev server runs on
|
|
37
|
+
projectRoot: process.cwd()
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export default config;
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
2. Add scripts to your `package.json`:
|
|
44
|
+
|
|
45
|
+
```json
|
|
46
|
+
{
|
|
47
|
+
"scripts": {
|
|
48
|
+
"dev:treesap": "treesap dev",
|
|
49
|
+
"treesap": "treesap start"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
3. Start Treesap:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
npm run dev:treesap
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Visit `http://localhost:1235` to access the Treesap interface with integrated terminal and live preview.
|
|
61
|
+
|
|
62
|
+
## 🏗️ Core Concepts
|
|
63
|
+
|
|
64
|
+
### Terminal Sessions
|
|
65
|
+
Each terminal session is persistent and can be shared across multiple clients (browsers, agents, etc.). Sessions survive disconnections and can be resumed at any time.
|
|
66
|
+
|
|
67
|
+
### WebSocket Communication
|
|
68
|
+
All terminal I/O, resize events, and cross-session communication happens over WebSockets, enabling real-time collaboration between humans and AI agents.
|
|
69
|
+
|
|
70
|
+
### Agent Coordination
|
|
71
|
+
External AI agents can:
|
|
72
|
+
- Monitor multiple terminal sessions simultaneously
|
|
73
|
+
- Send commands to specific terminals
|
|
74
|
+
- Receive real-time output from all monitored sessions
|
|
75
|
+
- Coordinate complex multi-step tasks across multiple environments
|
|
76
|
+
|
|
77
|
+
## 📱 Mobile-First Design
|
|
78
|
+
|
|
79
|
+
Treesap features a responsive terminal interface with:
|
|
80
|
+
- **Chat-style input** - Familiar textarea interface for mobile users
|
|
81
|
+
- **Two-step command execution** - Send to input field, then execute
|
|
82
|
+
- **Automatic terminal resizing** - Adapts to mobile screen sizes and orientation changes
|
|
83
|
+
- **Touch-optimized controls** - Better interaction on mobile devices
|
|
84
|
+
|
|
85
|
+
## ⚙️ Configuration
|
|
86
|
+
|
|
87
|
+
The `TreesapConfig` interface supports these options:
|
|
88
|
+
|
|
89
|
+
```typescript
|
|
90
|
+
interface TreesapConfig {
|
|
91
|
+
port?: number; // Treesap server port (default: 1235)
|
|
92
|
+
previewPort?: number; // Preview iframe port (default: 3000)
|
|
93
|
+
devCommand?: string; // Command to auto-start dev server
|
|
94
|
+
devPort?: number; // Dev server port to auto-start
|
|
95
|
+
projectRoot?: string; // Project root directory
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## 🧠 Multi-Agent Development
|
|
100
|
+
|
|
101
|
+
Treesap enables unprecedented AI agent collaboration:
|
|
102
|
+
|
|
103
|
+
### Agent Orchestration
|
|
104
|
+
- **Supervisor Agents** - Monitor multiple coding agents across different terminals
|
|
105
|
+
- **Specialized Agents** - Each agent can work in its dedicated terminal session
|
|
106
|
+
- **Cross-Agent Communication** - Agents can coordinate through the WebSocket infrastructure
|
|
107
|
+
|
|
108
|
+
### Human-AI Collaboration
|
|
109
|
+
- **Seamless Handoffs** - Switch between human and AI control of terminal sessions
|
|
110
|
+
- **Real-time Monitoring** - Watch AI agents work while maintaining override capability
|
|
111
|
+
- **Collaborative Debugging** - Multiple agents can work on the same problem simultaneously
|
|
112
|
+
|
|
113
|
+
## 🛠️ Architecture
|
|
114
|
+
|
|
115
|
+
### WebSocket Terminal Service
|
|
116
|
+
- Persistent terminal sessions using `node-pty`
|
|
117
|
+
- Multi-client session sharing
|
|
118
|
+
- Cross-session monitoring and control
|
|
119
|
+
- Real-time input/output streaming
|
|
120
|
+
|
|
121
|
+
### Sapling Islands Components
|
|
122
|
+
- Reactive terminal interface
|
|
123
|
+
- Live preview integration
|
|
124
|
+
- Mobile-responsive design
|
|
125
|
+
- Chat-style input system
|
|
126
|
+
|
|
127
|
+
### External Agent Integration
|
|
128
|
+
```typescript
|
|
129
|
+
// Connect to WebSocket for monitoring
|
|
130
|
+
const ws = new WebSocket('ws://localhost:1235/terminal/ws');
|
|
131
|
+
|
|
132
|
+
// Join a terminal session
|
|
133
|
+
ws.send(JSON.stringify({
|
|
134
|
+
type: 'join',
|
|
135
|
+
sessionId: 'terminal-1',
|
|
136
|
+
terminalId: 'terminal-1'
|
|
137
|
+
}));
|
|
138
|
+
|
|
139
|
+
// Send commands
|
|
140
|
+
ws.send(JSON.stringify({
|
|
141
|
+
type: 'input',
|
|
142
|
+
sessionId: 'terminal-1',
|
|
143
|
+
data: 'npm test\r'
|
|
144
|
+
}));
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## 🎯 Use Cases
|
|
148
|
+
|
|
149
|
+
### AI Development Teams
|
|
150
|
+
- Multiple AI agents working on different parts of a large codebase
|
|
151
|
+
- Coordinated testing and deployment across multiple environments
|
|
152
|
+
- Real-time code review and collaboration between AI agents
|
|
153
|
+
|
|
154
|
+
### Educational Platforms
|
|
155
|
+
- Instructors monitoring multiple student coding sessions
|
|
156
|
+
- AI tutors providing real-time assistance
|
|
157
|
+
- Collaborative coding exercises with mixed human-AI teams
|
|
158
|
+
|
|
159
|
+
### DevOps Orchestration
|
|
160
|
+
- Coordinated deployments across multiple servers
|
|
161
|
+
- Real-time monitoring and intervention capabilities
|
|
162
|
+
- Automated testing with human oversight
|
|
163
|
+
|
|
164
|
+
## 📚 API Reference
|
|
165
|
+
|
|
166
|
+
### WebSocket Message Types
|
|
167
|
+
- `join` - Join a terminal session
|
|
168
|
+
- `leave` - Leave a terminal session
|
|
169
|
+
- `input` - Send input to terminal
|
|
170
|
+
- `resize` - Resize terminal dimensions
|
|
171
|
+
- `ping/pong` - Connection health checks
|
|
172
|
+
|
|
173
|
+
### Terminal Service Methods
|
|
174
|
+
- `getActiveSessions()` - List all active sessions
|
|
175
|
+
- `sendCommandToSession(sessionId, command)` - Send command to session
|
|
176
|
+
- `getSessionClients(sessionId)` - Get connected clients
|
|
177
|
+
- `closeSession(sessionId)` - Terminate a session
|
|
178
|
+
|
|
179
|
+
## 🔧 Development
|
|
180
|
+
|
|
181
|
+
### Prerequisites
|
|
182
|
+
- Node.js >=18.0.0
|
|
183
|
+
- TypeScript support
|
|
184
|
+
|
|
185
|
+
### Building from Source
|
|
186
|
+
```bash
|
|
187
|
+
git clone https://github.com/withtreesap/treesap.git
|
|
188
|
+
cd treesap/packages/treesap
|
|
189
|
+
npm install
|
|
190
|
+
npm run build
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Development Scripts
|
|
194
|
+
```bash
|
|
195
|
+
npm run dev # Start with hot reload
|
|
196
|
+
npm run dev:css # Watch CSS changes
|
|
197
|
+
npm run build # Build for production
|
|
198
|
+
npm run clean # Clean build artifacts
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
## 🤝 Contributing
|
|
202
|
+
|
|
203
|
+
We welcome contributions! Treesap is building the foundation for the future of AI-powered development.
|
|
204
|
+
|
|
205
|
+
## 📄 License
|
|
206
|
+
|
|
207
|
+
MIT License - see LICENSE file for details.
|
|
208
|
+
|
|
209
|
+
## 🔗 Links
|
|
210
|
+
|
|
211
|
+
- [GitHub Repository](https://github.com/withtreesap/treesap)
|
|
212
|
+
- [Issues & Bug Reports](https://github.com/withtreesap/treesap/issues)
|
|
213
|
+
- [NPM Package](https://www.npmjs.com/package/treesap)
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
**Treesap** - *Growing the future of collaborative development* 🌳
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "hono/jsx/jsx-runtime";
|
|
|
2
2
|
export function Terminal({ id, index = 1 }) {
|
|
3
3
|
const terminalId = id || `terminal-${index}`;
|
|
4
4
|
const sessionId = `terminal-${index}`;
|
|
5
|
-
return (_jsxs("sapling-island", { loading: "visible", children: [_jsxs("template", { children: [_jsx("link", { href: "https://cdn.jsdelivr.net/npm/@xterm/xterm@5.5.0/css/xterm.min.css", rel: "stylesheet" }), _jsx("script", { type: "module", src: "/components/Terminal.js" })] }), _jsx("div", { id: terminalId, class: "h-full bg-
|
|
5
|
+
return (_jsxs("sapling-island", { loading: "visible", children: [_jsxs("template", { children: [_jsx("link", { href: "https://cdn.jsdelivr.net/npm/@xterm/xterm@5.5.0/css/xterm.min.css", rel: "stylesheet" }), _jsx("script", { type: "module", src: "/components/Terminal.js" })] }), _jsx("div", { id: terminalId, class: "h-full bg-[#1e1e1e] flex font-sans overflow-hidden", children: _jsx("div", { class: "w-full flex flex-col bg-[#1e1e1e] relative min-w-0", children: _jsx("div", { id: `${terminalId}-container`, class: "h-full flex flex-col min-w-0", children: _jsx("div", { class: "flex-1 overflow-hidden min-w-0", children: _jsx("div", { id: `${terminalId}-xterm`, class: "h-full w-full min-w-0 max-w-full" }) }) }) }) }), _jsx("script", { dangerouslySetInnerHTML: { __html: `
|
|
6
6
|
// Pass terminal data to JavaScript
|
|
7
7
|
window.terminalData_${terminalId.replace(/-/g, '_')} = {
|
|
8
8
|
terminalId: '${terminalId}',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Terminal.js","sourceRoot":"","sources":["../../src/components/Terminal.tsx"],"names":[],"mappings":";AAKA,MAAM,UAAU,QAAQ,CAAC,EAAE,EAAE,EAAE,KAAK,GAAG,CAAC,EAAiB;IACvD,MAAM,UAAU,GAAG,EAAE,IAAI,YAAY,KAAK,EAAE,CAAC;IAC7C,MAAM,SAAS,GAAG,YAAY,KAAK,EAAE,CAAC;IACtC,OAAO,CACL,0BAAgB,OAAO,EAAC,SAAS,aAC/B,+BACE,eAAM,IAAI,EAAC,mEAAmE,EAAC,GAAG,EAAC,YAAY,GAAG,EAClG,iBAAQ,IAAI,EAAC,QAAQ,EAAC,GAAG,EAAC,yBAAyB,GAAU,IACpD,EAEX,cAAK,EAAE,EAAE,UAAU,EAAE,KAAK,EAAC,
|
|
1
|
+
{"version":3,"file":"Terminal.js","sourceRoot":"","sources":["../../src/components/Terminal.tsx"],"names":[],"mappings":";AAKA,MAAM,UAAU,QAAQ,CAAC,EAAE,EAAE,EAAE,KAAK,GAAG,CAAC,EAAiB;IACvD,MAAM,UAAU,GAAG,EAAE,IAAI,YAAY,KAAK,EAAE,CAAC;IAC7C,MAAM,SAAS,GAAG,YAAY,KAAK,EAAE,CAAC;IACtC,OAAO,CACL,0BAAgB,OAAO,EAAC,SAAS,aAC/B,+BACE,eAAM,IAAI,EAAC,mEAAmE,EAAC,GAAG,EAAC,YAAY,GAAG,EAClG,iBAAQ,IAAI,EAAC,QAAQ,EAAC,GAAG,EAAC,yBAAyB,GAAU,IACpD,EAEX,cAAK,EAAE,EAAE,UAAU,EAAE,KAAK,EAAC,oDAAoD,YAE7E,cAAK,KAAK,EAAC,oDAAoD,YAE7D,cAAK,EAAE,EAAE,GAAG,UAAU,YAAY,EAAE,KAAK,EAAC,8BAA8B,YAGtE,cAAK,KAAK,EAAC,gCAAgC,YACzC,cAAK,EAAE,EAAE,GAAG,UAAU,QAAQ,EAAE,KAAK,EAAC,kCAAkC,GAAO,GAC3E,GACF,GACF,GACF,EAEN,iBAAQ,uBAAuB,EAAE,EAAC,MAAM,EAAE;;8BAElB,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;yBAClC,UAAU;wBACX,SAAS;mBACd,KAAK;;OAEjB,EAAC,GAAW,IACE,CAClB,CAAC;AACJ,CAAC"}
|
|
@@ -8,10 +8,12 @@ export interface WebSocketClient {
|
|
|
8
8
|
lastPing: Date;
|
|
9
9
|
}
|
|
10
10
|
export interface WebSocketMessage {
|
|
11
|
-
type: 'join' | 'leave' | 'input' | 'ping' | 'pong';
|
|
11
|
+
type: 'join' | 'leave' | 'input' | 'resize' | 'ping' | 'pong';
|
|
12
12
|
sessionId?: string;
|
|
13
13
|
terminalId?: string;
|
|
14
14
|
data?: string;
|
|
15
|
+
cols?: number;
|
|
16
|
+
rows?: number;
|
|
15
17
|
timestamp?: number;
|
|
16
18
|
}
|
|
17
19
|
export declare class WebSocketTerminalService {
|
|
@@ -24,6 +26,7 @@ export declare class WebSocketTerminalService {
|
|
|
24
26
|
private static handleJoin;
|
|
25
27
|
private static handleLeave;
|
|
26
28
|
private static handleInput;
|
|
29
|
+
private static handleResize;
|
|
27
30
|
private static handleDisconnect;
|
|
28
31
|
private static addClientToSession;
|
|
29
32
|
private static removeClientFromSession;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/services/websocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,SAAS,EAAE,MAAM,IAAI,CAAC;AAKhD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,SAAS,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/services/websocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,SAAS,EAAE,MAAM,IAAI,CAAC;AAKhD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,SAAS,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,wBAAwB;IACnC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAgC;IAClD,OAAO,CAAC,MAAM,CAAC,OAAO,CAAsC;IAC5D,OAAO,CAAC,MAAM,CAAC,cAAc,CAAkC;IAE/D,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM;IA8ChC,OAAO,CAAC,MAAM,CAAC,aAAa;IAsB5B,OAAO,CAAC,MAAM,CAAC,aAAa;IAqC5B,OAAO,CAAC,MAAM,CAAC,UAAU;IAuCzB,OAAO,CAAC,MAAM,CAAC,WAAW;IAe1B,OAAO,CAAC,MAAM,CAAC,WAAW;IA8B1B,OAAO,CAAC,MAAM,CAAC,YAAY;IA0B3B,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAY/B,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAOjC,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAYtC,OAAO,CAAC,MAAM,CAAC,0BAA0B;IAiBzC,OAAO,CAAC,MAAM,CAAC,4BAA4B;IAQ3C,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAcjC,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAenC,OAAO,CAAC,MAAM,CAAC,YAAY;IAe3B,MAAM,CAAC,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAKrD,MAAM,CAAC,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAaxE,MAAM,CAAC,iBAAiB,IAAI,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAO7E,MAAM,CAAC,mBAAmB,IAAI,MAAM;IAIpC,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM;IAoBrC,MAAM,CAAC,OAAO;CAUf"}
|
|
@@ -80,6 +80,9 @@ export class WebSocketTerminalService {
|
|
|
80
80
|
case 'input':
|
|
81
81
|
this.handleInput(clientId, message);
|
|
82
82
|
break;
|
|
83
|
+
case 'resize':
|
|
84
|
+
this.handleResize(clientId, message);
|
|
85
|
+
break;
|
|
83
86
|
case 'ping':
|
|
84
87
|
this.sendToClient(clientId, {
|
|
85
88
|
type: 'pong',
|
|
@@ -167,6 +170,29 @@ export class WebSocketTerminalService {
|
|
|
167
170
|
});
|
|
168
171
|
}
|
|
169
172
|
}
|
|
173
|
+
static handleResize(clientId, message) {
|
|
174
|
+
const client = this.clients.get(clientId);
|
|
175
|
+
if (!client || !message.sessionId || message.cols === undefined || message.rows === undefined)
|
|
176
|
+
return;
|
|
177
|
+
// Get the terminal session
|
|
178
|
+
const session = TerminalService.getSession(message.sessionId);
|
|
179
|
+
if (!session) {
|
|
180
|
+
console.error(`Session ${message.sessionId} not found for resize`);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
// Resize the PTY
|
|
184
|
+
try {
|
|
185
|
+
console.log(`Resizing terminal session ${message.sessionId} to ${message.cols}x${message.rows}`);
|
|
186
|
+
session.process.resize(message.cols, message.rows);
|
|
187
|
+
session.lastActivity = new Date();
|
|
188
|
+
// Update session dimensions
|
|
189
|
+
session.cols = message.cols;
|
|
190
|
+
session.rows = message.rows;
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
console.error(`Failed to resize session ${message.sessionId}:`, error);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
170
196
|
static handleDisconnect(clientId) {
|
|
171
197
|
const client = this.clients.get(clientId);
|
|
172
198
|
console.log(`WebSocket client disconnected: ${clientId}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/services/websocket.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/services/websocket.ts"],"names":[],"mappings":"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"}
|
|
@@ -58,7 +58,10 @@ class TerminalManager {
|
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
setupXterm() {
|
|
61
|
-
//
|
|
61
|
+
// Detect mobile devices for responsive terminal setup
|
|
62
|
+
const isMobile = window.innerWidth <= 768 || /Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
|
|
63
|
+
|
|
64
|
+
// Create terminal instance with VS Code-like theme and responsive settings
|
|
62
65
|
this.terminal = new Terminal({
|
|
63
66
|
cursorBlink: true,
|
|
64
67
|
fontSize: 12,
|
|
@@ -86,9 +89,14 @@ class TerminalManager {
|
|
|
86
89
|
brightCyan: '#29b8db',
|
|
87
90
|
brightWhite: '#ffffff'
|
|
88
91
|
},
|
|
89
|
-
scrollback: 1000,
|
|
92
|
+
scrollback: isMobile ? 500 : 1000, // Smaller scrollback for mobile performance
|
|
90
93
|
tabStopWidth: 4,
|
|
91
|
-
allowTransparency: false
|
|
94
|
+
allowTransparency: false,
|
|
95
|
+
// Mobile-specific options
|
|
96
|
+
...(isMobile && {
|
|
97
|
+
convertEol: true,
|
|
98
|
+
disableStdin: false
|
|
99
|
+
})
|
|
92
100
|
});
|
|
93
101
|
|
|
94
102
|
// Open terminal in container
|
|
@@ -110,7 +118,20 @@ class TerminalManager {
|
|
|
110
118
|
|
|
111
119
|
// Resize handler
|
|
112
120
|
window.addEventListener('resize', () => {
|
|
113
|
-
|
|
121
|
+
// Add a small delay for mobile orientation changes
|
|
122
|
+
clearTimeout(this.resizeTimeout);
|
|
123
|
+
this.resizeTimeout = setTimeout(() => {
|
|
124
|
+
this.fitTerminal();
|
|
125
|
+
}, 100);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
// Mobile orientation change handler
|
|
129
|
+
window.addEventListener('orientationchange', () => {
|
|
130
|
+
// Longer delay for orientation changes as they can be slower
|
|
131
|
+
clearTimeout(this.orientationTimeout);
|
|
132
|
+
this.orientationTimeout = setTimeout(() => {
|
|
133
|
+
this.fitTerminal();
|
|
134
|
+
}, 300);
|
|
114
135
|
});
|
|
115
136
|
}
|
|
116
137
|
|
|
@@ -120,10 +141,77 @@ class TerminalManager {
|
|
|
120
141
|
setTimeout(() => {
|
|
121
142
|
const containerRect = this.xtermContainer.getBoundingClientRect();
|
|
122
143
|
if (containerRect.width > 0 && containerRect.height > 0) {
|
|
123
|
-
|
|
124
|
-
const
|
|
125
|
-
|
|
144
|
+
// Detect mobile devices for responsive sizing
|
|
145
|
+
const isMobile = window.innerWidth <= 768 || /Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
|
|
146
|
+
|
|
147
|
+
// Use consistent font size
|
|
148
|
+
const fontSize = 12;
|
|
149
|
+
|
|
150
|
+
// Calculate character dimensions more accurately
|
|
151
|
+
// Create a temporary element to measure actual character size
|
|
152
|
+
const testElement = document.createElement('div');
|
|
153
|
+
testElement.style.fontFamily = this.terminal.options.fontFamily;
|
|
154
|
+
testElement.style.fontSize = `${fontSize}px`;
|
|
155
|
+
testElement.style.position = 'absolute';
|
|
156
|
+
testElement.style.visibility = 'hidden';
|
|
157
|
+
testElement.style.whiteSpace = 'pre';
|
|
158
|
+
testElement.textContent = 'M'; // Use 'M' as it's typically the widest character
|
|
159
|
+
document.body.appendChild(testElement);
|
|
160
|
+
|
|
161
|
+
const charWidth = testElement.getBoundingClientRect().width;
|
|
162
|
+
const charHeight = testElement.getBoundingClientRect().height;
|
|
163
|
+
document.body.removeChild(testElement);
|
|
164
|
+
|
|
165
|
+
// Calculate columns and rows based on actual character dimensions
|
|
166
|
+
const cols = Math.max(20, Math.floor(containerRect.width / charWidth)); // Minimum 20 columns
|
|
167
|
+
const rows = Math.max(10, Math.floor(containerRect.height / charHeight)); // Minimum 10 rows
|
|
168
|
+
|
|
169
|
+
// Store previous dimensions to detect significant changes
|
|
170
|
+
const prevCols = this.lastCols || 0;
|
|
171
|
+
const prevRows = this.lastRows || 0;
|
|
172
|
+
const significantChange = Math.abs(cols - prevCols) > Math.max(10, prevCols * 0.3) ||
|
|
173
|
+
Math.abs(rows - prevRows) > Math.max(5, prevRows * 0.3);
|
|
174
|
+
|
|
175
|
+
console.log(`Fitting terminal ${this.terminalId}: ${cols}x${rows} (container: ${containerRect.width}x${containerRect.height}, charSize: ${charWidth}x${charHeight}, mobile: ${isMobile})`);
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
// Resize the terminal
|
|
126
179
|
this.terminal.resize(cols, rows);
|
|
180
|
+
|
|
181
|
+
// Send resize notification to backend PTY
|
|
182
|
+
if (this.websocket && this.websocket.readyState === WebSocket.OPEN) {
|
|
183
|
+
const resizeMessage = {
|
|
184
|
+
type: 'resize',
|
|
185
|
+
sessionId: this.sessionId,
|
|
186
|
+
terminalId: this.terminalId,
|
|
187
|
+
cols: cols,
|
|
188
|
+
rows: rows
|
|
189
|
+
};
|
|
190
|
+
this.websocket.send(JSON.stringify(resizeMessage));
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Force a refresh if there was a significant size change (like mobile rotation)
|
|
194
|
+
if (significantChange && (prevCols > 0 || prevRows > 0)) {
|
|
195
|
+
console.log(`Significant terminal size change detected, forcing refresh`);
|
|
196
|
+
// Small delay to ensure resize is processed, then refresh
|
|
197
|
+
setTimeout(() => {
|
|
198
|
+
if (this.websocket && this.websocket.readyState === WebSocket.OPEN) {
|
|
199
|
+
// Send Ctrl+L to clear and refresh the display
|
|
200
|
+
const refreshMessage = {
|
|
201
|
+
type: 'input',
|
|
202
|
+
sessionId: this.sessionId,
|
|
203
|
+
terminalId: this.terminalId,
|
|
204
|
+
data: '\x0C' // Ctrl+L (form feed) to refresh
|
|
205
|
+
};
|
|
206
|
+
this.websocket.send(JSON.stringify(refreshMessage));
|
|
207
|
+
}
|
|
208
|
+
}, 100);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Store current dimensions for next comparison
|
|
212
|
+
this.lastCols = cols;
|
|
213
|
+
this.lastRows = rows;
|
|
214
|
+
|
|
127
215
|
} else {
|
|
128
216
|
console.warn(`Terminal ${this.terminalId} container has zero dimensions, retrying...`);
|
|
129
217
|
// Retry after a short delay
|
|
@@ -336,8 +424,8 @@ function initializeTerminals() {
|
|
|
336
424
|
const saplingIslands = document.querySelectorAll('sapling-island');
|
|
337
425
|
|
|
338
426
|
for (const island of saplingIslands) {
|
|
339
|
-
// Look for a div with
|
|
340
|
-
const terminalDiv = island.querySelector('div
|
|
427
|
+
// Look for a div with terminal ID (updated selector for new background class)
|
|
428
|
+
const terminalDiv = island.querySelector('div[id^="terminal-"]');
|
|
341
429
|
if (terminalDiv && terminalDiv.id && terminalDiv.id.startsWith('terminal-')) {
|
|
342
430
|
const terminalId = terminalDiv.id;
|
|
343
431
|
console.log('Found terminal component with ID:', terminalId);
|
|
@@ -1249,10 +1249,18 @@ video {
|
|
|
1249
1249
|
width: 100%;
|
|
1250
1250
|
}
|
|
1251
1251
|
|
|
1252
|
+
.min-w-0 {
|
|
1253
|
+
min-width: 0px;
|
|
1254
|
+
}
|
|
1255
|
+
|
|
1252
1256
|
.min-w-\[140px\] {
|
|
1253
1257
|
min-width: 140px;
|
|
1254
1258
|
}
|
|
1255
1259
|
|
|
1260
|
+
.max-w-full {
|
|
1261
|
+
max-width: 100%;
|
|
1262
|
+
}
|
|
1263
|
+
|
|
1256
1264
|
.flex-1 {
|
|
1257
1265
|
flex: 1 1 0%;
|
|
1258
1266
|
}
|
|
@@ -1425,11 +1433,6 @@ video {
|
|
|
1425
1433
|
background-color: rgb(0 0 0 / var(--tw-bg-opacity, 1));
|
|
1426
1434
|
}
|
|
1427
1435
|
|
|
1428
|
-
.bg-gray-900 {
|
|
1429
|
-
--tw-bg-opacity: 1;
|
|
1430
|
-
background-color: rgb(17 24 39 / var(--tw-bg-opacity, 1));
|
|
1431
|
-
}
|
|
1432
|
-
|
|
1433
1436
|
.bg-transparent {
|
|
1434
1437
|
background-color: transparent;
|
|
1435
1438
|
}
|
package/package.json
CHANGED
|
@@ -13,15 +13,15 @@ export function Terminal({ id, index = 1 }: TerminalProps) {
|
|
|
13
13
|
<script type="module" src="/components/Terminal.js"></script>
|
|
14
14
|
</template>
|
|
15
15
|
|
|
16
|
-
<div id={terminalId} class="h-full bg-
|
|
16
|
+
<div id={terminalId} class="h-full bg-[#1e1e1e] flex font-sans overflow-hidden">
|
|
17
17
|
{/* Terminal Interface */}
|
|
18
|
-
<div class="w-full flex flex-col bg-
|
|
18
|
+
<div class="w-full flex flex-col bg-[#1e1e1e] relative min-w-0">
|
|
19
19
|
{/* Terminal header */}
|
|
20
|
-
<div id={`${terminalId}-container`} class="h-full flex flex-col">
|
|
20
|
+
<div id={`${terminalId}-container`} class="h-full flex flex-col min-w-0">
|
|
21
21
|
|
|
22
22
|
{/* Xterm.js terminal container */}
|
|
23
|
-
<div class="flex-1 overflow-hidden">
|
|
24
|
-
<div id={`${terminalId}-xterm`} class="h-full w-full"></div>
|
|
23
|
+
<div class="flex-1 overflow-hidden min-w-0">
|
|
24
|
+
<div id={`${terminalId}-xterm`} class="h-full w-full min-w-0 max-w-full"></div>
|
|
25
25
|
</div>
|
|
26
26
|
</div>
|
|
27
27
|
</div>
|
|
@@ -14,10 +14,12 @@ export interface WebSocketClient {
|
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
export interface WebSocketMessage {
|
|
17
|
-
type: 'join' | 'leave' | 'input' | 'ping' | 'pong';
|
|
17
|
+
type: 'join' | 'leave' | 'input' | 'resize' | 'ping' | 'pong';
|
|
18
18
|
sessionId?: string;
|
|
19
19
|
terminalId?: string;
|
|
20
20
|
data?: string;
|
|
21
|
+
cols?: number;
|
|
22
|
+
rows?: number;
|
|
21
23
|
timestamp?: number;
|
|
22
24
|
}
|
|
23
25
|
|
|
@@ -114,6 +116,9 @@ export class WebSocketTerminalService {
|
|
|
114
116
|
case 'input':
|
|
115
117
|
this.handleInput(clientId, message);
|
|
116
118
|
break;
|
|
119
|
+
case 'resize':
|
|
120
|
+
this.handleResize(clientId, message);
|
|
121
|
+
break;
|
|
117
122
|
case 'ping':
|
|
118
123
|
this.sendToClient(clientId, {
|
|
119
124
|
type: 'pong',
|
|
@@ -212,6 +217,32 @@ export class WebSocketTerminalService {
|
|
|
212
217
|
}
|
|
213
218
|
}
|
|
214
219
|
|
|
220
|
+
private static handleResize(clientId: string, message: WebSocketMessage) {
|
|
221
|
+
const client = this.clients.get(clientId);
|
|
222
|
+
if (!client || !message.sessionId || message.cols === undefined || message.rows === undefined) return;
|
|
223
|
+
|
|
224
|
+
// Get the terminal session
|
|
225
|
+
const session = TerminalService.getSession(message.sessionId);
|
|
226
|
+
if (!session) {
|
|
227
|
+
console.error(`Session ${message.sessionId} not found for resize`);
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Resize the PTY
|
|
232
|
+
try {
|
|
233
|
+
console.log(`Resizing terminal session ${message.sessionId} to ${message.cols}x${message.rows}`);
|
|
234
|
+
session.process.resize(message.cols, message.rows);
|
|
235
|
+
session.lastActivity = new Date();
|
|
236
|
+
|
|
237
|
+
// Update session dimensions
|
|
238
|
+
session.cols = message.cols;
|
|
239
|
+
session.rows = message.rows;
|
|
240
|
+
|
|
241
|
+
} catch (error) {
|
|
242
|
+
console.error(`Failed to resize session ${message.sessionId}:`, error);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
215
246
|
private static handleDisconnect(clientId: string) {
|
|
216
247
|
const client = this.clients.get(clientId);
|
|
217
248
|
console.log(`WebSocket client disconnected: ${clientId}`);
|
|
@@ -58,7 +58,10 @@ class TerminalManager {
|
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
setupXterm() {
|
|
61
|
-
//
|
|
61
|
+
// Detect mobile devices for responsive terminal setup
|
|
62
|
+
const isMobile = window.innerWidth <= 768 || /Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
|
|
63
|
+
|
|
64
|
+
// Create terminal instance with VS Code-like theme and responsive settings
|
|
62
65
|
this.terminal = new Terminal({
|
|
63
66
|
cursorBlink: true,
|
|
64
67
|
fontSize: 12,
|
|
@@ -86,9 +89,14 @@ class TerminalManager {
|
|
|
86
89
|
brightCyan: '#29b8db',
|
|
87
90
|
brightWhite: '#ffffff'
|
|
88
91
|
},
|
|
89
|
-
scrollback: 1000,
|
|
92
|
+
scrollback: isMobile ? 500 : 1000, // Smaller scrollback for mobile performance
|
|
90
93
|
tabStopWidth: 4,
|
|
91
|
-
allowTransparency: false
|
|
94
|
+
allowTransparency: false,
|
|
95
|
+
// Mobile-specific options
|
|
96
|
+
...(isMobile && {
|
|
97
|
+
convertEol: true,
|
|
98
|
+
disableStdin: false
|
|
99
|
+
})
|
|
92
100
|
});
|
|
93
101
|
|
|
94
102
|
// Open terminal in container
|
|
@@ -110,7 +118,20 @@ class TerminalManager {
|
|
|
110
118
|
|
|
111
119
|
// Resize handler
|
|
112
120
|
window.addEventListener('resize', () => {
|
|
113
|
-
|
|
121
|
+
// Add a small delay for mobile orientation changes
|
|
122
|
+
clearTimeout(this.resizeTimeout);
|
|
123
|
+
this.resizeTimeout = setTimeout(() => {
|
|
124
|
+
this.fitTerminal();
|
|
125
|
+
}, 100);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
// Mobile orientation change handler
|
|
129
|
+
window.addEventListener('orientationchange', () => {
|
|
130
|
+
// Longer delay for orientation changes as they can be slower
|
|
131
|
+
clearTimeout(this.orientationTimeout);
|
|
132
|
+
this.orientationTimeout = setTimeout(() => {
|
|
133
|
+
this.fitTerminal();
|
|
134
|
+
}, 300);
|
|
114
135
|
});
|
|
115
136
|
}
|
|
116
137
|
|
|
@@ -120,10 +141,77 @@ class TerminalManager {
|
|
|
120
141
|
setTimeout(() => {
|
|
121
142
|
const containerRect = this.xtermContainer.getBoundingClientRect();
|
|
122
143
|
if (containerRect.width > 0 && containerRect.height > 0) {
|
|
123
|
-
|
|
124
|
-
const
|
|
125
|
-
|
|
144
|
+
// Detect mobile devices for responsive sizing
|
|
145
|
+
const isMobile = window.innerWidth <= 768 || /Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
|
|
146
|
+
|
|
147
|
+
// Use consistent font size
|
|
148
|
+
const fontSize = 12;
|
|
149
|
+
|
|
150
|
+
// Calculate character dimensions more accurately
|
|
151
|
+
// Create a temporary element to measure actual character size
|
|
152
|
+
const testElement = document.createElement('div');
|
|
153
|
+
testElement.style.fontFamily = this.terminal.options.fontFamily;
|
|
154
|
+
testElement.style.fontSize = `${fontSize}px`;
|
|
155
|
+
testElement.style.position = 'absolute';
|
|
156
|
+
testElement.style.visibility = 'hidden';
|
|
157
|
+
testElement.style.whiteSpace = 'pre';
|
|
158
|
+
testElement.textContent = 'M'; // Use 'M' as it's typically the widest character
|
|
159
|
+
document.body.appendChild(testElement);
|
|
160
|
+
|
|
161
|
+
const charWidth = testElement.getBoundingClientRect().width;
|
|
162
|
+
const charHeight = testElement.getBoundingClientRect().height;
|
|
163
|
+
document.body.removeChild(testElement);
|
|
164
|
+
|
|
165
|
+
// Calculate columns and rows based on actual character dimensions
|
|
166
|
+
const cols = Math.max(20, Math.floor(containerRect.width / charWidth)); // Minimum 20 columns
|
|
167
|
+
const rows = Math.max(10, Math.floor(containerRect.height / charHeight)); // Minimum 10 rows
|
|
168
|
+
|
|
169
|
+
// Store previous dimensions to detect significant changes
|
|
170
|
+
const prevCols = this.lastCols || 0;
|
|
171
|
+
const prevRows = this.lastRows || 0;
|
|
172
|
+
const significantChange = Math.abs(cols - prevCols) > Math.max(10, prevCols * 0.3) ||
|
|
173
|
+
Math.abs(rows - prevRows) > Math.max(5, prevRows * 0.3);
|
|
174
|
+
|
|
175
|
+
console.log(`Fitting terminal ${this.terminalId}: ${cols}x${rows} (container: ${containerRect.width}x${containerRect.height}, charSize: ${charWidth}x${charHeight}, mobile: ${isMobile})`);
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
// Resize the terminal
|
|
126
179
|
this.terminal.resize(cols, rows);
|
|
180
|
+
|
|
181
|
+
// Send resize notification to backend PTY
|
|
182
|
+
if (this.websocket && this.websocket.readyState === WebSocket.OPEN) {
|
|
183
|
+
const resizeMessage = {
|
|
184
|
+
type: 'resize',
|
|
185
|
+
sessionId: this.sessionId,
|
|
186
|
+
terminalId: this.terminalId,
|
|
187
|
+
cols: cols,
|
|
188
|
+
rows: rows
|
|
189
|
+
};
|
|
190
|
+
this.websocket.send(JSON.stringify(resizeMessage));
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Force a refresh if there was a significant size change (like mobile rotation)
|
|
194
|
+
if (significantChange && (prevCols > 0 || prevRows > 0)) {
|
|
195
|
+
console.log(`Significant terminal size change detected, forcing refresh`);
|
|
196
|
+
// Small delay to ensure resize is processed, then refresh
|
|
197
|
+
setTimeout(() => {
|
|
198
|
+
if (this.websocket && this.websocket.readyState === WebSocket.OPEN) {
|
|
199
|
+
// Send Ctrl+L to clear and refresh the display
|
|
200
|
+
const refreshMessage = {
|
|
201
|
+
type: 'input',
|
|
202
|
+
sessionId: this.sessionId,
|
|
203
|
+
terminalId: this.terminalId,
|
|
204
|
+
data: '\x0C' // Ctrl+L (form feed) to refresh
|
|
205
|
+
};
|
|
206
|
+
this.websocket.send(JSON.stringify(refreshMessage));
|
|
207
|
+
}
|
|
208
|
+
}, 100);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Store current dimensions for next comparison
|
|
212
|
+
this.lastCols = cols;
|
|
213
|
+
this.lastRows = rows;
|
|
214
|
+
|
|
127
215
|
} else {
|
|
128
216
|
console.warn(`Terminal ${this.terminalId} container has zero dimensions, retrying...`);
|
|
129
217
|
// Retry after a short delay
|
|
@@ -336,8 +424,8 @@ function initializeTerminals() {
|
|
|
336
424
|
const saplingIslands = document.querySelectorAll('sapling-island');
|
|
337
425
|
|
|
338
426
|
for (const island of saplingIslands) {
|
|
339
|
-
// Look for a div with
|
|
340
|
-
const terminalDiv = island.querySelector('div
|
|
427
|
+
// Look for a div with terminal ID (updated selector for new background class)
|
|
428
|
+
const terminalDiv = island.querySelector('div[id^="terminal-"]');
|
|
341
429
|
if (terminalDiv && terminalDiv.id && terminalDiv.id.startsWith('terminal-')) {
|
|
342
430
|
const terminalId = terminalDiv.id;
|
|
343
431
|
console.log('Found terminal component with ID:', terminalId);
|
|
@@ -1249,10 +1249,18 @@ video {
|
|
|
1249
1249
|
width: 100%;
|
|
1250
1250
|
}
|
|
1251
1251
|
|
|
1252
|
+
.min-w-0 {
|
|
1253
|
+
min-width: 0px;
|
|
1254
|
+
}
|
|
1255
|
+
|
|
1252
1256
|
.min-w-\[140px\] {
|
|
1253
1257
|
min-width: 140px;
|
|
1254
1258
|
}
|
|
1255
1259
|
|
|
1260
|
+
.max-w-full {
|
|
1261
|
+
max-width: 100%;
|
|
1262
|
+
}
|
|
1263
|
+
|
|
1256
1264
|
.flex-1 {
|
|
1257
1265
|
flex: 1 1 0%;
|
|
1258
1266
|
}
|
|
@@ -1425,11 +1433,6 @@ video {
|
|
|
1425
1433
|
background-color: rgb(0 0 0 / var(--tw-bg-opacity, 1));
|
|
1426
1434
|
}
|
|
1427
1435
|
|
|
1428
|
-
.bg-gray-900 {
|
|
1429
|
-
--tw-bg-opacity: 1;
|
|
1430
|
-
background-color: rgb(17 24 39 / var(--tw-bg-opacity, 1));
|
|
1431
|
-
}
|
|
1432
|
-
|
|
1433
1436
|
.bg-transparent {
|
|
1434
1437
|
background-color: transparent;
|
|
1435
1438
|
}
|