From 87748ab5ec8a79dda2455f46c9e165c3a480f9c7 Mon Sep 17 00:00:00 2001 From: Eugene Pankov Date: Mon, 13 Sep 2021 09:54:00 +0200 Subject: [PATCH] wip --- backend/tabby/app/urls.py | 2 +- frontend/package.json | 2 + frontend/src/app.module.ts | 21 +- frontend/src/assets/screenshots/progress.png | Bin 0 -> 74827 bytes frontend/src/assets/screenshots/zmodem.png | Bin 0 -> 23645 bytes .../components/demoTerminal.component.scss | 16 ++ .../src/components/demoTerminal.component.ts | 102 ++++++++++ frontend/src/components/home.component.pug | 179 +++--------------- frontend/src/components/home.component.scss | 107 +++-------- frontend/src/components/home.component.ts | 134 ++++--------- .../src/components/homeFeatures.component.pug | 17 ++ .../components/homeFeatures.component.scss | 3 + .../src/components/homeFeatures.component.ts | 13 ++ .../src/components/homeIndex.component.pug | 135 +++++++++++++ .../src/components/homeIndex.component.scss | 71 +++++++ .../src/components/homeIndex.component.ts | 24 +++ frontend/src/theme/index.scss | 8 +- frontend/src/theme/vars.scss | 2 + frontend/tsconfig.json | 2 +- frontend/webpack.config.base.js | 3 + frontend/webpack.config.js | 2 +- frontend/yarn.lock | 41 +--- 22 files changed, 512 insertions(+), 372 deletions(-) create mode 100644 frontend/src/assets/screenshots/progress.png create mode 100644 frontend/src/assets/screenshots/zmodem.png create mode 100644 frontend/src/components/demoTerminal.component.scss create mode 100644 frontend/src/components/demoTerminal.component.ts create mode 100644 frontend/src/components/homeFeatures.component.pug create mode 100644 frontend/src/components/homeFeatures.component.scss create mode 100644 frontend/src/components/homeFeatures.component.ts create mode 100644 frontend/src/components/homeIndex.component.pug create mode 100644 frontend/src/components/homeIndex.component.scss create mode 100644 frontend/src/components/homeIndex.component.ts diff --git a/backend/tabby/app/urls.py b/backend/tabby/app/urls.py index bb224df..698969c 100644 --- a/backend/tabby/app/urls.py +++ b/backend/tabby/app/urls.py @@ -15,7 +15,7 @@ urlpatterns = [ path('api/1/instance-info', api.InstanceInfoViewSet.as_view({'get': 'retrieve'})), path('api/1/gateways/choose', api.ChooseGatewayViewSet.as_view({'post': 'retrieve'})), - re_path('^(|login|app)$', views.IndexView.as_view()), + re_path('^(|login|app|about|features)$', views.IndexView.as_view()), path('terminal', views.TerminalView.as_view()), path('app-dist//', views.AppDistView.as_view()), diff --git a/frontend/package.json b/frontend/package.json index f0ba260..5e7d75f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -69,9 +69,11 @@ "throng": "^5.0.0", "typescript": "~4.1", "val-loader": "^4.0.0", + "vanta": "^0.5.21", "webpack": "^5.38.1", "webpack-bundle-analyzer": "^4.4.2", "webpack-cli": "^4.7.2", + "three": "^0.119.0", "zone.js": "^0.11.4" } } diff --git a/frontend/src/app.module.ts b/frontend/src/app.module.ts index b23192b..4a21d90 100644 --- a/frontend/src/app.module.ts +++ b/frontend/src/app.module.ts @@ -1,5 +1,5 @@ import { NgModule } from '@angular/core' -import { NgbDropdownModule, NgbModalModule } from '@ng-bootstrap/ng-bootstrap' +import { NgbDropdownModule, NgbModalModule, NgbNavModule } from '@ng-bootstrap/ng-bootstrap' import { BrowserModule } from '@angular/platform-browser' import { BrowserAnimationsModule } from '@angular/platform-browser/animations' import { CommonModule } from '@angular/common' @@ -16,10 +16,13 @@ import { AppComponent } from './components/app.component' import { MainComponent } from './components/main.component' import { ConfigModalComponent } from './components/configModal.component' import { SettingsModalComponent } from './components/settingsModal.component' -import { HomeComponent } from './components/home.component' +import { HomeComponent, HomeComponentPreloadResolver } from './components/home.component' import { LoginComponent } from './components/login.component' import { ConnectionListComponent } from './components/connectionList.component' import { UpgradeModalComponent } from './components/upgradeModal.component' +import { HomeIndexComponent } from './components/homeIndex.component' +import { DemoTerminalComponent } from './components/demoTerminal.component' +import { HomeFeaturesComponent } from './components/homeFeatures.component' import { InstanceInfoResolver } from './api' import '@fortawesome/fontawesome-svg-core/styles.css' @@ -30,7 +33,18 @@ const ROUTES = [ component: HomeComponent, resolve: { instanceInfo: InstanceInfoResolver, + preload: HomeComponentPreloadResolver, }, + children: [ + { + path: '', + component: HomeIndexComponent, + }, + { + path: 'features', + component: HomeFeaturesComponent, + }, + ], }, { path: 'app', @@ -61,6 +75,7 @@ const ROUTES = [ HttpClientXsrfModule, NgbDropdownModule, NgbModalModule, + NgbNavModule, FontAwesomeModule, ClipboardModule, NgxImageZoomModule, @@ -74,11 +89,13 @@ const ROUTES = [ AppComponent, MainComponent, HomeComponent, + HomeIndexComponent, LoginComponent, ConfigModalComponent, SettingsModalComponent, ConnectionListComponent, UpgradeModalComponent, + DemoTerminalComponent, ], bootstrap: [AppComponent], }) diff --git a/frontend/src/assets/screenshots/progress.png b/frontend/src/assets/screenshots/progress.png new file mode 100644 index 0000000000000000000000000000000000000000..5ed8eb93b47142857468d1f69acc660edfeb6c77 GIT binary patch literal 74827 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 P00000NkvXXu0mjfHM6K4 literal 0 HcmV?d00001 diff --git a/frontend/src/assets/screenshots/zmodem.png b/frontend/src/assets/screenshots/zmodem.png new file mode 100644 index 0000000000000000000000000000000000000000..44342fc18fc22340e7fa8ab8f43bcb3d3fe949ee GIT binary patch literal 23645 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⪼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 BhTi}H literal 0 HcmV?d00001 diff --git a/frontend/src/components/demoTerminal.component.scss b/frontend/src/components/demoTerminal.component.scss new file mode 100644 index 0000000..293c847 --- /dev/null +++ b/frontend/src/components/demoTerminal.component.scss @@ -0,0 +1,16 @@ +@import "../theme/vars.scss"; + +:host { + display: flex; + flex-direction: column; + overflow: hidden; + border-radius: 5px; + background: $body-bg; + box-shadow: 0 0 2px black, 0 0 50px #6ef2ff05, 0 0 150px #6854ff14; +} + +iframe { + flex: auto; + display: block; + overflow: hidden; +} diff --git a/frontend/src/components/demoTerminal.component.ts b/frontend/src/components/demoTerminal.component.ts new file mode 100644 index 0000000..299662b --- /dev/null +++ b/frontend/src/components/demoTerminal.component.ts @@ -0,0 +1,102 @@ +import { Subject } from 'rxjs' +import * as semverCompare from 'semver/functions/compare-loose' +import { HttpClient } from '@angular/common/http' +import { Component, ElementRef, ViewChild } from '@angular/core' +import { Version } from '../api' +import { CommonService } from '../services/common.service' + +class DemoConnector { + constructor ( + targetWindow: Window, + private commonService: CommonService, + private version: Version, + ) { + targetWindow['tabbyWebDemoDataPath'] = `${this.getDistURL()}/${version.version}/tabby-web-demo/data` + } + + async loadConfig (): Promise { + return `{ + recoverTabs: false, + web: { + preventAccidentalTabClosure: false, + }, + }` + } + + // eslint-disable-next-line @typescript-eslint/no-empty-function + async saveConfig (_content: string): Promise { } + + getAppVersion (): string { + return this.version.version + } + + getDistURL (): string { + return this.commonService.backendURL + '/app-dist' + } + + getPluginsToLoad (): string[] { + return [ + 'tabby-core', + 'tabby-settings', + 'tabby-terminal', + 'tabby-community-color-schemes', + 'tabby-ssh', + 'tabby-telnet', + 'tabby-web', + 'tabby-web-demo', + ] + } + + createSocket () { + return new DemoSocketProxy() + } +} + + +export class DemoSocketProxy { + connect$ = new Subject() + data$ = new Subject() + error$ = new Subject() + close$ = new Subject() + + async connect (options) { + this.error$.next(new Error('This web demo can\'t actually access Internet, but feel free to download the release and try it out!')) + } +} + +@Component({ + selector: 'demo-terminal', + template: '', + styleUrls: ['./demoTerminal.component.scss'], +}) +export class DemoTerminalComponent { + @ViewChild('iframe') iframe: ElementRef + connector: DemoConnector + + + constructor ( + private http: HttpClient, + private commonService: CommonService, + ) { + window.addEventListener('message', this.connectorRequestHandler) + } + + // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types + connectorRequestHandler = event => { + if (event.data === 'request-connector') { + this.iframe.nativeElement.contentWindow['__connector__'] = this.connector + this.iframe.nativeElement.contentWindow.postMessage('connector-ready', '*') + } + } + + async ngAfterViewInit (): Promise { + const versions = await this.http.get('/api/1/versions').toPromise() + versions.sort((a, b) => -semverCompare(a.version, b.version)) + this.connector = new DemoConnector(this.iframe.nativeElement.contentWindow, this.commonService, versions[0]) + this.iframe.nativeElement.src = '/terminal' + } + + ngOnDestroy (): void { + window.removeEventListener('message', this.connectorRequestHandler) + } +} diff --git a/frontend/src/components/home.component.pug b/frontend/src/components/home.component.pug index 32e3c57..1f4118b 100644 --- a/frontend/src/components/home.component.pug +++ b/frontend/src/components/home.component.pug @@ -1,159 +1,32 @@ .top-half - .navbar - img.brand(src='{{_logo}}') - .me-auto - a.btn.btn-primary([href]='releaseURL', target='_blank') - fa-icon([icon]='_downloadIcon', [fixedWidth]='true') - span Download - a.btn.btn-secondary([href]='donationURL', target='_blank') - fa-icon([icon]='_donateIcon', [fixedWidth]='true') - span Donate - a.btn.btn-secondary(routerLink='/login', *ngIf='instanceInfo.login_enabled') - fa-icon([icon]='_loginIcon', [fixedWidth]='true') - span Login + .container.overflow-hidden + .navbar + img.brand(src='{{_logo}}') + .me-auto + a.btn.btn-primary([href]='releaseURL', target='_blank') + fa-icon([icon]='_downloadIcon', [fixedWidth]='true') + span Download + a.btn.btn-secondary([href]='donationURL', target='_blank') + fa-icon([icon]='_donateIcon', [fixedWidth]='true') + span Donate + a.btn.btn-secondary(routerLink='/login', *ngIf='instanceInfo.login_enabled') + fa-icon([icon]='_loginIcon', [fixedWidth]='true') + span Login + + ul.nav-pills.mb-4(ngbNav, [activeId]='router.url') + li([ngbNavItem]='link.link', *ngFor='let link of navLinks') + a(ngbNavLink, routerLink='.', [routerLink]='link.link') {{ link.title }} .container - .intro - h1 Hey. - div My name is Eugene and I've built a nice terminal app, #[em.ms-1 just for you]. - div Crossplatform, local, SSH, serial, Telnet - it's all there. - div Here's a demo 👇 + div(*ngIf='router.url == "/"') + .intro + h1 Hey. + div My name is Eugene and I've built a nice terminal app, #[em.ms-1 just for you]. + div Crossplatform, local, SSH, serial, Telnet - it's all there. + div Here's a demo 👇 - iframe(#iframe) + demo-terminal .bottom-half - .container - .d-flex.m-auto.mb-5 - a.btn.btn-lg.btn-primary.ms-auto.me-3([href]='releaseURL', target='_blank') - fa-icon([icon]='_downloadIcon', [fixedWidth]='true') - span Latest release - - a.btn.btn-lg.btn-secondary.me-auto([href]='githubURL', target='_blank') - fa-icon([icon]='_githubIcon', [fixedWidth]='true') - span GitHub - - .quotes - .quote - .text "reasonable" - .author — Michael - - .quote - .text "cool" - .author — some dude on my ko-fi - - .quote - .text "very cool" - .author — datsukan - - .section.section-a - .container - .row - .col-12.col-xl-6 - lib-ngx-image-zoom( - [fullImage]='screenshots.window', - [thumbImage]='screenshots.window' - ) - .col-12.col-xl-6 - h1 The important stuff - ul - li Runs on #[strong Windows, Mac and Linux] - li Integrated #[strong SSH client] with a connection manager - li Integrated #[strong serial terminal] - li PowerShell, PS Core, WSL, Git-Bash, Cygwin, Cmder and CMD support - li Full #[strong Unicode support] including double-width characters - li File transfer from/to SSH sessions via #[strong SFTP and Zmodem] - li Theming and color schemes - li Fully #[strong configurable shortcuts] and multi-chord shortcuts - li #[strong Remembers your tabs] and split panes - li Proper shell experience on Windows including #[strong tab completion] - li Integrated #[strong encrypted container] for SSH secrets and configuration - - .section.section-b - .container - .row - .col-12.col-xl-6 - h1 Terminal features - ul - li Multiple #[strong nested panes] - li #[strong Progress bars] and activity notifications for tabs - li Tabby remembers open tabs and panes where you left off - li Tabs on #[strong any side of the window] - li Optional #[strong quake mode] (terminal docked to a side of the screen) - li Optional #[strong global hotkey] to focus/hide the terminal - li Bracketed paste - .col-12.col-xl-6 - lib-ngx-image-zoom( - [fullImage]='screenshots.tabs', - [thumbImage]='screenshots.tabs' - ) - - .section.section-a - .container - .row - .col-12.col-xl-6 - lib-ngx-image-zoom( - [fullImage]='screenshots.ssh', - [thumbImage]='screenshots.ssh' - ) - .col-12.col-xl-6 - h1 SSH Client - ul - li SSH2 client with a connection manager - li #[strong SFTP and Zmodem] file transfers - li #[strong X11] and #[strong port forwarding] - li Jump hosts - li #[strong Agent forwarding] - including Pageant and Windows native OpenSSH Agent - li Login scripts - li Optional built-in #[strong password manager] with a master passphrase - li #[strong Proxy command] support - - .section.section-b - .container - .row - .col-12.col-xl-6 - h1 Windows, but nice - ul - li Support for #[strong different shells] in the same window - li Better tab completion #[strong cmd.exe] thanks to Clink. - li Explorer menu integration - li Optional #[strong portable mode] - li Current directory detection that works - .col-12.col-xl-6 - lib-ngx-image-zoom( - [fullImage]='screenshots.win', - [thumbImage]='screenshots.win' - ) - - .section.section-a - .container - .row - .col-12.col-xl-6 - lib-ngx-image-zoom( - [fullImage]='screenshots.serial', - [thumbImage]='screenshots.serial' - ) - .col-12.col-xl-6 - h1 Serial Terminal - ul - li Multiple #[strong connection profiles] - li Newline conversion - li Text, #[strong readline] and #[strong byte-by-byte] input modes - li Text and #[strong hexdump] output modes - li Zmodem - li Non-standard baud rates - - .section.section-a - .container - h1 And just too much stuff to mention here: - ul - li Themes #[strong customizable with CSS] - li Extensible via #[strong plugins] (in JS) - li A bunch of color schemes already included - li Telnet client - li #[strong Font ligatures] and font fallback - li #[strong Clickable URLs], IPs and paths - li #[strong WinSCP] integration - li Shell #[strong profiles] - li Simultaneous #[strong multi-pane input] - li Optional PuTTY style #[strong right-click paste] and #[strong copy on select] - li macOS vibrancy and Win 10 fluent background support + .demo-offset(*ngIf='router.url == "/"') + router-outlet diff --git a/frontend/src/components/home.component.scss b/frontend/src/components/home.component.scss index d37a415..b4f20a6 100644 --- a/frontend/src/components/home.component.scss +++ b/frontend/src/components/home.component.scss @@ -4,18 +4,33 @@ :host { font-size: 20px; font-family: 'Fira Code', monospace; - - button, a, .quote { - font-family: $font-family-sans-serif; - } + position: absolute; + width: 100vw; + height: 100vh; + overflow: auto; } .top-half { - background: linear-gradient(#0c141c, #15202b); + background: linear-gradient(#0c141c00, #15202b); h1 { font-size: 80px; } + + .nav { + font-size: 14px; + padding: 0 35px; + } +} + +.demo-offset { + padding-top: 24vw; +} + +.bottom-half { + background: $body-bg; + overflow: hidden; + min-height: 100vh; } .navbar { @@ -31,87 +46,11 @@ width: 32px; } -h1 { - font-family: $font-family-monospace; - font-weight: bold; - font-size: 48px; - text-shadow: 0 0 1px black; - margin: 0 0 25px; -} - -.intro { - width: 60vw; - margin: auto; -} - -iframe { - display: block; +demo-terminal { margin: auto; + width: calc(min(max(480px, 60vw), 100vw)); + height: calc(max(460px, 42vw)); position: relative; top: 20vw; margin-top: -16vw; - - width: calc(min(max(480px, 60vw), 100vw)); - height: calc(max(460px, 42vw)); - overflow: hidden; - border-radius: 5px; - box-shadow: 0 0 2px black, 0 0 50px #6ef2ff05, 0 0 150px #6854ff14; -} - - -.bottom-half { - padding-top: 24vw; -} - -.quotes { - margin: 50px 0; - display: flex; - justify-content: center; - text-align: center; - - .quote { - margin: 0 30px; - - .text { - font-size: 50px; - font-style: italic; - } - - .author { - font-size: 14px; - } - } - - @media (max-width: 600px) { - & { display: none;} - } -} - -strong { - background: #849dff; - font-weight: normal; - padding: 2px 7px; - color: black; -} - -.section { - padding: 50px 0; -} - -.section-a { - background: rgba(0, 0, 0, .5); -} - -.section-b { -} - -::ng-deep lib-ngx-image-zoom { - width: 100%; - display: block; - - img { - min-width: 100px; - max-width: 100%; - width: 100%; - } } diff --git a/frontend/src/components/home.component.ts b/frontend/src/components/home.component.ts index 350024b..9bb19f5 100644 --- a/frontend/src/components/home.component.ts +++ b/frontend/src/components/home.component.ts @@ -1,72 +1,7 @@ -import { Subject } from 'rxjs' -import * as semverCompare from 'semver/functions/compare-loose' -import { HttpClient } from '@angular/common/http' -import { Component, ElementRef, ViewChild } from '@angular/core' -import { InstanceInfo, Version } from '../api' +import { Component, Injectable } from '@angular/core' +import { ActivatedRoute, Router, Resolve } from '@angular/router' import { faCoffee, faDownload, faSignInAlt } from '@fortawesome/free-solid-svg-icons' -import { faGithub } from '@fortawesome/free-brands-svg-icons' -import { ActivatedRoute, Router } from '@angular/router' -import { CommonService } from '../services/common.service' - - -class DemoConnector { - constructor ( - targetWindow: Window, - private commonService: CommonService, - private version: Version, - ) { - targetWindow['tabbyWebDemoDataPath'] = `${this.getDistURL()}/${version.version}/tabby-web-demo/data` - } - - async loadConfig (): Promise { - return `{ - recoverTabs: false, - web: { - preventAccidentalTabClosure: false, - }, - }` - } - - // eslint-disable-next-line @typescript-eslint/no-empty-function - async saveConfig (_content: string): Promise { } - - getAppVersion (): string { - return this.version.version - } - - getDistURL (): string { - return this.commonService.backendURL + '/app-dist' - } - - getPluginsToLoad (): string[] { - return [ - 'tabby-core', - 'tabby-settings', - 'tabby-terminal', - 'tabby-community-color-schemes', - 'tabby-ssh', - 'tabby-telnet', - 'tabby-web', - 'tabby-web-demo', - ] - } - - createSocket () { - return new DemoSocketProxy() - } -} - - -export class DemoSocketProxy { - connect$ = new Subject() - data$ = new Subject() - error$ = new Subject() - close$ = new Subject() - - async connect (options) { - this.error$.next(new Error('This web demo can\'t actually access Internet, but feel free to download the release and try it out!')) - } -} +import { InstanceInfo } from '../api' @Component({ @@ -75,8 +10,6 @@ export class DemoSocketProxy { styleUrls: ['./home.component.scss'], }) export class HomeComponent { - @ViewChild('iframe') iframe: ElementRef - connector: DemoConnector githubURL = 'https://github.com/Eugeny/tabby' releaseURL = `${this.githubURL}/releases/latest` donationURL = 'https://ko-fi.com/eugeny' @@ -84,48 +17,55 @@ export class HomeComponent { _logo = require('../assets/logo.svg') _downloadIcon = faDownload _loginIcon = faSignInAlt - _githubIcon = faGithub _donateIcon = faCoffee - screenshots = { - window: require('../assets/screenshots/window.png'), - tabs: require('../assets/screenshots/tabs.png'), - ssh: require('../assets/screenshots/ssh.png'), - serial: require('../assets/screenshots/serial.png'), - win: require('../assets/screenshots/win.png'), - } + navLinks = [ + { + title: 'About Tabby', + link: '/' + }, + { + title: 'Features', + link: '/features' + }, + ] instanceInfo: InstanceInfo constructor ( - private http: HttpClient, - private commonService: CommonService, - route: ActivatedRoute, - router: Router, + public route: ActivatedRoute, + public router: Router, ) { - window.addEventListener('message', this.connectorRequestHandler) this.instanceInfo = route.snapshot.data.instanceInfo if (!this.instanceInfo.homepage_enabled) { router.navigate(['/app']) } } - // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types - connectorRequestHandler = event => { - if (event.data === 'request-connector') { - this.iframe.nativeElement.contentWindow['__connector__'] = this.connector - this.iframe.nativeElement.contentWindow.postMessage('connector-ready', '*') - } + static async preload () { + const three = await import(/* webpackChunkName: "gfx" */ 'three') + window['THREE'] = three + await import(/* webpackChunkName: "gfx" */ 'vanta/src/vanta.waves.js') } async ngAfterViewInit (): Promise { - const versions = await this.http.get('/api/1/versions').toPromise() - versions.sort((a, b) => -semverCompare(a.version, b.version)) - this.connector = new DemoConnector(this.iframe.nativeElement.contentWindow, this.commonService, versions[0]) - this.iframe.nativeElement.src = '/terminal' - } - - ngOnDestroy (): void { - window.removeEventListener('message', this.connectorRequestHandler) + window['VANTA'].WAVES({ + el: 'body', + mouseControls: true, + touchControls: true, + gyroControls: false, + minHeight: 200.00, + minWidth: 200.00, + scale: 1.00, + scaleMobile: 1.00, + color: 0x70f + }) + } +} + +@Injectable({ providedIn: 'root' }) +export class HomeComponentPreloadResolver implements Resolve> { + resolve () { + return HomeComponent.preload() } } diff --git a/frontend/src/components/homeFeatures.component.pug b/frontend/src/components/homeFeatures.component.pug new file mode 100644 index 0000000..c53fc0e --- /dev/null +++ b/frontend/src/components/homeFeatures.component.pug @@ -0,0 +1,17 @@ +.container.mt-5.mb-5 + h1 Features + + .row + .col-12.col-md-4 + .card.bg-dark + img.card-img-top([src]='screenshots.progress') + .card-body + h5.card-title Smart tabs + .card-text Tabs that detect progress and can notify you when a process is done. + + .col-12.col-md-4 + .card.bg-dark + img.card-img-top([src]='screenshots.zmodem') + .card-body + h5.card-title Zmodem transfers + .card-text Full support for Zmodem transfers in SSH, telnet and serial connections. diff --git a/frontend/src/components/homeFeatures.component.scss b/frontend/src/components/homeFeatures.component.scss new file mode 100644 index 0000000..53a165a --- /dev/null +++ b/frontend/src/components/homeFeatures.component.scss @@ -0,0 +1,3 @@ +:host { + font-size: 14px; +} diff --git a/frontend/src/components/homeFeatures.component.ts b/frontend/src/components/homeFeatures.component.ts new file mode 100644 index 0000000..a14ea2f --- /dev/null +++ b/frontend/src/components/homeFeatures.component.ts @@ -0,0 +1,13 @@ +import { Component } from '@angular/core' + +@Component({ + selector: 'home-features', + templateUrl: './homeFeatures.component.pug', + styleUrls: ['./homeFeatures.component.scss'], +}) +export class HomeFeaturesComponent { + screenshots = { + progress: require('../assets/screenshots/progress.png'), + zmodem: require('../assets/screenshots/zmodem.png'), + } +} diff --git a/frontend/src/components/homeIndex.component.pug b/frontend/src/components/homeIndex.component.pug new file mode 100644 index 0000000..8978370 --- /dev/null +++ b/frontend/src/components/homeIndex.component.pug @@ -0,0 +1,135 @@ +.container + .d-flex.m-auto.mb-5 + a.btn.btn-lg.btn-primary.ms-auto.me-3([href]='releaseURL', target='_blank') + fa-icon([icon]='_downloadIcon', [fixedWidth]='true') + span Latest release + + a.btn.btn-lg.btn-secondary.me-auto([href]='githubURL', target='_blank') + fa-icon([icon]='_githubIcon', [fixedWidth]='true') + span GitHub + + .quotes + .quote + .text "reasonable" + .author — Michael + + .quote + .text "cool" + .author — some dude on my ko-fi + + .quote + .text "very cool" + .author — datsukan + +.section.section-a + .container + .row + .col-12.col-xl-6 + lib-ngx-image-zoom( + [fullImage]='screenshots.window', + [thumbImage]='screenshots.window' + ) + .col-12.col-xl-6 + h1 The important stuff + ul + li Runs on #[strong Windows, Mac and Linux] + li Integrated #[strong SSH client] with a connection manager + li Integrated #[strong serial terminal] + li PowerShell, PS Core, WSL, Git-Bash, Cygwin, Cmder and CMD support + li Full #[strong Unicode support] including double-width characters + li File transfer from/to SSH sessions via #[strong SFTP and Zmodem] + li Theming and color schemes + li Fully #[strong configurable shortcuts] and multi-chord shortcuts + li #[strong Remembers your tabs] and split panes + li Proper shell experience on Windows including #[strong tab completion] + li Integrated #[strong encrypted container] for SSH secrets and configuration + +.section.section-b + .container + .row + .col-12.col-xl-6 + h1 Terminal features + ul + li Multiple #[strong nested panes] + li #[strong Progress bars] and activity notifications for tabs + li Tabby remembers open tabs and panes where you left off + li Tabs on #[strong any side of the window] + li Optional #[strong quake mode] (terminal docked to a side of the screen) + li Optional #[strong global hotkey] to focus/hide the terminal + li Bracketed paste + .col-12.col-xl-6 + lib-ngx-image-zoom( + [fullImage]='screenshots.tabs', + [thumbImage]='screenshots.tabs' + ) + +.section.section-a + .container + .row + .col-12.col-xl-6 + lib-ngx-image-zoom( + [fullImage]='screenshots.ssh', + [thumbImage]='screenshots.ssh' + ) + .col-12.col-xl-6 + h1 SSH Client + ul + li SSH2 client with a connection manager + li #[strong SFTP and Zmodem] file transfers + li #[strong X11] and #[strong port forwarding] + li Jump hosts + li #[strong Agent forwarding] - including Pageant and Windows native OpenSSH Agent + li Login scripts + li Optional built-in #[strong password manager] with a master passphrase + li #[strong Proxy command] support + +.section.section-b + .container + .row + .col-12.col-xl-6 + h1 Windows, but nice + ul + li Support for #[strong different shells] in the same window + li Better tab completion #[strong cmd.exe] thanks to Clink. + li Explorer menu integration + li Optional #[strong portable mode] + li Current directory detection that works + .col-12.col-xl-6 + lib-ngx-image-zoom( + [fullImage]='screenshots.win', + [thumbImage]='screenshots.win' + ) + +.section.section-a + .container + .row + .col-12.col-xl-6 + lib-ngx-image-zoom( + [fullImage]='screenshots.serial', + [thumbImage]='screenshots.serial' + ) + .col-12.col-xl-6 + h1 Serial Terminal + ul + li Multiple #[strong connection profiles] + li Newline conversion + li Text, #[strong readline] and #[strong byte-by-byte] input modes + li Text and #[strong hexdump] output modes + li Zmodem + li Non-standard baud rates + +.section.section-a + .container + h1 And just too much stuff to mention here: + ul + li Themes #[strong customizable with CSS] + li Extensible via #[strong plugins] (in JS) + li A bunch of color schemes already included + li Telnet client + li #[strong Font ligatures] and font fallback + li #[strong Clickable URLs], IPs and paths + li #[strong WinSCP] integration + li Shell #[strong profiles] + li Simultaneous #[strong multi-pane input] + li Optional PuTTY style #[strong right-click paste] and #[strong copy on select] + li macOS vibrancy and Win 10 fluent background support diff --git a/frontend/src/components/homeIndex.component.scss b/frontend/src/components/homeIndex.component.scss new file mode 100644 index 0000000..f760751 --- /dev/null +++ b/frontend/src/components/homeIndex.component.scss @@ -0,0 +1,71 @@ +@import "../theme/vars.scss"; + +h1 { + font-family: $font-family-monospace; + font-weight: bold; + font-size: 48px; + text-shadow: 0 0 1px black; + margin: 0 0 25px; +} + +button, a, .quote { + font-family: $font-family-sans-serif; +} + +.intro { + width: 60vw; + margin: auto; +} + +.quotes { + margin: 50px 0; + display: flex; + justify-content: center; + text-align: center; + + .quote { + margin: 0 30px; + + .text { + font-size: 50px; + font-style: italic; + } + + .author { + font-size: 14px; + } + } + + @media (max-width: 600px) { + & { display: none;} + } +} + +strong { + background: #849dff; + font-weight: normal; + padding: 2px 7px; + color: black; +} + +.section { + padding: 50px 0; +} + +.section-a { + background: rgba(0, 0, 0, .5); +} + +.section-b { +} + +::ng-deep lib-ngx-image-zoom { + width: 100%; + display: block; + + img { + min-width: 100px; + max-width: 100%; + width: 100%; + } +} diff --git a/frontend/src/components/homeIndex.component.ts b/frontend/src/components/homeIndex.component.ts new file mode 100644 index 0000000..0baa38b --- /dev/null +++ b/frontend/src/components/homeIndex.component.ts @@ -0,0 +1,24 @@ +import { Component } from '@angular/core' +import { faDownload } from '@fortawesome/free-solid-svg-icons' +import { faGithub } from '@fortawesome/free-brands-svg-icons' + +@Component({ + selector: 'home-index', + templateUrl: './homeIndex.component.pug', + styleUrls: ['./homeIndex.component.scss'], +}) +export class HomeIndexComponent { + githubURL = 'https://github.com/Eugeny/tabby' + releaseURL = `${this.githubURL}/releases/latest` + + _downloadIcon = faDownload + _githubIcon = faGithub + + screenshots = { + window: require('../assets/screenshots/window.png'), + tabs: require('../assets/screenshots/tabs.png'), + ssh: require('../assets/screenshots/ssh.png'), + serial: require('../assets/screenshots/serial.png'), + win: require('../assets/screenshots/win.png'), + } +} diff --git a/frontend/src/theme/index.scss b/frontend/src/theme/index.scss index 38e382d..84bb2c9 100644 --- a/frontend/src/theme/index.scss +++ b/frontend/src/theme/index.scss @@ -17,11 +17,11 @@ @import "~bootstrap/scss/transitions"; @import "~bootstrap/scss/dropdown"; @import "~bootstrap/scss/button-group"; -// @import "~bootstrap/scss/nav"; +@import "~bootstrap/scss/nav"; // @import "~bootstrap/scss/navbar"; @import "~bootstrap/scss/card"; // @import "~bootstrap/scss/accordion"; -// @import "~bootstrap/scss/breadcrum/b"; +// @import "~bootstrap/scss/breadcrumb"; // @import "~bootstrap/scss/pagination"; @import "~bootstrap/scss/badge"; @import "~bootstrap/scss/alert"; @@ -58,6 +58,10 @@ background-color: $gray-700; } +body { + min-height: 100vh; +} + .dropdown-menu { box-shadow: $dropdown-box-shadow; diff --git a/frontend/src/theme/vars.scss b/frontend/src/theme/vars.scss index fac6560..1a6ac52 100644 --- a/frontend/src/theme/vars.scss +++ b/frontend/src/theme/vars.scss @@ -140,6 +140,8 @@ $nav-tabs-link-active-color: #eee; $nav-tabs-link-active-bg: transparent; $nav-tabs-link-active-border-color: #eee; +$nav-pills-link-active-bg: rgba(255, 255, 255, .125); + $navbar-padding-y: 0; $navbar-padding-x: 0; diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index 7122cb7..3f74b27 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "baseUrl": "src/", - "module": "es2015", + "module": "esnext", "target": "es6", "moduleResolution": "node", "noImplicitAny": false, diff --git a/frontend/webpack.config.base.js b/frontend/webpack.config.base.js index c934be8..244d36b 100644 --- a/frontend/webpack.config.base.js +++ b/frontend/webpack.config.base.js @@ -59,5 +59,8 @@ module.exports = { new webpack.DefinePlugin({ BACKEND_URL: JSON.stringify(process.env.BACKEND_URL || ''), }), + new webpack.ProvidePlugin({ + THREE: 'three', + }) ], } diff --git a/frontend/webpack.config.js b/frontend/webpack.config.js index f761ec1..f939321 100644 --- a/frontend/webpack.config.js +++ b/frontend/webpack.config.js @@ -25,7 +25,7 @@ module.exports = { new AngularWebpackPlugin({ tsconfig: 'tsconfig.json', directTemplateLoading: false, - skipCodeGeneration: false, + jitMode: false, }), new HtmlWebpackPlugin({ template: './src/index.html', diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 9fd3234..620244b 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -953,11 +953,6 @@ async-foreach@^0.1.3: resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= -async@~3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.1.tgz#d3274ec66d107a47476a4c49136aacdb00665fc8" - integrity sha512-XdD5lRO/87udXCMC9meWdYiR+Nq6ZjUfXidViUZGu2F1MO4T3XwZ1et0hb2++BgLfhyJwy44BGB/yx80ABx8hg== - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -2903,13 +2898,6 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-cache@~5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - magic-string@^0.25.0: version "0.25.7" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" @@ -3076,20 +3064,6 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -mustache-express@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mustache-express/-/mustache-express-1.3.1.tgz#b5144513ab79a503c87aa8cb16fe019d2f61d9f9" - integrity sha512-RSSzrvM+CVAk9217dkWSNYyl6c2JnesNn6zaZ8+FvZSn8aLxY9l4kTnYqIoiE8GxdLyVQL2ak7XlMZS6t/l8YA== - dependencies: - async "~3.2.0" - lru-cache "~5.1.1" - mustache "^4.2.0" - -mustache@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" - integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== - nan@^2.13.2: version "2.14.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" @@ -4572,6 +4546,11 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= +three@^0.119.0: + version "0.119.1" + resolved "https://registry.yarnpkg.com/three/-/three-0.119.1.tgz#9d979a082c4cd9622af8e3498a8dfa026a619332" + integrity sha512-GHyh/RiUfQ5VTiWIVRRTANYoXc1PFB1y+jDVRTb649nif1uX1F06PT1TKU3k2+F/MN4UJ3PWvQB53fY2OqKqKw== + throng@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/throng/-/throng-5.0.0.tgz#f9550c0221e579073f68a00be33a593d094e4d29" @@ -4765,6 +4744,11 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +vanta@^0.5.21: + version "0.5.21" + resolved "https://registry.yarnpkg.com/vanta/-/vanta-0.5.21.tgz#f3548b531ac0a53ea0b161f12c880474f0d92b29" + integrity sha512-UYW6rYXVl8klFbQrhmgDMZ7SCys9hKROIuTlq5M+v6j346BPu1wqBwVRQPHiYsuooWkUYY6HSXV/9HrJBSuo6g== + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -4976,11 +4960,6 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"