diff --git a/frontend/assets/demo.jpeg b/frontend/assets/demo.jpeg
new file mode 100644
index 0000000..668c772
Binary files /dev/null and b/frontend/assets/demo.jpeg differ
diff --git a/frontend/src/homepage/components/demoTerminal.component.pug b/frontend/src/homepage/components/demoTerminal.component.pug
new file mode 100644
index 0000000..0a71e97
--- /dev/null
+++ b/frontend/src/homepage/components/demoTerminal.component.pug
@@ -0,0 +1,6 @@
+iframe(#iframe)
+img(*ngIf='!running', [src]='_demoScreenshot')
+.overlay(*ngIf='!running', (click)='start()')
+ fa-icon.mb-3([icon]='_playIcon', size='2x')
+ strong.mb-2 Start interactive demo
+ small.text-muted 25 MB, CPU intensive
diff --git a/frontend/src/homepage/components/demoTerminal.component.scss b/frontend/src/homepage/components/demoTerminal.component.scss
index 3a37ad6..4ba0fc4 100644
--- a/frontend/src/homepage/components/demoTerminal.component.scss
+++ b/frontend/src/homepage/components/demoTerminal.component.scss
@@ -4,6 +4,7 @@
display: flex;
flex-direction: column;
overflow: hidden;
+ position: relative;
border-radius: 5px;
background: $body-bg;
box-shadow: 0 0 2px black, 0 0 50px #6ef2ff05, 0 0 150px #6854ff14;
@@ -14,3 +15,38 @@ iframe {
display: block;
overflow: hidden;
}
+
+img, .overlay {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+}
+
+img {
+ object-fit: contain;
+ width: 100%;
+ height: 100%;
+}
+
+.overlay {
+ background: rgba(0, 0, 0, 0.5);
+ transition: background-color 0.25s ease-out;
+
+ &:hover {
+ background: rgba(0, 0, 0, 0.8);
+ }
+
+ cursor: pointer;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+
+ strong, small {
+ background: rgba(0, 0, 0, .5);
+ border-radius: 5px;
+ padding: 5px 10px;
+ }
+}
diff --git a/frontend/src/homepage/components/demoTerminal.component.ts b/frontend/src/homepage/components/demoTerminal.component.ts
index 2df376d..233d0b0 100644
--- a/frontend/src/homepage/components/demoTerminal.component.ts
+++ b/frontend/src/homepage/components/demoTerminal.component.ts
@@ -1,5 +1,6 @@
import { Subject } from 'rxjs'
import * as semverCompare from 'semver/functions/compare-loose'
+import { faPlay } from '@fortawesome/free-solid-svg-icons'
import { HttpClient } from '@angular/common/http'
import { Component, ElementRef, ViewChild } from '@angular/core'
import { Version } from 'src/api'
@@ -20,6 +21,9 @@ class DemoConnector {
web: {
preventAccidentalTabClosure: false,
},
+ terminal: {
+ fontSize: 11,
+ },
}`
}
@@ -66,13 +70,16 @@ export class DemoSocketProxy {
@Component({
selector: 'demo-terminal',
- template: '',
+ templateUrl: './demoTerminal.component.pug',
styleUrls: ['./demoTerminal.component.scss'],
})
export class DemoTerminalComponent {
@ViewChild('iframe') iframe: ElementRef
connector: DemoConnector
+ running = false
+ _demoScreenshot = require('../../../assets/demo.jpeg')
+ _playIcon = faPlay
constructor (
private http: HttpClient,
@@ -89,7 +96,8 @@ export class DemoTerminalComponent {
}
}
- async ngAfterViewInit (): Promise {
+ async start (): Promise {
+ this.running = true
const versions = (await this.http.get('/api/1/versions').toPromise()) as Version[]
versions.sort((a, b) => -semverCompare(a.version, b.version))
this.connector = new DemoConnector(this.iframe.nativeElement.contentWindow, this.commonService, versions[0]!)
diff --git a/frontend/src/homepage/components/home.component.scss b/frontend/src/homepage/components/home.component.scss
index 48cea41..fa43fd8 100644
--- a/frontend/src/homepage/components/home.component.scss
+++ b/frontend/src/homepage/components/home.component.scss
@@ -56,7 +56,7 @@
demo-terminal {
margin: auto;
width: calc(min(max(480px, 60vw), 100vw));
- height: calc(max(460px, 42vw));
+ height: calc(max(360px, 38vw));
position: relative;
top: 20vw;
margin-top: -16vw;