From ae6b8b7979d7c4686fb56570f2507f989a81428c Mon Sep 17 00:00:00 2001 From: mahansky Date: Fri, 15 Feb 2019 13:53:51 +0100 Subject: [PATCH 01/14] Change REPL URL based on ENV --- src/app/services/api.service.ts | 3 ++- src/environments/environment.prod.ts | 3 ++- src/environments/environment.ts | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/app/services/api.service.ts b/src/app/services/api.service.ts index bae20d154..569952495 100644 --- a/src/app/services/api.service.ts +++ b/src/app/services/api.service.ts @@ -1,5 +1,6 @@ import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; +import { environment } from 'src/environments/environment'; @Injectable({ providedIn: 'root' @@ -8,6 +9,6 @@ export class ApiService { constructor(private http: HttpClient) { } executeCode(code: string) { - return this.http.post('/eval', { Code: code }, { responseType: 'text' }); + return this.http.post(environment.replURL, { Code: code }, { responseType: 'text' }); } } diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index 3612073bc..39c634352 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -1,3 +1,4 @@ export const environment = { - production: true + production: true, + replURL: 'https://cx.skycoin.net/repl', }; diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 7b4f817ad..77ad527c7 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -3,7 +3,8 @@ // The list of file replacements can be found in `angular.json`. export const environment = { - production: false + production: false, + replURL: '/eval', }; /* From bc87458014033a5fa404694cc2eb67059d77bfed Mon Sep 17 00:00:00 2001 From: mahansky Date: Fri, 15 Feb 2019 14:02:35 +0100 Subject: [PATCH 02/14] Fixes --- src/assets/img/book-cover.png | Bin 13604 -> 19576 bytes src/environments/environment.prod.ts | 2 +- src/styles.scss | 4 ++++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/assets/img/book-cover.png b/src/assets/img/book-cover.png index 96b0c765423c79dbf68e65ab3ee52e02d92d6305..330dca7b878530e5d2f1adac458ee64a87b98605 100644 GIT binary patch literal 19576 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 diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index 39c634352..b8135f701 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -1,4 +1,4 @@ export const environment = { production: true, - replURL: 'https://cx.skycoin.net/repl', + replURL: 'https://play.cx.skycoin.net', }; diff --git a/src/styles.scss b/src/styles.scss index 60968aabf..f4a20d407 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -56,3 +56,7 @@ code { line-height: 1.5; word-break: break-all; } + +button { + outline: none; +} From 7fe9a9c0ef20420312db980b7f2a55df7b0bbaff Mon Sep 17 00:00:00 2001 From: mahansky Date: Sun, 17 Feb 2019 17:48:46 +0100 Subject: [PATCH 03/14] REPL enabled/disabled env variable --- .../pages/content/content.component.scss | 4 --- .../pages/editor/editor.component.html | 18 +++++++++---- .../pages/editor/editor.component.scss | 16 ++++++++++++ .../pages/editor/editor.component.ts | 26 ++++++++++++++----- src/environments/environment.prod.ts | 1 + src/environments/environment.ts | 1 + src/styles.scss | 9 +++++++ 7 files changed, 59 insertions(+), 16 deletions(-) diff --git a/src/app/components/pages/content/content.component.scss b/src/app/components/pages/content/content.component.scss index a38d04f11..d844f8c27 100644 --- a/src/app/components/pages/content/content.component.scss +++ b/src/app/components/pages/content/content.component.scss @@ -11,10 +11,6 @@ main { } ::ng-deep { - a { - color: $blue; - } - code { padding: 0 5px; background: #f8f8f8; diff --git a/src/app/components/pages/editor/editor.component.html b/src/app/components/pages/editor/editor.component.html index 7a7b28f57..43685a218 100644 --- a/src/app/components/pages/editor/editor.component.html +++ b/src/app/components/pages/editor/editor.component.html @@ -1,7 +1,7 @@

CX Playground

-
+
@@ -14,10 +14,18 @@

CX Playground

-
{{ examplePrograms[0].code.trim() }}
+ +
{{ examplePrograms[0].code.trim() }}
- - Output -
{{ output }}
+ + Output +
{{ output }}
+
+
+ +
+ +

Playground is currently offline. Install CX and run REPL locally.

+
diff --git a/src/app/components/pages/editor/editor.component.scss b/src/app/components/pages/editor/editor.component.scss index af20a7687..3d570b202 100644 --- a/src/app/components/pages/editor/editor.component.scss +++ b/src/app/components/pages/editor/editor.component.scss @@ -56,3 +56,19 @@ code { } } } + +.offline-msg { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + margin-top: 90px; + color: $grey; + + svg { + fill: lighten($grey, 20%); + width: 100px; + height: 100px; + margin-bottom: 30px; + } +} diff --git a/src/app/components/pages/editor/editor.component.ts b/src/app/components/pages/editor/editor.component.ts index f2beae778..6e063a030 100644 --- a/src/app/components/pages/editor/editor.component.ts +++ b/src/app/components/pages/editor/editor.component.ts @@ -2,8 +2,9 @@ import { Component, ElementRef, OnDestroy, - OnInit, - ViewChild, + QueryList, + ViewChildren, + AfterViewInit, } from '@angular/core'; import { fromEvent, Unsubscribable } from 'rxjs'; import { debounceTime, filter } from 'rxjs/operators'; @@ -15,18 +16,21 @@ import { MatDialog } from '@angular/material'; import { ShareComponent } from './share/share.component'; import { ExamplesComponent } from './examples/examples.component'; import { ActivatedRoute } from '@angular/router'; +import { environment } from 'src/environments/environment'; @Component({ selector: 'app-editor', templateUrl: './editor.component.html', styleUrls: ['./editor.component.scss'] }) -export class EditorComponent implements OnInit, OnDestroy { - @ViewChild('code') codeElement: ElementRef; - +export class EditorComponent implements AfterViewInit, OnDestroy { examplePrograms = programs; + enabled = environment.replEnabled; output: string; + @ViewChildren('code') + private codeElements: QueryList; + private codeElement: ElementRef; private subscription: Unsubscribable; constructor( @@ -35,7 +39,13 @@ export class EditorComponent implements OnInit, OnDestroy { private route: ActivatedRoute, ) { } - ngOnInit() { + ngAfterViewInit() { + if (!this.enabled) { + return; + } + + this.codeElement = this.codeElements.first; + this.route.queryParams .pipe(filter(params => params.code)) .subscribe(params => { @@ -50,7 +60,9 @@ export class EditorComponent implements OnInit, OnDestroy { } ngOnDestroy() { - this.subscription.unsubscribe(); + if (this.subscription) { + this.subscription.unsubscribe(); + } } run() { diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index b8135f701..30c43a25c 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -1,4 +1,5 @@ export const environment = { production: true, replURL: 'https://play.cx.skycoin.net', + replEnabled: false, }; diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 77ad527c7..fb25a34bf 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -5,6 +5,7 @@ export const environment = { production: false, replURL: '/eval', + replEnabled: true, }; /* diff --git a/src/styles.scss b/src/styles.scss index f4a20d407..4b2294200 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -28,6 +28,7 @@ $cx-website-theme: mat-light-theme($cx-website-primary, $cx-website-accent, $cx- @import 'fonts'; @import 'container'; @import 'highlight'; +@import 'variables'; html, body { height: 100%; @@ -60,3 +61,11 @@ code { button { outline: none; } + +a { + color: $blue; +} + +h1 { + font-weight: normal; +} From 56bd4b3d8f5a3e405a6acb9a04ac14b0b5bc50a8 Mon Sep 17 00:00:00 2001 From: iketheadore <2589926+iketheadore@users.noreply.github.com> Date: Tue, 26 Feb 2019 22:59:34 +1100 Subject: [PATCH 04/14] Add Dockerfile --- Dockerfile | 17 +++++++++++++++++ nginx.conf | 25 +++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 Dockerfile create mode 100644 nginx.conf diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..3914ac3f9 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,17 @@ +# STEP 1, build dist +FROM node:alpine as node + +WORKDIR /usr/src/app + +COPY . ./ + +RUN npm install +RUN npm run build + +# STEP 2, run it with nginx +FROM nginx:alpine + +WORKDIR /usr/share/nginx/html + +COPY --from=node /usr/src/app/nginx.conf /etc/nginx/nginx.conf +COPY --from=node /usr/src/app/dist/cx-website/ ./ diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 000000000..ea9434b3d --- /dev/null +++ b/nginx.conf @@ -0,0 +1,25 @@ +worker_processes 1; + +events { + worker_connections 1024; +} + +http { + server { + listen 80; + server_name localhost; + + root /usr/share/nginx/html; + index index.html index.htm; + include /etc/nginx/mime.types; + + gzip on; + gzip_min_length 1000; + gzip_proxied expired no-cache no-store private auth; + gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript; + + location / { + try_files $uri $uri/ /index.html; + } + } +} From e6d5dc5f7aa240d8b97d7071b7744d2ed1a238c5 Mon Sep 17 00:00:00 2001 From: iketheadore <2589926+iketheadore@users.noreply.github.com> Date: Tue, 26 Feb 2019 23:27:23 +1100 Subject: [PATCH 05/14] Update FROM image of node and ngixn to reduce image size --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3914ac3f9..bf9892ab2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # STEP 1, build dist -FROM node:alpine as node +FROM node:11-alpine as node WORKDIR /usr/src/app @@ -9,7 +9,7 @@ RUN npm install RUN npm run build # STEP 2, run it with nginx -FROM nginx:alpine +FROM nginx:1.15.8-alpine WORKDIR /usr/share/nginx/html From 494458f47f3afdb66301191b224f0d4d2d1e8303 Mon Sep 17 00:00:00 2001 From: mahansky Date: Fri, 15 Mar 2019 15:24:32 +0100 Subject: [PATCH 06/14] Hide TryItOut button when REPL is disabled --- src/app/components/pages/home/home.component.html | 2 +- src/app/components/pages/home/home.component.ts | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/app/components/pages/home/home.component.html b/src/app/components/pages/home/home.component.html index 8109ad3f5..cf4cd6984 100644 --- a/src/app/components/pages/home/home.component.html +++ b/src/app/components/pages/home/home.component.html @@ -11,7 +11,7 @@ diff --git a/src/app/components/pages/home/home.component.ts b/src/app/components/pages/home/home.component.ts index f56c8c173..414dcc6f4 100644 --- a/src/app/components/pages/home/home.component.ts +++ b/src/app/components/pages/home/home.component.ts @@ -1,4 +1,5 @@ import { Component, OnInit } from '@angular/core'; +import { environment } from '../../../../environments/environment'; @Component({ selector: 'app-home', @@ -6,10 +7,11 @@ import { Component, OnInit } from '@angular/core'; styleUrls: ['./home.component.scss'] }) export class HomeComponent implements OnInit { + replEnabled: boolean; constructor() { } ngOnInit() { + this.replEnabled = environment.replEnabled; } - } From acdcf817e78676cb270dc8ce5a6faf292ddb4f07 Mon Sep 17 00:00:00 2001 From: mahansky Date: Fri, 15 Mar 2019 16:13:14 +0100 Subject: [PATCH 07/14] Add footer --- src/app/app.component.html | 2 + src/app/app.module.ts | 4 +- .../layout/footer/footer.component.html | 28 +++++++++++++ .../layout/footer/footer.component.scss | 38 ++++++++++++++++++ .../layout/footer/footer.component.spec.ts | 25 ++++++++++++ .../layout/footer/footer.component.ts | 15 +++++++ .../pages/content/content.component.scss | 1 - src/assets/img/skycoin-logo.svg | 18 +++++++++ src/favicon.png | Bin 1234 -> 399 bytes 9 files changed, 129 insertions(+), 2 deletions(-) create mode 100644 src/app/components/layout/footer/footer.component.html create mode 100644 src/app/components/layout/footer/footer.component.scss create mode 100644 src/app/components/layout/footer/footer.component.spec.ts create mode 100644 src/app/components/layout/footer/footer.component.ts create mode 100644 src/assets/img/skycoin-logo.svg diff --git a/src/app/app.component.html b/src/app/app.component.html index 6537a3ae9..20c39afb8 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1,3 +1,5 @@ + + diff --git a/src/app/app.module.ts b/src/app/app.module.ts index e7a4f30e0..c7dc5fcbc 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -20,6 +20,7 @@ import { ExamplesComponent } from './components/pages/editor/examples/examples.c import { DialogComponent } from './components/layout/dialog/dialog.component'; import { BookComponent } from './components/pages/book/book.component'; import { SafePipe } from './pipes/safe.pipe'; +import { FooterComponent } from './components/layout/footer/footer.component'; @NgModule({ @@ -33,7 +34,8 @@ import { SafePipe } from './pipes/safe.pipe'; ExamplesComponent, DialogComponent, BookComponent, - SafePipe + SafePipe, + FooterComponent ], imports: [ BrowserModule, diff --git a/src/app/components/layout/footer/footer.component.html b/src/app/components/layout/footer/footer.component.html new file mode 100644 index 000000000..ad8c757a7 --- /dev/null +++ b/src/app/components/layout/footer/footer.component.html @@ -0,0 +1,28 @@ + diff --git a/src/app/components/layout/footer/footer.component.scss b/src/app/components/layout/footer/footer.component.scss new file mode 100644 index 000000000..10d1c0564 --- /dev/null +++ b/src/app/components/layout/footer/footer.component.scss @@ -0,0 +1,38 @@ +@import 'variables'; + +footer { + background: $blue-dark; + padding: 60px 0; + + .links, .social { + display: flex; + justify-content: space-between; + align-items: center; + } + + .separator { + border-top: 1px solid hsla(0, 0%, 100%, .12); + margin: 30px 0; + } + + svg { + margin-left: 60px; + width: 20px; + height: 20px; + fill: $blue; + } + + nav { + a { + margin-left: 30px; + color: #616d7c; + text-decoration: none; + font-size: 13px; + } + } + + .social span { + color: #616d7c; + font-size: 13px; + } +} diff --git a/src/app/components/layout/footer/footer.component.spec.ts b/src/app/components/layout/footer/footer.component.spec.ts new file mode 100644 index 000000000..2ca6c4543 --- /dev/null +++ b/src/app/components/layout/footer/footer.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FooterComponent } from './footer.component'; + +describe('FooterComponent', () => { + let component: FooterComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ FooterComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FooterComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/layout/footer/footer.component.ts b/src/app/components/layout/footer/footer.component.ts new file mode 100644 index 000000000..da17d8242 --- /dev/null +++ b/src/app/components/layout/footer/footer.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-footer', + templateUrl: './footer.component.html', + styleUrls: ['./footer.component.scss'] +}) +export class FooterComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/app/components/pages/content/content.component.scss b/src/app/components/pages/content/content.component.scss index d844f8c27..e75e97a69 100644 --- a/src/app/components/pages/content/content.component.scss +++ b/src/app/components/pages/content/content.component.scss @@ -7,7 +7,6 @@ main { box-shadow: 0 2px 2px 0 rgba(0,0,0,0.2); box-sizing: border-box; min-height: 400px; - margin-bottom: 30px; } ::ng-deep { diff --git a/src/assets/img/skycoin-logo.svg b/src/assets/img/skycoin-logo.svg new file mode 100644 index 000000000..b2ffa0139 --- /dev/null +++ b/src/assets/img/skycoin-logo.svg @@ -0,0 +1,18 @@ + +logo_bot +Created using Figma + + + + + + + + + + + + + + + diff --git a/src/favicon.png b/src/favicon.png index 2a6963a7143e641c2376adc37a8c5da573661d6f..abf51494ac7a772ce9051fb9d118e80fb4287148 100644 GIT binary patch literal 399 zcmV;A0dW3_P)lqxT*AUhyVyeOrv}Ywy^LvKuuV)!D-dtqJ{ra3C>e5PvfSuDBoM$yM z@W=>Y*UTZr!;ty@F+xM zL*)784B=;1Gh_m7_u0_T;4rxe7)DDO7@3){hXV^I8-sqH4}(Q*9D{9F1%pX>9D{C( t7lU?62!mC77K50D6azCS3&SWt0RV7rfc0d0>WTmW002ovPDHLkV1iL3ueJaH literal 1234 zcmV;@1TFiCP)FQ03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00cHkL_t(|+U?p~h*eb_ z$MMhcOqxwfH9Zt$W(=a%Lpq~*$r`Z2(v(EHL11AJQGyjdNeN*jlt@Zp7o|sivAkd* znq3&vIdg^}ChuI~zf2}}(iIrr0 zEjAPwa2k(ZLLX`Tktf{1N-_QhWMkIw>pke}ov3Ydr5HaL-^Uogy@xx>%&7f)l_J2} z7~{|4?jH6xBI;vqB^W*`-1>ACDgg8NO^l-4kXLs z6mNA`C&$tT78jPc^6&t@ifa?FZX8ebW(E{H*8bC%0__ENvrg{Y&vU&U+h0X?fpj^h#x;w;*cY+)~OGoMlVCGi;3#C#$JxWo4EP zI~jDjVutxK0vyMj656KmY~)b4C~?p&OfT3C4!1C(jc>B7T~elPhSl Date: Fri, 15 Mar 2019 16:34:58 +0100 Subject: [PATCH 08/14] Improve book component --- src/app/app-routing.module.ts | 2 +- .../components/pages/book/book.component.html | 8 ++++- .../components/pages/book/book.component.scss | 29 +++++++++++++++++-- .../components/pages/book/book.component.ts | 29 ++++++++++++++++++- .../components/pages/home/home.component.html | 2 +- 5 files changed, 63 insertions(+), 7 deletions(-) diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 4ce6874bf..88a55acf0 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -11,7 +11,7 @@ import { BookComponent } from './components/pages/book/book.component'; export const routes: Routes = [ { path: '', component: HomeComponent }, { path: 'editor', component: EditorComponent }, - { path: 'book', component: BookComponent }, + { path: 'books/:book', component: BookComponent }, { path: '**', component: ContentComponent, canActivate: [ContentGuard] }, ]; diff --git a/src/app/components/pages/book/book.component.html b/src/app/components/pages/book/book.component.html index 0693355ea..acd15e536 100644 --- a/src/app/components/pages/book/book.component.html +++ b/src/app/components/pages/book/book.component.html @@ -1,3 +1,9 @@
- +
+
+

{{ book.title }}

+ Download +
+ +
diff --git a/src/app/components/pages/book/book.component.scss b/src/app/components/pages/book/book.component.scss index bd8cfe479..3fa6c8644 100644 --- a/src/app/components/pages/book/book.component.scss +++ b/src/app/components/pages/book/book.component.scss @@ -1,5 +1,28 @@ -iframe { +@import 'variables'; + +main { width: 100%; - height: 100vh; - border: none; + background-color: $white; + padding: 30px; + box-shadow: 0 2px 2px 0 rgba(0,0,0,0.2); + box-sizing: border-box; + + .heading { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 30px; + + h1 { + margin: 0; + font-weight: normal; + } + } + + iframe { + width: calc(100% + 60px); + height: 100vh; + border: none; + margin: 0 -30px; + } } diff --git a/src/app/components/pages/book/book.component.ts b/src/app/components/pages/book/book.component.ts index ed597df57..57bbd7ff8 100644 --- a/src/app/components/pages/book/book.component.ts +++ b/src/app/components/pages/book/book.component.ts @@ -1,4 +1,6 @@ import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { DomSanitizer } from '@angular/platform-browser'; @Component({ selector: 'app-book', @@ -6,10 +8,35 @@ import { Component, OnInit } from '@angular/core'; styleUrls: ['./book.component.scss'] }) export class BookComponent implements OnInit { + book; - constructor() { } + readonly books = [ + { + title: 'CX Programming Language', + route: 'cx-programming-language', + file: 'cx-programming-language.pdf' + }, + ]; + + constructor( + private route: ActivatedRoute, + private router: Router, + private sanitizer: DomSanitizer, + ) { } ngOnInit() { + this.route.paramMap.subscribe(map => { + const book = this.books.find(b => b.route === map.get('book')); + + if (!book) { + this.router.navigate(['/']); + } else { + this.book = book; + } + }); } + path(file: string) { + return this.sanitizer.bypassSecurityTrustResourceUrl(`../../../../assets/books/${file}`); + } } diff --git a/src/app/components/pages/home/home.component.html b/src/app/components/pages/home/home.component.html index cf4cd6984..b942f9e39 100644 --- a/src/app/components/pages/home/home.component.html +++ b/src/app/components/pages/home/home.component.html @@ -26,7 +26,7 @@ and future books will teach you how to program with CX for video games and smart contracts.

- Read it here + Read it here
CX Book From 47039e1daa50e59c389425d4a4acf00bf54ceca1 Mon Sep 17 00:00:00 2001 From: mahansky Date: Fri, 15 Mar 2019 16:49:51 +0100 Subject: [PATCH 09/14] Home content as markdown --- src/app/app-routing.module.ts | 2 +- .../components/pages/home/home.component.html | 38 +------------------ .../components/pages/home/home.component.scss | 14 +++---- src/app/services/content.guard.ts | 2 +- src/assets/content/home.md | 26 +++++++++++++ 5 files changed, 35 insertions(+), 47 deletions(-) create mode 100644 src/assets/content/home.md diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 88a55acf0..3a806c313 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -9,7 +9,7 @@ import { EditorComponent } from './components/pages/editor/editor.component'; import { BookComponent } from './components/pages/book/book.component'; export const routes: Routes = [ - { path: '', component: HomeComponent }, + { path: '', component: HomeComponent, canActivate: [ContentGuard] }, { path: 'editor', component: EditorComponent }, { path: 'books/:book', component: BookComponent }, { path: '**', component: ContentComponent, canActivate: [ContentGuard] }, diff --git a/src/app/components/pages/home/home.component.html b/src/app/components/pages/home/home.component.html index b942f9e39..fa1f8512d 100644 --- a/src/app/components/pages/home/home.component.html +++ b/src/app/components/pages/home/home.component.html @@ -34,42 +34,6 @@
-

Latest release: CX v0.6

- - Serialization -

A CX program has a 'binary' representation that is intended to go on the - blockchain. This binary representation is often called a bytecode, and is a - common feature in many language. The difference between CX and most other - languages is that in CX you have a bytecode representation of both the program - itself, and a running state. CX 0.6 has serialization of any program and - running state as well as deserialization of both.

- -

So in the next step of the Sky development, you will be able to store a CX - program on a blockchain (a chain on Fiber) and store the state of it also on - the chain. The next time the program is started, the state will be read from - the chain, and continued from where it left off, run for a while, providing a - service of some kind, and then the new state will be put back into a new - block. This is similar to what is called a smart contract on other - blockchains.

- - Language Improvements -

There are a number of new language features that were present in late release - of CX 0.5, but are now officially supported. These are:

- -
    -
  • Functions as first-class objects -
  • Callbacks (used in some libraries, like OpenGL)
  • -
  • Much improved handling of slices, esp. resize/copy/insert/remove functions, and boundary checks.
  • -
  • New control flow keywords: break and continue
  • -
  • New formatting for printf: %v for values of any type
  • -
  • Labels can now appear anywhere in a function.
  • -
  • Improved error reporting
  • -
  • ...and many improvements that were introduced during late stages of CX 0.5
  • -
- - Library Improvements -

Added GIF support to OpenGL

- - Read more at GitHub +
diff --git a/src/app/components/pages/home/home.component.scss b/src/app/components/pages/home/home.component.scss index 0dae91a42..daecaf964 100644 --- a/src/app/components/pages/home/home.component.scss +++ b/src/app/components/pages/home/home.component.scss @@ -114,16 +114,14 @@ .content { margin: 60px 0; - ul li { - line-height: 24px; - } - - a { - color: $blue; - } - @media (max-width: map-get($bp, sm)) { padding: 30px; margin-top: 0; } + + ::ng-deep main { + padding: 0; + box-shadow: none; + min-height: auto; + } } diff --git a/src/app/services/content.guard.ts b/src/app/services/content.guard.ts index c13009e3c..40961d5fd 100644 --- a/src/app/services/content.guard.ts +++ b/src/app/services/content.guard.ts @@ -18,7 +18,7 @@ export class ContentGuard implements CanActivate { canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise { const path = next.url.map(segment => segment.path).join('/'); - const file = `${path}.md`; + const file = path !== '' ? `${path}.md` : 'home.md'; return this.contentService.loadContent(file) .then(() => true) diff --git a/src/assets/content/home.md b/src/assets/content/home.md new file mode 100644 index 000000000..8015a3bbf --- /dev/null +++ b/src/assets/content/home.md @@ -0,0 +1,26 @@ +## Latest release: CX v0.6 + +**Serialization** + +A CX program has a 'binary' representation that is intended to go on the blockchain. This binary representation is often called a bytecode, and is a common feature in many language. The difference between CX and most other languages is that in CX you have a bytecode representation of both the program itself, and a running state. CX 0.6 has serialization of any program and running state as well as deserialization of both. + +So in the next step of the Sky development, you will be able to store a CX program on a blockchain (a chain on Fiber) and store the state of it also on the chain. The next time the program is started, the state will be read from the chain, and continued from where it left off, run for a while, providing a service of some kind, and then the new state will be put back into a new block. This is similar to what is called a smart contract on other blockchains. + +**Language Improvements** + +There are a number of new language features that were present in late release of CX 0.5, but are now officially supported. These are: + +* Functions as first-class objects +* Callbacks (used in some libraries, like OpenGL) +* Much improved handling of slices, esp. resize/copy/insert/remove functions, and boundary checks. +* New control flow keywords: break and continue +* New formatting for printf: %v for values of any type +* Labels can now appear anywhere in a function. +* Improved error reporting +* ...and many improvements that were introduced during late stages of CX 0.5 + +**Library Improvements** + +Added GIF support to OpenGL + +[Read more at GitHub](https://github.com/skycoin/cx/releases) From abd65609105079f3c5955ca1b00544bcac1ace7d Mon Sep 17 00:00:00 2001 From: Marek Mahansky Date: Fri, 15 Mar 2019 16:57:38 +0100 Subject: [PATCH 10/14] Update CONTRIBUTING.md --- CONTRIBUTING.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8f4ad3b9d..8549365a9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,13 +2,15 @@ ## Markdown content -Content of the CX website (except for homepage) is generated from Markdown files. +Content of the CX website is generated from Markdown files. These files are stored in [./src/assets/content](./src/assets/content) directory. After you create a file, you can access it by going to `http://localhost:4200/`. You can also create sub pages by moving the files into directories. +Content on the homepage is generated from file `home.md`. + **Examples:** - Simple page @@ -18,7 +20,6 @@ You can also create sub pages by moving the files into directories. - Create file `./src/assets/content/tutorial/hello-world.md` - It is accessible from `http://localhost:4200/tutorial/hello-world` - ### Headers You should always start a page with `h1 (#)` header which will act as a page title. From e03117ec1816aa50517839b78c8425cf6ecfee1e Mon Sep 17 00:00:00 2001 From: mahansky Date: Fri, 15 Mar 2019 19:01:47 +0100 Subject: [PATCH 11/14] Footer responsivity --- .../layout/footer/footer.component.scss | 29 +++++++++++++++++-- .../components/pages/home/home.component.scss | 4 +-- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/app/components/layout/footer/footer.component.scss b/src/app/components/layout/footer/footer.component.scss index 10d1c0564..634841716 100644 --- a/src/app/components/layout/footer/footer.component.scss +++ b/src/app/components/layout/footer/footer.component.scss @@ -27,12 +27,37 @@ footer { margin-left: 30px; color: #616d7c; text-decoration: none; - font-size: 13px; + font-size: 14px; } } .social span { color: #616d7c; - font-size: 13px; + font-size: 14px; + } +} + +@media (max-width: map-get($bp, sm)) { + footer { + padding: 30px 0; + } + + .links { + padding: 0 30px; + flex-direction: column; + align-items: flex-start !important; + + img { + margin-bottom: 30px; + } + + a { + margin-left: 0 !important; + margin-right: 30px; + } + } + + .social { + padding: 0 30px; } } diff --git a/src/app/components/pages/home/home.component.scss b/src/app/components/pages/home/home.component.scss index daecaf964..44906d0f4 100644 --- a/src/app/components/pages/home/home.component.scss +++ b/src/app/components/pages/home/home.component.scss @@ -115,8 +115,8 @@ margin: 60px 0; @media (max-width: map-get($bp, sm)) { - padding: 30px; - margin-top: 0; + padding: 0 30px; + margin: 30px 0; } ::ng-deep main { From 826f117ccc6b0d2e66fb5839abc938ea8f116032 Mon Sep 17 00:00:00 2001 From: mahansky Date: Wed, 20 Mar 2019 03:52:07 +0100 Subject: [PATCH 12/14] Editor error handling --- src/app/app.module.ts | 8 +++++--- .../pages/editor/editor.component.scss | 18 +++++++++--------- .../pages/editor/editor.component.ts | 17 +++++++++++++---- src/app/utils/examples.ts | 4 ++++ 4 files changed, 31 insertions(+), 16 deletions(-) diff --git a/src/app/app.module.ts b/src/app/app.module.ts index c7dc5fcbc..039f89489 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -2,8 +2,8 @@ import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { - MAT_DIALOG_DEFAULT_OPTIONS, MatButtonModule, - MatDialogModule, MatInputModule, + MAT_DIALOG_DEFAULT_OPTIONS, MAT_SNACK_BAR_DEFAULT_OPTIONS, MatButtonModule, + MatDialogModule, MatInputModule, MatSnackBarModule, MatTooltipModule } from '@angular/material'; import { HttpClientModule } from '@angular/common/http'; @@ -47,6 +47,7 @@ import { FooterComponent } from './components/layout/footer/footer.component'; MatDialogModule, MatInputModule, MatButtonModule, + MatSnackBarModule, ], entryComponents: [ DialogComponent, @@ -54,7 +55,8 @@ import { FooterComponent } from './components/layout/footer/footer.component'; ExamplesComponent, ], providers: [ - { provide: MAT_DIALOG_DEFAULT_OPTIONS, useValue: { width: '500px', hasBackdrop: true }} + { provide: MAT_DIALOG_DEFAULT_OPTIONS, useValue: { width: '500px', hasBackdrop: true }}, + { provide: MAT_SNACK_BAR_DEFAULT_OPTIONS, useValue: { duration: 3000 }}, ], bootstrap: [AppComponent] }) diff --git a/src/app/components/pages/editor/editor.component.scss b/src/app/components/pages/editor/editor.component.scss index 3d570b202..e284d8a23 100644 --- a/src/app/components/pages/editor/editor.component.scss +++ b/src/app/components/pages/editor/editor.component.scss @@ -1,14 +1,5 @@ @import 'variables'; -main { - background-color: $white; - padding: 30px; - box-shadow: 0 2px 2px 0 rgba(0,0,0,0.2); - box-sizing: border-box; - min-height: 400px; - margin-bottom: 30px; -} - code { outline: none; } @@ -55,6 +46,15 @@ code { } } } + + @media (max-width: map-get($bp, sm)) { + flex-direction: column; + align-items: flex-start; + + .controls button { + margin: 15px 15px 0 0; + } + } } .offline-msg { diff --git a/src/app/components/pages/editor/editor.component.ts b/src/app/components/pages/editor/editor.component.ts index 6e063a030..ed49bc2d0 100644 --- a/src/app/components/pages/editor/editor.component.ts +++ b/src/app/components/pages/editor/editor.component.ts @@ -12,7 +12,7 @@ import hljs = require('highlight.js/lib/highlight'); import { restoreSelection, saveSelection } from '../../../utils/cursor'; import { programs } from '../../../utils/examples'; import { ApiService } from '../../../services/api.service'; -import { MatDialog } from '@angular/material'; +import { MatDialog, MatSnackBar } from '@angular/material'; import { ShareComponent } from './share/share.component'; import { ExamplesComponent } from './examples/examples.component'; import { ActivatedRoute } from '@angular/router'; @@ -36,6 +36,7 @@ export class EditorComponent implements AfterViewInit, OnDestroy { constructor( private apiService: ApiService, private dialog: MatDialog, + private snackbar: MatSnackBar, private route: ActivatedRoute, ) { } @@ -63,12 +64,20 @@ export class EditorComponent implements AfterViewInit, OnDestroy { if (this.subscription) { this.subscription.unsubscribe(); } + + this.snackbar.dismiss(); } run() { - this.apiService.executeCode(this.codeElement.nativeElement.innerText).subscribe((output) => { - this.output = output; - }); + this.apiService.executeCode(this.codeElement.nativeElement.innerText) + .subscribe( + (output) => { + this.output = output; + }, + (error) => { + this.snackbar.open(error.error); + } + ); } share() { diff --git a/src/app/utils/examples.ts b/src/app/utils/examples.ts index 90eb74143..9b2fb5cae 100644 --- a/src/app/utils/examples.ts +++ b/src/app/utils/examples.ts @@ -3,6 +3,10 @@ export const programs = [ id: 1, name: 'Hello world', code: ` +// Edit the following code as you please +// You can execute it using the "play" button in the top-right corner +// If you don't know where to start, take a look at our examples + package main func main () () { From 3f46bbd07f63aa6a239f1f54046de2f5085a47f1 Mon Sep 17 00:00:00 2001 From: mahansky Date: Wed, 20 Mar 2019 03:52:26 +0100 Subject: [PATCH 13/14] Content fix --- src/assets/content/home.md | 2 +- src/assets/content/installation.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/assets/content/home.md b/src/assets/content/home.md index 8015a3bbf..a60eca570 100644 --- a/src/assets/content/home.md +++ b/src/assets/content/home.md @@ -1,4 +1,4 @@ -## Latest release: CX v0.6 +# Latest release: CX v0.6 **Serialization** diff --git a/src/assets/content/installation.md b/src/assets/content/installation.md index 27ebf13cb..847a15639 100644 --- a/src/assets/content/installation.md +++ b/src/assets/content/installation.md @@ -124,7 +124,7 @@ Don't get GCC through Cygwin; apparently, [Cygwin has compatibility issues with Go](https://github.com/golang/go/issues/7265#issuecomment-66091041). Users have reported that using either [MingW](http://www.mingw.org/) -or [tdm-gcc](tdm-gcc.tdragon.net(), where tdm-gcc seems to be the +or [tdm-gcc](http://tdm-gcc.tdragon.net), where tdm-gcc seems to be the easiest way. ## Installing CX From 3fed9dbb224725a31fa9b533cb133352c98306db Mon Sep 17 00:00:00 2001 From: mahansky Date: Wed, 20 Mar 2019 03:53:46 +0100 Subject: [PATCH 14/14] Style fixes --- .../layout/footer/footer.component.scss | 3 ++- .../components/pages/book/book.component.scss | 6 +---- .../pages/content/content.component.scss | 25 +++++++++++++------ .../components/pages/home/home.component.scss | 19 ++++++++++---- src/styles.scss | 16 ++++++++++++ 5 files changed, 51 insertions(+), 18 deletions(-) diff --git a/src/app/components/layout/footer/footer.component.scss b/src/app/components/layout/footer/footer.component.scss index 10d1c0564..451afee2a 100644 --- a/src/app/components/layout/footer/footer.component.scss +++ b/src/app/components/layout/footer/footer.component.scss @@ -2,7 +2,8 @@ footer { background: $blue-dark; - padding: 60px 0; + padding: 90px 0 60px; + margin-top: -30px; .links, .social { display: flex; diff --git a/src/app/components/pages/book/book.component.scss b/src/app/components/pages/book/book.component.scss index 3fa6c8644..2aae227f4 100644 --- a/src/app/components/pages/book/book.component.scss +++ b/src/app/components/pages/book/book.component.scss @@ -1,11 +1,7 @@ @import 'variables'; main { - width: 100%; - background-color: $white; - padding: 30px; - box-shadow: 0 2px 2px 0 rgba(0,0,0,0.2); - box-sizing: border-box; + padding-bottom: 0; .heading { display: flex; diff --git a/src/app/components/pages/content/content.component.scss b/src/app/components/pages/content/content.component.scss index e75e97a69..1e07c7822 100644 --- a/src/app/components/pages/content/content.component.scss +++ b/src/app/components/pages/content/content.component.scss @@ -1,12 +1,18 @@ @import 'variables'; -main { - width: 100%; - background-color: $white; - padding: 30px; - box-shadow: 0 2px 2px 0 rgba(0,0,0,0.2); - box-sizing: border-box; - min-height: 400px; +.container { + position: relative; + z-index: 10; +} + +main ::ng-deep { + & > *:last-child { + margin-bottom: -30px; + } + + & > *:last-child:not(pre) { + margin-bottom: inherit; + } } ::ng-deep { @@ -26,6 +32,10 @@ main { p { margin-bottom: 10px; color: $text; + + &:last-child { + margin-bottom: 0; + } } ul { @@ -77,6 +87,7 @@ main { img { max-width: 100%; + display: block; } h1, h2, h3, h4, h5, h6 { diff --git a/src/app/components/pages/home/home.component.scss b/src/app/components/pages/home/home.component.scss index daecaf964..28f562b8f 100644 --- a/src/app/components/pages/home/home.component.scss +++ b/src/app/components/pages/home/home.component.scss @@ -22,6 +22,10 @@ } .buttons { + display: flex; + flex-direction: column; + align-items: center; + a { display: block; color: $blue; @@ -44,16 +48,15 @@ @media (max-width: map-get($bp, sm)) { flex-direction: column; - padding: 30px; + padding: 30px 30px 15px; margin-top: 0; .buttons { - align-items: center; - display: flex; + align-items: flex-start; margin-top: 30px; a.primary { - margin-bottom: 0; + margin-bottom: 15px; } } } @@ -116,7 +119,13 @@ @media (max-width: map-get($bp, sm)) { padding: 30px; - margin-top: 0; + margin: 0; + } + + ::ng-deep main ::ng-deep { + h1 { + font-size: 20px; + } } ::ng-deep main { diff --git a/src/styles.scss b/src/styles.scss index 4b2294200..b3bd06820 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -38,6 +38,22 @@ html, body { line-height: 1; } +main { + width: 100%; + background-color: $white; + padding: 30px; + box-shadow: 0 2px 2px 0 rgba(0,0,0,0.2); + box-sizing: border-box; + min-height: 500px; + position: relative; + z-index: 100; +} + +app-home + app-footer footer { + padding-top: 60px !important; + margin-top: 0 !important; +} + p { line-height: 1.5; }