Commit e10438c1 authored by wangxin's avatar wangxin

publish

parent fa703d42
<div class="model-content"> <div class="model-content">
<input nz-input [(ngModel)]="item.text" (blur)="save()" />
<div style="padding: 10px;">
<div style="width: 300px;" align='center'>
<span>图1: </span>
<app-upload-image-with-preview
[picUrl]="item.pic_url"
(imageUploaded)="onImageUploadSuccess($event, 'pic_url')">
</app-upload-image-with-preview>
</div>
<div style="width: 300px; margin-top: 5px;" align='center'>
<span>图2: </span>
<app-upload-image-with-preview
[picUrl]="item.pic_url_2"
(imageUploaded)="onImageUploadSuccess($event, 'pic_url_2')">
</app-upload-image-with-preview>
</div>
<div style="width: 300px; margin-top: 15px;">
<span>文本: </span>
<input type="text" nz-input [(ngModel)]="item.text" (blur)="save()">
</div>
<div style="margin-top: 5px">
<span>音频: </span>
<app-audio-recorder
[audioUrl]="item.audio_url"
(audioUploaded)="onAudioUploadSuccess($event, 'audio_url')"
></app-audio-recorder>
</div>
</div>
</div> </div>
import { Component, EventEmitter, Input, OnDestroy, OnChanges, OnInit, Output, ApplicationRef, ChangeDetectorRef } from '@angular/core'; import {
import { JsonPipe } from '@angular/common'; Component,
EventEmitter,
Input,
OnDestroy,
OnChanges,
OnInit,
Output,
ApplicationRef,
ChangeDetectorRef,
} from "@angular/core";
import { JsonPipe } from "@angular/common";
@Component({ @Component({
selector: 'app-form', selector: "app-form",
templateUrl: './form.component.html', templateUrl: "./form.component.html",
styleUrls: ['./form.component.css'] styleUrls: ["./form.component.css"],
}) })
export class FormComponent implements OnInit, OnChanges, OnDestroy { export class FormComponent implements OnInit, OnChanges, OnDestroy {
// 储存数据用 // 储存数据用
saveKey = "test_001"; saveKey = "test_001";
// 储存对象 // 储存对象
item; item;
constructor(private appRef: ApplicationRef, private changeDetectorRef: ChangeDetectorRef) { constructor(
private appRef: ApplicationRef,
} private changeDetectorRef: ChangeDetectorRef
) {}
createShell() { createShell() {
this.item.wordList.push({ this.item.wordList.push({
word: '', word: "",
audio: '', audio: "",
backWord: '', backWord: "",
backWordAudio: '', backWordAudio: "",
}); });
this.save(); this.save();
} }
...@@ -34,12 +43,10 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy { ...@@ -34,12 +43,10 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy {
} }
ngOnInit() { ngOnInit() {
this.item = {}; this.item = {};
// 获取存储的数据 // 获取存储的数据
(<any>window).courseware.getData((data) => { (<any>window).courseware.getData((data) => {
if (data) { if (data) {
this.item = data; this.item = data;
} }
...@@ -48,27 +55,20 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy { ...@@ -48,27 +55,20 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy {
this.changeDetectorRef.markForCheck(); this.changeDetectorRef.markForCheck();
this.changeDetectorRef.detectChanges(); this.changeDetectorRef.detectChanges();
this.refresh(); this.refresh();
}, this.saveKey); }, this.saveKey);
} }
ngOnChanges() { ngOnChanges() {}
}
ngOnDestroy() {
}
init() { ngOnDestroy() {}
}
init() {}
/** /**
* 储存图片数据 * 储存图片数据
* @param e * @param e
*/ */
onImageUploadSuccess(e, key) { onImageUploadSuccess(e, key) {
this.item[key] = e.url; this.item[key] = e.url;
this.save(); this.save();
} }
...@@ -99,7 +99,7 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy { ...@@ -99,7 +99,7 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy {
(<any>window).courseware.setData(this.item, null, this.saveKey); (<any>window).courseware.setData(this.item, null, this.saveKey);
this.refresh(); this.refresh();
console.log('this.item = ' + JSON.stringify(this.item)); console.log("this.item = " + JSON.stringify(this.item));
} }
/** /**
...@@ -110,5 +110,4 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy { ...@@ -110,5 +110,4 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy {
this.appRef.tick(); this.appRef.tick();
}, 1); }, 1);
} }
} }
import {Component, ElementRef, ViewChild, OnInit, Input, OnDestroy, HostListener} from '@angular/core';
import { import {
Label, Component,
MySprite, tweenChange, ElementRef,
ViewChild,
} from './Unit'; OnInit,
import {res, resAudio} from './resources'; Input,
OnDestroy,
import {Subject} from 'rxjs'; HostListener,
import {debounceTime} from 'rxjs/operators'; } from "@angular/core";
import TWEEN from '@tweenjs/tween.js';
import { Label, MySprite, tweenChange } from "./Unit";
import { res, resAudio } from "./resources";
import { Subject } from "rxjs";
import { debounceTime } from "rxjs/operators";
import TWEEN from "@tweenjs/tween.js";
@Component({ @Component({
selector: 'app-play', selector: "app-play",
templateUrl: './play.component.html', templateUrl: "./play.component.html",
styleUrls: ['./play.component.css'] styleUrls: ["./play.component.css"],
}) })
export class PlayComponent implements OnInit, OnDestroy { export class PlayComponent implements OnInit, OnDestroy {
@ViewChild("canvas", { static: true }) canvas: ElementRef;
@ViewChild('canvas', {static: true }) canvas: ElementRef; @ViewChild("wrap", { static: true }) wrap: ElementRef;
@ViewChild('wrap', {static: true }) wrap: ElementRef;
// 数据 // 数据
data; data;
...@@ -39,7 +39,6 @@ export class PlayComponent implements OnInit, OnDestroy { ...@@ -39,7 +39,6 @@ export class PlayComponent implements OnInit, OnDestroy {
mx; // 点击x坐标 mx; // 点击x坐标
my; // 点击y坐标 my; // 点击y坐标
// 资源 // 资源
rawImages = new Map(res); rawImages = new Map(res);
rawAudios = new Map(resAudio); rawAudios = new Map(resAudio);
...@@ -57,8 +56,7 @@ export class PlayComponent implements OnInit, OnDestroy { ...@@ -57,8 +56,7 @@ export class PlayComponent implements OnInit, OnDestroy {
canvasLeft; canvasLeft;
canvasTop; canvasTop;
saveKey = 'test_0011'; saveKey = "test_001";
btnLeft; btnLeft;
btnRight; btnRight;
...@@ -69,27 +67,25 @@ export class PlayComponent implements OnInit, OnDestroy { ...@@ -69,27 +67,25 @@ export class PlayComponent implements OnInit, OnDestroy {
curPic; curPic;
@HostListener('window:resize', ['$event']) @HostListener("window:resize", ["$event"])
onResize(event) { onResize(event) {
this.winResizeEventStream.next(); this.winResizeEventStream.next();
} }
ngOnInit() { ngOnInit() {
this.data = {}; this.data = {};
// 获取数据 // 获取数据
const getData = (<any> window).courseware.getData; const getData = (<any>window).courseware.getData;
getData((data) => { getData((data) => {
console.log("data:", data);
if (data && typeof data == 'object') { if (data && typeof data == "object") {
this.data = data; this.data = data;
} }
// console.log('data:' , data); console.log("data:", data);
// 初始化 各事件监听 // 初始化 各事件监听
this.initListener(); // this.initListener();
// 若无数据 则为预览模式 需要填充一些默认数据用来显示 // 若无数据 则为预览模式 需要填充一些默认数据用来显示
this.initDefaultData(); this.initDefaultData();
...@@ -100,19 +96,15 @@ export class PlayComponent implements OnInit, OnDestroy { ...@@ -100,19 +96,15 @@ export class PlayComponent implements OnInit, OnDestroy {
this.initImg(); this.initImg();
// 开始预加载资源 // 开始预加载资源
this.load(); this.load();
}, this.saveKey); }, this.saveKey);
} }
ngOnDestroy() { ngOnDestroy() {
window['curCtx'] = null; window["curCtx"] = null;
window.cancelAnimationFrame(this.animationId); window.cancelAnimationFrame(this.animationId);
} }
load() { load() {
// 预加载资源 // 预加载资源
this.loadResources().then(() => { this.loadResources().then(() => {
window["air"].hideAirClassLoading(this.saveKey, this.data); window["air"].hideAirClassLoading(this.saveKey, this.data);
...@@ -121,9 +113,7 @@ export class PlayComponent implements OnInit, OnDestroy { ...@@ -121,9 +113,7 @@ export class PlayComponent implements OnInit, OnDestroy {
}); });
} }
init() { init() {
this.initCtx(); this.initCtx();
this.initData(); this.initData();
this.initView(); this.initView();
...@@ -135,19 +125,13 @@ export class PlayComponent implements OnInit, OnDestroy { ...@@ -135,19 +125,13 @@ export class PlayComponent implements OnInit, OnDestroy {
this.canvas.nativeElement.width = this.wrap.nativeElement.clientWidth; this.canvas.nativeElement.width = this.wrap.nativeElement.clientWidth;
this.canvas.nativeElement.height = this.wrap.nativeElement.clientHeight; this.canvas.nativeElement.height = this.wrap.nativeElement.clientHeight;
this.ctx = this.canvas.nativeElement.getContext("2d");
this.ctx = this.canvas.nativeElement.getContext('2d');
this.canvas.nativeElement.width = this.canvasWidth; this.canvas.nativeElement.width = this.canvasWidth;
this.canvas.nativeElement.height = this.canvasHeight; this.canvas.nativeElement.height = this.canvasHeight;
window['curCtx'] = this.ctx; window["curCtx"] = this.ctx;
} }
updateItem(item) { updateItem(item) {
if (item) { if (item) {
item.update(); item.update();
...@@ -163,115 +147,7 @@ export class PlayComponent implements OnInit, OnDestroy { ...@@ -163,115 +147,7 @@ export class PlayComponent implements OnInit, OnDestroy {
} }
} }
initListener() {
this.winResizeEventStream
.pipe(debounceTime(500))
.subscribe(data => {
this.renderAfterResize();
});
// ---------------------------------------------
const setParentOffset = () => {
const rect = this.canvas.nativeElement.getBoundingClientRect();
this.canvasLeft = rect.left;
this.canvasTop = rect.top;
};
const setMxMyByTouch = (event) => {
if (event.touches.length <= 0) {
return;
}
if (this.canvasLeft == null) {
setParentOffset();
}
this.mx = event.touches[0].pageX - this.canvasLeft;
this.my = event.touches[0].pageY - this.canvasTop;
};
const setMxMyByMouse = (event) => {
this.mx = event.offsetX;
this.my = event.offsetY;
};
// ---------------------------------------------
let firstTouch = true;
const touchDownFunc = (e) => {
if (firstTouch) {
firstTouch = false;
removeMouseListener();
}
setMxMyByTouch(e);
this.mapDown(e);
};
const touchMoveFunc = (e) => {
setMxMyByTouch(e);
this.mapMove(e);
};
const touchUpFunc = (e) => {
setMxMyByTouch(e);
this.mapUp(e);
};
const mouseDownFunc = (e) => {
if (firstTouch) {
firstTouch = false;
removeTouchListener();
}
setMxMyByMouse(e);
this.mapDown(e);
};
const mouseMoveFunc = (e) => {
setMxMyByMouse(e);
this.mapMove(e);
};
const mouseUpFunc = (e) => {
setMxMyByMouse(e);
this.mapUp(e);
};
const element = this.canvas.nativeElement;
const addTouchListener = () => {
element.addEventListener('touchstart', touchDownFunc);
element.addEventListener('touchmove', touchMoveFunc);
element.addEventListener('touchend', touchUpFunc);
element.addEventListener('touchcancel', touchUpFunc);
};
const removeTouchListener = () => {
element.removeEventListener('touchstart', touchDownFunc);
element.removeEventListener('touchmove', touchMoveFunc);
element.removeEventListener('touchend', touchUpFunc);
element.removeEventListener('touchcancel', touchUpFunc);
};
const addMouseListener = () => {
element.addEventListener('mousedown', mouseDownFunc);
element.addEventListener('mousemove', mouseMoveFunc);
element.addEventListener('mouseup', mouseUpFunc);
};
const removeMouseListener = () => {
element.removeEventListener('mousedown', mouseDownFunc);
element.removeEventListener('mousemove', mouseMoveFunc);
element.removeEventListener('mouseup', mouseUpFunc);
};
addMouseListener();
addTouchListener();
}
playAudio(key, now = false, callback = null) { playAudio(key, now = false, callback = null) {
const audio = this.audioObj[key]; const audio = this.audioObj[key];
if (audio) { if (audio) {
if (now) { if (now) {
...@@ -288,28 +164,28 @@ export class PlayComponent implements OnInit, OnDestroy { ...@@ -288,28 +164,28 @@ export class PlayComponent implements OnInit, OnDestroy {
} }
} }
loadResources() { loadResources() {
const pr = []; const pr = [];
this.rawImages.forEach((value, key) => {// 预加载图片 this.rawImages.forEach((value, key) => {
// 预加载图片
const p = this.preload(value) const p = this.preload(value)
.then(img => { .then((img) => {
this.images.set(key, img); this.images.set(key, img);
}) })
.catch(err => console.log(err)); .catch((err) => console.log(err));
pr.push(p); pr.push(p);
}); });
this.rawAudios.forEach((value, key) => {// 预加载音频 this.rawAudios.forEach((value, key) => {
// 预加载音频
const a = this.preloadAudio(value) const a = this.preloadAudio(value)
.then(() => { .then(() => {
// this.images.set(key, img); // this.images.set(key, img);
}) })
.catch(err => console.log(err)); .catch((err) => console.log(err));
pr.push(a); pr.push(a);
}); });
...@@ -340,19 +216,13 @@ export class PlayComponent implements OnInit, OnDestroy { ...@@ -340,19 +216,13 @@ export class PlayComponent implements OnInit, OnDestroy {
}); });
} }
renderAfterResize() { renderAfterResize() {
this.canvasWidth = this.wrap.nativeElement.clientWidth; this.canvasWidth = this.wrap.nativeElement.clientWidth;
this.canvasHeight = this.wrap.nativeElement.clientHeight; this.canvasHeight = this.wrap.nativeElement.clientHeight;
this.init(); this.init();
} }
checkClickTarget(target) { checkClickTarget(target) {
const rect = target.getBoundingBox(); const rect = target.getBoundingBox();
if (this.checkPointInRect(this.mx, this.my, rect)) { if (this.checkPointInRect(this.mx, this.my, rect)) {
...@@ -362,11 +232,9 @@ export class PlayComponent implements OnInit, OnDestroy { ...@@ -362,11 +232,9 @@ export class PlayComponent implements OnInit, OnDestroy {
} }
getWorlRect(target) { getWorlRect(target) {
let rect = target.getBoundingBox(); let rect = target.getBoundingBox();
if (target.parent) { if (target.parent) {
const pRect = this.getWorlRect(target.parent); const pRect = this.getWorlRect(target.parent);
rect.x += pRect.x; rect.x += pRect.x;
rect.y += pRect.y; rect.y += pRect.y;
...@@ -383,12 +251,7 @@ export class PlayComponent implements OnInit, OnDestroy { ...@@ -383,12 +251,7 @@ export class PlayComponent implements OnInit, OnDestroy {
return false; return false;
} }
addUrlToAudioObj(key, url = null, vlomue = 1, loop = false, callback = null) { addUrlToAudioObj(key, url = null, vlomue = 1, loop = false, callback = null) {
const audioObj = this.audioObj; const audioObj = this.audioObj;
if (url == null) { if (url == null) {
...@@ -416,60 +279,42 @@ export class PlayComponent implements OnInit, OnDestroy { ...@@ -416,60 +279,42 @@ export class PlayComponent implements OnInit, OnDestroy {
this.rawImages.set(url, url); this.rawImages.set(url, url);
} }
// ======================================================编写区域========================================================================== // ======================================================编写区域==========================================================================
/** /**
* 添加默认数据 便于无数据时的展示 * 添加默认数据 便于无数据时的展示
*/ */
initDefaultData() { initDefaultData() {
if (!this.data.pic_url) { if (!this.data.pic_url) {
this.data.pic_url = 'assets/play/default/pic.jpg'; this.data.pic_url = "assets/play/default/pic.jpg";
this.data.pic_url_2 = 'assets/play/default/pic.jpg'; this.data.pic_url_2 = "assets/play/default/pic.jpg";
} }
} }
/** /**
* 添加预加载图片 * 添加预加载图片
*/ */
initImg() { initImg() {
this.addUrlToImages(this.data.pic_url); this.addUrlToImages(this.data.pic_url);
this.addUrlToImages(this.data.pic_url_2); this.addUrlToImages(this.data.pic_url_2);
} }
/** /**
* 添加预加载音频 * 添加预加载音频
*/ */
initAudio() { initAudio() {
// 音频资源 // 音频资源
this.addUrlToAudioObj(this.data.audio_url); this.addUrlToAudioObj(this.data.audio_url);
this.addUrlToAudioObj(this.data.audio_url_2); this.addUrlToAudioObj(this.data.audio_url_2);
// 音效 // 音效
this.addUrlToAudioObj('click', this.rawAudios.get('click'), 0.3); this.addUrlToAudioObj("click", this.rawAudios.get("click"), 0.3);
} }
/** /**
* 初始化数据 * 初始化数据
*/ */
initData() { initData() {
const sx = this.canvasWidth / this.canvasBaseW; const sx = this.canvasWidth / this.canvasBaseW;
const sy = this.canvasHeight / this.canvasBaseH; const sy = this.canvasHeight / this.canvasBaseH;
const s = Math.min(sx, sy); const s = Math.min(sx, sy);
...@@ -478,31 +323,21 @@ export class PlayComponent implements OnInit, OnDestroy { ...@@ -478,31 +323,21 @@ export class PlayComponent implements OnInit, OnDestroy {
// this.mapScale = sx; // this.mapScale = sx;
// this.mapScale = sy; // this.mapScale = sy;
this.renderArr = []; this.renderArr = [];
} }
/** /**
* 初始化试图 * 初始化试图
*/ */
initView() { initView() {
// this.initPic();
this.initPic();
this.initBottomPart(); this.initBottomPart();
} }
initBottomPart() { initBottomPart() {
const btnLeft = new MySprite(); const btnLeft = new MySprite();
btnLeft.init(this.images.get('btn_left')); btnLeft.init(this.images.get("btn_left"));
btnLeft.x = this.canvasWidth - 150 * this.mapScale; btnLeft.x = this.canvasWidth - 150 * this.mapScale;
btnLeft.y = this.canvasHeight - 100 * this.mapScale; btnLeft.y = this.canvasHeight - 100 * this.mapScale;
...@@ -512,10 +347,8 @@ export class PlayComponent implements OnInit, OnDestroy { ...@@ -512,10 +347,8 @@ export class PlayComponent implements OnInit, OnDestroy {
this.btnLeft = btnLeft; this.btnLeft = btnLeft;
const btnRight = new MySprite(); const btnRight = new MySprite();
btnRight.init(this.images.get('btn_right')); btnRight.init(this.images.get("btn_right"));
btnRight.x = this.canvasWidth - 50 * this.mapScale; btnRight.x = this.canvasWidth - 50 * this.mapScale;
btnRight.y = this.canvasHeight - 100 * this.mapScale; btnRight.y = this.canvasHeight - 100 * this.mapScale;
btnRight.setScaleXY(this.mapScale); btnRight.setScaleXY(this.mapScale);
...@@ -523,142 +356,60 @@ export class PlayComponent implements OnInit, OnDestroy { ...@@ -523,142 +356,60 @@ export class PlayComponent implements OnInit, OnDestroy {
this.renderArr.push(btnRight); this.renderArr.push(btnRight);
this.btnRight = btnRight; this.btnRight = btnRight;
}
initPic() {
const maxW = this.canvasWidth * 0.7;
const pic1 = new MySprite();
pic1.init(this.images.get(this.data.pic_url));
pic1.x = this.canvasWidth / 2;
pic1.y = this.canvasHeight / 2;
pic1.setScaleXY(maxW / pic1.width);
this.renderArr.push(pic1);
this.pic1 = pic1;
const label1 = new Label(); const label1 = new Label();
label1.text = this.data.text; label1.text = this.data.text;
label1.textAlign = 'center'; label1.textAlign = "center";
label1.fontSize = 50; label1.fontSize = 50;
label1.fontName = 'BRLNSDB'; label1.fontName = "BRLNSDB";
label1.fontColor = '#ffffff'; label1.fontColor = "#000000";
label1.x = this.canvasWidth * 0.5 - 150 * this.mapScale;
pic1.addChild(label1); label1.y = this.canvasHeight * 0.5 - 100 * this.mapScale;
this.renderArr.push(label1);
const pic2 = new MySprite();
pic2.init(this.images.get(this.data.pic_url_2));
pic2.x = this.canvasWidth / 2 + this.canvasWidth;
pic2.y = this.canvasHeight / 2;
pic2.setScaleXY(maxW / pic2.width);
this.renderArr.push(pic2);
this.pic2 = pic2;
this.curPic = pic1;
} }
initPic() {
const maxW = this.canvasWidth * 0.7;
btnLeftClicked() { // const pic1 = new MySprite();
// pic1.init(this.images.get(this.data.pic_url));
this.lastPage(); // pic1.x = this.canvasWidth / 2;
} // pic1.y = this.canvasHeight / 2;
// pic1.setScaleXY(maxW / pic1.width);
btnRightClicked() {
this.nextPage();
}
lastPage() {
if (this.curPic == this.pic1) {
return;
}
this.canTouch = false;
const moveLen = this.canvasWidth;
tweenChange(this.pic1, {x: this.pic1.x + moveLen}, 1);
tweenChange(this.pic2, {x: this.pic2.x + moveLen}, 1, () => {
this.canTouch = true;
this.curPic = this.pic1;
});
}
nextPage() {
if (this.curPic == this.pic2) {
return;
}
this.canTouch = false;
const moveLen = this.canvasWidth;
tweenChange(this.pic1, {x: this.pic1.x - moveLen}, 1);
tweenChange(this.pic2, {x: this.pic2.x - moveLen}, 1, () => {
this.canTouch = true;
this.curPic = this.pic2;
});
}
pic1Clicked() {
this.playAudio(this.data.audio_url);
}
pic2Clicked() {
this.playAudio(this.data.audio_url_2);
}
mapDown(event) {
if (!this.canTouch) {
return;
}
if ( this.checkClickTarget(this.btnLeft) ) {
this.btnLeftClicked();
return;
}
if ( this.checkClickTarget(this.btnRight) ) {
this.btnRightClicked();
return;
}
if ( this.checkClickTarget(this.pic1) ) { // this.renderArr.push(pic1);
this.pic1Clicked(); // this.pic1 = pic1;
return;
}
if ( this.checkClickTarget(this.pic2) ) { // const label1 = new Label();
this.pic2Clicked(); // label1.text = this.data.text;
return; // label1.textAlign = 'center';
} // label1.fontSize = 50;
// label1.fontName = 'BRLNSDB';
// label1.fontColor = '#ffffff';
} // pic1.addChild(label1);
mapMove(event) { // const pic2 = new MySprite();
// pic2.init(this.images.get(this.data.pic_url_2));
// pic2.x = this.canvasWidth / 2 + this.canvasWidth;
// pic2.y = this.canvasHeight / 2;
// pic2.setScaleXY(maxW / pic2.width);
} // this.renderArr.push(pic2);
// this.pic2 = pic2;
mapUp(event) { // this.curPic = pic1;
// const label1 = new Label();
// label1.text = this.data.text;
// label1.textAlign = "center";
// label1.fontSize = 50;
// label1.fontName = "BRLNSDB";
// label1.fontColor = "#ff0000";
// this.renderArr.push(label1);
} }
update() { update() {
// ---------------------------------------------------------- // ----------------------------------------------------------
this.animationId = window.requestAnimationFrame(this.update.bind(this)); this.animationId = window.requestAnimationFrame(this.update.bind(this));
// 清除画布内容 // 清除画布内容
...@@ -667,13 +418,6 @@ export class PlayComponent implements OnInit, OnDestroy { ...@@ -667,13 +418,6 @@ export class PlayComponent implements OnInit, OnDestroy {
TWEEN.update(); TWEEN.update();
// ---------------------------------------------------------- // ----------------------------------------------------------
this.updateArr(this.renderArr); this.updateArr(this.renderArr);
} }
} }
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"compressing": "^1.5.0" "compressing": "^1.5.0",
"node-sass": "^4.0.0"
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment