Compare commits
99 Commits
v1.0.0-alp
...
v1.0.0-alp
Author | SHA1 | Date | |
---|---|---|---|
![]() |
eed01e76ad | ||
![]() |
7f8d012a8a | ||
![]() |
9ad1371c2b | ||
![]() |
0d37f4736a | ||
![]() |
e71d404c2b | ||
![]() |
0545471f3c | ||
![]() |
a04c60046e | ||
![]() |
5c2003cc2f | ||
![]() |
dc864781e4 | ||
![]() |
e315654d0a | ||
![]() |
5863ea0de1 | ||
![]() |
cce49c69d6 | ||
![]() |
3e41d0df4e | ||
![]() |
507b69acb4 | ||
![]() |
6b08341760 | ||
![]() |
62bf681598 | ||
![]() |
e403a423b7 | ||
![]() |
6b49cdc974 | ||
![]() |
5fe71b8169 | ||
![]() |
6bc2d18f3c | ||
![]() |
6fa5ab5eb2 | ||
![]() |
2411713501 | ||
![]() |
947e0f8b66 | ||
![]() |
f8bc94fe78 | ||
![]() |
5a32a45b19 | ||
![]() |
62222e67fb | ||
![]() |
6aab782326 | ||
![]() |
cec349d021 | ||
![]() |
c8b40647a9 | ||
![]() |
67ed830e97 | ||
![]() |
975d4d62ef | ||
![]() |
275791517b | ||
![]() |
9db452f489 | ||
![]() |
5094262e68 | ||
![]() |
17cf0f59c9 | ||
![]() |
aa805b912b | ||
![]() |
4b3cbc5639 | ||
![]() |
6a59db1a36 | ||
![]() |
2d43e29bcd | ||
![]() |
bf5e460bca | ||
![]() |
d574f634c9 | ||
![]() |
4ceb8ff897 | ||
![]() |
0f8c27e536 | ||
![]() |
d6fb71dca2 | ||
![]() |
38e450f70a | ||
![]() |
18c0a585a2 | ||
![]() |
8a1c33b82a | ||
![]() |
f81bda1686 | ||
![]() |
c285b89b6c | ||
![]() |
6dc46bb970 | ||
![]() |
7d25816751 | ||
![]() |
d6f163b048 | ||
![]() |
f357dab8f0 | ||
![]() |
0eaf857b02 | ||
![]() |
f367ea6c74 | ||
![]() |
dc4b984ed0 | ||
![]() |
4b7b692ace | ||
![]() |
0749096d9f | ||
![]() |
5b76947d70 | ||
![]() |
98a7801803 | ||
![]() |
ce2c72393b | ||
![]() |
2ea2c02845 | ||
![]() |
4b1ba7863f | ||
![]() |
2e558e2aa2 | ||
![]() |
a98f2ce12d | ||
![]() |
046ef239db | ||
![]() |
6cc20c3719 | ||
![]() |
3f8f87a141 | ||
![]() |
5f337e6dbe | ||
![]() |
7af14c5699 | ||
![]() |
d3a5c7be8d | ||
![]() |
8aff33d59c | ||
![]() |
7f45bb57fc | ||
![]() |
06d14f9bb2 | ||
![]() |
64f670bd86 | ||
![]() |
c9dde2e29c | ||
![]() |
46d8533fee | ||
![]() |
627d7402ca | ||
![]() |
a10c6e6251 | ||
![]() |
594597e93d | ||
![]() |
2dded5ddb6 | ||
![]() |
c4415577fa | ||
![]() |
6e725ca16d | ||
![]() |
9683564826 | ||
![]() |
57e313d9de | ||
![]() |
1781ee2818 | ||
![]() |
406b061cf9 | ||
![]() |
d861941b15 | ||
![]() |
578a7c1a7b | ||
![]() |
a7bee5dd01 | ||
![]() |
81579fa9cc | ||
![]() |
1826cbe83b | ||
![]() |
56bf5f888c | ||
![]() |
084be557b0 | ||
![]() |
6d81290e1d | ||
![]() |
8243a219de | ||
![]() |
5196069b33 | ||
![]() |
0a4fadd5ba | ||
![]() |
0b56259a36 |
55
.eslintrc.yml
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
parser: babel-eslint
|
||||||
|
extends: standard
|
||||||
|
env:
|
||||||
|
node: true
|
||||||
|
commonjs: true
|
||||||
|
rules:
|
||||||
|
no-duplicate-imports: error
|
||||||
|
import/no-duplicates: 0
|
||||||
|
array-bracket-spacing:
|
||||||
|
- error
|
||||||
|
- never
|
||||||
|
block-scoped-var: error
|
||||||
|
brace-style:
|
||||||
|
- error
|
||||||
|
- 1tbs
|
||||||
|
computed-property-spacing:
|
||||||
|
- error
|
||||||
|
- never
|
||||||
|
comma-dangle:
|
||||||
|
- error
|
||||||
|
- always-multiline
|
||||||
|
curly: error
|
||||||
|
eol-last: error
|
||||||
|
eqeqeq:
|
||||||
|
- error
|
||||||
|
- smart
|
||||||
|
max-depth:
|
||||||
|
- 1
|
||||||
|
- 5
|
||||||
|
max-statements:
|
||||||
|
- 1
|
||||||
|
- 80
|
||||||
|
no-multiple-empty-lines: error
|
||||||
|
no-mixed-spaces-and-tabs: error
|
||||||
|
no-trailing-spaces: error
|
||||||
|
no-unused-vars:
|
||||||
|
- error
|
||||||
|
- vars: all
|
||||||
|
args: after-used
|
||||||
|
argsIgnorePattern: ^_
|
||||||
|
no-undef: error
|
||||||
|
no-use-before-define:
|
||||||
|
- error
|
||||||
|
- nofunc
|
||||||
|
no-var: error
|
||||||
|
object-curly-spacing:
|
||||||
|
- error
|
||||||
|
- always
|
||||||
|
quote-props:
|
||||||
|
- warn
|
||||||
|
- as-needed
|
||||||
|
- keywords: true
|
||||||
|
numbers: true
|
||||||
|
strict:
|
||||||
|
- error
|
18
.github/stale.yml
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# Number of days of inactivity before an issue becomes stale
|
||||||
|
daysUntilStale: 60
|
||||||
|
# Number of days of inactivity before a stale issue is closed
|
||||||
|
daysUntilClose: 14
|
||||||
|
# Issues with these labels will never be considered stale
|
||||||
|
exemptLabels:
|
||||||
|
- "T: Enhancement"
|
||||||
|
- "S: Triaged"
|
||||||
|
# Label to use when marking an issue as stale
|
||||||
|
staleLabel: "S: Stale"
|
||||||
|
# Comment to post when marking an issue as stale. Set to `false` to disable
|
||||||
|
markComment: >
|
||||||
|
This issue has been automatically marked as stale because it has not had
|
||||||
|
recent activity. It will be closed in two weeks unless you comment.
|
||||||
|
|
||||||
|
Thank you for your contributions.
|
||||||
|
# Comment to post when closing a stale issue. Set to `false` to disable
|
||||||
|
closeComment: false
|
@@ -6,7 +6,7 @@ matrix:
|
|||||||
env: BUILD_FOR=macos
|
env: BUILD_FOR=macos
|
||||||
|
|
||||||
language: node_js
|
language: node_js
|
||||||
node_js: 7
|
node_js: 8
|
||||||
|
|
||||||
cache:
|
cache:
|
||||||
directories:
|
directories:
|
||||||
@@ -30,8 +30,6 @@ addons:
|
|||||||
apt:
|
apt:
|
||||||
packages:
|
packages:
|
||||||
- rpm
|
- rpm
|
||||||
- wine
|
|
||||||
- mono-runtime
|
|
||||||
- yarn
|
- yarn
|
||||||
sources:
|
sources:
|
||||||
- sourceline: 'deb https://dl.yarnpkg.com/debian/ stable main'
|
- sourceline: 'deb https://dl.yarnpkg.com/debian/ stable main'
|
||||||
|
17
README.md
@@ -1,21 +1,11 @@
|
|||||||
<div align="center">
|

|
||||||
<img src="https://raw.githubusercontent.com/Eugeny/terminus/master/build/icons/128x128.png">
|
|
||||||
<h1>Terminus α</h1>
|
|
||||||
<p>
|
|
||||||
<i>A terminal for a more modern age</i>
|
|
||||||
</p>
|
|
||||||
<br/>
|
|
||||||
<br/>
|
|
||||||
<br/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
[](https://travis-ci.org/Eugeny/terminus) [](https://ci.appveyor.com/project/Eugeny/terminus) [](https://raw.githubusercontent.com/Eugeny/terminus/master/LICENSE) [](https://github.com/Eugeny/terminus/releases/latest)
|
[](https://travis-ci.org/Eugeny/terminus) [](https://ci.appveyor.com/project/Eugeny/terminus) [](https://raw.githubusercontent.com/Eugeny/terminus/master/LICENSE) [](https://github.com/Eugeny/terminus/releases/latest)
|
||||||
[](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2FEugeny%2Fterminus?ref=badge_shield)
|
[](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2FEugeny%2Fterminus?ref=badge_shield)
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
**Terminus** is a terminal heavily inspired by Hyper. It is, however, designed for people who need to get things done.
|
**Terminus** is a terminal heavily inspired by Hyper. It is, however, designed for people who need to get things done.
|
||||||
|
|
||||||
* Runs on Windows, macOS and Linux
|
* Runs on Windows, macOS and Linux
|
||||||
@@ -36,8 +26,9 @@ Plugins can be installed directly from the Settings view inside Terminus.
|
|||||||
* [clickable-links](https://github.com/Eugeny/terminus-clickable-links) - makes paths and URLs in the terminal clickable
|
* [clickable-links](https://github.com/Eugeny/terminus-clickable-links) - makes paths and URLs in the terminal clickable
|
||||||
* [theme-hype](https://github.com/Eugeny/terminus-theme-hype) - a Hyper inspired theme
|
* [theme-hype](https://github.com/Eugeny/terminus-theme-hype) - a Hyper inspired theme
|
||||||
* [shell-selector](https://github.com/Eugeny/terminus-shell-selector) - a quick shell selector pane
|
* [shell-selector](https://github.com/Eugeny/terminus-shell-selector) - a quick shell selector pane
|
||||||
* [title-control](https://github.com/kbjr/terminus-scrollbar) - allows modifying the title of the terminal tabs by providing a prefix, suffix, and/or strings to be removed
|
* [title-control](https://github.com/kbjr/terminus-title-control) - allows modifying the title of the terminal tabs by providing a prefix, suffix, and/or strings to be removed
|
||||||
* [scrollbar](https://github.com/kbjr/terminus-scrollbar) - adds a scrollbar to terminal tabs
|
* [scrollbar](https://github.com/kbjr/terminus-scrollbar) - adds a scrollbar to terminal tabs
|
||||||
|
* [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - quicklky send commands to one or all terminal tabs
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@@ -11,7 +11,7 @@ html
|
|||||||
style#custom-css
|
style#custom-css
|
||||||
style.
|
style.
|
||||||
body { transition: 0.5s background; }
|
body { transition: 0.5s background; }
|
||||||
body(style='min-height: 100vh; overflow: hidden')
|
body
|
||||||
app-root
|
app-root
|
||||||
.preload-logo
|
.preload-logo
|
||||||
div
|
div
|
||||||
|
172
app/lib/app.ts
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
import { app, ipcMain, Menu, Tray, shell } from 'electron'
|
||||||
|
import { Window } from './window'
|
||||||
|
|
||||||
|
export class Application {
|
||||||
|
private tray: Tray
|
||||||
|
private windows: Window[] = []
|
||||||
|
|
||||||
|
constructor () {
|
||||||
|
ipcMain.on('app:config-change', () => {
|
||||||
|
this.broadcast('host:config-change')
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
async newWindow (): Promise<Window> {
|
||||||
|
let window = new Window()
|
||||||
|
this.windows.push(window)
|
||||||
|
window.visible$.subscribe(visible => {
|
||||||
|
if (visible) {
|
||||||
|
this.disableTray()
|
||||||
|
} else {
|
||||||
|
this.enableTray()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (process.platform === 'darwin') {
|
||||||
|
this.setupMenu()
|
||||||
|
}
|
||||||
|
await window.ready
|
||||||
|
return window
|
||||||
|
}
|
||||||
|
|
||||||
|
broadcast (event, ...args) {
|
||||||
|
for (let window of this.windows) {
|
||||||
|
window.send(event, ...args)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async send (event, ...args) {
|
||||||
|
if (!this.hasWindows()) {
|
||||||
|
await this.newWindow()
|
||||||
|
}
|
||||||
|
this.windows[0].send(event, ...args)
|
||||||
|
}
|
||||||
|
|
||||||
|
enableTray () {
|
||||||
|
if (this.tray) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (process.platform === 'darwin') {
|
||||||
|
this.tray = new Tray(`${app.getAppPath()}/assets/tray-darwinTemplate.png`)
|
||||||
|
this.tray.setPressedImage(`${app.getAppPath()}/assets/tray-darwinHighlightTemplate.png`)
|
||||||
|
} else {
|
||||||
|
this.tray = new Tray(`${app.getAppPath()}/assets/tray.png`)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.tray.on('click', () => this.focus())
|
||||||
|
|
||||||
|
const contextMenu = Menu.buildFromTemplate([{
|
||||||
|
label: 'Show',
|
||||||
|
click: () => this.focus(),
|
||||||
|
}])
|
||||||
|
|
||||||
|
if (process.platform !== 'darwin') {
|
||||||
|
this.tray.setContextMenu(contextMenu)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.tray.setToolTip(`Terminus ${app.getVersion()}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
disableTray () {
|
||||||
|
if (this.tray) {
|
||||||
|
this.tray.destroy()
|
||||||
|
this.tray = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hasWindows () {
|
||||||
|
return !!this.windows.length
|
||||||
|
}
|
||||||
|
|
||||||
|
focus () {
|
||||||
|
for (let window of this.windows) {
|
||||||
|
window.show()
|
||||||
|
window.focus()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private setupMenu () {
|
||||||
|
let template: Electron.MenuItemConstructorOptions[] = [
|
||||||
|
{
|
||||||
|
label: 'Application',
|
||||||
|
submenu: [
|
||||||
|
{ role: 'about', label: 'About Terminus' },
|
||||||
|
{ type: 'separator' },
|
||||||
|
{
|
||||||
|
label: 'Preferences',
|
||||||
|
accelerator: 'Cmd+,',
|
||||||
|
async click () {
|
||||||
|
if (!this.hasWindows()) {
|
||||||
|
await this.newWindow()
|
||||||
|
}
|
||||||
|
this.windows[0].send('host:preferences-menu')
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ type: 'separator' },
|
||||||
|
{ role: 'services', submenu: [] },
|
||||||
|
{ type: 'separator' },
|
||||||
|
{ role: 'hide' },
|
||||||
|
{ role: 'hideothers' },
|
||||||
|
{ role: 'unhide' },
|
||||||
|
{ type: 'separator' },
|
||||||
|
{
|
||||||
|
label: 'Quit',
|
||||||
|
accelerator: 'Cmd+Q',
|
||||||
|
click () {
|
||||||
|
app.quit()
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Edit',
|
||||||
|
submenu: [
|
||||||
|
{ role: 'undo' },
|
||||||
|
{ role: 'redo' },
|
||||||
|
{ type: 'separator' },
|
||||||
|
{ role: 'cut' },
|
||||||
|
{ role: 'copy' },
|
||||||
|
{ role: 'paste' },
|
||||||
|
{ role: 'pasteandmatchstyle' },
|
||||||
|
{ role: 'delete' },
|
||||||
|
{ role: 'selectall' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'View',
|
||||||
|
submenu: [
|
||||||
|
{ role: 'reload' },
|
||||||
|
{ role: 'forcereload' },
|
||||||
|
{ role: 'toggledevtools' },
|
||||||
|
{ type: 'separator' },
|
||||||
|
{ role: 'resetzoom' },
|
||||||
|
{ role: 'zoomin' },
|
||||||
|
{ role: 'zoomout' },
|
||||||
|
{ type: 'separator' },
|
||||||
|
{ role: 'togglefullscreen' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
role: 'window',
|
||||||
|
submenu: [
|
||||||
|
{ role: 'minimize' },
|
||||||
|
{ role: 'zoom' },
|
||||||
|
{ type: 'separator' },
|
||||||
|
{ role: 'front' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
role: 'help',
|
||||||
|
submenu: [
|
||||||
|
{
|
||||||
|
label: 'Website',
|
||||||
|
click () {
|
||||||
|
shell.openExternal('https://eugeny.github.io/terminus')
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
Menu.setApplicationMenu(Menu.buildFromTemplate(template))
|
||||||
|
}
|
||||||
|
}
|
39
app/lib/cli.ts
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
import { app } from 'electron'
|
||||||
|
|
||||||
|
export function parseArgs (argv, cwd) {
|
||||||
|
if (argv[0].includes('node')) {
|
||||||
|
argv = argv.slice(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
return require('yargs')
|
||||||
|
.usage('terminus [command] [arguments]')
|
||||||
|
.command('open [directory]', 'open a shell in a directory', {
|
||||||
|
directory: { type: 'string', 'default': cwd },
|
||||||
|
})
|
||||||
|
.command('run [command...]', 'run a command in the terminal', {
|
||||||
|
command: { type: 'string' },
|
||||||
|
})
|
||||||
|
.command('paste [text]', 'paste stdin into the active tab', yargs => {
|
||||||
|
return yargs.option('escape', {
|
||||||
|
alias: 'e',
|
||||||
|
type: 'boolean',
|
||||||
|
describe: 'Perform shell escaping'
|
||||||
|
}).positional('text', {
|
||||||
|
type: 'string'
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.version('version', '', app.getVersion())
|
||||||
|
.option('debug', {
|
||||||
|
alias: 'd',
|
||||||
|
describe: 'Show DevTools on start',
|
||||||
|
type: 'boolean'
|
||||||
|
})
|
||||||
|
.option('version', {
|
||||||
|
alias: 'v',
|
||||||
|
describe: 'Show version and exit',
|
||||||
|
type: 'boolean'
|
||||||
|
})
|
||||||
|
.help('help')
|
||||||
|
.strict()
|
||||||
|
.parse(argv.slice(1))
|
||||||
|
}
|
65
app/lib/index.ts
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
import './lru'
|
||||||
|
import { app, ipcMain, Menu } from 'electron'
|
||||||
|
import electronDebug = require('electron-debug')
|
||||||
|
import { parseArgs } from './cli'
|
||||||
|
import { Application } from './app'
|
||||||
|
if (process.platform === 'win32' && require('electron-squirrel-startup')) process.exit(0)
|
||||||
|
|
||||||
|
if (!process.env.TERMINUS_PLUGINS) {
|
||||||
|
process.env.TERMINUS_PLUGINS = ''
|
||||||
|
}
|
||||||
|
|
||||||
|
const application = new Application()
|
||||||
|
|
||||||
|
app.commandLine.appendSwitch('disable-http-cache')
|
||||||
|
|
||||||
|
ipcMain.on('app:new-window', () => {
|
||||||
|
console.log('new-window')
|
||||||
|
application.newWindow()
|
||||||
|
})
|
||||||
|
|
||||||
|
app.on('activate', () => {
|
||||||
|
if (!application.hasWindows()) {
|
||||||
|
application.newWindow()
|
||||||
|
} else {
|
||||||
|
application.focus()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
app.on('window-all-closed', () => {
|
||||||
|
app.quit()
|
||||||
|
})
|
||||||
|
|
||||||
|
process.on('uncaughtException' as any, err => {
|
||||||
|
console.log(err)
|
||||||
|
application.broadcast('uncaughtException', err)
|
||||||
|
})
|
||||||
|
|
||||||
|
app.on('second-instance', (_event, argv, cwd) => {
|
||||||
|
application.send('host:second-instance', parseArgs(argv, cwd), cwd)
|
||||||
|
})
|
||||||
|
|
||||||
|
const argv = parseArgs(process.argv, process.cwd())
|
||||||
|
|
||||||
|
if (!app.requestSingleInstanceLock()) {
|
||||||
|
app.quit()
|
||||||
|
process.exit(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argv.d) {
|
||||||
|
electronDebug({ enabled: true, showDevTools: 'undocked' })
|
||||||
|
}
|
||||||
|
|
||||||
|
app.on('ready', () => {
|
||||||
|
if (process.platform === 'darwin') {
|
||||||
|
app.dock.setMenu(Menu.buildFromTemplate([
|
||||||
|
{
|
||||||
|
label: 'New window',
|
||||||
|
click () {
|
||||||
|
this.app.newWindow()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]))
|
||||||
|
}
|
||||||
|
application.newWindow()
|
||||||
|
})
|
15
app/lib/lru.ts
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
let lru = require('lru-cache')({ max: 256, maxAge: 250 })
|
||||||
|
|
||||||
|
let fs = require('fs')
|
||||||
|
let origLstat = fs.realpathSync.bind(fs)
|
||||||
|
|
||||||
|
// NB: The biggest offender of thrashing realpathSync is the node module system
|
||||||
|
// itself, which we can't get into via any sane means.
|
||||||
|
require('fs').realpathSync = function (p) {
|
||||||
|
let r = lru.get(p)
|
||||||
|
if (r) return r
|
||||||
|
|
||||||
|
r = origLstat(p)
|
||||||
|
lru.set(p, r)
|
||||||
|
return r
|
||||||
|
}
|
201
app/lib/window.ts
Normal file
@@ -0,0 +1,201 @@
|
|||||||
|
import { Subject, Observable } from 'rxjs'
|
||||||
|
import { BrowserWindow, app, ipcMain, Rectangle, Menu } from 'electron'
|
||||||
|
import ElectronConfig = require('electron-config')
|
||||||
|
import * as yaml from 'js-yaml'
|
||||||
|
import * as fs from 'fs'
|
||||||
|
import * as path from 'path'
|
||||||
|
|
||||||
|
let electronVibrancy: any
|
||||||
|
if (process.platform !== 'linux') {
|
||||||
|
electronVibrancy = require('electron-vibrancy')
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Window {
|
||||||
|
ready: Promise<void>
|
||||||
|
private visible = new Subject<boolean>()
|
||||||
|
private window: BrowserWindow
|
||||||
|
private vibrancyViewID: number
|
||||||
|
private windowConfig: ElectronConfig
|
||||||
|
private windowBounds: Rectangle
|
||||||
|
|
||||||
|
get visible$ (): Observable<boolean> { return this.visible }
|
||||||
|
|
||||||
|
constructor () {
|
||||||
|
let configPath = path.join(app.getPath('userData'), 'config.yaml')
|
||||||
|
let configData
|
||||||
|
if (fs.existsSync(configPath)) {
|
||||||
|
configData = yaml.safeLoad(fs.readFileSync(configPath, 'utf8'))
|
||||||
|
} else {
|
||||||
|
configData = {}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.windowConfig = new ElectronConfig({ name: 'window' })
|
||||||
|
this.windowBounds = this.windowConfig.get('windowBoundaries')
|
||||||
|
|
||||||
|
let maximized = this.windowConfig.get('maximized')
|
||||||
|
let options: Electron.BrowserWindowConstructorOptions = {
|
||||||
|
width: 800,
|
||||||
|
height: 600,
|
||||||
|
title: 'Terminus',
|
||||||
|
minWidth: 400,
|
||||||
|
minHeight: 300,
|
||||||
|
webPreferences: { webSecurity: false },
|
||||||
|
frame: false,
|
||||||
|
show: false,
|
||||||
|
}
|
||||||
|
Object.assign(options, this.windowBounds)
|
||||||
|
|
||||||
|
if ((configData.appearance || {}).frame === 'native') {
|
||||||
|
options.frame = true
|
||||||
|
} else {
|
||||||
|
if (process.platform === 'darwin') {
|
||||||
|
options.titleBarStyle = 'hiddenInset'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (process.platform === 'win32' && (configData.appearance || {}).vibrancy) {
|
||||||
|
options.transparent = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if (process.platform === 'linux') {
|
||||||
|
options.backgroundColor = '#131d27'
|
||||||
|
}
|
||||||
|
|
||||||
|
this.window = new BrowserWindow(options)
|
||||||
|
this.window.once('ready-to-show', () => {
|
||||||
|
if (process.platform === 'darwin') {
|
||||||
|
this.window.setVibrancy('dark')
|
||||||
|
} else if (process.platform === 'win32' && (configData.appearance || {}).vibrancy) {
|
||||||
|
this.setVibrancy(true)
|
||||||
|
}
|
||||||
|
if (maximized) {
|
||||||
|
this.window.maximize()
|
||||||
|
} else {
|
||||||
|
this.window.show()
|
||||||
|
}
|
||||||
|
this.window.focus()
|
||||||
|
})
|
||||||
|
this.window.loadURL(`file://${app.getAppPath()}/dist/index.html?${this.window.id}`, { extraHeaders: 'pragma: no-cache\n' })
|
||||||
|
|
||||||
|
if (process.platform !== 'darwin') {
|
||||||
|
this.window.setMenu(null)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setupWindowManagement()
|
||||||
|
|
||||||
|
this.ready = new Promise(resolve => {
|
||||||
|
const listener = event => {
|
||||||
|
if (event.sender === this.window.webContents) {
|
||||||
|
ipcMain.removeListener('app:ready', listener)
|
||||||
|
resolve()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ipcMain.on('app:ready', listener)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
setVibrancy (enabled: boolean) {
|
||||||
|
if (enabled && !this.vibrancyViewID) {
|
||||||
|
this.vibrancyViewID = electronVibrancy.SetVibrancy(this.window, 0)
|
||||||
|
} else if (!enabled && this.vibrancyViewID) {
|
||||||
|
electronVibrancy.RemoveView(this.window, this.vibrancyViewID)
|
||||||
|
this.vibrancyViewID = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
show () {
|
||||||
|
this.window.show()
|
||||||
|
}
|
||||||
|
|
||||||
|
focus () {
|
||||||
|
this.window.focus()
|
||||||
|
}
|
||||||
|
|
||||||
|
send (event, ...args) {
|
||||||
|
this.window.webContents.send(event, ...args)
|
||||||
|
}
|
||||||
|
|
||||||
|
private setupWindowManagement () {
|
||||||
|
this.window.on('show', () => {
|
||||||
|
this.visible.next(true)
|
||||||
|
this.window.webContents.send('host:window-shown')
|
||||||
|
})
|
||||||
|
|
||||||
|
this.window.on('hide', () => {
|
||||||
|
this.visible.next(false)
|
||||||
|
})
|
||||||
|
|
||||||
|
this.window.on('enter-full-screen', () => this.window.webContents.send('host:window-enter-full-screen'))
|
||||||
|
this.window.on('leave-full-screen', () => this.window.webContents.send('host:window-leave-full-screen'))
|
||||||
|
|
||||||
|
this.window.on('close', () => {
|
||||||
|
this.windowConfig.set('windowBoundaries', this.windowBounds)
|
||||||
|
this.windowConfig.set('maximized', this.window.isMaximized())
|
||||||
|
})
|
||||||
|
|
||||||
|
this.window.on('closed', () => {
|
||||||
|
this.destroy()
|
||||||
|
})
|
||||||
|
|
||||||
|
this.window.on('resize', () => {
|
||||||
|
if (!this.window.isMaximized()) {
|
||||||
|
this.windowBounds = this.window.getBounds()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
this.window.on('move', () => {
|
||||||
|
if (!this.window.isMaximized()) {
|
||||||
|
this.windowBounds = this.window.getBounds()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
ipcMain.on('window-focus', () => {
|
||||||
|
this.window.focus()
|
||||||
|
})
|
||||||
|
|
||||||
|
ipcMain.on('window-maximize', () => {
|
||||||
|
this.window.maximize()
|
||||||
|
})
|
||||||
|
|
||||||
|
ipcMain.on('window-unmaximize', () => {
|
||||||
|
this.window.unmaximize()
|
||||||
|
})
|
||||||
|
|
||||||
|
ipcMain.on('window-toggle-maximize', () => {
|
||||||
|
if (this.window.isMaximized()) {
|
||||||
|
this.window.unmaximize()
|
||||||
|
} else {
|
||||||
|
this.window.maximize()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
ipcMain.on('window-minimize', () => {
|
||||||
|
this.window.minimize()
|
||||||
|
})
|
||||||
|
|
||||||
|
ipcMain.on('window-set-bounds', (_event, bounds) => {
|
||||||
|
this.window.setBounds(bounds)
|
||||||
|
})
|
||||||
|
|
||||||
|
ipcMain.on('window-set-always-on-top', (_event, flag) => {
|
||||||
|
this.window.setAlwaysOnTop(flag)
|
||||||
|
})
|
||||||
|
|
||||||
|
ipcMain.on('window-set-vibrancy', (_event, enabled) => {
|
||||||
|
this.setVibrancy(enabled)
|
||||||
|
})
|
||||||
|
|
||||||
|
ipcMain.on('window-set-title', (_event, title) => {
|
||||||
|
this.window.setTitle(title)
|
||||||
|
})
|
||||||
|
|
||||||
|
ipcMain.on('window-popup-context-menu', (_event, menuDefinition) => {
|
||||||
|
Menu.buildFromTemplate(menuDefinition).popup({ window: this.window })
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
private destroy () {
|
||||||
|
this.window = null
|
||||||
|
this.visible.complete()
|
||||||
|
}
|
||||||
|
}
|
291
app/main.js
@@ -1,291 +0,0 @@
|
|||||||
if (process.platform == 'win32' && require('electron-squirrel-startup')) process.exit(0)
|
|
||||||
|
|
||||||
const electron = require('electron')
|
|
||||||
const electronVibrancy = require('electron-vibrancy')
|
|
||||||
|
|
||||||
if (process.argv.indexOf('--debug') !== -1) {
|
|
||||||
require('electron-debug')({enabled: true, showDevTools: 'undocked'})
|
|
||||||
}
|
|
||||||
|
|
||||||
let app = electron.app
|
|
||||||
|
|
||||||
let secondInstance = app.makeSingleInstance((argv, cwd) => {
|
|
||||||
app.window.webContents.send('host:second-instance', argv, cwd)
|
|
||||||
})
|
|
||||||
|
|
||||||
if (secondInstance) {
|
|
||||||
app.quit()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const yaml = require('js-yaml')
|
|
||||||
const path = require('path')
|
|
||||||
const fs = require('fs')
|
|
||||||
const Config = require('electron-config')
|
|
||||||
let windowConfig = new Config({name: 'window'})
|
|
||||||
|
|
||||||
|
|
||||||
if (!process.env.TERMINUS_PLUGINS) {
|
|
||||||
process.env.TERMINUS_PLUGINS = ''
|
|
||||||
}
|
|
||||||
|
|
||||||
setupWindowManagement = () => {
|
|
||||||
app.window.on('show', () => {
|
|
||||||
app.window.webContents.send('host:window-shown')
|
|
||||||
if (app.tray) {
|
|
||||||
app.tray.destroy()
|
|
||||||
app.tray = null
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
app.window.on('hide', (e) => {
|
|
||||||
if (!app.tray) {
|
|
||||||
setupTray()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
app.window.on('enter-full-screen', () => app.window.webContents.send('host:window-enter-full-screen'))
|
|
||||||
app.window.on('leave-full-screen', () => app.window.webContents.send('host:window-leave-full-screen'))
|
|
||||||
|
|
||||||
app.window.on('close', (e) => {
|
|
||||||
windowConfig.set('windowBoundaries', app.window.getBounds())
|
|
||||||
})
|
|
||||||
|
|
||||||
app.window.on('closed', () => {
|
|
||||||
app.window = null
|
|
||||||
})
|
|
||||||
|
|
||||||
electron.ipcMain.on('window-focus', () => {
|
|
||||||
app.window.focus()
|
|
||||||
})
|
|
||||||
|
|
||||||
electron.ipcMain.on('window-maximize', () => {
|
|
||||||
app.window.maximize()
|
|
||||||
})
|
|
||||||
|
|
||||||
electron.ipcMain.on('window-unmaximize', () => {
|
|
||||||
app.window.unmaximize()
|
|
||||||
})
|
|
||||||
|
|
||||||
electron.ipcMain.on('window-toggle-maximize', () => {
|
|
||||||
if (app.window.isMaximized()) {
|
|
||||||
app.window.unmaximize()
|
|
||||||
} else {
|
|
||||||
app.window.maximize()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
electron.ipcMain.on('window-minimize', () => {
|
|
||||||
app.window.minimize()
|
|
||||||
})
|
|
||||||
|
|
||||||
electron.ipcMain.on('window-set-bounds', (event, bounds) => {
|
|
||||||
app.window.setBounds(bounds)
|
|
||||||
})
|
|
||||||
|
|
||||||
electron.ipcMain.on('window-set-always-on-top', (event, flag) => {
|
|
||||||
app.window.setAlwaysOnTop(flag)
|
|
||||||
})
|
|
||||||
|
|
||||||
electron.ipcMain.on('window-set-vibrancy', (event, enabled) => {
|
|
||||||
if (enabled && !app.window.vibrancyViewID) {
|
|
||||||
app.window.vibrancyViewID = electronVibrancy.SetVibrancy(app.window, 0)
|
|
||||||
} else if (!enabled && app.window.vibrancyViewID) {
|
|
||||||
electronVibrancy.RemoveView(app.window, app.window.vibrancyViewID)
|
|
||||||
app.window.vibrancyViewID = null
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
setupTray = () => {
|
|
||||||
if (process.platform == 'darwin') {
|
|
||||||
app.tray = new electron.Tray(`${app.getAppPath()}/assets/tray-darwinTemplate.png`)
|
|
||||||
app.tray.setPressedImage(`${app.getAppPath()}/assets/tray-darwinHighlightTemplate.png`)
|
|
||||||
} else {
|
|
||||||
app.tray = new electron.Tray(`${app.getAppPath()}/assets/tray.png`)
|
|
||||||
}
|
|
||||||
|
|
||||||
app.tray.on('click', () => {
|
|
||||||
app.window.show()
|
|
||||||
app.window.focus()
|
|
||||||
})
|
|
||||||
|
|
||||||
const contextMenu = electron.Menu.buildFromTemplate([{
|
|
||||||
label: 'Show',
|
|
||||||
click () {
|
|
||||||
app.window.show()
|
|
||||||
app.window.focus()
|
|
||||||
}
|
|
||||||
}])
|
|
||||||
|
|
||||||
if (process.platform != 'darwin') {
|
|
||||||
app.tray.setContextMenu(contextMenu)
|
|
||||||
}
|
|
||||||
|
|
||||||
app.tray.setToolTip(`Terminus ${app.getVersion()}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
setupMenu = () => {
|
|
||||||
let template = [{
|
|
||||||
label: "Application",
|
|
||||||
submenu: [
|
|
||||||
{ role: 'about', label: 'About Terminus' },
|
|
||||||
{ type: 'separator' },
|
|
||||||
{
|
|
||||||
label: 'Preferences',
|
|
||||||
accelerator: 'Cmd+,',
|
|
||||||
click () {
|
|
||||||
app.window.webContents.send('host:preferences-menu')
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{ type: 'separator' },
|
|
||||||
{ role: 'services', submenu: [] },
|
|
||||||
{ type: 'separator' },
|
|
||||||
{ role: 'hide' },
|
|
||||||
{ role: 'hideothers' },
|
|
||||||
{ role: 'unhide' },
|
|
||||||
{ type: 'separator' },
|
|
||||||
{
|
|
||||||
label: 'Quit',
|
|
||||||
accelerator: 'Cmd+Q',
|
|
||||||
click () {
|
|
||||||
app.quit()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Edit",
|
|
||||||
submenu: [
|
|
||||||
{role: 'undo'},
|
|
||||||
{role: 'redo'},
|
|
||||||
{type: 'separator'},
|
|
||||||
{role: 'cut'},
|
|
||||||
{role: 'copy'},
|
|
||||||
{role: 'paste'},
|
|
||||||
{role: 'pasteandmatchstyle'},
|
|
||||||
{role: 'delete'},
|
|
||||||
{role: 'selectall'}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'View',
|
|
||||||
submenu: [
|
|
||||||
{role: 'reload'},
|
|
||||||
{role: 'forcereload'},
|
|
||||||
{role: 'toggledevtools'},
|
|
||||||
{type: 'separator'},
|
|
||||||
{role: 'resetzoom'},
|
|
||||||
{role: 'zoomin'},
|
|
||||||
{role: 'zoomout'},
|
|
||||||
{type: 'separator'},
|
|
||||||
{role: 'togglefullscreen'}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
role: 'window',
|
|
||||||
submenu: [
|
|
||||||
{role: 'minimize'},
|
|
||||||
{role: 'zoom'},
|
|
||||||
{type: 'separator'},
|
|
||||||
{role: 'front'}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
role: 'help',
|
|
||||||
submenu: [
|
|
||||||
{
|
|
||||||
label: 'Website',
|
|
||||||
click () { electron.shell.openExternal('https://eugeny.github.io/terminus') }
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}]
|
|
||||||
|
|
||||||
electron.Menu.setApplicationMenu(electron.Menu.buildFromTemplate(template))
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
start = () => {
|
|
||||||
let t0 = Date.now()
|
|
||||||
|
|
||||||
let configPath = path.join(electron.app.getPath('userData'), 'config.yaml')
|
|
||||||
let configData
|
|
||||||
if (fs.existsSync(configPath)) {
|
|
||||||
configData = yaml.safeLoad(fs.readFileSync(configPath, 'utf8'))
|
|
||||||
} else {
|
|
||||||
configData = {}
|
|
||||||
}
|
|
||||||
|
|
||||||
let options = {
|
|
||||||
width: 800,
|
|
||||||
height: 600,
|
|
||||||
title: 'Terminus',
|
|
||||||
minWidth: 400,
|
|
||||||
minHeight: 300,
|
|
||||||
'web-preferences': {'web-security': false},
|
|
||||||
//- background to avoid the flash of unstyled window
|
|
||||||
backgroundColor: '#131d27',
|
|
||||||
frame: false,
|
|
||||||
show: false,
|
|
||||||
}
|
|
||||||
Object.assign(options, windowConfig.get('windowBoundaries'))
|
|
||||||
|
|
||||||
if ((configData.appearance || {}).frame == 'native') {
|
|
||||||
options.frame = true
|
|
||||||
} else {
|
|
||||||
if (process.platform == 'darwin') {
|
|
||||||
options.titleBarStyle = 'hiddenInset'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (['darwin', 'win32'].includes(process.platform)) {
|
|
||||||
options.transparent = true
|
|
||||||
delete options.backgroundColor
|
|
||||||
}
|
|
||||||
|
|
||||||
app.commandLine.appendSwitch('disable-http-cache')
|
|
||||||
|
|
||||||
app.window = new electron.BrowserWindow(options)
|
|
||||||
app.window.once('ready-to-show', () => {
|
|
||||||
app.window.show()
|
|
||||||
app.window.focus()
|
|
||||||
})
|
|
||||||
app.window.loadURL(`file://${app.getAppPath()}/dist/index.html`, {extraHeaders: "pragma: no-cache\n"})
|
|
||||||
|
|
||||||
if (process.platform != 'darwin') {
|
|
||||||
app.window.setMenu(null)
|
|
||||||
}
|
|
||||||
|
|
||||||
setupWindowManagement()
|
|
||||||
|
|
||||||
if (process.platform == 'darwin') {
|
|
||||||
setupMenu()
|
|
||||||
} else {
|
|
||||||
app.window.setMenu(null)
|
|
||||||
}
|
|
||||||
|
|
||||||
console.info(`Host startup: ${Date.now() - t0}ms`)
|
|
||||||
t0 = Date.now()
|
|
||||||
electron.ipcMain.on('app:ready', () => {
|
|
||||||
console.info(`App startup: ${Date.now() - t0}ms`)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
app.on('ready', start)
|
|
||||||
|
|
||||||
app.on('activate', () => {
|
|
||||||
if (!app.window)
|
|
||||||
start()
|
|
||||||
else {
|
|
||||||
app.window.show()
|
|
||||||
app.window.focus()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
process.on('uncaughtException', function(err) {
|
|
||||||
console.log(err)
|
|
||||||
app.window.webContents.send('uncaughtException', err)
|
|
||||||
})
|
|
@@ -5,7 +5,7 @@
|
|||||||
"name": "Eugene Pankov",
|
"name": "Eugene Pankov",
|
||||||
"email": "e@ajenti.org"
|
"email": "e@ajenti.org"
|
||||||
},
|
},
|
||||||
"main": "main.js",
|
"main": "dist/main.js",
|
||||||
"version": "1.0.0-alpha.1",
|
"version": "1.0.0-alpha.1",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "webpack --progress --color --display-modules",
|
"build": "webpack --progress --color --display-modules",
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
"@ng-bootstrap/ng-bootstrap": "^2.0.0",
|
"@ng-bootstrap/ng-bootstrap": "^2.0.0",
|
||||||
"devtron": "1.4.0",
|
"devtron": "1.4.0",
|
||||||
"electron-config": "0.2.1",
|
"electron-config": "0.2.1",
|
||||||
"electron-debug": "^1.0.1",
|
"electron-debug": "^2.0.0",
|
||||||
"electron-is-dev": "0.1.2",
|
"electron-is-dev": "0.1.2",
|
||||||
"electron-squirrel-startup": "^1.0.0",
|
"electron-squirrel-startup": "^1.0.0",
|
||||||
"electron-vibrancy": "^0.1.3",
|
"electron-vibrancy": "^0.1.3",
|
||||||
@@ -31,6 +31,7 @@
|
|||||||
"ngx-toastr": "^8.7.3",
|
"ngx-toastr": "^8.7.3",
|
||||||
"path": "0.12.7",
|
"path": "0.12.7",
|
||||||
"rxjs": "^6.1.0",
|
"rxjs": "^6.1.0",
|
||||||
|
"yargs": "^12.0.1",
|
||||||
"zone.js": "~0.8.26"
|
"zone.js": "~0.8.26"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
import '../lib/lru'
|
||||||
import 'source-sans-pro'
|
import 'source-sans-pro'
|
||||||
import 'font-awesome/css/font-awesome.css'
|
import 'font-awesome/css/font-awesome.css'
|
||||||
import 'ngx-toastr/toastr.css'
|
import 'ngx-toastr/toastr.css'
|
||||||
@@ -28,8 +29,8 @@ Raven.config(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
process.on('uncaughtException', (err) => {
|
process.on('uncaughtException' as any, (err) => {
|
||||||
Raven.captureException(err)
|
Raven.captureException(err as any)
|
||||||
console.error(err)
|
console.error(err)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@@ -2,6 +2,8 @@ import 'zone.js'
|
|||||||
import 'core-js/es7/reflect'
|
import 'core-js/es7/reflect'
|
||||||
import 'core-js/core/delay'
|
import 'core-js/core/delay'
|
||||||
import 'rxjs'
|
import 'rxjs'
|
||||||
|
|
||||||
|
import './global.scss'
|
||||||
import './toastr.scss'
|
import './toastr.scss'
|
||||||
|
|
||||||
// Always land on the start view
|
// Always land on the start view
|
||||||
|
91
app/src/global.scss
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
body {
|
||||||
|
min-height: 100vh;
|
||||||
|
overflow: hidden;
|
||||||
|
background: #1D272D;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-dialog, .modal-backdrop, .no-drag {
|
||||||
|
-webkit-app-region: no-drag;
|
||||||
|
}
|
||||||
|
|
||||||
|
.selectable {
|
||||||
|
user-select: text;
|
||||||
|
}
|
||||||
|
|
||||||
|
[ngbradiogroup] input[type="radio"] {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-line {
|
||||||
|
display: flex;
|
||||||
|
border-top: 1px solid rgba(0, 0, 0, 0.2);
|
||||||
|
align-items: center;
|
||||||
|
padding: 10px 0;
|
||||||
|
margin: 0;
|
||||||
|
min-height: 64px;
|
||||||
|
|
||||||
|
.header {
|
||||||
|
margin-right: auto;
|
||||||
|
|
||||||
|
.title {
|
||||||
|
}
|
||||||
|
|
||||||
|
.description {
|
||||||
|
font-size: 13px;
|
||||||
|
opacity: .5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&>.form-control, &>.input-group {
|
||||||
|
width: 33%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type=range] {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
background: transparent;
|
||||||
|
outline: none;
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
border-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin thumb() {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
display: block;
|
||||||
|
height: 12px;
|
||||||
|
width: 12px;
|
||||||
|
background: #aaa;
|
||||||
|
border-radius: 6px;
|
||||||
|
cursor: pointer;
|
||||||
|
margin-top: -4px;
|
||||||
|
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.95);
|
||||||
|
transition: 0.25s background;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: #777;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background: #666;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&::-webkit-slider-thumb { @include thumb(); }
|
||||||
|
&::-moz-range-thumb { @include thumb(); }
|
||||||
|
&::-ms-thumb { @include thumb(); }
|
||||||
|
&::thumb { @include thumb(); }
|
||||||
|
|
||||||
|
@mixin track() {
|
||||||
|
height: 4px;
|
||||||
|
background: #111;
|
||||||
|
margin: 3px 0 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::-webkit-slider-runnable-track { @include track(); }
|
||||||
|
&:focus::-webkit-slider-runnable-track { @include track(); }
|
||||||
|
&::-moz-range-track { @include track(); }
|
||||||
|
&::-ms-track { @include track(); }
|
||||||
|
}
|
@@ -58,11 +58,3 @@
|
|||||||
color: #842fe0;
|
color: #842fe0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.modal-dialog, .modal-backdrop {
|
|
||||||
-webkit-app-region: no-drag;
|
|
||||||
}
|
|
||||||
|
|
||||||
[ngbradiogroup] input[type="radio"] {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
@@ -17,7 +17,7 @@
|
|||||||
"lib": [
|
"lib": [
|
||||||
"dom",
|
"dom",
|
||||||
"es2015",
|
"es2015",
|
||||||
"es2015.iterable.ts",
|
"es2015.iterable",
|
||||||
"es2017",
|
"es2017",
|
||||||
"es7"
|
"es7"
|
||||||
]
|
]
|
||||||
|
31
app/tsconfig.main.json
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"baseUrl": "./lib",
|
||||||
|
"module": "commonjs",
|
||||||
|
"target": "es2017",
|
||||||
|
"declaration": false,
|
||||||
|
"noImplicitAny": false,
|
||||||
|
"removeComments": false,
|
||||||
|
"emitDecoratorMetadata": true,
|
||||||
|
"experimentalDecorators": true,
|
||||||
|
"sourceMap": true,
|
||||||
|
"noUnusedParameters": true,
|
||||||
|
"noImplicitReturns": true,
|
||||||
|
"noFallthroughCasesInSwitch": true,
|
||||||
|
"noUnusedParameters": true,
|
||||||
|
"noUnusedLocals": true,
|
||||||
|
"lib": [
|
||||||
|
"dom",
|
||||||
|
"es2015",
|
||||||
|
"es2015.iterable",
|
||||||
|
"es2017",
|
||||||
|
"es7"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"compileOnSave": false,
|
||||||
|
"exclude": [
|
||||||
|
"dist",
|
||||||
|
"node_modules",
|
||||||
|
"*/node_modules"
|
||||||
|
]
|
||||||
|
}
|
@@ -6,15 +6,16 @@ module.exports = {
|
|||||||
target: 'node',
|
target: 'node',
|
||||||
entry: {
|
entry: {
|
||||||
'index.ignore': 'file-loader?name=index.html!val-loader!pug-html-loader!' + path.resolve(__dirname, './index.pug'),
|
'index.ignore': 'file-loader?name=index.html!val-loader!pug-html-loader!' + path.resolve(__dirname, './index.pug'),
|
||||||
'preload': path.resolve(__dirname, 'src/entry.preload.ts'),
|
preload: path.resolve(__dirname, 'src/entry.preload.ts'),
|
||||||
'bundle': path.resolve(__dirname, 'src/entry.ts'),
|
bundle: path.resolve(__dirname, 'src/entry.ts'),
|
||||||
},
|
},
|
||||||
|
mode: process.env.DEV ? 'development' : 'production',
|
||||||
context: __dirname,
|
context: __dirname,
|
||||||
devtool: 'source-map',
|
devtool: 'source-map',
|
||||||
output: {
|
output: {
|
||||||
path: path.join(__dirname, 'dist'),
|
path: path.join(__dirname, 'dist'),
|
||||||
pathinfo: true,
|
pathinfo: true,
|
||||||
filename: '[name].js'
|
filename: '[name].js',
|
||||||
},
|
},
|
||||||
resolve: {
|
resolve: {
|
||||||
modules: ['src/', 'node_modules', '../node_modules', 'assets/'].map(x => path.join(__dirname, x)),
|
modules: ['src/', 'node_modules', '../node_modules', 'assets/'].map(x => path.join(__dirname, x)),
|
||||||
@@ -28,8 +29,8 @@ module.exports = {
|
|||||||
loader: 'awesome-typescript-loader',
|
loader: 'awesome-typescript-loader',
|
||||||
options: {
|
options: {
|
||||||
configFileName: path.resolve(__dirname, 'tsconfig.json'),
|
configFileName: path.resolve(__dirname, 'tsconfig.json'),
|
||||||
}
|
},
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
{ test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] },
|
{ test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] },
|
||||||
{ test: /\.css$/, use: ['style-loader', 'css-loader', 'sass-loader'] },
|
{ test: /\.css$/, use: ['style-loader', 'css-loader', 'sass-loader'] },
|
||||||
@@ -38,20 +39,20 @@ module.exports = {
|
|||||||
use: {
|
use: {
|
||||||
loader: 'file-loader',
|
loader: 'file-loader',
|
||||||
options: {
|
options: {
|
||||||
name: 'images/[name].[ext]'
|
name: 'images/[name].[ext]',
|
||||||
}
|
},
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
test: /\.(ttf|eot|otf|woff|woff2)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
|
test: /\.(ttf|eot|otf|woff|woff2)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
|
||||||
use: {
|
use: {
|
||||||
loader: 'file-loader',
|
loader: 'file-loader',
|
||||||
options: {
|
options: {
|
||||||
name: 'fonts/[name].[ext]'
|
name: 'fonts/[name].[ext]',
|
||||||
}
|
},
|
||||||
}
|
},
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
},
|
},
|
||||||
externals: {
|
externals: {
|
||||||
'@angular/core': 'commonjs @angular/core',
|
'@angular/core': 'commonjs @angular/core',
|
||||||
@@ -61,14 +62,15 @@ module.exports = {
|
|||||||
'@angular/forms': 'commonjs @angular/forms',
|
'@angular/forms': 'commonjs @angular/forms',
|
||||||
'@angular/common': 'commonjs @angular/common',
|
'@angular/common': 'commonjs @angular/common',
|
||||||
'@ng-bootstrap/ng-bootstrap': 'commonjs @ng-bootstrap/ng-bootstrap',
|
'@ng-bootstrap/ng-bootstrap': 'commonjs @ng-bootstrap/ng-bootstrap',
|
||||||
'child_process': 'commonjs child_process',
|
child_process: 'commonjs child_process',
|
||||||
'electron': 'commonjs electron',
|
electron: 'commonjs electron',
|
||||||
'electron-is-dev': 'commonjs electron-is-dev',
|
'electron-is-dev': 'commonjs electron-is-dev',
|
||||||
|
fs: 'commonjs fs',
|
||||||
'ngx-toastr': 'commonjs ngx-toastr',
|
'ngx-toastr': 'commonjs ngx-toastr',
|
||||||
'module': 'commonjs module',
|
module: 'commonjs module',
|
||||||
'mz': 'commonjs mz',
|
mz: 'commonjs mz',
|
||||||
'path': 'commonjs path',
|
path: 'commonjs path',
|
||||||
'rxjs': 'commonjs rxjs',
|
rxjs: 'commonjs rxjs',
|
||||||
'zone.js': 'commonjs zone.js/dist/zone.js',
|
'zone.js': 'commonjs zone.js/dist/zone.js',
|
||||||
},
|
},
|
||||||
plugins: [
|
plugins: [
|
||||||
|
48
app/webpack.main.config.js
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
const path = require('path')
|
||||||
|
const webpack = require('webpack')
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
name: 'terminus-main',
|
||||||
|
target: 'node',
|
||||||
|
entry: {
|
||||||
|
main: path.resolve(__dirname, 'lib/index.ts'),
|
||||||
|
},
|
||||||
|
mode: process.env.DEV ? 'development' : 'production',
|
||||||
|
context: __dirname,
|
||||||
|
devtool: 'source-map',
|
||||||
|
output: {
|
||||||
|
path: path.join(__dirname, 'dist'),
|
||||||
|
pathinfo: true,
|
||||||
|
filename: '[name].js',
|
||||||
|
},
|
||||||
|
resolve: {
|
||||||
|
modules: ['lib/', 'node_modules', '../node_modules'].map(x => path.join(__dirname, x)),
|
||||||
|
extensions: ['.ts', '.js'],
|
||||||
|
},
|
||||||
|
module: {
|
||||||
|
rules: [
|
||||||
|
{
|
||||||
|
test: /\.ts$/,
|
||||||
|
use: {
|
||||||
|
loader: 'awesome-typescript-loader',
|
||||||
|
options: {
|
||||||
|
configFileName: path.resolve(__dirname, 'tsconfig.main.json'),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
externals: {
|
||||||
|
electron: 'commonjs electron',
|
||||||
|
'electron-config': 'commonjs electron-config',
|
||||||
|
'electron-vibrancy': 'commonjs electron-vibrancy',
|
||||||
|
'electron-squirrel-startup': 'commonjs electron-squirrel-startup',
|
||||||
|
fs: 'commonjs fs',
|
||||||
|
mz: 'commonjs mz',
|
||||||
|
path: 'commonjs path',
|
||||||
|
yargs: 'commonjs yargs',
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
new webpack.optimize.ModuleConcatenationPlugin(),
|
||||||
|
],
|
||||||
|
}
|
307
app/yarn.lock
@@ -62,6 +62,14 @@ accessibility-developer-tools@^2.11.0:
|
|||||||
version "2.12.0"
|
version "2.12.0"
|
||||||
resolved "https://registry.yarnpkg.com/accessibility-developer-tools/-/accessibility-developer-tools-2.12.0.tgz#3da0cce9d6ec6373964b84f35db7cfc3df7ab514"
|
resolved "https://registry.yarnpkg.com/accessibility-developer-tools/-/accessibility-developer-tools-2.12.0.tgz#3da0cce9d6ec6373964b84f35db7cfc3df7ab514"
|
||||||
|
|
||||||
|
ansi-regex@^2.0.0:
|
||||||
|
version "2.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
|
||||||
|
|
||||||
|
ansi-regex@^3.0.0:
|
||||||
|
version "3.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
|
||||||
|
|
||||||
any-promise@^1.0.0:
|
any-promise@^1.0.0:
|
||||||
version "1.3.0"
|
version "1.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
|
resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
|
||||||
@@ -76,6 +84,22 @@ bindings@^1.2.1:
|
|||||||
version "1.3.0"
|
version "1.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.0.tgz#b346f6ecf6a95f5a815c5839fc7cdb22502f1ed7"
|
resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.0.tgz#b346f6ecf6a95f5a815c5839fc7cdb22502f1ed7"
|
||||||
|
|
||||||
|
camelcase@^4.1.0:
|
||||||
|
version "4.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
|
||||||
|
|
||||||
|
cliui@^4.0.0:
|
||||||
|
version "4.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49"
|
||||||
|
dependencies:
|
||||||
|
string-width "^2.1.1"
|
||||||
|
strip-ansi "^4.0.0"
|
||||||
|
wrap-ansi "^2.0.0"
|
||||||
|
|
||||||
|
code-point-at@^1.0.0:
|
||||||
|
version "1.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
|
||||||
|
|
||||||
conf@^0.11.1:
|
conf@^0.11.1:
|
||||||
version "0.11.2"
|
version "0.11.2"
|
||||||
resolved "https://registry.yarnpkg.com/conf/-/conf-0.11.2.tgz#879f479267600483e502583462ca4063fc9779b2"
|
resolved "https://registry.yarnpkg.com/conf/-/conf-0.11.2.tgz#879f479267600483e502583462ca4063fc9779b2"
|
||||||
@@ -85,12 +109,26 @@ conf@^0.11.1:
|
|||||||
mkdirp "^0.5.1"
|
mkdirp "^0.5.1"
|
||||||
pkg-up "^1.0.0"
|
pkg-up "^1.0.0"
|
||||||
|
|
||||||
|
cross-spawn@^5.0.1:
|
||||||
|
version "5.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
|
||||||
|
dependencies:
|
||||||
|
lru-cache "^4.0.1"
|
||||||
|
shebang-command "^1.2.0"
|
||||||
|
which "^1.2.9"
|
||||||
|
|
||||||
debug@^2.2.0, debug@^2.6.8:
|
debug@^2.2.0, debug@^2.6.8:
|
||||||
version "2.6.8"
|
version "2.6.8"
|
||||||
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc"
|
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc"
|
||||||
dependencies:
|
dependencies:
|
||||||
ms "2.0.0"
|
ms "2.0.0"
|
||||||
|
|
||||||
|
decamelize@^2.0.0:
|
||||||
|
version "2.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7"
|
||||||
|
dependencies:
|
||||||
|
xregexp "4.0.0"
|
||||||
|
|
||||||
devtron@1.4.0:
|
devtron@1.4.0:
|
||||||
version "1.4.0"
|
version "1.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/devtron/-/devtron-1.4.0.tgz#b5e748bd6e95bbe70bfcc68aae6fe696119441e1"
|
resolved "https://registry.yarnpkg.com/devtron/-/devtron-1.4.0.tgz#b5e748bd6e95bbe70bfcc68aae6fe696119441e1"
|
||||||
@@ -111,27 +149,33 @@ electron-config@0.2.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
conf "^0.11.1"
|
conf "^0.11.1"
|
||||||
|
|
||||||
electron-debug@^1.0.1:
|
electron-debug@^2.0.0:
|
||||||
version "1.2.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/electron-debug/-/electron-debug-1.2.0.tgz#22e51a73e1bf095d0bb51a6c3d97a203364c4222"
|
resolved "https://registry.yarnpkg.com/electron-debug/-/electron-debug-2.0.0.tgz#3059a6557acbfb091f138d83875f57bac80cea6d"
|
||||||
dependencies:
|
dependencies:
|
||||||
electron-is-dev "^0.1.0"
|
electron-is-dev "^0.3.0"
|
||||||
electron-localshortcut "^2.0.0"
|
electron-localshortcut "^3.0.0"
|
||||||
|
|
||||||
electron-is-accelerator@^0.1.0:
|
electron-is-accelerator@^0.1.0:
|
||||||
version "0.1.2"
|
version "0.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/electron-is-accelerator/-/electron-is-accelerator-0.1.2.tgz#509e510c26a56b55e17f863a4b04e111846ab27b"
|
resolved "https://registry.yarnpkg.com/electron-is-accelerator/-/electron-is-accelerator-0.1.2.tgz#509e510c26a56b55e17f863a4b04e111846ab27b"
|
||||||
|
|
||||||
electron-is-dev@0.1.2, electron-is-dev@^0.1.0:
|
electron-is-dev@0.1.2:
|
||||||
version "0.1.2"
|
version "0.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/electron-is-dev/-/electron-is-dev-0.1.2.tgz#8a1043e32b3a1da1c3f553dce28ce764246167e3"
|
resolved "https://registry.yarnpkg.com/electron-is-dev/-/electron-is-dev-0.1.2.tgz#8a1043e32b3a1da1c3f553dce28ce764246167e3"
|
||||||
|
|
||||||
electron-localshortcut@^2.0.0:
|
electron-is-dev@^0.3.0:
|
||||||
version "2.0.2"
|
version "0.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/electron-localshortcut/-/electron-localshortcut-2.0.2.tgz#6a1adcd6514c957328ec7912f5ccb5e1c10706db"
|
resolved "https://registry.yarnpkg.com/electron-is-dev/-/electron-is-dev-0.3.0.tgz#14e6fda5c68e9e4ecbeff9ccf037cbd7c05c5afe"
|
||||||
|
|
||||||
|
electron-localshortcut@^3.0.0:
|
||||||
|
version "3.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/electron-localshortcut/-/electron-localshortcut-3.1.0.tgz#10c1ffd537b8d39170aaf6e1551341f7780dd2ce"
|
||||||
dependencies:
|
dependencies:
|
||||||
debug "^2.6.8"
|
debug "^2.6.8"
|
||||||
electron-is-accelerator "^0.1.0"
|
electron-is-accelerator "^0.1.0"
|
||||||
|
keyboardevent-from-electron-accelerator "^1.1.0"
|
||||||
|
keyboardevents-areequal "^0.2.1"
|
||||||
|
|
||||||
electron-squirrel-startup@^1.0.0:
|
electron-squirrel-startup@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
@@ -154,6 +198,18 @@ esprima@^3.1.1:
|
|||||||
version "3.1.3"
|
version "3.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
|
resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
|
||||||
|
|
||||||
|
execa@^0.7.0:
|
||||||
|
version "0.7.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
|
||||||
|
dependencies:
|
||||||
|
cross-spawn "^5.0.1"
|
||||||
|
get-stream "^3.0.0"
|
||||||
|
is-stream "^1.1.0"
|
||||||
|
npm-run-path "^2.0.0"
|
||||||
|
p-finally "^1.0.0"
|
||||||
|
signal-exit "^3.0.0"
|
||||||
|
strip-eof "^1.0.0"
|
||||||
|
|
||||||
find-up@^1.0.0:
|
find-up@^1.0.0:
|
||||||
version "1.1.2"
|
version "1.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
|
resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
|
||||||
@@ -161,6 +217,20 @@ find-up@^1.0.0:
|
|||||||
path-exists "^2.0.0"
|
path-exists "^2.0.0"
|
||||||
pinkie-promise "^2.0.0"
|
pinkie-promise "^2.0.0"
|
||||||
|
|
||||||
|
find-up@^3.0.0:
|
||||||
|
version "3.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
|
||||||
|
dependencies:
|
||||||
|
locate-path "^3.0.0"
|
||||||
|
|
||||||
|
get-caller-file@^1.0.1:
|
||||||
|
version "1.0.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
|
||||||
|
|
||||||
|
get-stream@^3.0.0:
|
||||||
|
version "3.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
|
||||||
|
|
||||||
highlight.js@^9.3.0:
|
highlight.js@^9.3.0:
|
||||||
version "9.12.0"
|
version "9.12.0"
|
||||||
resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e"
|
resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e"
|
||||||
@@ -173,10 +243,32 @@ inherits@2.0.1:
|
|||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
|
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
|
||||||
|
|
||||||
|
invert-kv@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
|
||||||
|
|
||||||
|
is-fullwidth-code-point@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
|
||||||
|
dependencies:
|
||||||
|
number-is-nan "^1.0.0"
|
||||||
|
|
||||||
|
is-fullwidth-code-point@^2.0.0:
|
||||||
|
version "2.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
|
||||||
|
|
||||||
is-obj@^1.0.0:
|
is-obj@^1.0.0:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
|
resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
|
||||||
|
|
||||||
|
is-stream@^1.1.0:
|
||||||
|
version "1.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
|
||||||
|
|
||||||
|
isexe@^2.0.0:
|
||||||
|
version "2.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
|
||||||
|
|
||||||
js-yaml@3.8.2:
|
js-yaml@3.8.2:
|
||||||
version "3.8.2"
|
version "3.8.2"
|
||||||
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.2.tgz#02d3e2c0f6beab20248d412c352203827d786721"
|
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.2.tgz#02d3e2c0f6beab20248d412c352203827d786721"
|
||||||
@@ -184,6 +276,44 @@ js-yaml@3.8.2:
|
|||||||
argparse "^1.0.7"
|
argparse "^1.0.7"
|
||||||
esprima "^3.1.1"
|
esprima "^3.1.1"
|
||||||
|
|
||||||
|
keyboardevent-from-electron-accelerator@^1.1.0:
|
||||||
|
version "1.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/keyboardevent-from-electron-accelerator/-/keyboardevent-from-electron-accelerator-1.1.0.tgz#324614f6e33490c37ffc5be5876b3e85fe223c84"
|
||||||
|
|
||||||
|
keyboardevents-areequal@^0.2.1:
|
||||||
|
version "0.2.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz#88191ec738ce9f7591c25e9056de928b40277194"
|
||||||
|
|
||||||
|
lcid@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
|
||||||
|
dependencies:
|
||||||
|
invert-kv "^1.0.0"
|
||||||
|
|
||||||
|
locate-path@^3.0.0:
|
||||||
|
version "3.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
|
||||||
|
dependencies:
|
||||||
|
p-locate "^3.0.0"
|
||||||
|
path-exists "^3.0.0"
|
||||||
|
|
||||||
|
lru-cache@^4.0.1:
|
||||||
|
version "4.1.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c"
|
||||||
|
dependencies:
|
||||||
|
pseudomap "^1.0.2"
|
||||||
|
yallist "^2.1.2"
|
||||||
|
|
||||||
|
mem@^1.1.0:
|
||||||
|
version "1.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
|
||||||
|
dependencies:
|
||||||
|
mimic-fn "^1.0.0"
|
||||||
|
|
||||||
|
mimic-fn@^1.0.0:
|
||||||
|
version "1.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
|
||||||
|
|
||||||
minimist@0.0.8:
|
minimist@0.0.8:
|
||||||
version "0.0.8"
|
version "0.0.8"
|
||||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
|
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
|
||||||
@@ -216,16 +346,62 @@ ngx-toastr@^8.7.3:
|
|||||||
dependencies:
|
dependencies:
|
||||||
tslib "^1.9.0"
|
tslib "^1.9.0"
|
||||||
|
|
||||||
|
npm-run-path@^2.0.0:
|
||||||
|
version "2.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
|
||||||
|
dependencies:
|
||||||
|
path-key "^2.0.0"
|
||||||
|
|
||||||
|
number-is-nan@^1.0.0:
|
||||||
|
version "1.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
|
||||||
|
|
||||||
object-assign@^4.0.1:
|
object-assign@^4.0.1:
|
||||||
version "4.1.1"
|
version "4.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
|
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
|
||||||
|
|
||||||
|
os-locale@^2.0.0:
|
||||||
|
version "2.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
|
||||||
|
dependencies:
|
||||||
|
execa "^0.7.0"
|
||||||
|
lcid "^1.0.0"
|
||||||
|
mem "^1.1.0"
|
||||||
|
|
||||||
|
p-finally@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
|
||||||
|
|
||||||
|
p-limit@^2.0.0:
|
||||||
|
version "2.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec"
|
||||||
|
dependencies:
|
||||||
|
p-try "^2.0.0"
|
||||||
|
|
||||||
|
p-locate@^3.0.0:
|
||||||
|
version "3.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
|
||||||
|
dependencies:
|
||||||
|
p-limit "^2.0.0"
|
||||||
|
|
||||||
|
p-try@^2.0.0:
|
||||||
|
version "2.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1"
|
||||||
|
|
||||||
path-exists@^2.0.0:
|
path-exists@^2.0.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
|
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
|
||||||
dependencies:
|
dependencies:
|
||||||
pinkie-promise "^2.0.0"
|
pinkie-promise "^2.0.0"
|
||||||
|
|
||||||
|
path-exists@^3.0.0:
|
||||||
|
version "3.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
|
||||||
|
|
||||||
|
path-key@^2.0.0:
|
||||||
|
version "2.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
|
||||||
|
|
||||||
path@0.12.7:
|
path@0.12.7:
|
||||||
version "0.12.7"
|
version "0.12.7"
|
||||||
resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f"
|
resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f"
|
||||||
@@ -253,16 +429,77 @@ process@^0.11.1:
|
|||||||
version "0.11.10"
|
version "0.11.10"
|
||||||
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
|
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
|
||||||
|
|
||||||
|
pseudomap@^1.0.2:
|
||||||
|
version "1.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
|
||||||
|
|
||||||
|
require-directory@^2.1.1:
|
||||||
|
version "2.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
|
||||||
|
|
||||||
|
require-main-filename@^1.0.1:
|
||||||
|
version "1.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
|
||||||
|
|
||||||
rxjs@^6.1.0:
|
rxjs@^6.1.0:
|
||||||
version "6.1.0"
|
version "6.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.1.0.tgz#833447de4e4f6427b9cec3e5eb9f56415cd28315"
|
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.1.0.tgz#833447de4e4f6427b9cec3e5eb9f56415cd28315"
|
||||||
dependencies:
|
dependencies:
|
||||||
tslib "^1.9.0"
|
tslib "^1.9.0"
|
||||||
|
|
||||||
|
set-blocking@^2.0.0:
|
||||||
|
version "2.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
|
||||||
|
|
||||||
|
shebang-command@^1.2.0:
|
||||||
|
version "1.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
|
||||||
|
dependencies:
|
||||||
|
shebang-regex "^1.0.0"
|
||||||
|
|
||||||
|
shebang-regex@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
|
||||||
|
|
||||||
|
signal-exit@^3.0.0:
|
||||||
|
version "3.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
|
||||||
|
|
||||||
sprintf-js@~1.0.2:
|
sprintf-js@~1.0.2:
|
||||||
version "1.0.3"
|
version "1.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
|
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
|
||||||
|
|
||||||
|
string-width@^1.0.1:
|
||||||
|
version "1.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
|
||||||
|
dependencies:
|
||||||
|
code-point-at "^1.0.0"
|
||||||
|
is-fullwidth-code-point "^1.0.0"
|
||||||
|
strip-ansi "^3.0.0"
|
||||||
|
|
||||||
|
string-width@^2.0.0, string-width@^2.1.1:
|
||||||
|
version "2.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
|
||||||
|
dependencies:
|
||||||
|
is-fullwidth-code-point "^2.0.0"
|
||||||
|
strip-ansi "^4.0.0"
|
||||||
|
|
||||||
|
strip-ansi@^3.0.0, strip-ansi@^3.0.1:
|
||||||
|
version "3.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
|
||||||
|
dependencies:
|
||||||
|
ansi-regex "^2.0.0"
|
||||||
|
|
||||||
|
strip-ansi@^4.0.0:
|
||||||
|
version "4.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
|
||||||
|
dependencies:
|
||||||
|
ansi-regex "^3.0.0"
|
||||||
|
|
||||||
|
strip-eof@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
|
||||||
|
|
||||||
thenify-all@^1.0.0:
|
thenify-all@^1.0.0:
|
||||||
version "1.6.0"
|
version "1.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726"
|
resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726"
|
||||||
@@ -285,6 +522,58 @@ util@^0.10.3:
|
|||||||
dependencies:
|
dependencies:
|
||||||
inherits "2.0.1"
|
inherits "2.0.1"
|
||||||
|
|
||||||
|
which-module@^2.0.0:
|
||||||
|
version "2.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
|
||||||
|
|
||||||
|
which@^1.2.9:
|
||||||
|
version "1.3.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
|
||||||
|
dependencies:
|
||||||
|
isexe "^2.0.0"
|
||||||
|
|
||||||
|
wrap-ansi@^2.0.0:
|
||||||
|
version "2.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
|
||||||
|
dependencies:
|
||||||
|
string-width "^1.0.1"
|
||||||
|
strip-ansi "^3.0.1"
|
||||||
|
|
||||||
|
xregexp@4.0.0:
|
||||||
|
version "4.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020"
|
||||||
|
|
||||||
|
"y18n@^3.2.1 || ^4.0.0":
|
||||||
|
version "4.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
|
||||||
|
|
||||||
|
yallist@^2.1.2:
|
||||||
|
version "2.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
|
||||||
|
|
||||||
|
yargs-parser@^10.1.0:
|
||||||
|
version "10.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8"
|
||||||
|
dependencies:
|
||||||
|
camelcase "^4.1.0"
|
||||||
|
|
||||||
|
yargs@^12.0.1:
|
||||||
|
version "12.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.1.tgz#6432e56123bb4e7c3562115401e98374060261c2"
|
||||||
|
dependencies:
|
||||||
|
cliui "^4.0.0"
|
||||||
|
decamelize "^2.0.0"
|
||||||
|
find-up "^3.0.0"
|
||||||
|
get-caller-file "^1.0.1"
|
||||||
|
os-locale "^2.0.0"
|
||||||
|
require-directory "^2.1.1"
|
||||||
|
require-main-filename "^1.0.1"
|
||||||
|
set-blocking "^2.0.0"
|
||||||
|
string-width "^2.0.0"
|
||||||
|
which-module "^2.0.0"
|
||||||
|
y18n "^3.2.1 || ^4.0.0"
|
||||||
|
yargs-parser "^10.1.0"
|
||||||
|
|
||||||
zone.js@~0.8.26:
|
zone.js@~0.8.26:
|
||||||
version "0.8.26"
|
version "0.8.26"
|
||||||
resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.8.26.tgz#7bdd72f7668c5a7ad6b118148b4ea39c59d08d2d"
|
resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.8.26.tgz#7bdd72f7668c5a7ad6b118148b4ea39c59d08d2d"
|
||||||
|
@@ -24,3 +24,4 @@ build_script:
|
|||||||
|
|
||||||
artifacts:
|
artifacts:
|
||||||
- path: 'dist\win\*.exe'
|
- path: 'dist\win\*.exe'
|
||||||
|
- path: 'dist\*.exe'
|
||||||
|
BIN
docs/background.jpeg
Normal file
After Width: | Height: | Size: 2.6 MiB |
BIN
docs/dist/assets/background.jpeg
vendored
Normal file
After Width: | Height: | Size: 2.6 MiB |
BIN
docs/dist/assets/terminal.png
vendored
Normal file
After Width: | Height: | Size: 21 KiB |
1
docs/dist/bundle.js
vendored
Normal file
BIN
docs/dist/fonts/background.jpeg
vendored
Normal file
After Width: | Height: | Size: 2.6 MiB |
@@ -1,50 +1,4 @@
|
|||||||
<!DOCTYPE html><html><head><link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400" rel="stylesheet"><link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"><link href="https://cdn.jsdelivr.net/g/bootstrap@4.0.0-alpha.6(css/bootstrap.min.css)" rel="stylesheet"><script src="https://cdn.jsdelivr.net/g/jquery@3.2.1,tether@1.4.0,bootstrap@4.0.0-alpha.6,modernizr@3.3.1,detectizr@2.2.0"></script><title>Terminus</title><style>body {
|
<!DOCTYPE html><html><head><base href="dist/"><meta name="viewport" content="initial-scale=1, minimal-ui, shrink-to-fit=no"><link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400" rel="stylesheet"><script src="bundle.js"></script><title>Terminus</title></head><body><div class="mt-5 mb-5" id="header"><div class="text-center"><h1>Terminus</h1><div class="subtitle mb-3">A terminal for a more modern age</div><a class="btn btn-lg btn-outline-dark mt-4" href="https://github.com/Eugeny/terminus/releases/latest" target="_blank"><strong>DOWNLOAD</strong></a><a class="btn btn-lg btn-outline-secondary mt-4 ml-3" href="https://github.com/Eugeny/terminus" target="_blank"><strong>GITHUB</strong></a></div></div><div class="background-stripe"><div class="overlay overlay1"></div><div class="overlay overlay2"></div><div class="terminal"></div></div><div class="container mt-5 mb-5"><div class="d-flex flex-wrap flex-md-nowrap"><div class="w-100"><div class="feature">windows</div><div class="feature">linux</div><div class="feature">macos</div><br><div class="feature">powershell</div><div class="feature">wsl</div><div class="feature">cygwin</div><div class="feature">git-bash</div><div class="feature">cmder</div><div class="feature">clink</div></div><div class="w-100"><div class="feature">full unicode</div><div class="feature">global hotkey</div><div class="feature">plugins</div><div class="feature">tab recovery</div><div class="feature">custom css</div><div class="feature">themes</div><div class="feature">font ligatures</div><div class="feature">clickable paths</div><div class="feature">tabs on top/bottom</div><div class="feature">vibrancy</div><div class="feature">bracketed paste</div></div></div></div><div class="container mt-5 mb-5"><div class="text-center"><a class="btn btn-lg btn-outline-secondary mt-5" href="/terminus/#header"><strong>BEAM ME UP</strong></a></div></div><div class="background-stripe2"><div class="overlay overlay1"></div></div><script>(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||||
font-family: 'Source Sans Pro', sans-serif;
|
|
||||||
background: #111;
|
|
||||||
color: #ccc;
|
|
||||||
min-height: 100vh;
|
|
||||||
background-image: radial-gradient(#111, #000);
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
font-size: 64px;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1, h2, h3, h5 {
|
|
||||||
font-weight: 300;
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn i + span,
|
|
||||||
.nav-link i + span {
|
|
||||||
margin-left: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-outline-primary {
|
|
||||||
color: #b6e7ff !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-link {
|
|
||||||
font-size: 22px;
|
|
||||||
}
|
|
||||||
|
|
||||||
video, img {
|
|
||||||
max-width: 100%;
|
|
||||||
box-shadow: 0 0 50px black;
|
|
||||||
}
|
|
||||||
</style><script defer>setTimeout(function () {
|
|
||||||
/*
|
|
||||||
if (Detectizr.os.name == 'windows') {
|
|
||||||
$('[href="#windows"]').tab('show')
|
|
||||||
}
|
|
||||||
if (Detectizr.os.name == 'mac os') {
|
|
||||||
$('[href="#macos"]').tab('show')
|
|
||||||
}
|
|
||||||
if (Detectizr.os.name == 'linux') {
|
|
||||||
$('[href="#linux"]').tab('show')
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
})</script></head><body><div class="container mt-5 mb-5"><div class="text-center"><h1>Terminus</h1><h5>A terminal for a more modern age</h5><h2 class="text-muted">alpha</h2></div><div class="d-flex flex-row mt-5 mb-5"><ul class="nav nav-pills flex-column mr-5" style="min-width: 200px;"><li class="nav-item"><a class="nav-link active" data-toggle="tab" href="#windows" role="tab"><i class="fa fa-windows"></i><span>Windows</span></a></li><li class="nav-item"><a class="nav-link" data-toggle="tab" href="#macos" role="tab"><i class="fa fa-apple"></i><span>macOS</span></a></li><li class="nav-item"><a class="nav-link" data-toggle="tab" href="#linux" role="tab"><i class="fa fa-linux"></i><span>Linux</span></a></li></ul><div class="tab-content"><div class="tab-pane active" id="windows" role="tabpanel"><div class="row"><div class="col-6"><video src="videos/windows.mp4" autoplay loop></video></div><div class="col-6"><h3>A proper Windows experience</h3><p> <b>Clink </b>provides tab completion, readline-style editing and persistent command history on Windows.</p><p>Also supported:<ul> <li>Classic CMD</li><li>PowerShell </li><li>Bash on Windows </li></ul></p></div></div></div><div class="tab-pane" id="macos" role="tabpanel"><div class="row"><div class="col-6"><!--video(src='videos/windows.mp4', autoplay, loop)--></div><div class="col-6"><h3>Well...</h3><p>Not much to say here, it just works.</p></div></div></div><div class="tab-pane" id="linux" role="tabpanel"><div class="row"><div class="col-6"><img src="linux.png"></div><div class="col-6"><p><ul> <li>Spawn with a global hotkey</li><li>Tabs persist after restart</li><li>Auto-dock to any side of any screen</li><li>Full Unicode and double-width character support</li></ul></p></div></div></div></div></div><div class="text-center"><div class="mt-3 mb-3"><h2></h2><div><div class="btn-group mt-3 mb-1"><a class="btn btn-lg btn-outline-success" href="https://github.com/Eugeny/terminus/releases/latest" target="_blank"><i class="fa fa-download"></i><span>Downloads</span></a><a class="btn btn-lg btn-outline-secondary" href="https://github.com/Eugeny/terminus" target="_blank"><i class="fa fa-github"></i><span>GitHub</span></a></div></div><small class="text-muted">EXE, DMG, DEB, RPM, TGZ</small></div></div><div class="row mt-5"><div class="col-6"><h3>User experience</h3><ul><li>Spawn and hide with a global hotkey</li><li>Fully customizable hotkey schema</li><li>Restores tabs </li><li>Drag in a file to paste the path</li><li>Click paths and URLs to open in browser/file manager</li><li>Keeps the current directory in new tabs</li></ul></div><div class="col-6"><div class="mb-5"><h3>Customizable</h3><p>Multiple app themes and a myriad of community color schemes for the terminal. Color scheme editor included.</p></div><div> <h3>Infinitely extensible</h3><p>Install plugins from the NPM repository, or create your own with Typescript and Angular framework.</p></div></div></div></div><script>(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
|
||||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||||
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
|
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
|
||||||
|
1
docs/index.js
Normal file
@@ -0,0 +1 @@
|
|||||||
|
import './styles.scss'
|
183
docs/index.pug
@@ -1,154 +1,63 @@
|
|||||||
doctype html
|
doctype html
|
||||||
html
|
html
|
||||||
head
|
head
|
||||||
|
base(href='dist/')
|
||||||
|
meta(name='viewport', content='initial-scale=1, minimal-ui, shrink-to-fit=no')
|
||||||
link(href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400", rel="stylesheet")
|
link(href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400", rel="stylesheet")
|
||||||
link(href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css", rel="stylesheet")
|
script(src='bundle.js')
|
||||||
link(href="https://cdn.jsdelivr.net/g/bootstrap@4.0.0-alpha.6(css/bootstrap.min.css)", rel="stylesheet")
|
|
||||||
script(src="https://cdn.jsdelivr.net/g/jquery@3.2.1,tether@1.4.0,bootstrap@4.0.0-alpha.6,modernizr@3.3.1,detectizr@2.2.0")
|
|
||||||
title Terminus
|
title Terminus
|
||||||
style.
|
|
||||||
body {
|
|
||||||
font-family: 'Source Sans Pro', sans-serif;
|
|
||||||
background: #111;
|
|
||||||
color: #ccc;
|
|
||||||
min-height: 100vh;
|
|
||||||
background-image: radial-gradient(#111, #000);
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
font-size: 64px;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1, h2, h3, h5 {
|
|
||||||
font-weight: 300;
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn i + span,
|
|
||||||
.nav-link i + span {
|
|
||||||
margin-left: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-outline-primary {
|
|
||||||
color: #b6e7ff !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-link {
|
|
||||||
font-size: 22px;
|
|
||||||
}
|
|
||||||
|
|
||||||
video, img {
|
|
||||||
max-width: 100%;
|
|
||||||
box-shadow: 0 0 50px black;
|
|
||||||
}
|
|
||||||
|
|
||||||
script(defer).
|
|
||||||
setTimeout(function () {
|
|
||||||
/*
|
|
||||||
if (Detectizr.os.name == 'windows') {
|
|
||||||
$('[href="#windows"]').tab('show')
|
|
||||||
}
|
|
||||||
if (Detectizr.os.name == 'mac os') {
|
|
||||||
$('[href="#macos"]').tab('show')
|
|
||||||
}
|
|
||||||
if (Detectizr.os.name == 'linux') {
|
|
||||||
$('[href="#linux"]').tab('show')
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
})
|
|
||||||
body
|
body
|
||||||
.container.mt-5.mb-5
|
.mt-5.mb-5#header
|
||||||
.text-center
|
.text-center
|
||||||
h1 Terminus
|
h1 Terminus
|
||||||
h5 A terminal for a more modern age
|
.subtitle.mb-3 A terminal for a more modern age
|
||||||
h2.text-muted alpha
|
|
||||||
|
|
||||||
.d-flex.flex-row.mt-5.mb-5
|
a.btn.btn-lg.btn-outline-dark.mt-4(href='https://github.com/Eugeny/terminus/releases/latest', target='_blank')
|
||||||
ul.nav.nav-pills.flex-column.mr-5(style='min-width: 200px')
|
strong DOWNLOAD
|
||||||
li.nav-item
|
|
||||||
a.nav-link.active(data-toggle='tab', href='#windows', role='tab')
|
|
||||||
i.fa.fa-windows
|
|
||||||
span Windows
|
|
||||||
li.nav-item
|
|
||||||
a.nav-link(data-toggle='tab', href='#macos', role='tab')
|
|
||||||
i.fa.fa-apple
|
|
||||||
span macOS
|
|
||||||
li.nav-item
|
|
||||||
a.nav-link(data-toggle='tab', href='#linux', role='tab')
|
|
||||||
i.fa.fa-linux
|
|
||||||
span Linux
|
|
||||||
|
|
||||||
.tab-content
|
a.btn.btn-lg.btn-outline-secondary.mt-4.ml-3(href='https://github.com/Eugeny/terminus', target='_blank')
|
||||||
#windows.tab-pane.active(role='tabpanel')
|
strong GITHUB
|
||||||
.row
|
|
||||||
.col-6
|
|
||||||
video(src='videos/windows.mp4', autoplay, loop)
|
|
||||||
.col-6
|
|
||||||
h3 A proper Windows experience
|
|
||||||
p
|
|
||||||
b Clink
|
|
||||||
| provides tab completion, readline-style editing and persistent command history on Windows.
|
|
||||||
p Also supported:
|
|
||||||
ul
|
|
||||||
li Classic CMD
|
|
||||||
li PowerShell
|
|
||||||
li Bash on Windows
|
|
||||||
|
|
||||||
#macos.tab-pane(role='tabpanel')
|
|
||||||
.row
|
|
||||||
.col-6
|
|
||||||
//video(src='videos/windows.mp4', autoplay, loop)
|
|
||||||
.col-6
|
|
||||||
h3 Well...
|
|
||||||
p Not much to say here, it just works.
|
|
||||||
|
|
||||||
#linux.tab-pane(role='tabpanel')
|
|
||||||
.row
|
|
||||||
.col-6
|
|
||||||
img(src='linux.png')
|
|
||||||
.col-6
|
|
||||||
p
|
|
||||||
ul
|
|
||||||
li Spawn with a global hotkey
|
|
||||||
li Tabs persist after restart
|
|
||||||
li Auto-dock to any side of any screen
|
|
||||||
li Full Unicode and double-width character support
|
|
||||||
|
|
||||||
|
|
||||||
|
.background-stripe
|
||||||
|
.overlay.overlay1
|
||||||
|
.overlay.overlay2
|
||||||
|
.terminal
|
||||||
|
|
||||||
|
.container.mt-5.mb-5
|
||||||
|
.d-flex.flex-wrap.flex-md-nowrap
|
||||||
|
.w-100
|
||||||
|
.feature windows
|
||||||
|
.feature linux
|
||||||
|
.feature macos
|
||||||
|
br
|
||||||
|
.feature powershell
|
||||||
|
.feature wsl
|
||||||
|
.feature cygwin
|
||||||
|
.feature git-bash
|
||||||
|
.feature cmder
|
||||||
|
.feature clink
|
||||||
|
|
||||||
|
.w-100
|
||||||
|
.feature full unicode
|
||||||
|
.feature global hotkey
|
||||||
|
.feature plugins
|
||||||
|
.feature tab recovery
|
||||||
|
.feature custom css
|
||||||
|
.feature themes
|
||||||
|
.feature font ligatures
|
||||||
|
.feature clickable paths
|
||||||
|
.feature tabs on top/bottom
|
||||||
|
.feature vibrancy
|
||||||
|
.feature bracketed paste
|
||||||
|
|
||||||
|
.container.mt-5.mb-5
|
||||||
.text-center
|
.text-center
|
||||||
.mt-3.mb-3
|
a.btn.btn-lg.btn-outline-secondary.mt-5(href='/terminus/#header')
|
||||||
h2
|
strong BEAM ME UP
|
||||||
|
|
||||||
div
|
.background-stripe2
|
||||||
.btn-group.mt-3.mb-1
|
.overlay.overlay1
|
||||||
a.btn.btn-lg.btn-outline-success(href='https://github.com/Eugeny/terminus/releases/latest', target='_blank')
|
|
||||||
i.fa.fa-download
|
|
||||||
span Downloads
|
|
||||||
a.btn.btn-lg.btn-outline-secondary(href='https://github.com/Eugeny/terminus', target='_blank')
|
|
||||||
i.fa.fa-github
|
|
||||||
span GitHub
|
|
||||||
small.text-muted EXE, DMG, DEB, RPM, TGZ
|
|
||||||
|
|
||||||
|
|
||||||
.row.mt-5
|
|
||||||
.col-6
|
|
||||||
h3 User experience
|
|
||||||
ul
|
|
||||||
li Spawn and hide with a global hotkey
|
|
||||||
li Fully customizable hotkey schema
|
|
||||||
li Restores tabs
|
|
||||||
li Drag in a file to paste the path
|
|
||||||
li Click paths and URLs to open in browser/file manager
|
|
||||||
li Keeps the current directory in new tabs
|
|
||||||
|
|
||||||
.col-6
|
|
||||||
.mb-5
|
|
||||||
h3 Customizable
|
|
||||||
p Multiple app themes and a myriad of community color schemes for the terminal. Color scheme editor included.
|
|
||||||
|
|
||||||
div
|
|
||||||
h3 Infinitely extensible
|
|
||||||
p Install plugins from the NPM repository, or create your own with Typescript and Angular framework.
|
|
||||||
|
|
||||||
script.
|
script.
|
||||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||||
|
BIN
docs/linux.png
Before Width: | Height: | Size: 138 KiB |
@@ -1,15 +1,24 @@
|
|||||||
{
|
{
|
||||||
"name": "docs",
|
"name": "docs",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "",
|
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "pug index.pug",
|
"build": "webpack --progress",
|
||||||
"watch": "pug -w index.pug"
|
"watch": "webpack --progress --watch"
|
||||||
},
|
},
|
||||||
"author": "",
|
"private": true,
|
||||||
"license": "ISC",
|
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"pug-cli": "^1.0.0-alpha6"
|
"bootstrap": "^4.1.3",
|
||||||
|
"css-loader": "^1.0.0",
|
||||||
|
"file-loader": "^1.1.11",
|
||||||
|
"node-sass": "^4.9.3",
|
||||||
|
"pug": "^2.0.3",
|
||||||
|
"pug-cli": "^1.0.0-alpha6",
|
||||||
|
"pug-html-loader": "^1.1.5",
|
||||||
|
"sass-loader": "^7.1.0",
|
||||||
|
"style-loader": "^0.22.1",
|
||||||
|
"val-loader": "^1.1.1",
|
||||||
|
"webpack": "^4.16.5",
|
||||||
|
"webpack-cli": "^3.1.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
BIN
docs/readme.png
Normal file
After Width: | Height: | Size: 862 KiB |
141
docs/styles.scss
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
$font-family-sans-serif: "Source Sans Pro";
|
||||||
|
$border-radius-lg: 0;
|
||||||
|
$btn-border-width: 3px;
|
||||||
|
|
||||||
|
@import "node_modules/bootstrap/scss/bootstrap";
|
||||||
|
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 10vw;
|
||||||
|
font-weight: 200;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
overflow-x: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.subtitle {
|
||||||
|
font-style: italic;
|
||||||
|
color: #999;
|
||||||
|
font-size: 5vw;
|
||||||
|
font-weight: 300;
|
||||||
|
}
|
||||||
|
|
||||||
|
.background-stripe {
|
||||||
|
width: 100vw;
|
||||||
|
background-image: url('./background.jpeg');
|
||||||
|
background-size: cover;
|
||||||
|
height: 30vw;
|
||||||
|
margin: 200px 0 150px;
|
||||||
|
min-height: 1000px;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.overlay {
|
||||||
|
position: absolute;
|
||||||
|
width: 100vw;
|
||||||
|
width: 1px;
|
||||||
|
height: 1px;
|
||||||
|
|
||||||
|
&.overlay1 {
|
||||||
|
top: -1px;
|
||||||
|
left: 0;
|
||||||
|
border-top: 10vw solid white;
|
||||||
|
border-right: 100vw solid transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.overlay2 {
|
||||||
|
bottom: -1px;
|
||||||
|
right: 0;
|
||||||
|
border-bottom: 10vw solid white;
|
||||||
|
border-left: 100vw solid transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.terminal {
|
||||||
|
position: absolute;
|
||||||
|
left: 50%;
|
||||||
|
top: 5vw;
|
||||||
|
|
||||||
|
width: 1304px;
|
||||||
|
margin-left: -652px;
|
||||||
|
height: 972px;
|
||||||
|
border-radius: 9px;
|
||||||
|
|
||||||
|
box-shadow: 0 0 100px black;
|
||||||
|
background: url('./terminal.png');
|
||||||
|
background-size: cover;
|
||||||
|
|
||||||
|
animation: slideIn ease-out 1s;
|
||||||
|
opacity: .95;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media(max-width: 1500px) {
|
||||||
|
min-height: 500px;
|
||||||
|
margin: 200px 0 100px;
|
||||||
|
|
||||||
|
.terminal {
|
||||||
|
width: 652px;
|
||||||
|
top: -100px;
|
||||||
|
margin-left: -326px;
|
||||||
|
height: 486px;
|
||||||
|
border-radius: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media(max-width: 750px) {
|
||||||
|
min-height: 250px;
|
||||||
|
margin: 100px 0 50px;
|
||||||
|
|
||||||
|
.terminal {
|
||||||
|
width: 326px;
|
||||||
|
top: -50px;
|
||||||
|
margin-left: -163px;
|
||||||
|
height: 243px;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.feature {
|
||||||
|
font-size: 45px;
|
||||||
|
line-height: 40px;
|
||||||
|
opacity: .5;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes slideIn {
|
||||||
|
from {
|
||||||
|
opacity: 0;
|
||||||
|
margin-top: 200px;
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
opacity: .95;
|
||||||
|
margin-top: 0px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.background-stripe2 {
|
||||||
|
width: 100vw;
|
||||||
|
background-image: url('./background.jpeg');
|
||||||
|
background-size: cover;
|
||||||
|
height: 30vw;
|
||||||
|
margin: 100px 0 0;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.overlay {
|
||||||
|
position: absolute;
|
||||||
|
width: 100vw;
|
||||||
|
width: 1px;
|
||||||
|
height: 1px;
|
||||||
|
|
||||||
|
&.overlay1 {
|
||||||
|
top: -1px;
|
||||||
|
right: 0;
|
||||||
|
border-top: 10vw solid white;
|
||||||
|
border-left: 100vw solid transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
BIN
docs/terminal.png
Normal file
After Width: | Height: | Size: 21 KiB |
27
docs/webpack.config.js
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
const path = require('path')
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
entry: {
|
||||||
|
'index.ignore': 'file-loader?name=../index.html!pug-html-loader!' + path.resolve(__dirname, './index.pug'),
|
||||||
|
'bundle': path.resolve(__dirname, 'index.js'),
|
||||||
|
},
|
||||||
|
context: __dirname,
|
||||||
|
output: {
|
||||||
|
path: path.join(__dirname, 'dist'),
|
||||||
|
filename: '[name].js'
|
||||||
|
},
|
||||||
|
module: {
|
||||||
|
rules: [
|
||||||
|
{ test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] },
|
||||||
|
{
|
||||||
|
test: /\.(jpeg|png)?$/,
|
||||||
|
use: {
|
||||||
|
loader: 'file-loader',
|
||||||
|
options: {
|
||||||
|
name: 'assets/[name].[ext]'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
}
|
@@ -0,0 +1,31 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>NSServices</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>NSBackgroundColorName</key>
|
||||||
|
<string>background</string>
|
||||||
|
<key>NSIconName</key>
|
||||||
|
<string>NSActionTemplate</string>
|
||||||
|
<key>NSMenuItem</key>
|
||||||
|
<dict>
|
||||||
|
<key>default</key>
|
||||||
|
<string>Open Terminus here</string>
|
||||||
|
</dict>
|
||||||
|
<key>NSMessage</key>
|
||||||
|
<string>runWorkflowAsService</string>
|
||||||
|
<key>NSRequiredContext</key>
|
||||||
|
<dict>
|
||||||
|
<key>NSApplicationIdentifier</key>
|
||||||
|
<string>com.apple.finder</string>
|
||||||
|
</dict>
|
||||||
|
<key>NSSendFileTypes</key>
|
||||||
|
<array>
|
||||||
|
<string>public.item</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
After Width: | Height: | Size: 3.6 KiB |
@@ -0,0 +1,136 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>files</key>
|
||||||
|
<dict/>
|
||||||
|
<key>files2</key>
|
||||||
|
<dict>
|
||||||
|
<key>QuickLook/Thumbnail.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>hash</key>
|
||||||
|
<data>
|
||||||
|
tv0Qtgo8zZ9+sQPQDNdKJHm7jeQ=
|
||||||
|
</data>
|
||||||
|
<key>hash2</key>
|
||||||
|
<data>
|
||||||
|
8nlfnBbkORcam9cE84KuxM9Lgf6hYU0jehepX8sSNDU=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>document.wflow</key>
|
||||||
|
<dict>
|
||||||
|
<key>cdhash</key>
|
||||||
|
<data>
|
||||||
|
VK77ipNZktBsDCcUfnfht774juM=
|
||||||
|
</data>
|
||||||
|
<key>requirement</key>
|
||||||
|
<string>identifier document and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = V4JSMC46SY</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<key>rules</key>
|
||||||
|
<dict>
|
||||||
|
<key>^Resources/</key>
|
||||||
|
<true/>
|
||||||
|
<key>^Resources/.*\.lproj/</key>
|
||||||
|
<dict>
|
||||||
|
<key>optional</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>1000</real>
|
||||||
|
</dict>
|
||||||
|
<key>^Resources/.*\.lproj/locversion.plist$</key>
|
||||||
|
<dict>
|
||||||
|
<key>omit</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>1100</real>
|
||||||
|
</dict>
|
||||||
|
<key>^Resources/Base\.lproj/</key>
|
||||||
|
<dict>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>1010</real>
|
||||||
|
</dict>
|
||||||
|
<key>^version.plist$</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>rules2</key>
|
||||||
|
<dict>
|
||||||
|
<key>.*\.dSYM($|/)</key>
|
||||||
|
<dict>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>11</real>
|
||||||
|
</dict>
|
||||||
|
<key>^(.*/)?\.DS_Store$</key>
|
||||||
|
<dict>
|
||||||
|
<key>omit</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>2000</real>
|
||||||
|
</dict>
|
||||||
|
<key>^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/</key>
|
||||||
|
<dict>
|
||||||
|
<key>nested</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>10</real>
|
||||||
|
</dict>
|
||||||
|
<key>^.*</key>
|
||||||
|
<true/>
|
||||||
|
<key>^Info\.plist$</key>
|
||||||
|
<dict>
|
||||||
|
<key>omit</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>20</real>
|
||||||
|
</dict>
|
||||||
|
<key>^PkgInfo$</key>
|
||||||
|
<dict>
|
||||||
|
<key>omit</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>20</real>
|
||||||
|
</dict>
|
||||||
|
<key>^Resources/</key>
|
||||||
|
<dict>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>20</real>
|
||||||
|
</dict>
|
||||||
|
<key>^Resources/.*\.lproj/</key>
|
||||||
|
<dict>
|
||||||
|
<key>optional</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>1000</real>
|
||||||
|
</dict>
|
||||||
|
<key>^Resources/.*\.lproj/locversion.plist$</key>
|
||||||
|
<dict>
|
||||||
|
<key>omit</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>1100</real>
|
||||||
|
</dict>
|
||||||
|
<key>^Resources/Base\.lproj/</key>
|
||||||
|
<dict>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>1010</real>
|
||||||
|
</dict>
|
||||||
|
<key>^[^/]+$</key>
|
||||||
|
<dict>
|
||||||
|
<key>nested</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>10</real>
|
||||||
|
</dict>
|
||||||
|
<key>^embedded\.provisionprofile$</key>
|
||||||
|
<dict>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>20</real>
|
||||||
|
</dict>
|
||||||
|
<key>^version\.plist$</key>
|
||||||
|
<dict>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>20</real>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
@@ -0,0 +1,226 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>AMApplicationBuild</key>
|
||||||
|
<string>444.38</string>
|
||||||
|
<key>AMApplicationVersion</key>
|
||||||
|
<string>2.9</string>
|
||||||
|
<key>AMDocumentVersion</key>
|
||||||
|
<string>2</string>
|
||||||
|
<key>actions</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>action</key>
|
||||||
|
<dict>
|
||||||
|
<key>AMAccepts</key>
|
||||||
|
<dict>
|
||||||
|
<key>Container</key>
|
||||||
|
<string>List</string>
|
||||||
|
<key>Optional</key>
|
||||||
|
<true/>
|
||||||
|
<key>Types</key>
|
||||||
|
<array>
|
||||||
|
<string>com.apple.cocoa.string</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<key>AMActionVersion</key>
|
||||||
|
<string>2.0.3</string>
|
||||||
|
<key>AMApplication</key>
|
||||||
|
<array>
|
||||||
|
<string>Automator</string>
|
||||||
|
</array>
|
||||||
|
<key>AMParameterProperties</key>
|
||||||
|
<dict>
|
||||||
|
<key>COMMAND_STRING</key>
|
||||||
|
<dict/>
|
||||||
|
<key>CheckedForUserDefaultShell</key>
|
||||||
|
<dict/>
|
||||||
|
<key>inputMethod</key>
|
||||||
|
<dict/>
|
||||||
|
<key>shell</key>
|
||||||
|
<dict/>
|
||||||
|
<key>source</key>
|
||||||
|
<dict/>
|
||||||
|
</dict>
|
||||||
|
<key>AMProvides</key>
|
||||||
|
<dict>
|
||||||
|
<key>Container</key>
|
||||||
|
<string>List</string>
|
||||||
|
<key>Types</key>
|
||||||
|
<array>
|
||||||
|
<string>com.apple.cocoa.string</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<key>ActionBundlePath</key>
|
||||||
|
<string>/System/Library/Automator/Run Shell Script.action</string>
|
||||||
|
<key>ActionName</key>
|
||||||
|
<string>Run Shell Script</string>
|
||||||
|
<key>ActionParameters</key>
|
||||||
|
<dict>
|
||||||
|
<key>COMMAND_STRING</key>
|
||||||
|
<string>/Applications/Terminus.app/Contents/MacOS/terminus open "$1"</string>
|
||||||
|
<key>CheckedForUserDefaultShell</key>
|
||||||
|
<true/>
|
||||||
|
<key>inputMethod</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>shell</key>
|
||||||
|
<string>/bin/sh</string>
|
||||||
|
<key>source</key>
|
||||||
|
<string></string>
|
||||||
|
</dict>
|
||||||
|
<key>BundleIdentifier</key>
|
||||||
|
<string>com.apple.RunShellScript</string>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>2.0.3</string>
|
||||||
|
<key>CanShowSelectedItemsWhenRun</key>
|
||||||
|
<false/>
|
||||||
|
<key>CanShowWhenRun</key>
|
||||||
|
<true/>
|
||||||
|
<key>Category</key>
|
||||||
|
<array>
|
||||||
|
<string>AMCategoryUtilities</string>
|
||||||
|
</array>
|
||||||
|
<key>Class Name</key>
|
||||||
|
<string>RunShellScriptAction</string>
|
||||||
|
<key>InputUUID</key>
|
||||||
|
<string>CDBAB8D4-B8B8-4FBB-9115-B4082FB99E1C</string>
|
||||||
|
<key>Keywords</key>
|
||||||
|
<array>
|
||||||
|
<string>Shell</string>
|
||||||
|
<string>Script</string>
|
||||||
|
<string>Command</string>
|
||||||
|
<string>Run</string>
|
||||||
|
<string>Unix</string>
|
||||||
|
</array>
|
||||||
|
<key>OutputUUID</key>
|
||||||
|
<string>96B5890B-A95F-4BF2-8E5A-38E07A849C33</string>
|
||||||
|
<key>UUID</key>
|
||||||
|
<string>62251AFB-502C-4EA0-821C-D9B8CA96E6EE</string>
|
||||||
|
<key>UnlocalizedApplications</key>
|
||||||
|
<array>
|
||||||
|
<string>Automator</string>
|
||||||
|
</array>
|
||||||
|
<key>arguments</key>
|
||||||
|
<dict>
|
||||||
|
<key>0</key>
|
||||||
|
<dict>
|
||||||
|
<key>default value</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>name</key>
|
||||||
|
<string>inputMethod</string>
|
||||||
|
<key>required</key>
|
||||||
|
<string>0</string>
|
||||||
|
<key>type</key>
|
||||||
|
<string>0</string>
|
||||||
|
<key>uuid</key>
|
||||||
|
<string>0</string>
|
||||||
|
</dict>
|
||||||
|
<key>1</key>
|
||||||
|
<dict>
|
||||||
|
<key>default value</key>
|
||||||
|
<string></string>
|
||||||
|
<key>name</key>
|
||||||
|
<string>source</string>
|
||||||
|
<key>required</key>
|
||||||
|
<string>0</string>
|
||||||
|
<key>type</key>
|
||||||
|
<string>0</string>
|
||||||
|
<key>uuid</key>
|
||||||
|
<string>1</string>
|
||||||
|
</dict>
|
||||||
|
<key>2</key>
|
||||||
|
<dict>
|
||||||
|
<key>default value</key>
|
||||||
|
<false/>
|
||||||
|
<key>name</key>
|
||||||
|
<string>CheckedForUserDefaultShell</string>
|
||||||
|
<key>required</key>
|
||||||
|
<string>0</string>
|
||||||
|
<key>type</key>
|
||||||
|
<string>0</string>
|
||||||
|
<key>uuid</key>
|
||||||
|
<string>2</string>
|
||||||
|
</dict>
|
||||||
|
<key>3</key>
|
||||||
|
<dict>
|
||||||
|
<key>default value</key>
|
||||||
|
<string></string>
|
||||||
|
<key>name</key>
|
||||||
|
<string>COMMAND_STRING</string>
|
||||||
|
<key>required</key>
|
||||||
|
<string>0</string>
|
||||||
|
<key>type</key>
|
||||||
|
<string>0</string>
|
||||||
|
<key>uuid</key>
|
||||||
|
<string>3</string>
|
||||||
|
</dict>
|
||||||
|
<key>4</key>
|
||||||
|
<dict>
|
||||||
|
<key>default value</key>
|
||||||
|
<string>/bin/sh</string>
|
||||||
|
<key>name</key>
|
||||||
|
<string>shell</string>
|
||||||
|
<key>required</key>
|
||||||
|
<string>0</string>
|
||||||
|
<key>type</key>
|
||||||
|
<string>0</string>
|
||||||
|
<key>uuid</key>
|
||||||
|
<string>4</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<key>isViewVisible</key>
|
||||||
|
<true/>
|
||||||
|
<key>location</key>
|
||||||
|
<string>529.000000:305.000000</string>
|
||||||
|
<key>nibPath</key>
|
||||||
|
<string>/System/Library/Automator/Run Shell Script.action/Contents/Resources/Base.lproj/main.nib</string>
|
||||||
|
</dict>
|
||||||
|
<key>isViewVisible</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>connectors</key>
|
||||||
|
<dict/>
|
||||||
|
<key>workflowMetaData</key>
|
||||||
|
<dict>
|
||||||
|
<key>applicationBundleID</key>
|
||||||
|
<string>com.apple.finder</string>
|
||||||
|
<key>applicationBundleIDsByPath</key>
|
||||||
|
<dict>
|
||||||
|
<key>/System/Library/CoreServices/Finder.app</key>
|
||||||
|
<string>com.apple.finder</string>
|
||||||
|
</dict>
|
||||||
|
<key>applicationPath</key>
|
||||||
|
<string>/System/Library/CoreServices/Finder.app</string>
|
||||||
|
<key>applicationPaths</key>
|
||||||
|
<array>
|
||||||
|
<string>/System/Library/CoreServices/Finder.app</string>
|
||||||
|
</array>
|
||||||
|
<key>inputTypeIdentifier</key>
|
||||||
|
<string>com.apple.Automator.fileSystemObject</string>
|
||||||
|
<key>outputTypeIdentifier</key>
|
||||||
|
<string>com.apple.Automator.nothing</string>
|
||||||
|
<key>presentationMode</key>
|
||||||
|
<integer>15</integer>
|
||||||
|
<key>processesInput</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>serviceApplicationBundleID</key>
|
||||||
|
<string>com.apple.finder</string>
|
||||||
|
<key>serviceApplicationPath</key>
|
||||||
|
<string>/System/Library/CoreServices/Finder.app</string>
|
||||||
|
<key>serviceInputTypeIdentifier</key>
|
||||||
|
<string>com.apple.Automator.fileSystemObject</string>
|
||||||
|
<key>serviceOutputTypeIdentifier</key>
|
||||||
|
<string>com.apple.Automator.nothing</string>
|
||||||
|
<key>serviceProcessesInput</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>systemImageName</key>
|
||||||
|
<string>NSActionTemplate</string>
|
||||||
|
<key>useAutomaticInputType</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>workflowTypeIdentifier</key>
|
||||||
|
<string>com.apple.Automator.servicesMenu</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
@@ -0,0 +1,31 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>NSServices</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>NSBackgroundColorName</key>
|
||||||
|
<string>background</string>
|
||||||
|
<key>NSIconName</key>
|
||||||
|
<string>NSActionTemplate</string>
|
||||||
|
<key>NSMenuItem</key>
|
||||||
|
<dict>
|
||||||
|
<key>default</key>
|
||||||
|
<string>Paste path into Terminus</string>
|
||||||
|
</dict>
|
||||||
|
<key>NSMessage</key>
|
||||||
|
<string>runWorkflowAsService</string>
|
||||||
|
<key>NSRequiredContext</key>
|
||||||
|
<dict>
|
||||||
|
<key>NSApplicationIdentifier</key>
|
||||||
|
<string>com.apple.finder</string>
|
||||||
|
</dict>
|
||||||
|
<key>NSSendFileTypes</key>
|
||||||
|
<array>
|
||||||
|
<string>public.item</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
After Width: | Height: | Size: 3.6 KiB |
@@ -0,0 +1,136 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>files</key>
|
||||||
|
<dict/>
|
||||||
|
<key>files2</key>
|
||||||
|
<dict>
|
||||||
|
<key>QuickLook/Thumbnail.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>hash</key>
|
||||||
|
<data>
|
||||||
|
tv0Qtgo8zZ9+sQPQDNdKJHm7jeQ=
|
||||||
|
</data>
|
||||||
|
<key>hash2</key>
|
||||||
|
<data>
|
||||||
|
8nlfnBbkORcam9cE84KuxM9Lgf6hYU0jehepX8sSNDU=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>document.wflow</key>
|
||||||
|
<dict>
|
||||||
|
<key>cdhash</key>
|
||||||
|
<data>
|
||||||
|
DwLo2M9xZ+aZGtMzRCGHhHB/wMY=
|
||||||
|
</data>
|
||||||
|
<key>requirement</key>
|
||||||
|
<string>identifier document and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = V4JSMC46SY</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<key>rules</key>
|
||||||
|
<dict>
|
||||||
|
<key>^Resources/</key>
|
||||||
|
<true/>
|
||||||
|
<key>^Resources/.*\.lproj/</key>
|
||||||
|
<dict>
|
||||||
|
<key>optional</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>1000</real>
|
||||||
|
</dict>
|
||||||
|
<key>^Resources/.*\.lproj/locversion.plist$</key>
|
||||||
|
<dict>
|
||||||
|
<key>omit</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>1100</real>
|
||||||
|
</dict>
|
||||||
|
<key>^Resources/Base\.lproj/</key>
|
||||||
|
<dict>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>1010</real>
|
||||||
|
</dict>
|
||||||
|
<key>^version.plist$</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>rules2</key>
|
||||||
|
<dict>
|
||||||
|
<key>.*\.dSYM($|/)</key>
|
||||||
|
<dict>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>11</real>
|
||||||
|
</dict>
|
||||||
|
<key>^(.*/)?\.DS_Store$</key>
|
||||||
|
<dict>
|
||||||
|
<key>omit</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>2000</real>
|
||||||
|
</dict>
|
||||||
|
<key>^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/</key>
|
||||||
|
<dict>
|
||||||
|
<key>nested</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>10</real>
|
||||||
|
</dict>
|
||||||
|
<key>^.*</key>
|
||||||
|
<true/>
|
||||||
|
<key>^Info\.plist$</key>
|
||||||
|
<dict>
|
||||||
|
<key>omit</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>20</real>
|
||||||
|
</dict>
|
||||||
|
<key>^PkgInfo$</key>
|
||||||
|
<dict>
|
||||||
|
<key>omit</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>20</real>
|
||||||
|
</dict>
|
||||||
|
<key>^Resources/</key>
|
||||||
|
<dict>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>20</real>
|
||||||
|
</dict>
|
||||||
|
<key>^Resources/.*\.lproj/</key>
|
||||||
|
<dict>
|
||||||
|
<key>optional</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>1000</real>
|
||||||
|
</dict>
|
||||||
|
<key>^Resources/.*\.lproj/locversion.plist$</key>
|
||||||
|
<dict>
|
||||||
|
<key>omit</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>1100</real>
|
||||||
|
</dict>
|
||||||
|
<key>^Resources/Base\.lproj/</key>
|
||||||
|
<dict>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>1010</real>
|
||||||
|
</dict>
|
||||||
|
<key>^[^/]+$</key>
|
||||||
|
<dict>
|
||||||
|
<key>nested</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>10</real>
|
||||||
|
</dict>
|
||||||
|
<key>^embedded\.provisionprofile$</key>
|
||||||
|
<dict>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>20</real>
|
||||||
|
</dict>
|
||||||
|
<key>^version\.plist$</key>
|
||||||
|
<dict>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>20</real>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
@@ -0,0 +1,226 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>AMApplicationBuild</key>
|
||||||
|
<string>444.38</string>
|
||||||
|
<key>AMApplicationVersion</key>
|
||||||
|
<string>2.9</string>
|
||||||
|
<key>AMDocumentVersion</key>
|
||||||
|
<string>2</string>
|
||||||
|
<key>actions</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>action</key>
|
||||||
|
<dict>
|
||||||
|
<key>AMAccepts</key>
|
||||||
|
<dict>
|
||||||
|
<key>Container</key>
|
||||||
|
<string>List</string>
|
||||||
|
<key>Optional</key>
|
||||||
|
<true/>
|
||||||
|
<key>Types</key>
|
||||||
|
<array>
|
||||||
|
<string>com.apple.cocoa.string</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<key>AMActionVersion</key>
|
||||||
|
<string>2.0.3</string>
|
||||||
|
<key>AMApplication</key>
|
||||||
|
<array>
|
||||||
|
<string>Automator</string>
|
||||||
|
</array>
|
||||||
|
<key>AMParameterProperties</key>
|
||||||
|
<dict>
|
||||||
|
<key>COMMAND_STRING</key>
|
||||||
|
<dict/>
|
||||||
|
<key>CheckedForUserDefaultShell</key>
|
||||||
|
<dict/>
|
||||||
|
<key>inputMethod</key>
|
||||||
|
<dict/>
|
||||||
|
<key>shell</key>
|
||||||
|
<dict/>
|
||||||
|
<key>source</key>
|
||||||
|
<dict/>
|
||||||
|
</dict>
|
||||||
|
<key>AMProvides</key>
|
||||||
|
<dict>
|
||||||
|
<key>Container</key>
|
||||||
|
<string>List</string>
|
||||||
|
<key>Types</key>
|
||||||
|
<array>
|
||||||
|
<string>com.apple.cocoa.string</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<key>ActionBundlePath</key>
|
||||||
|
<string>/System/Library/Automator/Run Shell Script.action</string>
|
||||||
|
<key>ActionName</key>
|
||||||
|
<string>Run Shell Script</string>
|
||||||
|
<key>ActionParameters</key>
|
||||||
|
<dict>
|
||||||
|
<key>COMMAND_STRING</key>
|
||||||
|
<string>/Applications/Terminus.app/Contents/MacOS/terminus paste --escape "$1"</string>
|
||||||
|
<key>CheckedForUserDefaultShell</key>
|
||||||
|
<true/>
|
||||||
|
<key>inputMethod</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>shell</key>
|
||||||
|
<string>/bin/sh</string>
|
||||||
|
<key>source</key>
|
||||||
|
<string></string>
|
||||||
|
</dict>
|
||||||
|
<key>BundleIdentifier</key>
|
||||||
|
<string>com.apple.RunShellScript</string>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>2.0.3</string>
|
||||||
|
<key>CanShowSelectedItemsWhenRun</key>
|
||||||
|
<false/>
|
||||||
|
<key>CanShowWhenRun</key>
|
||||||
|
<true/>
|
||||||
|
<key>Category</key>
|
||||||
|
<array>
|
||||||
|
<string>AMCategoryUtilities</string>
|
||||||
|
</array>
|
||||||
|
<key>Class Name</key>
|
||||||
|
<string>RunShellScriptAction</string>
|
||||||
|
<key>InputUUID</key>
|
||||||
|
<string>CDBAB8D4-B8B8-4FBB-9115-B4082FB99E1C</string>
|
||||||
|
<key>Keywords</key>
|
||||||
|
<array>
|
||||||
|
<string>Shell</string>
|
||||||
|
<string>Script</string>
|
||||||
|
<string>Command</string>
|
||||||
|
<string>Run</string>
|
||||||
|
<string>Unix</string>
|
||||||
|
</array>
|
||||||
|
<key>OutputUUID</key>
|
||||||
|
<string>96B5890B-A95F-4BF2-8E5A-38E07A849C33</string>
|
||||||
|
<key>UUID</key>
|
||||||
|
<string>62251AFB-502C-4EA0-821C-D9B8CA96E6EE</string>
|
||||||
|
<key>UnlocalizedApplications</key>
|
||||||
|
<array>
|
||||||
|
<string>Automator</string>
|
||||||
|
</array>
|
||||||
|
<key>arguments</key>
|
||||||
|
<dict>
|
||||||
|
<key>0</key>
|
||||||
|
<dict>
|
||||||
|
<key>default value</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>name</key>
|
||||||
|
<string>inputMethod</string>
|
||||||
|
<key>required</key>
|
||||||
|
<string>0</string>
|
||||||
|
<key>type</key>
|
||||||
|
<string>0</string>
|
||||||
|
<key>uuid</key>
|
||||||
|
<string>0</string>
|
||||||
|
</dict>
|
||||||
|
<key>1</key>
|
||||||
|
<dict>
|
||||||
|
<key>default value</key>
|
||||||
|
<string></string>
|
||||||
|
<key>name</key>
|
||||||
|
<string>source</string>
|
||||||
|
<key>required</key>
|
||||||
|
<string>0</string>
|
||||||
|
<key>type</key>
|
||||||
|
<string>0</string>
|
||||||
|
<key>uuid</key>
|
||||||
|
<string>1</string>
|
||||||
|
</dict>
|
||||||
|
<key>2</key>
|
||||||
|
<dict>
|
||||||
|
<key>default value</key>
|
||||||
|
<false/>
|
||||||
|
<key>name</key>
|
||||||
|
<string>CheckedForUserDefaultShell</string>
|
||||||
|
<key>required</key>
|
||||||
|
<string>0</string>
|
||||||
|
<key>type</key>
|
||||||
|
<string>0</string>
|
||||||
|
<key>uuid</key>
|
||||||
|
<string>2</string>
|
||||||
|
</dict>
|
||||||
|
<key>3</key>
|
||||||
|
<dict>
|
||||||
|
<key>default value</key>
|
||||||
|
<string></string>
|
||||||
|
<key>name</key>
|
||||||
|
<string>COMMAND_STRING</string>
|
||||||
|
<key>required</key>
|
||||||
|
<string>0</string>
|
||||||
|
<key>type</key>
|
||||||
|
<string>0</string>
|
||||||
|
<key>uuid</key>
|
||||||
|
<string>3</string>
|
||||||
|
</dict>
|
||||||
|
<key>4</key>
|
||||||
|
<dict>
|
||||||
|
<key>default value</key>
|
||||||
|
<string>/bin/sh</string>
|
||||||
|
<key>name</key>
|
||||||
|
<string>shell</string>
|
||||||
|
<key>required</key>
|
||||||
|
<string>0</string>
|
||||||
|
<key>type</key>
|
||||||
|
<string>0</string>
|
||||||
|
<key>uuid</key>
|
||||||
|
<string>4</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<key>isViewVisible</key>
|
||||||
|
<true/>
|
||||||
|
<key>location</key>
|
||||||
|
<string>529.000000:305.000000</string>
|
||||||
|
<key>nibPath</key>
|
||||||
|
<string>/System/Library/Automator/Run Shell Script.action/Contents/Resources/Base.lproj/main.nib</string>
|
||||||
|
</dict>
|
||||||
|
<key>isViewVisible</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>connectors</key>
|
||||||
|
<dict/>
|
||||||
|
<key>workflowMetaData</key>
|
||||||
|
<dict>
|
||||||
|
<key>applicationBundleID</key>
|
||||||
|
<string>com.apple.finder</string>
|
||||||
|
<key>applicationBundleIDsByPath</key>
|
||||||
|
<dict>
|
||||||
|
<key>/System/Library/CoreServices/Finder.app</key>
|
||||||
|
<string>com.apple.finder</string>
|
||||||
|
</dict>
|
||||||
|
<key>applicationPath</key>
|
||||||
|
<string>/System/Library/CoreServices/Finder.app</string>
|
||||||
|
<key>applicationPaths</key>
|
||||||
|
<array>
|
||||||
|
<string>/System/Library/CoreServices/Finder.app</string>
|
||||||
|
</array>
|
||||||
|
<key>inputTypeIdentifier</key>
|
||||||
|
<string>com.apple.Automator.fileSystemObject</string>
|
||||||
|
<key>outputTypeIdentifier</key>
|
||||||
|
<string>com.apple.Automator.nothing</string>
|
||||||
|
<key>presentationMode</key>
|
||||||
|
<integer>15</integer>
|
||||||
|
<key>processesInput</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>serviceApplicationBundleID</key>
|
||||||
|
<string>com.apple.finder</string>
|
||||||
|
<key>serviceApplicationPath</key>
|
||||||
|
<string>/System/Library/CoreServices/Finder.app</string>
|
||||||
|
<key>serviceInputTypeIdentifier</key>
|
||||||
|
<string>com.apple.Automator.fileSystemObject</string>
|
||||||
|
<key>serviceOutputTypeIdentifier</key>
|
||||||
|
<string>com.apple.Automator.nothing</string>
|
||||||
|
<key>serviceProcessesInput</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>systemImageName</key>
|
||||||
|
<string>NSActionTemplate</string>
|
||||||
|
<key>useAutomaticInputType</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>workflowTypeIdentifier</key>
|
||||||
|
<string>com.apple.Automator.servicesMenu</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
@@ -1,6 +1,10 @@
|
|||||||
|
|
||||||
### Changes
|
### Changes
|
||||||
|
|
||||||
|
##### v0.4.9
|
||||||
|
|
||||||
|
- Fixed broken Doskey on Win10 (#438, #451)
|
||||||
|
|
||||||
##### v0.4.8
|
##### v0.4.8
|
||||||
|
|
||||||
- Environment variable 'clink_profile' overrides Clink's profile path (#390).
|
- Environment variable 'clink_profile' overrides Clink's profile path (#390).
|
@@ -136,7 +136,7 @@ h6 { font-size: 1.00em; }
|
|||||||
<!-- ----------------------------------------------------- -->
|
<!-- ----------------------------------------------------- -->
|
||||||
<body onload="go();">
|
<body onload="go();">
|
||||||
<div id="header">
|
<div id="header">
|
||||||
<div id="title">Clink v0.4.8</div>
|
<div id="title">Clink v0.4.9</div>
|
||||||
<div id="url">
|
<div id="url">
|
||||||
<a href="http://github.com/mridgers/clink">
|
<a href="http://github.com/mridgers/clink">
|
||||||
http://github.com/mridgers/clink
|
http://github.com/mridgers/clink
|
||||||
@@ -697,6 +697,10 @@ The current cursor position within the line buffer.
|
|||||||
|
|
||||||
### Changes
|
### Changes
|
||||||
|
|
||||||
|
##### v0.4.9
|
||||||
|
|
||||||
|
- Fixed broken Doskey on Win10 (#438, #451)
|
||||||
|
|
||||||
##### v0.4.8
|
##### v0.4.8
|
||||||
|
|
||||||
- Environment variable 'clink_profile' overrides Clink's profile path (#390).
|
- Environment variable 'clink_profile' overrides Clink's profile path (#390).
|
BIN
extras/clink/clink_x64.exe
Normal file
BIN
extras/clink/clink_x86.exe
Normal file
46
package.json
@@ -1,18 +1,32 @@
|
|||||||
{
|
{
|
||||||
"name": "term",
|
"name": "term",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@types/electron-config": "^0.2.1",
|
||||||
|
"@types/electron-debug": "^1.1.0",
|
||||||
"@types/fs-promise": "1.0.1",
|
"@types/fs-promise": "1.0.1",
|
||||||
|
"@types/js-yaml": "^3.11.2",
|
||||||
"@types/node": "7.0.5",
|
"@types/node": "7.0.5",
|
||||||
"@types/webpack-env": "1.13.0",
|
"@types/webpack-env": "1.13.0",
|
||||||
"apply-loader": "0.1.0",
|
"apply-loader": "0.1.0",
|
||||||
"awesome-typescript-loader": "^5.0.0",
|
"awesome-typescript-loader": "^5.0.0",
|
||||||
|
"babel-core": "^6.26.3",
|
||||||
|
"babel-eslint": "^8.2.6",
|
||||||
|
"babel-loader": "^7.1.5",
|
||||||
|
"babel-preset-es2015": "^6.24.1",
|
||||||
"core-js": "2.4.1",
|
"core-js": "2.4.1",
|
||||||
"cross-env": "4.0.0",
|
"cross-env": "4.0.0",
|
||||||
"css-loader": "0.28.0",
|
"css-loader": "0.28.0",
|
||||||
"electron": "2.0.0",
|
"electron": "3.0.0",
|
||||||
"electron-builder": "^20.27.1",
|
"electron-builder": "^20.27.1",
|
||||||
"electron-builder-squirrel-windows": "17.0.1",
|
"electron-builder-squirrel-windows": "17.0.1",
|
||||||
|
"electron-installer-snap": "^3.0.0",
|
||||||
"electron-rebuild": "^1.8.2",
|
"electron-rebuild": "^1.8.2",
|
||||||
|
"eslint": "^5.4.0",
|
||||||
|
"eslint-config-standard": "^11.0.0",
|
||||||
|
"eslint-plugin-import": "^2.14.0",
|
||||||
|
"eslint-plugin-node": "^7.0.1",
|
||||||
|
"eslint-plugin-promise": "^4.0.0",
|
||||||
|
"eslint-plugin-standard": "^3.1.0",
|
||||||
"file-loader": "^1.1.11",
|
"file-loader": "^1.1.11",
|
||||||
"font-awesome": "4.7.0",
|
"font-awesome": "4.7.0",
|
||||||
"graceful-fs": "^4.1.11",
|
"graceful-fs": "^4.1.11",
|
||||||
@@ -20,7 +34,7 @@
|
|||||||
"json-loader": "0.5.4",
|
"json-loader": "0.5.4",
|
||||||
"less": "2.7.1",
|
"less": "2.7.1",
|
||||||
"less-loader": "2.2.3",
|
"less-loader": "2.2.3",
|
||||||
"node-abi": "^2.4.1",
|
"node-abi": "^2.4.4",
|
||||||
"node-gyp": "^3.6.2",
|
"node-gyp": "^3.6.2",
|
||||||
"node-sass": "^4.5.3",
|
"node-sass": "^4.5.3",
|
||||||
"npmlog": "4.1.0",
|
"npmlog": "4.1.0",
|
||||||
@@ -53,24 +67,31 @@
|
|||||||
"appId": "org.terminus",
|
"appId": "org.terminus",
|
||||||
"productName": "Terminus",
|
"productName": "Terminus",
|
||||||
"compression": "normal",
|
"compression": "normal",
|
||||||
|
"files": [
|
||||||
|
"**/*",
|
||||||
|
"dist"
|
||||||
|
],
|
||||||
"extraResources": [
|
"extraResources": [
|
||||||
"builtin-plugins",
|
"builtin-plugins",
|
||||||
"clink"
|
"extras"
|
||||||
],
|
],
|
||||||
"win": {
|
"win": {
|
||||||
"icon": "./build/windows/icon.ico",
|
"icon": "./build/windows/icon.ico",
|
||||||
"publish": [
|
"publish": [
|
||||||
"github"
|
"github"
|
||||||
]
|
],
|
||||||
|
"artifactName": "terminus-${version}-setup.exe"
|
||||||
},
|
},
|
||||||
"squirrelWindows": {
|
"squirrelWindows": {
|
||||||
"iconUrl": "https://github.com/Eugeny/terminus/raw/master/build/windows/icon.ico",
|
"iconUrl": "https://github.com/Eugeny/terminus/raw/master/build/windows/icon.ico",
|
||||||
"artifactName": "terminus-${version}-${os}-${arch}.exe"
|
"artifactName": "terminus-${version}-setup.exe"
|
||||||
|
},
|
||||||
|
"portable": {
|
||||||
|
"artifactName": "terminus-${version}-portable.exe"
|
||||||
},
|
},
|
||||||
"mac": {
|
"mac": {
|
||||||
"category": "public.app-category.video",
|
"category": "public.app-category.video",
|
||||||
"icon": "./build/mac/icon.icns",
|
"icon": "./build/mac/icon.icns",
|
||||||
"identity": null,
|
|
||||||
"publish": [
|
"publish": [
|
||||||
"github"
|
"github"
|
||||||
],
|
],
|
||||||
@@ -79,11 +100,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dmg": {
|
"dmg": {
|
||||||
"artifactName": "terminus-${version}-${os}-${arch}.dmg"
|
"artifactName": "terminus-${version}-macos.dmg"
|
||||||
},
|
},
|
||||||
"linux": {
|
"linux": {
|
||||||
"category": "Utilities",
|
"category": "Utilities",
|
||||||
"icon": "./build/icons",
|
"icon": "./build/icons",
|
||||||
|
"artifactName": "terminus-${version}-linux.${ext}",
|
||||||
"publish": [
|
"publish": [
|
||||||
"github"
|
"github"
|
||||||
]
|
]
|
||||||
@@ -98,20 +120,18 @@
|
|||||||
"libxtst6",
|
"libxtst6",
|
||||||
"libnss3",
|
"libnss3",
|
||||||
"tmux"
|
"tmux"
|
||||||
],
|
]
|
||||||
"artifactName": "terminus-${version}-${os}-${arch}.deb"
|
|
||||||
},
|
},
|
||||||
"rpm": {
|
"rpm": {
|
||||||
"depends": [
|
"depends": [
|
||||||
"screen",
|
"screen",
|
||||||
"gnome-python2-gnomekeyring"
|
"gnome-python2-gnomekeyring"
|
||||||
],
|
]
|
||||||
"artifactName": "terminus-${version}-${os}-${arch}.rpm"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "webpack --color --config app/webpack.config.js && webpack --color --config terminus-core/webpack.config.js && webpack --color --config terminus-settings/webpack.config.js && webpack --color --config terminus-terminal/webpack.config.js && webpack --color --config terminus-settings/webpack.config.js && webpack --color --config terminus-plugin-manager/webpack.config.js && webpack --color --config terminus-community-color-schemes/webpack.config.js && webpack --color --config terminus-ssh/webpack.config.js",
|
"build": "webpack --color --config app/webpack.main.config.js && webpack --color --config app/webpack.config.js && webpack --color --config terminus-core/webpack.config.js && webpack --color --config terminus-settings/webpack.config.js && webpack --color --config terminus-terminal/webpack.config.js && webpack --color --config terminus-settings/webpack.config.js && webpack --color --config terminus-plugin-manager/webpack.config.js && webpack --color --config terminus-community-color-schemes/webpack.config.js && webpack --color --config terminus-ssh/webpack.config.js",
|
||||||
"watch": "webpack --progress --color --watch",
|
"watch": "cross-env DEV=1 webpack --progress --color --watch",
|
||||||
"start": "cross-env DEV=1 electron app --debug",
|
"start": "cross-env DEV=1 electron app --debug",
|
||||||
"prod": "cross-env DEV=1 electron app",
|
"prod": "cross-env DEV=1 electron app",
|
||||||
"lint": "tslint -c tslint.json -t stylish terminus-*/src/**/*.ts terminus-*/src/*.ts app/src/*.ts",
|
"lint": "tslint -c tslint.json -t stylish terminus-*/src/**/*.ts terminus-*/src/*.ts app/src/*.ts",
|
||||||
|
@@ -4,7 +4,7 @@ const vars = require('./vars')
|
|||||||
|
|
||||||
builder({
|
builder({
|
||||||
dir: true,
|
dir: true,
|
||||||
linux: ['deb', 'rpm', 'tar.gz'],
|
linux: ['snap', 'deb', 'rpm', 'tar.gz'],
|
||||||
config: {
|
config: {
|
||||||
extraMetadata: {
|
extraMetadata: {
|
||||||
version: vars.version,
|
version: vars.version,
|
||||||
|
@@ -4,7 +4,7 @@ const vars = require('./vars')
|
|||||||
|
|
||||||
builder({
|
builder({
|
||||||
dir: true,
|
dir: true,
|
||||||
win: ['squirrel'],
|
win: ['squirrel', 'portable'],
|
||||||
config: {
|
config: {
|
||||||
extraMetadata: {
|
extraMetadata: {
|
||||||
version: vars.version,
|
version: vars.version,
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "terminus-community-color-schemes",
|
"name": "terminus-community-color-schemes",
|
||||||
"version": "1.0.0-alpha.48",
|
"version": "1.0.0-alpha.55",
|
||||||
"description": "Community color schemes for Terminus",
|
"description": "Community color schemes for Terminus",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"terminus-builtin-plugin"
|
"terminus-builtin-plugin"
|
||||||
|
@@ -13,6 +13,7 @@ module.exports = {
|
|||||||
libraryTarget: 'umd',
|
libraryTarget: 'umd',
|
||||||
devtoolModuleFilenameTemplate: 'webpack-terminus-community-color-schemes:///[resource-path]',
|
devtoolModuleFilenameTemplate: 'webpack-terminus-community-color-schemes:///[resource-path]',
|
||||||
},
|
},
|
||||||
|
mode: process.env.DEV ? 'development' : 'production',
|
||||||
resolve: {
|
resolve: {
|
||||||
modules: ['.', 'src', 'node_modules', '../app/node_modules'].map(x => path.join(__dirname, x)),
|
modules: ['.', 'src', 'node_modules', '../app/node_modules'].map(x => path.join(__dirname, x)),
|
||||||
extensions: ['.ts', '.js'],
|
extensions: ['.ts', '.js'],
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "terminus-core",
|
"name": "terminus-core",
|
||||||
"version": "1.0.0-alpha.48",
|
"version": "1.0.0-alpha.55",
|
||||||
"description": "Terminus core",
|
"description": "Terminus core",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"terminus-builtin-plugin"
|
"terminus-builtin-plugin"
|
||||||
@@ -22,11 +22,13 @@
|
|||||||
"@types/webpack-env": "^1.13.0",
|
"@types/webpack-env": "^1.13.0",
|
||||||
"@types/winston": "^2.3.6",
|
"@types/winston": "^2.3.6",
|
||||||
"axios": "0.16.2",
|
"axios": "0.16.2",
|
||||||
"bootstrap": "4.0.0-alpha.6",
|
"bootstrap": "^4.1.3",
|
||||||
"core-js": "^2.4.1",
|
"core-js": "^2.4.1",
|
||||||
"electron-updater": "^2.8.9",
|
"electron-updater": "^2.8.9",
|
||||||
"ng2-dnd": "^5.0.2",
|
"ng2-dnd": "^5.0.2",
|
||||||
"ngx-perfect-scrollbar": "^6.0.0"
|
"ngx-perfect-scrollbar": "^6.0.0",
|
||||||
|
"shell-escape": "^0.2.0",
|
||||||
|
"universal-analytics": "^0.4.17"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@angular/animations": "4.0.1",
|
"@angular/animations": "4.0.1",
|
||||||
@@ -41,6 +43,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"deepmerge": "^1.5.0",
|
"deepmerge": "^1.5.0",
|
||||||
"js-yaml": "^3.9.0",
|
"js-yaml": "^3.9.0",
|
||||||
|
"winreg": "^1.2.4",
|
||||||
"winston": "^2.4.0"
|
"winston": "^2.4.0"
|
||||||
},
|
},
|
||||||
"false": {}
|
"false": {}
|
||||||
|
@@ -1,3 +0,0 @@
|
|||||||
export abstract class DefaultTabProvider {
|
|
||||||
abstract async openNewTab (): Promise<void>
|
|
||||||
}
|
|
@@ -3,7 +3,6 @@ export { TabRecoveryProvider, RecoveredTab } from './tabRecovery'
|
|||||||
export { ToolbarButtonProvider, IToolbarButton } from './toolbarButtonProvider'
|
export { ToolbarButtonProvider, IToolbarButton } from './toolbarButtonProvider'
|
||||||
export { ConfigProvider } from './configProvider'
|
export { ConfigProvider } from './configProvider'
|
||||||
export { HotkeyProvider, IHotkeyDescription } from './hotkeyProvider'
|
export { HotkeyProvider, IHotkeyDescription } from './hotkeyProvider'
|
||||||
export { DefaultTabProvider } from './defaultTabProvider'
|
|
||||||
export { Theme } from './theme'
|
export { Theme } from './theme'
|
||||||
|
|
||||||
export { AppService } from '../services/app.service'
|
export { AppService } from '../services/app.service'
|
||||||
@@ -11,6 +10,8 @@ export { ConfigService } from '../services/config.service'
|
|||||||
export { DockingService } from '../services/docking.service'
|
export { DockingService } from '../services/docking.service'
|
||||||
export { ElectronService } from '../services/electron.service'
|
export { ElectronService } from '../services/electron.service'
|
||||||
export { Logger, LogService } from '../services/log.service'
|
export { Logger, LogService } from '../services/log.service'
|
||||||
|
export { HomeBaseService } from '../services/homeBase.service'
|
||||||
export { HotkeysService } from '../services/hotkeys.service'
|
export { HotkeysService } from '../services/hotkeys.service'
|
||||||
export { HostAppService, Platform } from '../services/hostApp.service'
|
export { HostAppService, Platform } from '../services/hostApp.service'
|
||||||
|
export { ShellIntegrationService } from '../services/shellIntegration.service'
|
||||||
export { ThemesService } from '../services/themes.service'
|
export { ThemesService } from '../services/themes.service'
|
||||||
|
@@ -2,6 +2,7 @@ import { SafeHtml } from '@angular/platform-browser'
|
|||||||
|
|
||||||
export interface IToolbarButton {
|
export interface IToolbarButton {
|
||||||
icon: SafeHtml
|
icon: SafeHtml
|
||||||
|
touchBarNSImage?: string
|
||||||
title: string
|
title: string
|
||||||
touchBarTitle?: string
|
touchBarTitle?: string
|
||||||
weight?: number
|
weight?: number
|
||||||
|
@@ -24,7 +24,7 @@ title-bar(
|
|||||||
[index]='idx',
|
[index]='idx',
|
||||||
[tab]='tab',
|
[tab]='tab',
|
||||||
[active]='tab == app.activeTab',
|
[active]='tab == app.activeTab',
|
||||||
[hasActivity]='tab.hasActivity',
|
[hasActivity]='tab.activity$|async',
|
||||||
@animateTab,
|
@animateTab,
|
||||||
(click)='app.selectTab(tab)',
|
(click)='app.selectTab(tab)',
|
||||||
[class.fully-draggable]='hostApp.platform != Platform.macOS',
|
[class.fully-draggable]='hostApp.platform != Platform.macOS',
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
height: 100vh;
|
height: 100vh;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
-webkit-user-select: none;
|
user-select: none;
|
||||||
-webkit-user-drag: none;
|
-webkit-user-drag: none;
|
||||||
-webkit-font-smoothing: antialiased;
|
-webkit-font-smoothing: antialiased;
|
||||||
will-change: transform;
|
will-change: transform;
|
||||||
|
@@ -138,33 +138,43 @@ export class AppRootComponent {
|
|||||||
config.changed$.subscribe(() => this.updateVibrancy())
|
config.changed$.subscribe(() => this.updateVibrancy())
|
||||||
this.updateVibrancy()
|
this.updateVibrancy()
|
||||||
|
|
||||||
this.app.tabOpened$.subscribe(tab => this.unsortedTabs.push(tab))
|
this.app.tabOpened$.subscribe(tab => {
|
||||||
|
this.unsortedTabs.push(tab)
|
||||||
|
tab.progress$.subscribe(progress => {
|
||||||
|
if (progress !== null) {
|
||||||
|
this.hostApp.getWindow().setProgressBar(progress / 100.0, { mode: 'normal' })
|
||||||
|
} else {
|
||||||
|
this.hostApp.getWindow().setProgressBar(-1, { mode: 'none' })
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
this.app.tabClosed$.subscribe(tab => {
|
this.app.tabClosed$.subscribe(tab => {
|
||||||
this.unsortedTabs = this.unsortedTabs.filter(x => x !== tab)
|
this.unsortedTabs = this.unsortedTabs.filter(x => x !== tab)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
onGlobalHotkey () {
|
onGlobalHotkey () {
|
||||||
if (this.electron.app.window.isFocused()) {
|
if (this.hostApp.getWindow().isFocused()) {
|
||||||
// focused
|
// focused
|
||||||
this.electron.loseFocus()
|
this.electron.loseFocus()
|
||||||
|
this.hostApp.getWindow().blur()
|
||||||
if (this.hostApp.platform !== Platform.macOS) {
|
if (this.hostApp.platform !== Platform.macOS) {
|
||||||
this.electron.app.window.hide()
|
this.hostApp.getWindow().hide()
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!this.electron.app.window.isVisible()) {
|
if (!this.hostApp.getWindow().isVisible()) {
|
||||||
// unfocused, invisible
|
// unfocused, invisible
|
||||||
this.electron.app.window.show()
|
this.hostApp.getWindow().show()
|
||||||
this.electron.app.window.focus()
|
this.hostApp.getWindow().focus()
|
||||||
} else {
|
} else {
|
||||||
if (this.config.store.appearance.dock === 'off') {
|
if (this.config.store.appearance.dock === 'off') {
|
||||||
// not docked, visible
|
// not docked, visible
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
this.electron.app.window.focus()
|
this.hostApp.getWindow().focus()
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
// docked, visible
|
// docked, visible
|
||||||
this.electron.app.window.hide()
|
this.hostApp.getWindow().hide()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -175,10 +185,6 @@ export class AppRootComponent {
|
|||||||
this.ready = true
|
this.ready = true
|
||||||
this.tabRecovery.saveTabs(this.app.tabs)
|
this.tabRecovery.saveTabs(this.app.tabs)
|
||||||
|
|
||||||
if (this.app.tabs.length === 0) {
|
|
||||||
this.app.openDefaultTab()
|
|
||||||
}
|
|
||||||
|
|
||||||
this.app.emitReady()
|
this.app.emitReady()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -6,16 +6,22 @@ export abstract class BaseTabComponent {
|
|||||||
id: number
|
id: number
|
||||||
title: string
|
title: string
|
||||||
customTitle: string
|
customTitle: string
|
||||||
hasActivity = false
|
|
||||||
hasFocus = false
|
hasFocus = false
|
||||||
|
hasActivity = false
|
||||||
hostView: ViewRef
|
hostView: ViewRef
|
||||||
protected titleChange = new Subject<string>()
|
protected titleChange = new Subject<string>()
|
||||||
protected focused = new Subject<void>()
|
protected focused = new Subject<void>()
|
||||||
protected blurred = new Subject<void>()
|
protected blurred = new Subject<void>()
|
||||||
|
protected progress = new Subject<number>()
|
||||||
|
protected activity = new Subject<boolean>()
|
||||||
|
|
||||||
|
private progressClearTimeout: number
|
||||||
|
|
||||||
get focused$ (): Observable<void> { return this.focused }
|
get focused$ (): Observable<void> { return this.focused }
|
||||||
get blurred$ (): Observable<void> { return this.blurred }
|
get blurred$ (): Observable<void> { return this.blurred }
|
||||||
get titleChange$ (): Observable<string> { return this.titleChange }
|
get titleChange$ (): Observable<string> { return this.titleChange }
|
||||||
|
get progress$ (): Observable<number> { return this.progress }
|
||||||
|
get activity$ (): Observable<boolean> { return this.activity }
|
||||||
|
|
||||||
constructor () {
|
constructor () {
|
||||||
this.id = BaseTabComponent.lastTabID++
|
this.id = BaseTabComponent.lastTabID++
|
||||||
@@ -34,8 +40,26 @@ export abstract class BaseTabComponent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setProgress (progress: number) {
|
||||||
|
this.progress.next(progress)
|
||||||
|
if (progress) {
|
||||||
|
if (this.progressClearTimeout) {
|
||||||
|
clearTimeout(this.progressClearTimeout)
|
||||||
|
}
|
||||||
|
this.progressClearTimeout = setTimeout(() => {
|
||||||
|
this.setProgress(null)
|
||||||
|
}, 5000)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
displayActivity (): void {
|
displayActivity (): void {
|
||||||
this.hasActivity = true
|
this.hasActivity = true
|
||||||
|
this.activity.next(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
clearActivity (): void {
|
||||||
|
this.hasActivity = false
|
||||||
|
this.activity.next(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
getRecoveryToken (): any {
|
getRecoveryToken (): any {
|
||||||
@@ -58,5 +82,6 @@ export abstract class BaseTabComponent {
|
|||||||
this.focused.complete()
|
this.focused.complete()
|
||||||
this.blurred.complete()
|
this.blurred.complete()
|
||||||
this.titleChange.complete()
|
this.titleChange.complete()
|
||||||
|
this.progress.complete()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
.icon((click)='click()', tabindex='0', [class.active]='model', (keyup.space)='click()')
|
.icon(tabindex='0', [class.active]='model', (keyup.space)='click()')
|
||||||
i.fa.fa-square-o.off
|
i.fa.fa-square-o.off
|
||||||
i.fa.fa-check-square.on
|
i.fa.fa-check-square.on
|
||||||
.text((click)='click()') {{text}}
|
.text {{text}}
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { NgZone, Component, Input } from '@angular/core'
|
import { NgZone, Component, Input, HostBinding, HostListener } from '@angular/core'
|
||||||
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'
|
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
@@ -10,12 +10,12 @@ import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'
|
|||||||
]
|
]
|
||||||
})
|
})
|
||||||
export class CheckboxComponent implements ControlValueAccessor {
|
export class CheckboxComponent implements ControlValueAccessor {
|
||||||
@Input() model: boolean
|
@HostBinding('class.active') @Input() model: boolean
|
||||||
@Input() disabled: boolean
|
@Input() disabled: boolean
|
||||||
@Input() text: string
|
@Input() text: string
|
||||||
private changed = new Array<(val: boolean) => void>()
|
private changed = new Array<(val: boolean) => void>()
|
||||||
|
|
||||||
click () {
|
@HostListener('click') click () {
|
||||||
NgZone.assertInAngularZone()
|
NgZone.assertInAngularZone()
|
||||||
if (this.disabled) {
|
if (this.disabled) {
|
||||||
return
|
return
|
||||||
|
@@ -4,21 +4,20 @@ div
|
|||||||
sup α
|
sup α
|
||||||
|
|
||||||
.list-group
|
.list-group
|
||||||
a.list-group-item.list-group-item-action(
|
a.list-group-item.list-group-item-action.d-flex(
|
||||||
*ngFor='let button of getButtons()',
|
*ngFor='let button of getButtons()',
|
||||||
(click)='button.click()',
|
(click)='button.click()',
|
||||||
)
|
)
|
||||||
.d-flex.align-self-center([innerHTML]='button.icon')
|
.d-flex.align-self-center([innerHTML]='button.icon')
|
||||||
span {{button.title}}
|
span {{button.title}}
|
||||||
|
|
||||||
footer
|
footer.d-flex.align-items-center
|
||||||
.pull-right
|
.btn-group.mr-auto
|
||||||
.form-control-static Version: {{version}}
|
button.btn.btn-secondary((click)='homeBase.openGitHub()')
|
||||||
|
|
||||||
.btn-group
|
|
||||||
button.btn.btn-secondary((click)='openGitHub()')
|
|
||||||
i.fa.fa-github
|
i.fa.fa-github
|
||||||
span GitHub
|
span GitHub
|
||||||
button.btn.btn-secondary((click)='reportBug()')
|
button.btn.btn-secondary((click)='homeBase.reportBug()')
|
||||||
i.fa.fa-bug
|
i.fa.fa-bug
|
||||||
span Report a problem
|
span Report a problem
|
||||||
|
|
||||||
|
.form-control-static.selectable.no-drag Version: {{homeBase.appVersion}}
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
flex: auto;
|
flex: auto;
|
||||||
-webkit-app-region: drag;
|
-webkit-app-region: drag;
|
||||||
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
:host > div {
|
:host > div {
|
||||||
@@ -32,6 +33,4 @@ a, button {
|
|||||||
width: 16px;
|
width: 16px;
|
||||||
height: 16px;
|
height: 16px;
|
||||||
margin-right: 10px;
|
margin-right: 10px;
|
||||||
fill: white;
|
|
||||||
fill-opacity: 0.75;
|
|
||||||
}
|
}
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
import * as os from 'os'
|
|
||||||
import { Component, Inject } from '@angular/core'
|
import { Component, Inject } from '@angular/core'
|
||||||
import { ElectronService } from '../services/electron.service'
|
|
||||||
import { ConfigService } from '../services/config.service'
|
import { ConfigService } from '../services/config.service'
|
||||||
|
import { HomeBaseService } from '../services/homeBase.service'
|
||||||
import { IToolbarButton, ToolbarButtonProvider } from '../api'
|
import { IToolbarButton, ToolbarButtonProvider } from '../api'
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
@@ -13,11 +12,10 @@ export class StartPageComponent {
|
|||||||
version: string
|
version: string
|
||||||
|
|
||||||
constructor (
|
constructor (
|
||||||
private electron: ElectronService,
|
|
||||||
private config: ConfigService,
|
private config: ConfigService,
|
||||||
|
public homeBase: HomeBaseService,
|
||||||
@Inject(ToolbarButtonProvider) private toolbarButtonProviders: ToolbarButtonProvider[],
|
@Inject(ToolbarButtonProvider) private toolbarButtonProviders: ToolbarButtonProvider[],
|
||||||
) {
|
) {
|
||||||
this.version = electron.app.getVersion()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getButtons (): IToolbarButton[] {
|
getButtons (): IToolbarButton[] {
|
||||||
@@ -26,19 +24,4 @@ export class StartPageComponent {
|
|||||||
.reduce((a, b) => a.concat(b))
|
.reduce((a, b) => a.concat(b))
|
||||||
.sort((a: IToolbarButton, b: IToolbarButton) => (a.weight || 0) - (b.weight || 0))
|
.sort((a: IToolbarButton, b: IToolbarButton) => (a.weight || 0) - (b.weight || 0))
|
||||||
}
|
}
|
||||||
|
|
||||||
openGitHub () {
|
|
||||||
this.electron.shell.openExternal('https://github.com/eugeny/terminus')
|
|
||||||
}
|
|
||||||
|
|
||||||
reportBug () {
|
|
||||||
let body = `Version: ${this.version}\n`
|
|
||||||
body += `Platform: ${os.platform()} ${os.release()}\n\n`
|
|
||||||
let label = {
|
|
||||||
darwin: 'macOS',
|
|
||||||
windows: 'Windows',
|
|
||||||
linux: 'Linux',
|
|
||||||
}[os.platform()]
|
|
||||||
this.electron.shell.openExternal(`https://github.com/eugeny/terminus/issues/new?body=${encodeURIComponent(body)}&labels=${label}`)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
.progressbar([style.width]='progress + "%"', *ngIf='progress != null')
|
||||||
.index(#handle) {{index + 1}}
|
.index(#handle) {{index + 1}}
|
||||||
.name([title]='tab.customTitle || tab.title') {{tab.customTitle || tab.title}}
|
.name([title]='tab.customTitle || tab.title') {{tab.customTitle || tab.title}}
|
||||||
button((click)='app.closeTab(tab, true)') ×
|
button((click)='app.closeTab(tab, true)') ×
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
$tabs-height: 36px;
|
$tabs-height: 36px;
|
||||||
|
|
||||||
:host {
|
:host {
|
||||||
|
position: relative;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
|
||||||
flex: 1000 1 200px;
|
flex: 1000 1 200px;
|
||||||
@@ -12,13 +13,11 @@ $tabs-height: 36px;
|
|||||||
|
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
||||||
transition: 0.125s ease-out all;
|
|
||||||
|
|
||||||
.index {
|
.index {
|
||||||
flex: none;
|
flex: none;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
-webkit-app-region: no-drag;
|
-webkit-app-region: no-drag;
|
||||||
cursor: grab;
|
cursor: -webkit-grab;
|
||||||
|
|
||||||
margin-left: 10px;
|
margin-left: 10px;
|
||||||
width: 20px;
|
width: 20px;
|
||||||
@@ -43,12 +42,13 @@ $tabs-height: 36px;
|
|||||||
flex: none;
|
flex: none;
|
||||||
background: transparent;
|
background: transparent;
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
|
-webkit-app-region: no-drag;
|
||||||
|
|
||||||
$button-size: 23px;
|
$button-size: 26px;
|
||||||
width: $button-size;
|
width: $button-size;
|
||||||
height: $button-size;
|
height: $button-size;
|
||||||
border-radius: $button-size / 2;
|
border-radius: $button-size / 2;
|
||||||
line-height: $button-size * 0.87;
|
line-height: $button-size * 0.9;
|
||||||
align-self: center;
|
align-self: center;
|
||||||
margin-right: 10px;
|
margin-right: 10px;
|
||||||
|
|
||||||
@@ -71,6 +71,15 @@ $tabs-height: 36px;
|
|||||||
}
|
}
|
||||||
|
|
||||||
&.fully-draggable {
|
&.fully-draggable {
|
||||||
cursor: grab;
|
cursor: -webkit-grab;
|
||||||
|
}
|
||||||
|
|
||||||
|
.progressbar {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
height: 5px;
|
||||||
|
z-index: -1;
|
||||||
|
transition: 0.25s width;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -17,7 +17,9 @@ export class TabHeaderComponent {
|
|||||||
@Input() @HostBinding('class.active') active: boolean
|
@Input() @HostBinding('class.active') active: boolean
|
||||||
@Input() @HostBinding('class.has-activity') hasActivity: boolean
|
@Input() @HostBinding('class.has-activity') hasActivity: boolean
|
||||||
@Input() tab: BaseTabComponent
|
@Input() tab: BaseTabComponent
|
||||||
|
@Input() progress: number
|
||||||
@ViewChild('handle') handle: ElementRef
|
@ViewChild('handle') handle: ElementRef
|
||||||
|
|
||||||
private contextMenu: any
|
private contextMenu: any
|
||||||
|
|
||||||
constructor (
|
constructor (
|
||||||
@@ -71,9 +73,12 @@ export class TabHeaderComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit () {
|
ngOnInit () {
|
||||||
if (this.hostApp.platform !== Platform.macOS) {
|
if (this.hostApp.platform === Platform.macOS) {
|
||||||
this.parentDraggable.setDragHandle(this.handle.nativeElement)
|
this.parentDraggable.setDragHandle(this.handle.nativeElement)
|
||||||
}
|
}
|
||||||
|
this.tab.progress$.subscribe(progress => {
|
||||||
|
this.progress = progress
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@HostListener('dblclick') onDoubleClick (): void {
|
@HostListener('dblclick') onDoubleClick (): void {
|
||||||
|
70
terminus-core/src/components/toggle.component.scss
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
:host {
|
||||||
|
flex: none;
|
||||||
|
$toggle-size: 18px;
|
||||||
|
$height: 30px;
|
||||||
|
$padding: 2px;
|
||||||
|
cursor: pointer;
|
||||||
|
display: inline-flex;
|
||||||
|
overflow: visible;
|
||||||
|
border-radius: 3px;
|
||||||
|
line-height: $height;
|
||||||
|
height: $height;
|
||||||
|
transition: 0.25s opacity;
|
||||||
|
align-items: center;
|
||||||
|
overflow: hidden;
|
||||||
|
padding-right: 10px;
|
||||||
|
padding-left: 10px;
|
||||||
|
margin-left: -10px;
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
background: rgba(255,255,255,.05);
|
||||||
|
border-radius: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&[disabled] {
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.body {
|
||||||
|
$border-width: 2px;
|
||||||
|
border-radius: 5px;
|
||||||
|
border: $border-width solid rgba(255, 255, 255, .2);
|
||||||
|
padding: $padding;
|
||||||
|
height: $toggle-size + $border-width * 2 + $padding * 2;
|
||||||
|
width: $toggle-size * 2 + $border-width * 2 + $padding * 2;
|
||||||
|
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.toggle {
|
||||||
|
position: absolute;
|
||||||
|
border-radius: 2px;
|
||||||
|
width: $toggle-size;
|
||||||
|
height: $toggle-size;
|
||||||
|
background: #475158;
|
||||||
|
top: $padding;
|
||||||
|
left: $padding;
|
||||||
|
transition: 0.25s left;
|
||||||
|
line-height: 19px;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 10px;
|
||||||
|
|
||||||
|
i {
|
||||||
|
opacity: 0;
|
||||||
|
transition: 0.25s opacity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.active .body .toggle {
|
||||||
|
left: $toggle-size + $padding;
|
||||||
|
|
||||||
|
i {
|
||||||
|
color: white;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background: rgba(255,255,255,.1);
|
||||||
|
}
|
||||||
|
}
|
22
terminus-core/src/components/toggle.component.ts
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
import { Component } from '@angular/core'
|
||||||
|
import { NG_VALUE_ACCESSOR } from '@angular/forms'
|
||||||
|
import { CheckboxComponent } from './checkbox.component'
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'toggle',
|
||||||
|
template: `
|
||||||
|
<div class="switch">
|
||||||
|
<div class="body">
|
||||||
|
<div class="toggle" [class.bg-primary]='model'>
|
||||||
|
<i class="fa fa-check"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`,
|
||||||
|
styles: [require('./toggle.component.scss')],
|
||||||
|
providers: [
|
||||||
|
{ provide: NG_VALUE_ACCESSOR, useExisting: ToggleComponent, multi: true },
|
||||||
|
]
|
||||||
|
})
|
||||||
|
export class ToggleComponent extends CheckboxComponent {
|
||||||
|
}
|
@@ -9,7 +9,7 @@ button.btn.btn-secondary.btn-maximize(
|
|||||||
svg(version='1.1', width='10', height='10')
|
svg(version='1.1', width='10', height='10')
|
||||||
path(d='M 0,0 0,10 10,10 10,0 Z M 1,1 9,1 9,9 1,9 Z')
|
path(d='M 0,0 0,10 10,10 10,0 Z M 1,1 9,1 9,9 1,9 Z')
|
||||||
button.btn.btn-secondary.btn-close(
|
button.btn.btn-secondary.btn-close(
|
||||||
(click)='hostApp.quit()',
|
(click)='hostApp.getWindow().close()',
|
||||||
)
|
)
|
||||||
svg(version='1.1', width='10', height='10')
|
svg(version='1.1', width='10', height='10')
|
||||||
path(d='M 0,0 0,0.7 4.3,5 0,9.3 0,10 0.7,10 5,5.7 9.3,10 10,10 10,9.3 5.7,5 10,0.7 10,0 9.3,0 5,4.3 0.7,0 Z')
|
path(d='M 0,0 0,0.7 4.3,5 0,9.3 0,10 0.7,10 5,5.7 9.3,10 10,10 10,9.3 5.7,5 10,0.7 10,0 9.3,0 5,4.3 0.7,0 Z')
|
||||||
|
@@ -1,4 +1,6 @@
|
|||||||
hotkeys:
|
hotkeys:
|
||||||
|
new-window:
|
||||||
|
- 'Ctrl-Shift-N'
|
||||||
toggle-window:
|
toggle-window:
|
||||||
- 'Ctrl+Space'
|
- 'Ctrl+Space'
|
||||||
toggle-fullscreen:
|
toggle-fullscreen:
|
||||||
|
@@ -1,4 +1,6 @@
|
|||||||
hotkeys:
|
hotkeys:
|
||||||
|
new-window:
|
||||||
|
- '⌘-N'
|
||||||
toggle-window:
|
toggle-window:
|
||||||
- 'Ctrl+Space'
|
- 'Ctrl+Space'
|
||||||
toggle-fullscreen:
|
toggle-fullscreen:
|
||||||
|
@@ -1,4 +1,6 @@
|
|||||||
hotkeys:
|
hotkeys:
|
||||||
|
new-window:
|
||||||
|
- 'Ctrl-Shift-N'
|
||||||
toggle-window:
|
toggle-window:
|
||||||
- 'Ctrl+Space'
|
- 'Ctrl+Space'
|
||||||
toggle-fullscreen:
|
toggle-fullscreen:
|
||||||
|
@@ -9,3 +9,4 @@ appearance:
|
|||||||
css: '/* * { color: blue !important; } */'
|
css: '/* * { color: blue !important; } */'
|
||||||
opacity: 1.0
|
opacity: 1.0
|
||||||
vibrancy: false
|
vibrancy: false
|
||||||
|
enableAnalytics: true
|
||||||
|
15
terminus-core/src/directives/autofocus.directive.ts
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
import { Directive, AfterViewInit, ElementRef } from '@angular/core'
|
||||||
|
|
||||||
|
@Directive({
|
||||||
|
selector: '[autofocus]'
|
||||||
|
})
|
||||||
|
export class AutofocusDirective implements AfterViewInit {
|
||||||
|
constructor (private el: ElementRef) { }
|
||||||
|
|
||||||
|
ngAfterViewInit () {
|
||||||
|
this.el.nativeElement.blur()
|
||||||
|
setTimeout(() => {
|
||||||
|
this.el.nativeElement.focus()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
@@ -11,8 +11,10 @@ import { ConfigService } from './services/config.service'
|
|||||||
import { ElectronService } from './services/electron.service'
|
import { ElectronService } from './services/electron.service'
|
||||||
import { HostAppService } from './services/hostApp.service'
|
import { HostAppService } from './services/hostApp.service'
|
||||||
import { LogService } from './services/log.service'
|
import { LogService } from './services/log.service'
|
||||||
|
import { HomeBaseService } from './services/homeBase.service'
|
||||||
import { HotkeysService, AppHotkeyProvider } from './services/hotkeys.service'
|
import { HotkeysService, AppHotkeyProvider } from './services/hotkeys.service'
|
||||||
import { DockingService } from './services/docking.service'
|
import { DockingService } from './services/docking.service'
|
||||||
|
import { ShellIntegrationService } from './services/shellIntegration.service'
|
||||||
import { TabRecoveryService } from './services/tabRecovery.service'
|
import { TabRecoveryService } from './services/tabRecovery.service'
|
||||||
import { ThemesService } from './services/themes.service'
|
import { ThemesService } from './services/themes.service'
|
||||||
import { TouchbarService } from './services/touchbar.service'
|
import { TouchbarService } from './services/touchbar.service'
|
||||||
@@ -25,14 +27,17 @@ import { SafeModeModalComponent } from './components/safeModeModal.component'
|
|||||||
import { StartPageComponent } from './components/startPage.component'
|
import { StartPageComponent } from './components/startPage.component'
|
||||||
import { TabHeaderComponent } from './components/tabHeader.component'
|
import { TabHeaderComponent } from './components/tabHeader.component'
|
||||||
import { TitleBarComponent } from './components/titleBar.component'
|
import { TitleBarComponent } from './components/titleBar.component'
|
||||||
|
import { ToggleComponent } from './components/toggle.component'
|
||||||
import { WindowControlsComponent } from './components/windowControls.component'
|
import { WindowControlsComponent } from './components/windowControls.component'
|
||||||
import { RenameTabModalComponent } from './components/renameTabModal.component'
|
import { RenameTabModalComponent } from './components/renameTabModal.component'
|
||||||
|
|
||||||
|
import { AutofocusDirective } from './directives/autofocus.directive'
|
||||||
|
|
||||||
import { HotkeyProvider } from './api/hotkeyProvider'
|
import { HotkeyProvider } from './api/hotkeyProvider'
|
||||||
import { ConfigProvider } from './api/configProvider'
|
import { ConfigProvider } from './api/configProvider'
|
||||||
import { Theme } from './api/theme'
|
import { Theme } from './api/theme'
|
||||||
|
|
||||||
import { StandardTheme, StandardCompactTheme } from './theme'
|
import { StandardTheme, StandardCompactTheme, PaperTheme } from './theme'
|
||||||
import { CoreConfigProvider } from './config'
|
import { CoreConfigProvider } from './config'
|
||||||
|
|
||||||
import 'perfect-scrollbar/css/perfect-scrollbar.css'
|
import 'perfect-scrollbar/css/perfect-scrollbar.css'
|
||||||
@@ -43,9 +48,11 @@ const PROVIDERS = [
|
|||||||
ConfigService,
|
ConfigService,
|
||||||
DockingService,
|
DockingService,
|
||||||
ElectronService,
|
ElectronService,
|
||||||
|
HomeBaseService,
|
||||||
HostAppService,
|
HostAppService,
|
||||||
HotkeysService,
|
HotkeysService,
|
||||||
LogService,
|
LogService,
|
||||||
|
ShellIntegrationService,
|
||||||
TabRecoveryService,
|
TabRecoveryService,
|
||||||
ThemesService,
|
ThemesService,
|
||||||
TouchbarService,
|
TouchbarService,
|
||||||
@@ -53,6 +60,7 @@ const PROVIDERS = [
|
|||||||
{ provide: HotkeyProvider, useClass: AppHotkeyProvider, multi: true },
|
{ provide: HotkeyProvider, useClass: AppHotkeyProvider, multi: true },
|
||||||
{ provide: Theme, useClass: StandardTheme, multi: true },
|
{ provide: Theme, useClass: StandardTheme, multi: true },
|
||||||
{ provide: Theme, useClass: StandardCompactTheme, multi: true },
|
{ provide: Theme, useClass: StandardCompactTheme, multi: true },
|
||||||
|
{ provide: Theme, useClass: PaperTheme, multi: true },
|
||||||
{ provide: ConfigProvider, useClass: CoreConfigProvider, multi: true },
|
{ provide: ConfigProvider, useClass: CoreConfigProvider, multi: true },
|
||||||
{ provide: PERFECT_SCROLLBAR_CONFIG, useValue: { suppressScrollX: true }}
|
{ provide: PERFECT_SCROLLBAR_CONFIG, useValue: { suppressScrollX: true }}
|
||||||
]
|
]
|
||||||
@@ -73,16 +81,20 @@ const PROVIDERS = [
|
|||||||
TabBodyComponent,
|
TabBodyComponent,
|
||||||
TabHeaderComponent,
|
TabHeaderComponent,
|
||||||
TitleBarComponent,
|
TitleBarComponent,
|
||||||
|
ToggleComponent,
|
||||||
WindowControlsComponent,
|
WindowControlsComponent,
|
||||||
RenameTabModalComponent,
|
RenameTabModalComponent,
|
||||||
SafeModeModalComponent,
|
SafeModeModalComponent,
|
||||||
|
AutofocusDirective,
|
||||||
],
|
],
|
||||||
entryComponents: [
|
entryComponents: [
|
||||||
RenameTabModalComponent,
|
RenameTabModalComponent,
|
||||||
SafeModeModalComponent,
|
SafeModeModalComponent,
|
||||||
],
|
],
|
||||||
exports: [
|
exports: [
|
||||||
CheckboxComponent
|
CheckboxComponent,
|
||||||
|
ToggleComponent,
|
||||||
|
AutofocusDirective,
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
export default class AppModule {
|
export default class AppModule {
|
||||||
|
@@ -1,9 +1,9 @@
|
|||||||
import { Observable, Subject, AsyncSubject } from 'rxjs'
|
import { Observable, Subject, AsyncSubject } from 'rxjs'
|
||||||
import { Injectable, ComponentFactoryResolver, Injector, Optional } from '@angular/core'
|
import { Injectable, ComponentFactoryResolver, Injector } from '@angular/core'
|
||||||
import { DefaultTabProvider } from '../api/defaultTabProvider'
|
|
||||||
import { BaseTabComponent } from '../components/baseTab.component'
|
import { BaseTabComponent } from '../components/baseTab.component'
|
||||||
import { Logger, LogService } from './log.service'
|
import { Logger, LogService } from './log.service'
|
||||||
import { ConfigService } from './config.service'
|
import { ConfigService } from './config.service'
|
||||||
|
import { HostAppService } from './hostApp.service'
|
||||||
|
|
||||||
export declare type TabComponentType = new (...args: any[]) => BaseTabComponent
|
export declare type TabComponentType = new (...args: any[]) => BaseTabComponent
|
||||||
|
|
||||||
@@ -28,8 +28,8 @@ export class AppService {
|
|||||||
|
|
||||||
constructor (
|
constructor (
|
||||||
private componentFactoryResolver: ComponentFactoryResolver,
|
private componentFactoryResolver: ComponentFactoryResolver,
|
||||||
@Optional() private defaultTabProvider: DefaultTabProvider,
|
|
||||||
private config: ConfigService,
|
private config: ConfigService,
|
||||||
|
private hostApp: HostAppService,
|
||||||
private injector: Injector,
|
private injector: Injector,
|
||||||
log: LogService,
|
log: LogService,
|
||||||
) {
|
) {
|
||||||
@@ -39,25 +39,26 @@ export class AppService {
|
|||||||
openNewTab (type: TabComponentType, inputs?: any): BaseTabComponent {
|
openNewTab (type: TabComponentType, inputs?: any): BaseTabComponent {
|
||||||
let componentFactory = this.componentFactoryResolver.resolveComponentFactory(type)
|
let componentFactory = this.componentFactoryResolver.resolveComponentFactory(type)
|
||||||
let componentRef = componentFactory.create(this.injector)
|
let componentRef = componentFactory.create(this.injector)
|
||||||
componentRef.instance.hostView = componentRef.hostView
|
let tab = componentRef.instance
|
||||||
Object.assign(componentRef.instance, inputs || {})
|
tab.hostView = componentRef.hostView
|
||||||
|
Object.assign(tab, inputs || {})
|
||||||
|
|
||||||
this.tabs.push(componentRef.instance)
|
this.tabs.push(tab)
|
||||||
this.selectTab(componentRef.instance)
|
this.selectTab(tab)
|
||||||
this.tabsChanged.next()
|
this.tabsChanged.next()
|
||||||
this.tabOpened.next(componentRef.instance)
|
this.tabOpened.next(tab)
|
||||||
|
|
||||||
return componentRef.instance
|
tab.titleChange$.subscribe(title => {
|
||||||
}
|
if (tab === this.activeTab) {
|
||||||
|
this.hostApp.setTitle(title)
|
||||||
openDefaultTab (): void {
|
|
||||||
if (this.defaultTabProvider) {
|
|
||||||
this.defaultTabProvider.openNewTab()
|
|
||||||
}
|
}
|
||||||
|
})
|
||||||
|
return tab
|
||||||
}
|
}
|
||||||
|
|
||||||
selectTab (tab: BaseTabComponent) {
|
selectTab (tab: BaseTabComponent) {
|
||||||
if (this.activeTab === tab) {
|
if (this.activeTab === tab) {
|
||||||
|
this.activeTab.emitFocused()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (this.tabs.includes(this.activeTab)) {
|
if (this.tabs.includes(this.activeTab)) {
|
||||||
@@ -66,13 +67,14 @@ export class AppService {
|
|||||||
this.lastTabIndex = null
|
this.lastTabIndex = null
|
||||||
}
|
}
|
||||||
if (this.activeTab) {
|
if (this.activeTab) {
|
||||||
this.activeTab.hasActivity = false
|
this.activeTab.clearActivity()
|
||||||
this.activeTab.emitBlurred()
|
this.activeTab.emitBlurred()
|
||||||
}
|
}
|
||||||
this.activeTab = tab
|
this.activeTab = tab
|
||||||
this.activeTabChange.next(tab)
|
this.activeTabChange.next(tab)
|
||||||
if (this.activeTab) {
|
if (this.activeTab) {
|
||||||
this.activeTab.emitFocused()
|
this.activeTab.emitFocused()
|
||||||
|
this.hostApp.setTitle(this.activeTab.title)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -129,5 +131,6 @@ export class AppService {
|
|||||||
emitReady () {
|
emitReady () {
|
||||||
this.ready.next(null)
|
this.ready.next(null)
|
||||||
this.ready.complete()
|
this.ready.complete()
|
||||||
|
this.hostApp.emitReady()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -63,7 +63,7 @@ export class ConfigService {
|
|||||||
|
|
||||||
constructor (
|
constructor (
|
||||||
electron: ElectronService,
|
electron: ElectronService,
|
||||||
hostApp: HostAppService,
|
private hostApp: HostAppService,
|
||||||
@Inject(ConfigProvider) configProviders: ConfigProvider[],
|
@Inject(ConfigProvider) configProviders: ConfigProvider[],
|
||||||
) {
|
) {
|
||||||
this.path = path.join(electron.app.getPath('userData'), 'config.yaml')
|
this.path = path.join(electron.app.getPath('userData'), 'config.yaml')
|
||||||
@@ -78,6 +78,15 @@ export class ConfigService {
|
|||||||
return defaults
|
return defaults
|
||||||
}).reduce(configMerge)
|
}).reduce(configMerge)
|
||||||
this.load()
|
this.load()
|
||||||
|
|
||||||
|
hostApp.configChangeBroadcast$.subscribe(() => {
|
||||||
|
this.load()
|
||||||
|
this.emitChange()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
getDefaults () {
|
||||||
|
return this.defaults
|
||||||
}
|
}
|
||||||
|
|
||||||
load (): void {
|
load (): void {
|
||||||
@@ -92,6 +101,18 @@ export class ConfigService {
|
|||||||
save (): void {
|
save (): void {
|
||||||
fs.writeFileSync(this.path, yaml.safeDump(this._store), 'utf8')
|
fs.writeFileSync(this.path, yaml.safeDump(this._store), 'utf8')
|
||||||
this.emitChange()
|
this.emitChange()
|
||||||
|
this.hostApp.broadcastConfigChange()
|
||||||
|
}
|
||||||
|
|
||||||
|
readRaw (): string {
|
||||||
|
return yaml.safeDump(this._store)
|
||||||
|
}
|
||||||
|
|
||||||
|
writeRaw (data: string): void {
|
||||||
|
this._store = yaml.safeLoad(data)
|
||||||
|
this.save()
|
||||||
|
this.load()
|
||||||
|
this.emitChange()
|
||||||
}
|
}
|
||||||
|
|
||||||
emitChange (): void {
|
emitChange (): void {
|
||||||
|
@@ -76,12 +76,8 @@ export class DockingService {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
getWindow () {
|
|
||||||
return this.electron.app.window
|
|
||||||
}
|
|
||||||
|
|
||||||
repositionWindow () {
|
repositionWindow () {
|
||||||
let [x, y] = this.getWindow().getPosition()
|
let [x, y] = this.hostApp.getWindow().getPosition()
|
||||||
for (let screen of this.electron.screen.getAllDisplays()) {
|
for (let screen of this.electron.screen.getAllDisplays()) {
|
||||||
let bounds = screen.bounds
|
let bounds = screen.bounds
|
||||||
if (x >= bounds.x && x <= bounds.x + bounds.width && y >= bounds.y && y <= bounds.y + bounds.height) {
|
if (x >= bounds.x && x <= bounds.x + bounds.width && y >= bounds.y && y <= bounds.y + bounds.height) {
|
||||||
@@ -89,6 +85,6 @@ export class DockingService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
let screen = this.electron.screen.getPrimaryDisplay()
|
let screen = this.electron.screen.getPrimaryDisplay()
|
||||||
this.getWindow().setPosition(screen.bounds.x, screen.bounds.y)
|
this.hostApp.getWindow().setPosition(screen.bounds.x, screen.bounds.y)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|