@electerm/electerm-react 2.3.6 → 2.3.30
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/client/common/constants.js +1 -1
- package/client/common/has-active-input.js +10 -0
- package/client/common/ui-theme.js +25 -12
- package/client/components/ai/ai.styl +1 -3
- package/client/components/bg/custom-css.jsx +2 -2
- package/client/components/common/highlight.styl +1 -2
- package/client/components/common/input-context-menu.jsx +294 -0
- package/client/components/file-transfer/transfer.styl +6 -8
- package/client/components/footer/footer.styl +2 -5
- package/client/components/layout/layout.styl +2 -3
- package/client/components/main/error-wrapper.jsx +3 -3
- package/client/components/main/main.jsx +2 -1
- package/client/components/main/ui-theme.jsx +46 -6
- package/client/components/main/upgrade.styl +4 -6
- package/client/components/main/wrapper.styl +5 -27
- package/client/components/quick-commands/qm.styl +3 -5
- package/client/components/session/session.styl +11 -13
- package/client/components/setting-panel/list.styl +5 -5
- package/client/components/setting-panel/setting-wrap.styl +1 -6
- package/client/components/setting-panel/terminal-bg-config.jsx +3 -0
- package/client/components/setting-sync/setting-sync-form.jsx +0 -1
- package/client/components/sftp/file-item.jsx +8 -5
- package/client/components/sftp/sftp-entry.jsx +18 -4
- package/client/components/sftp/sftp.styl +24 -28
- package/client/components/sftp/transfer-tag.styl +3 -5
- package/client/components/side-panel-r/right-side-panel.styl +7 -9
- package/client/components/sidebar/index.jsx +6 -0
- package/client/components/sidebar/info.styl +0 -12
- package/client/components/sidebar/sidebar.styl +15 -16
- package/client/components/sys-menu/sub-tab-menu.jsx +2 -2
- package/client/components/sys-menu/sys-menu.styl +11 -11
- package/client/components/tabs/add-btn.jsx +258 -0
- package/client/components/tabs/add-btn.styl +12 -0
- package/client/components/tabs/index.jsx +8 -56
- package/client/components/tabs/tabs.styl +30 -31
- package/client/components/terminal/term-search.styl +3 -3
- package/client/components/terminal/terminal.jsx +2 -2
- package/client/components/terminal/terminal.styl +21 -22
- package/client/components/terminal-info/terminal-info.styl +7 -7
- package/client/components/theme/terminal-theme-list.styl +2 -2
- package/client/components/theme/theme-list-item.jsx +62 -20
- package/client/components/tree-list/tree-expander.jsx +4 -2
- package/client/css/basic.styl +5 -8
- package/client/css/includes/theme.styl +16 -0
- package/client/store/ui-theme.js +0 -35
- package/package.json +1 -1
- package/client/components/common/native-input.styl +0 -7
- package/client/components/setting-sync/sync.styl +0 -7
- package/client/css/antd-overwrite.styl +0 -10
- package/client/css/includes/theme-default.styl +0 -20
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Add button component for tabs
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import React, { Component } from 'react'
|
|
6
|
+
import { createPortal } from 'react-dom'
|
|
7
|
+
import {
|
|
8
|
+
CodeFilled,
|
|
9
|
+
PlusOutlined,
|
|
10
|
+
RightSquareFilled
|
|
11
|
+
} from '@ant-design/icons'
|
|
12
|
+
import BookmarksList from '../sidebar/bookmark-select'
|
|
13
|
+
import classNames from 'classnames'
|
|
14
|
+
import hasActiveInput from '../../common/has-active-input'
|
|
15
|
+
import './add-btn.styl'
|
|
16
|
+
|
|
17
|
+
const e = window.translate
|
|
18
|
+
|
|
19
|
+
export default class AddBtn extends Component {
|
|
20
|
+
constructor (props) {
|
|
21
|
+
super(props)
|
|
22
|
+
this.state = {
|
|
23
|
+
open: false,
|
|
24
|
+
menuPosition: 'right',
|
|
25
|
+
menuTop: 0,
|
|
26
|
+
menuLeft: 0
|
|
27
|
+
}
|
|
28
|
+
this.addBtnRef = React.createRef()
|
|
29
|
+
this.menuRef = React.createRef()
|
|
30
|
+
this.hideTimeout = null
|
|
31
|
+
this.portalContainer = null
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
getPortalContainer = () => {
|
|
35
|
+
if (!this.portalContainer) {
|
|
36
|
+
this.portalContainer = document.createElement('div')
|
|
37
|
+
this.portalContainer.className = 'add-btn-menu-portal'
|
|
38
|
+
document.body.appendChild(this.portalContainer)
|
|
39
|
+
}
|
|
40
|
+
return this.portalContainer
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
componentDidMount () {
|
|
44
|
+
document.addEventListener('click', this.handleDocumentClick)
|
|
45
|
+
// Listen for dropdown events to prevent menu closing
|
|
46
|
+
document.addEventListener('ant-dropdown-show', this.handleDropdownShow)
|
|
47
|
+
document.addEventListener('ant-dropdown-hide', this.handleDropdownHide)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
componentWillUnmount () {
|
|
51
|
+
document.removeEventListener('click', this.handleDocumentClick)
|
|
52
|
+
document.removeEventListener('ant-dropdown-show', this.handleDropdownShow)
|
|
53
|
+
document.removeEventListener('ant-dropdown-hide', this.handleDropdownHide)
|
|
54
|
+
if (this.hideTimeout) {
|
|
55
|
+
clearTimeout(this.hideTimeout)
|
|
56
|
+
}
|
|
57
|
+
// Clean up portal container
|
|
58
|
+
if (this.portalContainer) {
|
|
59
|
+
document.body.removeChild(this.portalContainer)
|
|
60
|
+
this.portalContainer = null
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
handleDropdownShow = () => {
|
|
65
|
+
// Cancel any pending hide timeout when dropdown shows
|
|
66
|
+
if (this.hideTimeout) {
|
|
67
|
+
clearTimeout(this.hideTimeout)
|
|
68
|
+
this.hideTimeout = null
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
handleDropdownHide = () => {
|
|
73
|
+
// Small delay after dropdown hides before allowing menu to close
|
|
74
|
+
// This prevents flicker when dropdown closes
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
handleDocumentClick = (e) => {
|
|
78
|
+
// Don't close menu when clicking inside menu or add button
|
|
79
|
+
if (this.menuRef.current && this.menuRef.current.contains(e.target)) {
|
|
80
|
+
return
|
|
81
|
+
}
|
|
82
|
+
if (this.addBtnRef.current && this.addBtnRef.current.contains(e.target)) {
|
|
83
|
+
return
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Don't close if clicking on dropdown or active input elements
|
|
87
|
+
if (hasActiveInput()) {
|
|
88
|
+
return
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
this.setState({ open: false })
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
handleMouseEnter = () => {
|
|
95
|
+
if (this.hideTimeout) {
|
|
96
|
+
clearTimeout(this.hideTimeout)
|
|
97
|
+
this.hideTimeout = null
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Calculate menu position
|
|
101
|
+
if (this.addBtnRef.current) {
|
|
102
|
+
const rect = this.addBtnRef.current.getBoundingClientRect()
|
|
103
|
+
const windowWidth = window.innerWidth
|
|
104
|
+
const windowHeight = window.innerHeight
|
|
105
|
+
|
|
106
|
+
// Estimate menu width and height
|
|
107
|
+
const estimatedMenuWidth = Math.min(300, windowWidth - 40) // Responsive width
|
|
108
|
+
const estimatedMenuHeight = 400 // Rough estimate
|
|
109
|
+
|
|
110
|
+
// Calculate fixed position coordinates
|
|
111
|
+
let menuTop = rect.bottom + 4 // 4px margin
|
|
112
|
+
let menuLeft = rect.left
|
|
113
|
+
let menuPosition = 'right'
|
|
114
|
+
|
|
115
|
+
// Check if menu would overflow bottom of screen
|
|
116
|
+
if (menuTop + estimatedMenuHeight > windowHeight - 20) {
|
|
117
|
+
menuTop = rect.top - estimatedMenuHeight - 4 // Show above button
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// If aligning right would cause overflow, align left instead
|
|
121
|
+
if (rect.left + estimatedMenuWidth > windowWidth - 20) {
|
|
122
|
+
menuPosition = 'left'
|
|
123
|
+
menuLeft = rect.right - estimatedMenuWidth
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// If aligning left would cause overflow (negative position), force right
|
|
127
|
+
if (menuLeft < 20) {
|
|
128
|
+
menuPosition = 'right'
|
|
129
|
+
menuLeft = Math.max(20, rect.left) // Ensure at least 20px from edge
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Final check to ensure menu doesn't go off screen
|
|
133
|
+
if (menuLeft + estimatedMenuWidth > windowWidth - 20) {
|
|
134
|
+
menuLeft = windowWidth - estimatedMenuWidth - 20
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
this.setState({
|
|
138
|
+
open: true,
|
|
139
|
+
menuPosition,
|
|
140
|
+
menuTop,
|
|
141
|
+
menuLeft
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
if (!this.state.open) {
|
|
145
|
+
window.openTabBatch = this.props.batch
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
handleMouseLeave = () => {
|
|
151
|
+
this.hideTimeout = setTimeout(() => {
|
|
152
|
+
this.setState({ open: false })
|
|
153
|
+
}, 200)
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
handleMenuMouseEnter = () => {
|
|
157
|
+
if (this.hideTimeout) {
|
|
158
|
+
clearTimeout(this.hideTimeout)
|
|
159
|
+
this.hideTimeout = null
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
handleMenuMouseLeave = () => {
|
|
164
|
+
// Don't close if there's an active input or dropdown
|
|
165
|
+
if (hasActiveInput()) {
|
|
166
|
+
return
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
this.hideTimeout = setTimeout(() => {
|
|
170
|
+
this.setState({ open: false })
|
|
171
|
+
}, 200)
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
handleMenuScroll = (e) => {
|
|
175
|
+
// Prevent scroll events from bubbling up
|
|
176
|
+
e.stopPropagation()
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
handleTabAdd = () => {
|
|
180
|
+
if (!window.store.hasNodePty) {
|
|
181
|
+
window.store.onNewSsh()
|
|
182
|
+
return
|
|
183
|
+
}
|
|
184
|
+
window.store.addTab(
|
|
185
|
+
undefined, undefined,
|
|
186
|
+
this.props.batch
|
|
187
|
+
)
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
renderMenus = () => {
|
|
191
|
+
const { onNewSsh } = window.store
|
|
192
|
+
const cls = 'pd2x pd1y context-item pointer'
|
|
193
|
+
const addTabBtn = window.store.hasNodePty
|
|
194
|
+
? (
|
|
195
|
+
<div
|
|
196
|
+
className={cls}
|
|
197
|
+
onClick={this.handleTabAdd}
|
|
198
|
+
>
|
|
199
|
+
<RightSquareFilled /> {e('newTab')}
|
|
200
|
+
</div>
|
|
201
|
+
)
|
|
202
|
+
: null
|
|
203
|
+
|
|
204
|
+
const { menuPosition, menuTop, menuLeft } = this.state
|
|
205
|
+
|
|
206
|
+
return (
|
|
207
|
+
<div
|
|
208
|
+
ref={this.menuRef}
|
|
209
|
+
className={`add-menu-wrap add-menu-${menuPosition}`}
|
|
210
|
+
style={{
|
|
211
|
+
maxHeight: window.innerHeight - menuTop - 50,
|
|
212
|
+
top: menuTop,
|
|
213
|
+
left: menuLeft
|
|
214
|
+
}}
|
|
215
|
+
onMouseEnter={this.handleMenuMouseEnter}
|
|
216
|
+
onMouseLeave={this.handleMenuMouseLeave}
|
|
217
|
+
onScroll={this.handleMenuScroll}
|
|
218
|
+
>
|
|
219
|
+
<div
|
|
220
|
+
className={cls}
|
|
221
|
+
onClick={onNewSsh}
|
|
222
|
+
>
|
|
223
|
+
<CodeFilled /> {e('newBookmark')}
|
|
224
|
+
</div>
|
|
225
|
+
{addTabBtn}
|
|
226
|
+
<BookmarksList
|
|
227
|
+
store={window.store}
|
|
228
|
+
/>
|
|
229
|
+
</div>
|
|
230
|
+
)
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
render () {
|
|
234
|
+
const { empty, className } = this.props
|
|
235
|
+
const { open } = this.state
|
|
236
|
+
const cls = classNames(
|
|
237
|
+
'tabs-add-btn pointer',
|
|
238
|
+
className,
|
|
239
|
+
{
|
|
240
|
+
empty
|
|
241
|
+
}
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
return (
|
|
245
|
+
<>
|
|
246
|
+
<PlusOutlined
|
|
247
|
+
title={e('openNewTerm')}
|
|
248
|
+
className={cls}
|
|
249
|
+
onClick={this.handleTabAdd}
|
|
250
|
+
onMouseEnter={this.handleMouseEnter}
|
|
251
|
+
onMouseLeave={this.handleMouseLeave}
|
|
252
|
+
ref={this.addBtnRef}
|
|
253
|
+
/>
|
|
254
|
+
{open && createPortal(this.renderMenus(), this.getPortalContainer())}
|
|
255
|
+
</>
|
|
256
|
+
)
|
|
257
|
+
}
|
|
258
|
+
}
|
|
@@ -8,12 +8,9 @@ import runIdle from '../../common/run-idle'
|
|
|
8
8
|
import { throttle } from 'lodash-es'
|
|
9
9
|
import TabTitle from './tab-title'
|
|
10
10
|
import {
|
|
11
|
-
CodeFilled,
|
|
12
11
|
DownOutlined,
|
|
13
12
|
LeftOutlined,
|
|
14
|
-
|
|
15
|
-
RightOutlined,
|
|
16
|
-
RightSquareFilled
|
|
13
|
+
RightOutlined
|
|
17
14
|
} from '@ant-design/icons'
|
|
18
15
|
import {
|
|
19
16
|
SingleIcon,
|
|
@@ -25,7 +22,7 @@ import {
|
|
|
25
22
|
TwoRowsRightIcon,
|
|
26
23
|
TwoColumnsBottomIcon
|
|
27
24
|
} from '../icons/split-icons'
|
|
28
|
-
import { Dropdown
|
|
25
|
+
import { Dropdown } from 'antd'
|
|
29
26
|
import Tab from './tab'
|
|
30
27
|
import './tabs.styl'
|
|
31
28
|
import {
|
|
@@ -37,7 +34,7 @@ import {
|
|
|
37
34
|
splitMapDesc
|
|
38
35
|
} from '../../common/constants'
|
|
39
36
|
import WindowControl from './window-control'
|
|
40
|
-
import
|
|
37
|
+
import AddBtn from './add-btn'
|
|
41
38
|
import AppDrag from './app-drag'
|
|
42
39
|
import NoSession from './no-session'
|
|
43
40
|
import classNames from 'classnames'
|
|
@@ -190,45 +187,6 @@ export default class Tabs extends Component {
|
|
|
190
187
|
window.store.setLayout(key)
|
|
191
188
|
}
|
|
192
189
|
|
|
193
|
-
handleOpenChange = (open) => {
|
|
194
|
-
if (open) {
|
|
195
|
-
window.openTabBatch = this.props.batch
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
renderMenus () {
|
|
200
|
-
const { onNewSsh } = window.store
|
|
201
|
-
const cls = 'pd2x pd1y context-item pointer'
|
|
202
|
-
const addTabBtn = window.store.hasNodePty
|
|
203
|
-
? (
|
|
204
|
-
<div
|
|
205
|
-
className={cls}
|
|
206
|
-
onClick={this.handleTabAdd}
|
|
207
|
-
>
|
|
208
|
-
<RightSquareFilled /> {e('newTab')}
|
|
209
|
-
</div>
|
|
210
|
-
)
|
|
211
|
-
: null
|
|
212
|
-
return (
|
|
213
|
-
<div
|
|
214
|
-
className='add-menu-wrap' style={{
|
|
215
|
-
maxHeight: window.innerHeight - 200
|
|
216
|
-
}}
|
|
217
|
-
>
|
|
218
|
-
<div
|
|
219
|
-
className={cls}
|
|
220
|
-
onClick={onNewSsh}
|
|
221
|
-
>
|
|
222
|
-
<CodeFilled /> {e('newBookmark')}
|
|
223
|
-
</div>
|
|
224
|
-
{addTabBtn}
|
|
225
|
-
<BookmarksList
|
|
226
|
-
store={window.store}
|
|
227
|
-
/>
|
|
228
|
-
</div>
|
|
229
|
-
)
|
|
230
|
-
}
|
|
231
|
-
|
|
232
190
|
renderAddBtn = () => {
|
|
233
191
|
const cls = classNames(
|
|
234
192
|
'pointer tabs-add-btn font16',
|
|
@@ -237,17 +195,11 @@ export default class Tabs extends Component {
|
|
|
237
195
|
}
|
|
238
196
|
)
|
|
239
197
|
return (
|
|
240
|
-
<
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
<PlusOutlined
|
|
246
|
-
title={e('openNewTerm')}
|
|
247
|
-
className={cls}
|
|
248
|
-
onClick={this.handleTabAdd}
|
|
249
|
-
/>
|
|
250
|
-
</Popover>
|
|
198
|
+
<AddBtn
|
|
199
|
+
className={cls}
|
|
200
|
+
empty={!this.props.tabs?.length}
|
|
201
|
+
batch={this.props.batch}
|
|
202
|
+
/>
|
|
251
203
|
)
|
|
252
204
|
}
|
|
253
205
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
|
|
2
2
|
.tabs
|
|
3
3
|
position relative
|
|
4
4
|
height 36px
|
|
5
5
|
overflow hidden
|
|
6
|
-
background main-dark
|
|
6
|
+
background var(--main-dark)
|
|
7
7
|
z-index 12
|
|
8
8
|
::-webkit-scrollbar
|
|
9
9
|
width 0
|
|
@@ -41,17 +41,17 @@
|
|
|
41
41
|
line-height 36px
|
|
42
42
|
margin 0 1px 0 0
|
|
43
43
|
border-radius 3px 3px 0 0
|
|
44
|
-
background main-dark
|
|
44
|
+
background var(--main-dark)
|
|
45
45
|
text-align center
|
|
46
|
-
color text-dark
|
|
46
|
+
color var(--text-dark)
|
|
47
47
|
&.tab-last
|
|
48
48
|
margin-right 5px
|
|
49
49
|
.tab-reload
|
|
50
50
|
.tab-close
|
|
51
51
|
display none
|
|
52
52
|
&.active
|
|
53
|
-
color text
|
|
54
|
-
background main
|
|
53
|
+
color var(--text)
|
|
54
|
+
background var(--main)
|
|
55
55
|
.tab-count
|
|
56
56
|
opacity 1
|
|
57
57
|
&:hover
|
|
@@ -63,12 +63,12 @@
|
|
|
63
63
|
left -2px
|
|
64
64
|
top 0
|
|
65
65
|
width 1px
|
|
66
|
-
border 1px dashed text-dark
|
|
66
|
+
border 1px dashed var(--text-dark)
|
|
67
67
|
height 36px
|
|
68
68
|
&.error
|
|
69
69
|
.tab-reload
|
|
70
70
|
display inline-block
|
|
71
|
-
color text-light
|
|
71
|
+
color var(--text-light)
|
|
72
72
|
@keyframes blink
|
|
73
73
|
0%
|
|
74
74
|
background-color #e0e0e0
|
|
@@ -86,13 +86,13 @@
|
|
|
86
86
|
width 5px
|
|
87
87
|
height 5px
|
|
88
88
|
border-radius 5px
|
|
89
|
-
background-color text-dark
|
|
89
|
+
background-color var(--text-dark)
|
|
90
90
|
&.success
|
|
91
|
-
background-color success
|
|
91
|
+
background-color var(--success)
|
|
92
92
|
&.error
|
|
93
|
-
background-color error
|
|
93
|
+
background-color var(--error)
|
|
94
94
|
&.processing
|
|
95
|
-
background-color primary
|
|
95
|
+
background-color var(--primary)
|
|
96
96
|
.is-transporting .tab-traffic
|
|
97
97
|
display block
|
|
98
98
|
animation blink 2s infinite
|
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
left 10px
|
|
103
103
|
width 5px
|
|
104
104
|
border-radius 0
|
|
105
|
-
background-color success
|
|
105
|
+
background-color var(--success)
|
|
106
106
|
.is-terminal-active .tab-terminal-feed
|
|
107
107
|
display block
|
|
108
108
|
animation blink 2s infinite
|
|
@@ -111,7 +111,7 @@
|
|
|
111
111
|
display none
|
|
112
112
|
left 20px
|
|
113
113
|
border-radius 0
|
|
114
|
-
color success
|
|
114
|
+
color var(--success)
|
|
115
115
|
background none
|
|
116
116
|
font-size 8px
|
|
117
117
|
left 2px
|
|
@@ -121,29 +121,29 @@
|
|
|
121
121
|
right 5px
|
|
122
122
|
cursor pointer
|
|
123
123
|
top 50%
|
|
124
|
+
background var(--main)
|
|
124
125
|
margin-top -8px
|
|
125
|
-
background text-dark
|
|
126
126
|
border-radius 100%
|
|
127
|
-
color text
|
|
127
|
+
color var(--text)
|
|
128
128
|
height 16px
|
|
129
129
|
width 16px
|
|
130
130
|
text-align center
|
|
131
131
|
line-height 16px
|
|
132
132
|
font-size 10px
|
|
133
133
|
&:hover
|
|
134
|
-
|
|
134
|
+
background var(--primary)
|
|
135
|
+
color var(--primary-contast)
|
|
135
136
|
|
|
136
137
|
.tabs-add-btn
|
|
137
138
|
display inline-block
|
|
138
139
|
vertical-align middle
|
|
139
140
|
margin 0 3px 0 3px
|
|
140
|
-
color text
|
|
141
141
|
&.empty
|
|
142
142
|
font-size 20px
|
|
143
143
|
margin-left 20px
|
|
144
144
|
margin-top 10px
|
|
145
145
|
&:hover
|
|
146
|
-
color text-light
|
|
146
|
+
color var(--text-light)
|
|
147
147
|
.tabs-extra
|
|
148
148
|
position absolute
|
|
149
149
|
height 40px
|
|
@@ -153,7 +153,6 @@
|
|
|
153
153
|
z-index 20
|
|
154
154
|
|
|
155
155
|
.tabs-dd-icon
|
|
156
|
-
color text
|
|
157
156
|
font-size 12px
|
|
158
157
|
.tabs-add-btn
|
|
159
158
|
margin-top 0
|
|
@@ -165,21 +164,21 @@
|
|
|
165
164
|
z-index 900
|
|
166
165
|
border-radius 0 0 3px 3px
|
|
167
166
|
padding 0
|
|
168
|
-
background main-
|
|
167
|
+
background var(--main-lighter)
|
|
169
168
|
|
|
170
169
|
.window-control-box
|
|
171
170
|
display inline-block
|
|
172
171
|
padding 5px 10px
|
|
173
|
-
color text
|
|
172
|
+
color var(--text)
|
|
174
173
|
&:hover
|
|
175
|
-
color primary
|
|
174
|
+
color var(--primary)
|
|
176
175
|
cursor pointer
|
|
177
176
|
.icon-maximize
|
|
178
|
-
border-color primary
|
|
177
|
+
border-color var(--primary)
|
|
179
178
|
.icon-maximize
|
|
180
179
|
width 10px
|
|
181
180
|
height 7px
|
|
182
|
-
border 1px solid text
|
|
181
|
+
border 1px solid var(--text)
|
|
183
182
|
cursor pointer
|
|
184
183
|
&.is-max
|
|
185
184
|
height 6px
|
|
@@ -196,11 +195,11 @@
|
|
|
196
195
|
border-right none
|
|
197
196
|
|
|
198
197
|
.control-icon:hover
|
|
199
|
-
color text-light
|
|
198
|
+
color var(--text-light)
|
|
200
199
|
.tab-scroll-icon
|
|
201
|
-
color text-dark
|
|
200
|
+
color var(--text-dark)
|
|
202
201
|
&:hover
|
|
203
|
-
color text
|
|
202
|
+
color var(--text)
|
|
204
203
|
|
|
205
204
|
.add-menu-wrap
|
|
206
205
|
overflow-y scroll
|
|
@@ -208,9 +207,9 @@
|
|
|
208
207
|
.window-control-minimize
|
|
209
208
|
.window-control-maximize
|
|
210
209
|
&:hover
|
|
211
|
-
background main-dark
|
|
210
|
+
background var(--main-dark)
|
|
212
211
|
.window-control-close:hover
|
|
213
|
-
background error
|
|
212
|
+
background var(--error)
|
|
214
213
|
|
|
215
214
|
.system-ui
|
|
216
215
|
.window-controls
|
|
@@ -219,7 +218,7 @@
|
|
|
219
218
|
margin-right 5px
|
|
220
219
|
font-size 14px
|
|
221
220
|
.no-sessions
|
|
222
|
-
background main
|
|
221
|
+
background var(--main)
|
|
223
222
|
text-align center
|
|
224
223
|
padding 50px 0
|
|
225
224
|
position absolute
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
|
|
2
2
|
.terms-box
|
|
3
|
-
background main
|
|
3
|
+
background var(--main)
|
|
4
4
|
position relative
|
|
5
5
|
.loading-wrapper
|
|
6
6
|
padding 30px
|
|
@@ -12,22 +12,22 @@
|
|
|
12
12
|
z-index 30
|
|
13
13
|
|
|
14
14
|
.terminal-control
|
|
15
|
-
background main
|
|
15
|
+
background var(--main)
|
|
16
16
|
line-height 32px
|
|
17
17
|
padding 0 10px
|
|
18
18
|
|
|
19
19
|
.terms-box
|
|
20
20
|
position relative
|
|
21
21
|
.term-wrap
|
|
22
|
-
background main
|
|
22
|
+
background var(--main)
|
|
23
23
|
position absolute
|
|
24
24
|
|
|
25
25
|
.vertical
|
|
26
26
|
.term-wrap.not-first-term
|
|
27
|
-
border-top 1px solid main-
|
|
27
|
+
border-top 1px solid var(--main-lighter)
|
|
28
28
|
.horizontal
|
|
29
29
|
.term-wrap.not-first-term
|
|
30
|
-
border-left 1px solid main-
|
|
30
|
+
border-left 1px solid var(--main-lighter)
|
|
31
31
|
.term-sftp-tabs
|
|
32
32
|
margin-left 5px
|
|
33
33
|
|
|
@@ -48,9 +48,9 @@
|
|
|
48
48
|
left 0
|
|
49
49
|
top 0
|
|
50
50
|
width 100%
|
|
51
|
-
background main
|
|
52
|
-
color text
|
|
53
|
-
box-shadow 0px 3px 3px 0px
|
|
51
|
+
background var(--main)
|
|
52
|
+
color var(--text)
|
|
53
|
+
box-shadow 0px 3px 3px 0px var(--main-lighter)
|
|
54
54
|
z-index 66
|
|
55
55
|
padding-bottom 32px
|
|
56
56
|
.terminal-normal-buffer-body
|
|
@@ -59,9 +59,9 @@
|
|
|
59
59
|
.terminal-normal-buffer-close
|
|
60
60
|
cursor pointer
|
|
61
61
|
font-size 14px
|
|
62
|
-
color text
|
|
62
|
+
color var(--text)
|
|
63
63
|
&:hover
|
|
64
|
-
color text-light
|
|
64
|
+
color var(--text-light)
|
|
65
65
|
.terminal-normal-buffer-footer
|
|
66
66
|
position absolute
|
|
67
67
|
left 0
|
|
@@ -69,25 +69,24 @@
|
|
|
69
69
|
width 100%
|
|
70
70
|
height 32px
|
|
71
71
|
line-height 32px
|
|
72
|
-
box-shadow 0px -3px 3px 0px
|
|
73
|
-
background main-
|
|
72
|
+
box-shadow 0px -3px 3px 0px var(--main)
|
|
73
|
+
background var(--main-lighter)
|
|
74
74
|
.batch-input-wrap
|
|
75
75
|
width calc(100% - 80px)
|
|
76
76
|
|
|
77
77
|
.terminal-suggestions-wrap
|
|
78
78
|
position absolute
|
|
79
79
|
z-index 100
|
|
80
|
-
color text
|
|
81
80
|
max-height 300px
|
|
82
81
|
max-width 300px
|
|
83
82
|
min-width 200px
|
|
84
|
-
box-shadow 0px 0px 3px 3px main-
|
|
83
|
+
box-shadow 0px 0px 3px 3px var(--main-lighter)
|
|
85
84
|
display flex
|
|
86
85
|
flex-direction column
|
|
87
|
-
background main
|
|
86
|
+
background var(--main)
|
|
88
87
|
border-radius 4px
|
|
89
88
|
&.reverse .terminal-suggestions-list
|
|
90
|
-
border-top 1px solid main-
|
|
89
|
+
border-top 1px solid var(--main-lighter)
|
|
91
90
|
border-bottom none
|
|
92
91
|
|
|
93
92
|
.terminal-suggestions-list
|
|
@@ -96,7 +95,7 @@
|
|
|
96
95
|
overflow-y auto
|
|
97
96
|
max-height 268px
|
|
98
97
|
max-width 300px
|
|
99
|
-
border-bottom 1px solid main-
|
|
98
|
+
border-bottom 1px solid var(--main-lighter)
|
|
100
99
|
|
|
101
100
|
.terminal-suggestions-sticky
|
|
102
101
|
flex-shrink 0
|
|
@@ -109,9 +108,9 @@
|
|
|
109
108
|
align-items center
|
|
110
109
|
padding 5px 10px
|
|
111
110
|
cursor pointer
|
|
112
|
-
color text
|
|
111
|
+
color var(--text)
|
|
113
112
|
&:hover
|
|
114
|
-
background-color main-
|
|
113
|
+
background-color var(--main-lighter)
|
|
115
114
|
.suggestion-delete
|
|
116
115
|
visibility visible
|
|
117
116
|
|
|
@@ -124,9 +123,9 @@
|
|
|
124
123
|
.suggestion-type
|
|
125
124
|
margin-left 5px
|
|
126
125
|
font-size 0.8em
|
|
127
|
-
color
|
|
126
|
+
color var(--text)
|
|
128
127
|
&:hover
|
|
129
|
-
color
|
|
128
|
+
color var(--success)
|
|
130
129
|
|
|
131
130
|
.suggestion-delete
|
|
132
131
|
margin-left 5px
|