scss styles for frames
parent
fc76ad81ab
commit
e0360b237a
|
@ -115,27 +115,25 @@ export class FrameHandler {
|
||||||
public RefreshFrameViewer() {
|
public RefreshFrameViewer() {
|
||||||
// set all frames to inactive
|
// set all frames to inactive
|
||||||
for (let i = 0; i < this.frameViewer.children.length; i++) {
|
for (let i = 0; i < this.frameViewer.children.length; i++) {
|
||||||
this.frameViewer.children[i].className = 'frame';
|
this.frameViewer.children[i].classList.remove('selected', 'warning');
|
||||||
}
|
}
|
||||||
// set current frame to active
|
// set current frame to active
|
||||||
if (this.frameViewer.children[this.projectData.currentFrame] !== undefined) {
|
if (this.frameViewer.children[this.projectData.currentFrame] !== undefined) {
|
||||||
this.frameViewer.children[this.projectData.currentFrame].className = 'frameActive';
|
this.frameViewer.children[this.projectData.currentFrame].classList.add('selected');
|
||||||
}
|
}
|
||||||
|
|
||||||
// check frames for data errors
|
// check frames for data errors
|
||||||
for (let f = 0; f < this.animationData.frames.length; f++) {
|
for (let f = 0; f < this.animationData.frames.length; f++) {
|
||||||
|
// this.frameViewer.children[f].classList.add('warning');
|
||||||
|
|
||||||
if (this.animationData.pins !== undefined) {
|
if (this.animationData.pins !== undefined) {
|
||||||
for (let p = 0; p < this.animationData.pins.length; p++) {
|
for (let p = 0; p < this.animationData.pins.length; p++) {
|
||||||
if (this.animationData.pins[p] !== undefined) {
|
if (this.animationData.pins[p] !== undefined) {
|
||||||
const pinIDtoCheck = this.animationData.pins[p].id;
|
const pinIDtoCheck = this.animationData.pins[p].id;
|
||||||
console.log('checking frame ' + f + ' for pinID ' + this.animationData.pins[p].name);
|
// console.log('checking frame ' + f + ' for pinID ' + this.animationData.pins[p].name);
|
||||||
if (this.frameViewer.children[f] !== undefined) {
|
if (this.frameViewer.children[f] !== undefined) {
|
||||||
if (this.animationData.frames[f][pinIDtoCheck] === undefined) {
|
if (this.animationData.frames[f][pinIDtoCheck] === undefined) {
|
||||||
if (f === this.projectData.currentFrame) {
|
this.frameViewer.children[f].classList.add('warning');
|
||||||
this.frameViewer.children[f].className = 'frameActiveWarning';
|
|
||||||
} else {
|
|
||||||
this.frameViewer.children[f].className = 'frameWarning';
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -147,8 +145,8 @@ export class FrameHandler {
|
||||||
|
|
||||||
private RefreshImage() {
|
private RefreshImage() {
|
||||||
if (this.filenames.length === 0) {
|
if (this.filenames.length === 0) {
|
||||||
this.frameNumberDiv.className = 'warning';
|
// this.frameNumberDiv.className = 'warning';
|
||||||
this.frameNumberDiv.innerText = 'No images uploaded yet';
|
// this.frameNumberDiv.innerText = 'No images uploaded yet';
|
||||||
} else {
|
} else {
|
||||||
this.canvasContext.clearRect(0, 0, this.htmlCanvasElement.width, this.htmlCanvasElement.height);
|
this.canvasContext.clearRect(0, 0, this.htmlCanvasElement.width, this.htmlCanvasElement.height);
|
||||||
this.canvasContext.imageSmoothingEnabled = false;
|
this.canvasContext.imageSmoothingEnabled = false;
|
||||||
|
|
|
@ -26,10 +26,9 @@ export class PinHandler {
|
||||||
this.animationData = animationData;
|
this.animationData = animationData;
|
||||||
|
|
||||||
// add origin click behaviour
|
// add origin click behaviour
|
||||||
|
originPin.id = 'pinID_0';
|
||||||
originPin.addEventListener('click', () => {
|
originPin.addEventListener('click', () => {
|
||||||
this.DeselectAllPinContainers();
|
this.SelectPin(originPin);
|
||||||
originPin.className = 'pinButtonContainerSelected';
|
|
||||||
projectData.currentlySelectedPin = 0;
|
|
||||||
});
|
});
|
||||||
// put origin into pincontainer array
|
// put origin into pincontainer array
|
||||||
this.allPinContainers = [ originPin ];
|
this.allPinContainers = [ originPin ];
|
||||||
|
@ -63,6 +62,7 @@ export class PinHandler {
|
||||||
this.allPinContainers[i].remove();
|
this.allPinContainers[i].remove();
|
||||||
}
|
}
|
||||||
this.ResetPinSelection();
|
this.ResetPinSelection();
|
||||||
|
this.UpdateAnimationPinNames();
|
||||||
};
|
};
|
||||||
|
|
||||||
public GetAvailablePins = (): number[] => {
|
public GetAvailablePins = (): number[] => {
|
||||||
|
@ -99,6 +99,20 @@ export class PinHandler {
|
||||||
this.allPinContainers[0].className = 'pinButtonContainerSelected';
|
this.allPinContainers[0].className = 'pinButtonContainerSelected';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private CheckOriginDataExists = () => {
|
||||||
|
this.allPinContainers[0].className = 'pinButtonContainer';
|
||||||
|
if (this.projectData.currentlySelectedPin === 0) {
|
||||||
|
this.allPinContainers[0].className = 'pinButtonContainerSelected';
|
||||||
|
}
|
||||||
|
if (this.animationData.originX === null || this.animationData.originY === null) {
|
||||||
|
if (this.projectData.currentlySelectedPin === 0) {
|
||||||
|
this.allPinContainers[0].className = 'pinButtonContainerErrorSelected';
|
||||||
|
} else {
|
||||||
|
this.allPinContainers[0].className = 'pinButtonContainerError';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
private UpdatePinSettingsDiv = () => {
|
private UpdatePinSettingsDiv = () => {
|
||||||
// create info window div and append to pincontainer
|
// create info window div and append to pincontainer
|
||||||
const newDiv = document.createElement('div');
|
const newDiv = document.createElement('div');
|
||||||
|
@ -146,15 +160,24 @@ export class PinHandler {
|
||||||
newDiv.appendChild(selectPinButton);
|
newDiv.appendChild(selectPinButton);
|
||||||
selectPinButton.textContent = 'Select';
|
selectPinButton.textContent = 'Select';
|
||||||
selectPinButton.addEventListener('click', () => {
|
selectPinButton.addEventListener('click', () => {
|
||||||
this.DeselectAllPinContainers();
|
this.SelectPin(newDiv);
|
||||||
newDiv.className = 'pinButtonContainerSelected';
|
|
||||||
this.projectData.currentlySelectedPin = parseInt(newDiv.id.split('_')[1]);
|
|
||||||
console.log('selected pin ' + this.projectData.currentlySelectedPin);
|
|
||||||
this.UpdateAnimationPinNames();
|
|
||||||
});
|
});
|
||||||
this.UpdateAnimationPinNames();
|
this.UpdateAnimationPinNames();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private SelectPin = (pinDiv: HTMLElement) => {
|
||||||
|
this.CheckOriginDataExists();
|
||||||
|
this.DeselectAllPinContainers();
|
||||||
|
this.projectData.currentlySelectedPin = parseInt(pinDiv.id.split('_')[1]);
|
||||||
|
if (pinDiv.className === 'pinButtonContainerError') {
|
||||||
|
pinDiv.className = 'pinButtonContainerErrorSelected';
|
||||||
|
} else {
|
||||||
|
pinDiv.className = 'pinButtonContainerSelected';
|
||||||
|
}
|
||||||
|
console.log('selected pin ' + this.projectData.currentlySelectedPin);
|
||||||
|
this.UpdateAnimationPinNames();
|
||||||
|
};
|
||||||
|
|
||||||
private RemovePinDataForID = (pinID: number) => {
|
private RemovePinDataForID = (pinID: number) => {
|
||||||
// check for matching id in pin list and remove
|
// check for matching id in pin list and remove
|
||||||
|
|
||||||
|
@ -185,7 +208,20 @@ export class PinHandler {
|
||||||
|
|
||||||
private DeselectAllPinContainers = () => {
|
private DeselectAllPinContainers = () => {
|
||||||
for (let i = 0; i < this.allPinContainers.length; i++) {
|
for (let i = 0; i < this.allPinContainers.length; i++) {
|
||||||
this.allPinContainers[i].className = 'pinButtonContainer';
|
const pinDiv = this.allPinContainers[i];
|
||||||
|
pinDiv.className = 'pinButtonContainer';
|
||||||
|
if (i > 0) {
|
||||||
|
// check frames for missing pin info
|
||||||
|
const pinNumber = this.GetPinNumberFromID(pinDiv.id);
|
||||||
|
for (let f = 0; this.animationData.frames.length; f++) {
|
||||||
|
if (this.animationData.frames[f] !== undefined) {
|
||||||
|
if (this.animationData.frames[f][pinNumber] === undefined) {
|
||||||
|
pinDiv.className = 'pinButtonContainerError';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,119 @@
|
||||||
|
$bg-color: #859094;
|
||||||
|
$bg-dark-color: #7a8386;
|
||||||
|
$main-border-color: #6b7578;
|
||||||
|
$main-font-color: #101e24;
|
||||||
|
$selected-border-color: #09e7ca;
|
||||||
|
$selected-bg-color: #4d998f;
|
||||||
|
$warning-border-color: #aa093a;
|
||||||
|
$warning-bg-color: #6e545c;
|
||||||
|
$warning-selected-border-color: #ff044f;
|
||||||
|
$warning-selected-bg-color: #aa093a;
|
||||||
|
$warning-text-color: #ff1d61;
|
||||||
|
|
||||||
|
div {
|
||||||
|
display: block;
|
||||||
|
color: $main-font-color;
|
||||||
|
font-family: "Arial", Helvetica, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.numberinput {
|
||||||
|
width: 64px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.instruction {
|
||||||
|
font-size: 12px;
|
||||||
|
margin: auto;
|
||||||
|
width: 50%;
|
||||||
|
border: 2px solid;
|
||||||
|
padding: 1px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
#frameViewer {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
}
|
||||||
|
.frame {
|
||||||
|
flex: 1;
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
max-width: 32px;
|
||||||
|
color: $main-font-color;
|
||||||
|
padding: 1px;
|
||||||
|
display: inline-block;
|
||||||
|
border: 2px solid $main-border-color;
|
||||||
|
background-color: $bg-dark-color;
|
||||||
|
|
||||||
|
&.warning {
|
||||||
|
border: 2px solid $warning-border-color;
|
||||||
|
background-color: $warning-bg-color;
|
||||||
|
}
|
||||||
|
&.selected {
|
||||||
|
border: 2px solid $selected-border-color;
|
||||||
|
background-color: $selected-bg-color;
|
||||||
|
&.warning {
|
||||||
|
border: 2px solid $warning-selected-border-color;
|
||||||
|
background-color: $warning-selected-bg-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.errorMessage {
|
||||||
|
font-size: 12px;
|
||||||
|
width: 50%;
|
||||||
|
border: 2px solid $warning-border-color;
|
||||||
|
padding: 1px;
|
||||||
|
background-color: $warning-bg-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.warningMessage {
|
||||||
|
display: block;
|
||||||
|
color: $warning-text-color;
|
||||||
|
background-color: $warning-bg-color;
|
||||||
|
font-family: "Arial", Helvetica, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
background-color: $bg-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
#dropZone {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#canvasImage {
|
||||||
|
border: 2px solid $main-border-color;
|
||||||
|
image-rendering: pixelated;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pinContainer {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
}
|
||||||
|
.pinButtonContainer {
|
||||||
|
max-width: 10%;
|
||||||
|
flex: 1;
|
||||||
|
font-size: 12px;
|
||||||
|
border: 2px solid $main-border-color;
|
||||||
|
padding: 1px;
|
||||||
|
|
||||||
|
// .warning {
|
||||||
|
// border: 2px solid $warning-border-color;
|
||||||
|
// background-color: $warning-bg-color;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// .selected {
|
||||||
|
// border: 2px solid $selected-border-color;
|
||||||
|
// background-color: $selected-bg-color;
|
||||||
|
// .warning {
|
||||||
|
// border: 2px solid $warning-selected-border-color;
|
||||||
|
// background-color: $warning-selected-bg-color;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
.removeButton {
|
||||||
|
background-color: rgb(158, 15, 34);
|
||||||
|
color: rgb(227, 227, 236);
|
||||||
|
}
|
|
@ -1,121 +0,0 @@
|
||||||
div {
|
|
||||||
display: block;
|
|
||||||
color: #101e24;
|
|
||||||
font-family: "Arial", Helvetica, sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
.numberinput {
|
|
||||||
width: 64px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.instruction {
|
|
||||||
font-size: 12px;
|
|
||||||
margin: auto;
|
|
||||||
width: 50%;
|
|
||||||
border: 2px solid #6b7578;
|
|
||||||
padding: 1px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
#frameViewer {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
}
|
|
||||||
.frame {
|
|
||||||
flex: 1;
|
|
||||||
width: 32px;
|
|
||||||
height: 32px;
|
|
||||||
max-width: 32px;
|
|
||||||
color: #101e24;
|
|
||||||
border: 2px solid #3f4446;
|
|
||||||
padding: 1px;
|
|
||||||
background-color: rgb(90, 92, 95);
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
.frameActive {
|
|
||||||
flex: 1;
|
|
||||||
width: 32px;
|
|
||||||
height: 32px;
|
|
||||||
max-width: 32px;
|
|
||||||
color: #101e24;
|
|
||||||
border: 2px solid #0865df;
|
|
||||||
padding: 1px;
|
|
||||||
background-color: rgb(35, 75, 185);
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
.frameWarning {
|
|
||||||
flex: 1;
|
|
||||||
width: 32px;
|
|
||||||
height: 32px;
|
|
||||||
max-width: 32px;
|
|
||||||
color: #101e24;
|
|
||||||
border: 2px solid rgb(233, 7, 75);
|
|
||||||
padding: 1px;
|
|
||||||
background-color: rgb(83, 14, 20);
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
.frameActiveWarning {
|
|
||||||
flex: 1;
|
|
||||||
width: 32px;
|
|
||||||
height: 32px;
|
|
||||||
max-width: 32px;
|
|
||||||
color: #101e24;
|
|
||||||
border: 2px solid rgb(233, 7, 75);
|
|
||||||
padding: 1px;
|
|
||||||
background-color: rgb(185, 8, 61);
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.errorMessage {
|
|
||||||
font-size: 12px;
|
|
||||||
color: rgb(233, 7, 75);
|
|
||||||
width: 50%;
|
|
||||||
border: 2px solid rgb(233, 7, 75);
|
|
||||||
padding: 1px;
|
|
||||||
background-color: rgb(83, 14, 20);
|
|
||||||
}
|
|
||||||
|
|
||||||
.warning {
|
|
||||||
display: block;
|
|
||||||
color: #520012;
|
|
||||||
font-family: "Arial", Helvetica, sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
background-color: #818485;
|
|
||||||
}
|
|
||||||
|
|
||||||
#dropZone {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
#canvasImage {
|
|
||||||
border: 2px solid #6b7578;
|
|
||||||
image-rendering: pixelated;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pinContainer {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
}
|
|
||||||
.pinButtonContainer {
|
|
||||||
max-width: 10%;
|
|
||||||
flex: 1;
|
|
||||||
font-size: 12px;
|
|
||||||
border: 2px solid #6b7578;
|
|
||||||
padding: 1px;
|
|
||||||
}
|
|
||||||
.pinButtonContainerSelected {
|
|
||||||
max-width: 10%;
|
|
||||||
flex: 1;
|
|
||||||
font-size: 12px;
|
|
||||||
border: 2px solid #0865df;
|
|
||||||
padding: 1px;
|
|
||||||
background-color: rgb(35, 75, 185);
|
|
||||||
}
|
|
||||||
|
|
||||||
.removeButton {
|
|
||||||
background-color: rgb(158, 15, 34);
|
|
||||||
color: rgb(227, 227, 236);
|
|
||||||
}
|
|
|
@ -4,7 +4,6 @@
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
|
|
||||||
<link rel="icon" href="/favicon.ico">
|
<link rel="icon" href="/favicon.ico">
|
||||||
<link rel="stylesheet" href="assets/stylesheets/main.css">
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="dropZone">
|
<div id="dropZone">
|
||||||
|
@ -17,7 +16,7 @@
|
||||||
<div id="canvasStyle">
|
<div id="canvasStyle">
|
||||||
<canvas id="canvasImage" alt=""></canvas>
|
<canvas id="canvasImage" alt=""></canvas>
|
||||||
</div>
|
</div>
|
||||||
<div id="frameNumber" class="warning"></div>
|
<div id="frameNumber" class="warningMessage"></div>
|
||||||
<div id="frameViewer"></div>
|
<div id="frameViewer"></div>
|
||||||
<button id="addpin">Create New Pin</button>
|
<button id="addpin">Create New Pin</button>
|
||||||
<div id="pinContainer" class="pinContainer">
|
<div id="pinContainer" class="pinContainer">
|
||||||
|
|
1
index.ts
1
index.ts
|
@ -1,4 +1,5 @@
|
||||||
import { Page } from './app/page';
|
import { Page } from './app/page';
|
||||||
|
import './app/stylesheets/main.scss';
|
||||||
|
|
||||||
const page = new Page();
|
const page = new Page();
|
||||||
page.Load();
|
page.Load();
|
||||||
|
|
|
@ -19,7 +19,13 @@
|
||||||
},
|
},
|
||||||
"homepage": "https://github.com/MoonsideGames/AnimationTool#readme",
|
"homepage": "https://github.com/MoonsideGames/AnimationTool#readme",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"css-loader": "^3.2.0",
|
||||||
|
"fibers": "^4.0.1",
|
||||||
|
"node-sass": "^4.12.0",
|
||||||
"prettier": "^1.18.2",
|
"prettier": "^1.18.2",
|
||||||
|
"sass": "^1.23.0",
|
||||||
|
"sass-loader": "^8.0.0",
|
||||||
|
"style-loader": "^1.0.0",
|
||||||
"ts-loader": "^6.1.2",
|
"ts-loader": "^6.1.2",
|
||||||
"tslint": "^5.20.0",
|
"tslint": "^5.20.0",
|
||||||
"tslint-config-prettier": "^1.18.0",
|
"tslint-config-prettier": "^1.18.0",
|
||||||
|
|
1114
pnpm-lock.yaml
1114
pnpm-lock.yaml
File diff suppressed because it is too large
Load Diff
|
@ -1,25 +1,31 @@
|
||||||
const path = require("path");
|
const path = require('path');
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
mode: "development",
|
mode: 'development',
|
||||||
devtool: "inline-source-map",
|
devtool: 'inline-source-map',
|
||||||
entry: "./index.ts",
|
entry: {
|
||||||
|
main: [ './index.ts' ]
|
||||||
|
},
|
||||||
output: {
|
output: {
|
||||||
filename: "bundle.js"
|
filename: 'bundle.js'
|
||||||
},
|
},
|
||||||
resolve: {
|
resolve: {
|
||||||
// Add `.ts` and `.tsx` as a resolvable extension.
|
// Add `.ts` and `.tsx` as a resolvable extension.
|
||||||
extensions: [".ts", ".tsx", ".js"]
|
extensions: [ '.ts', '.tsx', '.js' ]
|
||||||
},
|
},
|
||||||
module: {
|
module: {
|
||||||
rules: [
|
rules: [
|
||||||
// all files with a `.ts` or `.tsx` extension will be handled by `ts-loader`
|
// all files with a `.ts` or `.tsx` extension will be handled by `ts-loader`
|
||||||
{
|
{
|
||||||
test: /\.tsx?$/,
|
test: /\.tsx?$/,
|
||||||
loader: "ts-loader",
|
loader: 'ts-loader',
|
||||||
options: {
|
options: {
|
||||||
allowTsInNodeModules: true
|
allowTsInNodeModules: true
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.scss$/,
|
||||||
|
use: [ 'style-loader', 'css-loader', 'sass-loader?sourceMap' ]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -28,4 +34,4 @@ module.exports = {
|
||||||
compress: false,
|
compress: false,
|
||||||
port: 8080
|
port: 8080
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,25 +1,29 @@
|
||||||
const path = require("path");
|
const path = require('path');
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
mode: "production",
|
mode: 'production',
|
||||||
entry: "./index.ts",
|
entry: './index.ts',
|
||||||
output: {
|
output: {
|
||||||
filename: "bundle.js"
|
filename: 'bundle.js'
|
||||||
},
|
},
|
||||||
resolve: {
|
resolve: {
|
||||||
// Add `.ts` and `.tsx` as a resolvable extension.
|
// Add `.ts` and `.tsx` as a resolvable extension.
|
||||||
extensions: [".ts", ".tsx", ".js"]
|
extensions: [ '.ts', '.tsx', '.js' ]
|
||||||
},
|
},
|
||||||
module: {
|
module: {
|
||||||
rules: [
|
rules: [
|
||||||
// all files with a `.ts` or `.tsx` extension will be handled by `ts-loader`
|
// all files with a `.ts` or `.tsx` extension will be handled by `ts-loader`
|
||||||
{
|
{
|
||||||
test: /\.tsx?$/,
|
test: /\.tsx?$/,
|
||||||
loader: "ts-loader",
|
loader: 'ts-loader',
|
||||||
options: {
|
options: {
|
||||||
allowTsInNodeModules: true
|
allowTsInNodeModules: true
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.(s*)css$/,
|
||||||
|
use: [ 'style-loader', 'css-loader', 'sass-loader' ]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue