avancée Hugo periode alternance (langues + editeur)

pull/3/head
Hugo PRADIER 1 year ago
parent 70f1000eff
commit 5c986142c5

@ -91,5 +91,8 @@
} }
} }
} }
},
"cli": {
"analytics": false
} }
} }

69
package-lock.json generated

@ -17,7 +17,11 @@
"@angular/platform-browser": "^17.0.1", "@angular/platform-browser": "^17.0.1",
"@angular/platform-browser-dynamic": "^17.0.1", "@angular/platform-browser-dynamic": "^17.0.1",
"@angular/router": "^17.0.1", "@angular/router": "^17.0.1",
"@ctrl/ngx-codemirror": "^7.0.0",
"@emailjs/browser": "^3.11.0", "@emailjs/browser": "^3.11.0",
"@ngx-translate/core": "^15.0.0",
"@ngx-translate/http-loader": "^8.0.0",
"codemirror": "^5.65.16",
"rxjs": "~7.8.1", "rxjs": "~7.8.1",
"tslib": "^2.6.2", "tslib": "^2.6.2",
"zone.js": "~0.14.2" "zone.js": "~0.14.2"
@ -2197,6 +2201,20 @@
"node": ">=0.1.90" "node": ">=0.1.90"
} }
}, },
"node_modules/@ctrl/ngx-codemirror": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/@ctrl/ngx-codemirror/-/ngx-codemirror-7.0.0.tgz",
"integrity": "sha512-qvIWtSTw/8fdXDnofBTX6LmTW9646HhawG2+Qyagf1vH40jCy0ZbHnkC20UYOVpUX+QCd1e/PQpkvWQ/1iGFzQ==",
"dependencies": {
"@types/codemirror": "^5.60.7",
"tslib": "^2.3.0"
},
"peerDependencies": {
"@angular/core": ">=16.0.0-0",
"@angular/forms": ">=16.0.0-0",
"codemirror": "^5.65.9"
}
},
"node_modules/@discoveryjs/json-ext": { "node_modules/@discoveryjs/json-ext": {
"version": "0.5.7", "version": "0.5.7",
"resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
@ -2788,6 +2806,33 @@
"webpack": "^5.54.0" "webpack": "^5.54.0"
} }
}, },
"node_modules/@ngx-translate/core": {
"version": "15.0.0",
"resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-15.0.0.tgz",
"integrity": "sha512-Am5uiuR0bOOxyoercDnAA3rJVizo4RRqJHo8N3RqJ+XfzVP/I845yEnMADykOHvM6HkVm4SZSnJBOiz0Anx5BA==",
"engines": {
"node": "^16.13.0 || >=18.10.0"
},
"peerDependencies": {
"@angular/common": ">=16.0.0",
"@angular/core": ">=16.0.0",
"rxjs": "^6.5.5 || ^7.4.0"
}
},
"node_modules/@ngx-translate/http-loader": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-8.0.0.tgz",
"integrity": "sha512-SFMsdUcmHF5OdZkL1CHEoSAwbP5EbAOPTLLboOCRRoOg21P4GJx+51jxGdJeGve6LSKLf4Pay7BkTwmE6vxYlg==",
"engines": {
"node": "^16.13.0 || >=18.10.0"
},
"peerDependencies": {
"@angular/common": ">=16.0.0",
"@angular/core": ">=16.0.0",
"@ngx-translate/core": ">=15.0.0",
"rxjs": "^6.5.5 || ^7.4.0"
}
},
"node_modules/@nodelib/fs.scandir": { "node_modules/@nodelib/fs.scandir": {
"version": "2.1.5", "version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@ -3158,6 +3203,14 @@
"@types/node": "*" "@types/node": "*"
} }
}, },
"node_modules/@types/codemirror": {
"version": "5.60.15",
"resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.15.tgz",
"integrity": "sha512-dTOvwEQ+ouKJ/rE9LT1Ue2hmP6H1mZv5+CCnNWu2qtiOe2LQa9lCprEY20HxiDmV/Bxh+dXjywmy5aKvoGjULA==",
"dependencies": {
"@types/tern": "*"
}
},
"node_modules/@types/connect": { "node_modules/@types/connect": {
"version": "3.4.38", "version": "3.4.38",
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
@ -3215,8 +3268,7 @@
"node_modules/@types/estree": { "node_modules/@types/estree": {
"version": "1.0.5", "version": "1.0.5",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw=="
"dev": true
}, },
"node_modules/@types/express": { "node_modules/@types/express": {
"version": "4.17.21", "version": "4.17.21",
@ -3350,6 +3402,14 @@
"@types/node": "*" "@types/node": "*"
} }
}, },
"node_modules/@types/tern": {
"version": "0.23.9",
"resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz",
"integrity": "sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==",
"dependencies": {
"@types/estree": "*"
}
},
"node_modules/@types/ws": { "node_modules/@types/ws": {
"version": "8.5.9", "version": "8.5.9",
"resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.9.tgz", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.9.tgz",
@ -4706,6 +4766,11 @@
"node": ">=6" "node": ">=6"
} }
}, },
"node_modules/codemirror": {
"version": "5.65.16",
"resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.16.tgz",
"integrity": "sha512-br21LjYmSlVL0vFCPWPfhzUCT34FM/pAdK7rRIZwa0rrtrIdotvP4Oh4GUHsu2E3IrQMCfRkL/fN3ytMNxVQvg=="
},
"node_modules/color-convert": { "node_modules/color-convert": {
"version": "1.9.3", "version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",

@ -19,7 +19,11 @@
"@angular/platform-browser": "^17.0.1", "@angular/platform-browser": "^17.0.1",
"@angular/platform-browser-dynamic": "^17.0.1", "@angular/platform-browser-dynamic": "^17.0.1",
"@angular/router": "^17.0.1", "@angular/router": "^17.0.1",
"@ctrl/ngx-codemirror": "^7.0.0",
"@emailjs/browser": "^3.11.0", "@emailjs/browser": "^3.11.0",
"@ngx-translate/core": "^15.0.0",
"@ngx-translate/http-loader": "^8.0.0",
"codemirror": "^5.65.16",
"rxjs": "~7.8.1", "rxjs": "~7.8.1",
"tslib": "^2.6.2", "tslib": "^2.6.2",
"zone.js": "~0.14.2" "zone.js": "~0.14.2"

@ -1,4 +1,5 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
@Component({ @Component({
selector: 'app-root', selector: 'app-root',
@ -6,5 +7,4 @@ import { Component } from '@angular/core';
styleUrls: ['./app.component.css'] styleUrls: ['./app.component.css']
}) })
export class AppComponent { export class AppComponent {
} }

@ -12,7 +12,13 @@ import { DocumentationComponent } from './documentation/documentation.component'
import { FormComponent } from './form/form.component'; import { FormComponent } from './form/form.component';
import { ReactiveFormsModule } from '@angular/forms'; import { ReactiveFormsModule } from '@angular/forms';
import { FormsModule } from '@angular/forms';
import { CodemirrorModule } from '@ctrl/ngx-codemirror';
import { HttpClient, HttpClientModule } from '@angular/common/http';
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
import { TranslationService } from './service/translation.service';
@NgModule({ @NgModule({
declarations: [ declarations: [
@ -28,9 +34,30 @@ import { ReactiveFormsModule } from '@angular/forms';
imports: [ imports: [
BrowserModule, BrowserModule,
AppRoutingModule, AppRoutingModule,
ReactiveFormsModule ReactiveFormsModule,
FormsModule,
CodemirrorModule,
// Injection des HttpClient pour notre module de traduction
HttpClientModule,
// Initialisation du module de traduction
TranslateModule.forRoot({
// Manière dont on charge les fichiers de traduction
loader: {
provide: TranslateLoader,
// On utiilise une fonction pour charger les fichiers de traduction
useFactory: (createTranslateLoader),
// deps permets de savoir ce dont on a besoin pour charger les fichiers de traduction
deps: [HttpClient]
},
defaultLanguage: 'fr'
})
], ],
providers: [], providers: [TranslationService],
bootstrap: [AppComponent] bootstrap: [AppComponent]
}) })
export class AppModule { } export class AppModule { }
// On crée une fonction pour charger les fichiers de traduction
export function createTranslateLoader(http: HttpClient) {
return new TranslateHttpLoader(http, './assets/i18n/', '.json'); // On charge les fichiers de traduction depuis le dossier assets/i18n
}

@ -1,9 +1,4 @@
.code_input { .ngx-codemirror {
padding: 2rem; border: 1px solid #060202;
} padding-top: 10px;
.code_input .code_input_textarea {
background-color: #cccccc;
min-height: 80vh;
width: 100%;
} }

@ -1,13 +1,39 @@
<div class="code_input"> <div>
<textarea <div>
class="code_input_textarea" <ngx-codemirror
id="code_input" [options]="{
name="code_input" theme: 'material',
placeholder="Enter your code here..." lineNumbers: true,
></textarea> lineWrapping: true,
<button (click)="onRunButtonClicked()" [disabled]="isLoaded">Run</button> mode: mode,
autofocus: true
}"
[ngModel]="defaults[mode]"
[autoFocus]="true"
(ngModelChange)="handleChange($event)"
></ngx-codemirror>
</div>
<div>
<label for="language">Langage de programmation</label>
<select
id="language"
name="language"
[(ngModel)]="mode"
(ngModelChange)="changeMode()"
>
<option value="text/typescript">TypeScript</option>
<option value="markdown">Markdown</option>
</select>
</div>
<div>
<button type="button" (click)="clear()">Remettre à zéro</button>
</div>
<button (click)="onRunButtonClicked()" [disabled]="isLoaded">Lancer</button>
<div *ngIf="!isLoaded"> <div *ngIf="!isLoaded">
<p>Loading: {{ loadingProgress }}%</p> <p>Chargement: {{ loadingProgress }}%</p>
<div class="loading-bar" [style.width.%]="loadingProgress"></div> <div class="loading-bar" [style.width.%]="loadingProgress"></div>
</div> </div>
</div> </div>

@ -1,6 +1,18 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router'; import { Router } from '@angular/router';
// Exemple de code pour chaque langage
const defaults = {
markdown:
'# Sankasten\n\nProjet **SAE 3A** par _FRIZOT, MAZINGUE, OLLIER, FREVILLE ET PRADIER_ text\nGit [Sankasten WEB](https://codefirst.iut.uca.fr/git/sandkasten/sandkasten-web.git)',
'text/typescript': `const component = {
name: "@exemple/Typescript",
author: "Sandkasten",
repo: "https://codefirst.iut.uca.fr/git/sandkasten/sandkasten-web.git"
};
const hello: string = 'Bonjour ceci est un test de code en typescript';`
};
@Component({ @Component({
selector: 'app-editor', selector: 'app-editor',
templateUrl: './editor.component.html', templateUrl: './editor.component.html',
@ -10,12 +22,38 @@ export class EditorComponent implements OnInit{
loadingProgress: number = 0; // Pour suivre la progression du chargement loadingProgress: number = 0; // Pour suivre la progression du chargement
isLoaded: boolean = false; // Pour vérifier si le chargement est terminé isLoaded: boolean = false; // Pour vérifier si le chargement est terminé
// Mode par défaut
mode: keyof typeof defaults = 'text/typescript';
options = {
lineNumbers: true,
mode: this.mode,
};
defaults = defaults;
constructor(private router: Router){} constructor(private router: Router){}
ngOnInit(): void { ngOnInit(): void {
} }
// Change le langage de l'éditeur
changeMode(): void {
this.options = {
...this.options,
mode: this.mode,
};
}
// Affiche le contenu de l'éditeur
handleChange($event: Event): void {
console.log('ngModelChange', $event);
}
// Efface le contenu de l'éditeur
clear(): void {
this.defaults[this.mode] = '';
}
// Si click sur "Run", on redirige vers la page d'output // Si click sur "Run", on redirige vers la page d'output
onRunButtonClicked() { onRunButtonClicked() {
this.loadingProgress = 0; this.loadingProgress = 0;
@ -32,4 +70,5 @@ export class EditorComponent implements OnInit{
} }
}, 50); // Augmenter la valeur pour ralentir la progression du chargement si nécessaire }, 50); // Augmenter la valeur pour ralentir la progression du chargement si nécessaire
} }
} }

@ -11,42 +11,41 @@
[routerLinkActiveOptions]="{ exact: true }" [routerLinkActiveOptions]="{ exact: true }"
[src]="sandkasten_logo" alt="Logo-Sandkasten" /> [src]="sandkasten_logo" alt="Logo-Sandkasten" />
<div class="title">Sandkasten</div> <div class="title">Sandkasten</div>
<div class="copyright">©2023 Sandkasten, Inc. All Rights Reserved</div> <div class="copyright">{{ 'FooterPage.Rights' | translate}}</div>
</div> </div>
<!-- Navigation--> <!-- Navigation-->
<div class="navigation"> <div class="navigation">
<div class="about"> <div class="about">
<span class="title">ABOUT SANDKASTEN</span> <span class="title">{{ 'FooterPage.About' | translate}}</span>
<div class="links"> <div class="links">
<!-- TODO - Add the router links --> <!-- TODO - Add the router links -->
<a <a
routerLink="" routerLink=""
routerLinkActive="active" routerLinkActive="active"
[routerLinkActiveOptions]="{ exact: true }" [routerLinkActiveOptions]="{ exact: true }"
>Our story</a> >{{ 'FooterPage.Story' | translate}}</a>
<a <a
routerLink="" routerLink=""
routerLinkActive="active" routerLinkActive="active"
[routerLinkActiveOptions]="{ exact: true }" [routerLinkActiveOptions]="{ exact: true }"
>Contact us</a> >{{ 'FooterPage.Contact' | translate}}</a>
</div> </div>
</div> </div>
<div class="legals"> <div class="legals">
<span class="title">LEGAL</span> <span class="title">{{ 'FooterPage.Legal' | translate}}</span>
<div class="links"> <div class="links">
<!-- TODO - Add the router links -->
<a <a
routerLink="" routerLink=""
routerLinkActive="active" routerLinkActive="active"
[routerLinkActiveOptions]="{ exact: true }" [routerLinkActiveOptions]="{ exact: true }"
>Terms of service</a> >{{ 'FooterPage.Terms' | translate}}</a>
<a <a
routerLink="" routerLink=""
routerLinkActive="active" routerLinkActive="active"
[routerLinkActiveOptions]="{ exact: true }" [routerLinkActiveOptions]="{ exact: true }"
>Privacy</a> >{{ 'FooterPage.Privacy' | translate}}</a>
</div> </div>
</div> </div>
</div> </div>
@ -54,7 +53,7 @@
<!-- Socials--> <!-- Socials-->
<div class="socials"> <div class="socials">
<!-- TODO - Add the socials icons--> <!-- TODO - Add the socials icons-->
<div>Socials</div> <div>{{ 'FooterPage.Social' | translate}}</div>
</div> </div>
</div> </div>

@ -16,31 +16,40 @@
routerLink="" routerLink=""
routerLinkActive="active" routerLinkActive="active"
[routerLinkActiveOptions]="{ exact: true }" [routerLinkActiveOptions]="{ exact: true }"
>Accueil</a> >{{ 'HeaderPage.Home' | translate }} </a>
<a <a
routerLink="editor" routerLink="editor"
routerLinkActive="active" routerLinkActive="active"
[routerLinkActiveOptions]="{ exact: true }" [routerLinkActiveOptions]="{ exact: true }"
>Editeur</a> >{{ 'HeaderPage.Editor' | translate }}</a>
<a <a
routerLink="documentation" routerLink="documentation"
routerLinkActive="active" routerLinkActive="active"
[routerLinkActiveOptions]="{ exact: true }" [routerLinkActiveOptions]="{ exact: true }"
>Documentation</a> >{{ 'HeaderPage.Documentation' | translate }}</a>
<a <a
routerLink="contact" routerLink="contact"
routerLinkActive="active" routerLinkActive="active"
[routerLinkActiveOptions]="{ exact: true }" [routerLinkActiveOptions]="{ exact: true }"
>Contact</a> >{{ 'HeaderPage.Contact' | translate }}</a>
</nav> </nav>
</div> </div>
<div class="right_part"> <div class="right_part">
<p>{{ 'HeaderPage.Language' | translate }}
<select (change)="onLanguageChange($event)">
<option value="fr">Français</option>
<option value="en">English</option>
</select>
<img [src]="getFlagImageUrl()" alt="Language Flag" width="50" height="30" />
</p>
<a href="https://codefirst.iut.uca.fr/git/sandkasten" <a href="https://codefirst.iut.uca.fr/git/sandkasten"
class="gitea_logo_container"> class="gitea_logo_container">
<img class="gitea-logo" <img class="gitea-logo"

@ -1,6 +1,7 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import {BreakpointObserver, Breakpoints} from '@angular/cdk/layout'; import {BreakpointObserver, Breakpoints} from '@angular/cdk/layout';
import {Router} from "@angular/router"; import {Router} from "@angular/router";
import { TranslationService } from '../service/translation.service';
@Component({ @Component({
selector: 'app-header', selector: 'app-header',
@ -20,28 +21,16 @@ export class HeaderComponent implements OnInit {
this.gitea_logo = 'assets/img/gitea.png'; this.gitea_logo = 'assets/img/gitea.png';
} }
} // Instanciation du service pour les actions de traduction
constructor(private translationService: TranslationService) {}
// Méthode pour changer la langue
onLanguageChange(event: any) {
this.translationService.onLanguageChange(event);
}
// export class ResponsiveComponent implements OnInit { // Méthode pour récupérer le drapeau de la langue courante
// getFlagImageUrl(): string {
// isPhonePortrait = false; return this.translationService.getFlagImageUrl();
// }
// constructor(private responsive: BreakpointObserver) { }
//
// }
//
// ngOnInit() {
//
// this.responsive.observe(Breakpoints.HandsetPortrait)
// .subscribe(result => {
//
// this.isPhonePortrait = false;
//
// if (result.matches) {
// this.isPhonePortrait = true;
// }
//
// });
//
// }
// }

@ -1,12 +1,11 @@
<div class="landing-block"> <div class="landing-block">
<div class="hero-container"> <div class="hero-container">
<h2 class="hero-title">Bienvenue sur Sandkasten !</h2> <h2 class="hero-title">{{ 'LandingPage.Welcome' | translate}}</h2>
<span class="hero-text">Vous voici arriver sur le meilleur site bac à sable de test de code ! Nous vous permettons de tester tous vos programmes sur vos langages préférés. grâce à léditeur Monaco et à notre gestion personalisée de léxecution sur des conteneurs, votre code devient complétement innoffencif et vous pouvez donc vous amusez autant que vous le souhaitez !</span> <span class="hero-text">{{ 'LandingPage.Description' | translate}}</span>
</div> </div>
<div class="landing-links"> <div class="landing-links">
<div class="button-container"> <div class="button-container">
<a class="animated-button" (click)="onContinue()">Try it now !</a> <a class="animated-button" (click)="onContinue()">{{ 'LandingPage.Try' | translate}}</a>
</div> </div>
</div> </div>
</div> </div>

@ -0,0 +1,21 @@
import { Injectable } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
@Injectable({
providedIn: 'root',
})
export class TranslationService {
language: string = 'fr'; // Par défaut, français
constructor(private translate: TranslateService) {}
onLanguageChange(event: any) {
this.language = event.target.value;
this.translate.use(this.language);
console.log(this.language);
}
getFlagImageUrl(): string {
return `../../assets/img/${this.language}_flag.jpg`;
}
}

@ -0,0 +1,24 @@
{
"LandingPage": {
"Welcome" : "Welcome to Sandkasten",
"Description" : "You've arrived at the best code testing sandbox site! We let you test all your programs in your favorite languages. Thanks to the Code Mirror editor and our personalized management of execution on containers, your code becomes completely harmless, so you can have as much fun as you like!",
"Try" : "Try it now !"
},
"HeaderPage": {
"Language" : "You can choose your language here :",
"Home" : "Home",
"Editor" : "Editor",
"Documentation" : "Documentation",
"Contact" : "Contact us"
},
"FooterPage": {
"About" : "About Sandkasten",
"Contact" : "Contact us",
"Story" : "Our story",
"Legal" : "Legal mentions",
"Terms" : "Terms of use",
"Privacy" : "Privacy policy",
"Rights" : "©2023 Sandkasten, Inc. All rights reserved.",
"Social" : "Follow us on social networks :"
}
}

@ -0,0 +1,24 @@
{
"LandingPage": {
"Welcome" : "Bienvenue sur Sandkasten",
"Description" : "Vous voici arrivé sur le meilleur site bac à sable de test de code ! Nous vous permettons de tester tous vos programmes sur vos langages préférés. Grâce à léditeur Code Mirror et à notre gestion personalisée de lexécution sur des conteneurs, votre code devient complétement inoffensif et vous pouvez donc vous amusez autant que vous le souhaitez !",
"Try" : "Essayez maintenant !"
},
"HeaderPage": {
"Language" : "Vous pouvez choisir votre langage ici :",
"Home" : "Accueil",
"Editor" : "Éditeur",
"Documentation" : "Documentation",
"Contact" : "Nous contacter"
},
"FooterPage": {
"About" : "À propos de Sandkasten",
"Contact" : "Nous contacter",
"Story" : "Notre histoire",
"Legal" : "Mentions légales",
"Terms" : "Conditions d'utilisation",
"Privacy" : "Politique de confidentialité",
"Rights" : "©2023 Sandkasten, Inc. Tous droits réservés",
"Social" : "Suivez-nous sur les réseaux sociaux !"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 KiB

@ -1,7 +1,9 @@
import 'codemirror/mode/javascript/javascript';
import 'codemirror/mode/markdown/markdown';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module'; import { AppModule } from './app/app.module';
platformBrowserDynamic().bootstrapModule(AppModule) platformBrowserDynamic().bootstrapModule(AppModule)
.catch(err => console.error(err)); .catch(err => console.error(err));

@ -1,25 +1,10 @@
@import 'codemirror/lib/codemirror.css';
@import 'codemirror/theme/material.css';
* { * {
font-family: Roboto, Helvetica, sans-serif; font-family: Roboto, Helvetica, sans-serif;
} }
body { body {
margin: 0; margin: 0;
} }
/*button {*/
/* background-color: #1dd21d;*/
/* border-radius: 10px;*/
/* box-sizing: border-box;*/
/* padding: 5px 10px;*/
/* border: none;*/
/* box-shadow: lightgray 3px 3px 7px;*/
/* margin-right: 20px;*/
/* outline: none;*/
/* font-size: 20px;*/
/* font-weight: 500;*/
/* &:active {*/
/* transform: translate(1px, 1px);*/
/* box-shadow: lightgray 0 0 5px;*/
/* }*/
/*}*/

Loading…
Cancel
Save