mirror of
https://github.com/Eugeny/tabby.git
synced 2025-08-13 12:51:51 +00:00
.
This commit is contained in:
@@ -19,16 +19,16 @@ import { DockingService } from 'services/docking'
|
|||||||
|
|
||||||
import { AppComponent } from 'components/app'
|
import { AppComponent } from 'components/app'
|
||||||
import { CheckboxComponent } from 'components/checkbox'
|
import { CheckboxComponent } from 'components/checkbox'
|
||||||
import { HotkeyInputComponent } from 'components/hotkeyInput'
|
|
||||||
import { HotkeyDisplayComponent } from 'components/hotkeyDisplay'
|
|
||||||
import { HotkeyHintComponent } from 'components/hotkeyHint'
|
|
||||||
import { HotkeyInputModalComponent } from 'components/hotkeyInputModal'
|
|
||||||
import { SettingsPaneComponent } from 'components/settingsPane'
|
|
||||||
import { TabBodyComponent } from 'components/tabBody'
|
import { TabBodyComponent } from 'components/tabBody'
|
||||||
import { TabHeaderComponent } from 'components/tabHeader'
|
import { TabHeaderComponent } from 'components/tabHeader'
|
||||||
import { TerminalTabComponent } from 'components/terminalTab'
|
import { TerminalTabComponent } from 'components/terminalTab'
|
||||||
|
import { TitleBarComponent } from 'components/titleBar'
|
||||||
|
|
||||||
|
|
||||||
|
let plugins = [
|
||||||
|
require('./settings').default,
|
||||||
|
]
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
imports: [
|
imports: [
|
||||||
BrowserModule,
|
BrowserModule,
|
||||||
@@ -36,7 +36,7 @@ import { TerminalTabComponent } from 'components/terminalTab'
|
|||||||
FormsModule,
|
FormsModule,
|
||||||
ToasterModule,
|
ToasterModule,
|
||||||
NgbModule.forRoot(),
|
NgbModule.forRoot(),
|
||||||
],
|
].concat(plugins),
|
||||||
providers: [
|
providers: [
|
||||||
ConfigService,
|
ConfigService,
|
||||||
DockingService,
|
DockingService,
|
||||||
@@ -51,21 +51,15 @@ import { TerminalTabComponent } from 'components/terminalTab'
|
|||||||
SessionsService,
|
SessionsService,
|
||||||
],
|
],
|
||||||
entryComponents: [
|
entryComponents: [
|
||||||
HotkeyInputModalComponent,
|
|
||||||
SettingsPaneComponent,
|
|
||||||
TerminalTabComponent,
|
TerminalTabComponent,
|
||||||
],
|
],
|
||||||
declarations: [
|
declarations: [
|
||||||
AppComponent,
|
AppComponent,
|
||||||
CheckboxComponent,
|
CheckboxComponent,
|
||||||
HotkeyDisplayComponent,
|
|
||||||
HotkeyHintComponent,
|
|
||||||
HotkeyInputComponent,
|
|
||||||
HotkeyInputModalComponent,
|
|
||||||
SettingsPaneComponent,
|
|
||||||
TabBodyComponent,
|
TabBodyComponent,
|
||||||
TabHeaderComponent,
|
TabHeaderComponent,
|
||||||
TerminalTabComponent,
|
TerminalTabComponent,
|
||||||
|
TitleBarComponent,
|
||||||
],
|
],
|
||||||
bootstrap: [
|
bootstrap: [
|
||||||
AppComponent,
|
AppComponent,
|
||||||
|
@@ -29,42 +29,9 @@
|
|||||||
background: @body-bg;
|
background: @body-bg;
|
||||||
}
|
}
|
||||||
|
|
||||||
@titlebar-height: 30px;
|
|
||||||
@tabs-height: 40px;
|
@tabs-height: 40px;
|
||||||
@tab-border-radius: 4px;
|
@tab-border-radius: 4px;
|
||||||
|
|
||||||
.titlebar {
|
|
||||||
flex: 0 0 @titlebar-height;
|
|
||||||
display: flex;
|
|
||||||
height: @titlebar-height;
|
|
||||||
background: @title-bg;
|
|
||||||
|
|
||||||
.title {
|
|
||||||
flex: auto;
|
|
||||||
padding-left: 15px;
|
|
||||||
line-height: @titlebar-height;
|
|
||||||
-webkit-app-region: drag;
|
|
||||||
}
|
|
||||||
|
|
||||||
button {
|
|
||||||
border: none;
|
|
||||||
box-shadow: none;
|
|
||||||
border-radius: 0;
|
|
||||||
font-size: 8px;
|
|
||||||
width: 40px;
|
|
||||||
padding: 0;
|
|
||||||
line-height: @titlebar-height;
|
|
||||||
text-align: center;
|
|
||||||
|
|
||||||
&:not(:hover):not(:active) {
|
|
||||||
background: transparent;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-close {
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
:host > .spacer {
|
:host > .spacer {
|
||||||
flex: 0 0 5px;
|
flex: 0 0 5px;
|
||||||
|
@@ -1,11 +1,4 @@
|
|||||||
.titlebar(*ngIf='!config.store.appearance.useNativeFrame && config.store.appearance.dock == "off"')
|
title-bar(*ngIf='!config.store.appearance.useNativeFrame && config.store.appearance.dock == "off"')
|
||||||
.title((dblclick)='hostApp.toggleMaximize()') Term
|
|
||||||
button.btn.btn-secondary.btn-minimize((click)='hostApp.minimize()')
|
|
||||||
i.fa.fa-window-minimize
|
|
||||||
button.btn.btn-secondary.btn-maximize((click)='hostApp.toggleMaximize()')
|
|
||||||
i.fa.fa-window-maximize
|
|
||||||
button.btn.btn-secondary.btn-close((click)='hostApp.quit()')
|
|
||||||
i.fa.fa-close
|
|
||||||
|
|
||||||
.spacer
|
.spacer
|
||||||
|
|
||||||
@@ -32,10 +25,9 @@
|
|||||||
[model]='tab',
|
[model]='tab',
|
||||||
[class.scrollable]='tab.scrollable',
|
[class.scrollable]='tab.scrollable',
|
||||||
)
|
)
|
||||||
//-terminal(*ngIf='tab.type == "terminal"', [session]='tab.session', '[(title)]'='tab.name')
|
|
||||||
//-settings-pane(*ngIf='tab.type == "settings"')
|
|
||||||
|
|
||||||
hotkey-hint
|
// TODO
|
||||||
|
//hotkey-hint
|
||||||
|
|
||||||
toaster-container([toasterconfig]="toasterconfig")
|
toaster-container([toasterconfig]="toasterconfig")
|
||||||
template(ngbModalContainer)
|
template(ngbModalContainer)
|
||||||
|
@@ -9,8 +9,9 @@ import { QuitterService } from 'services/quitter'
|
|||||||
import { ConfigService } from 'services/config'
|
import { ConfigService } from 'services/config'
|
||||||
import { DockingService } from 'services/docking'
|
import { DockingService } from 'services/docking'
|
||||||
import { SessionsService } from 'services/sessions'
|
import { SessionsService } from 'services/sessions'
|
||||||
|
import { PluginDispatcherService } from 'services/pluginDispatcher'
|
||||||
|
|
||||||
import { Tab, SettingsTab, TerminalTab } from 'models/tab'
|
import { Tab, TerminalTab } from 'models/tab'
|
||||||
|
|
||||||
import 'angular2-toaster/lib/toaster.css'
|
import 'angular2-toaster/lib/toaster.css'
|
||||||
import 'global.less'
|
import 'global.less'
|
||||||
@@ -53,6 +54,7 @@ export class AppComponent {
|
|||||||
public hostApp: HostAppService,
|
public hostApp: HostAppService,
|
||||||
public hotkeys: HotkeysService,
|
public hotkeys: HotkeysService,
|
||||||
public config: ConfigService,
|
public config: ConfigService,
|
||||||
|
private pluginDispatcher: PluginDispatcherService,
|
||||||
log: LogService,
|
log: LogService,
|
||||||
_quitter: QuitterService,
|
_quitter: QuitterService,
|
||||||
) {
|
) {
|
||||||
@@ -214,6 +216,7 @@ export class AppComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
showSettings() {
|
showSettings() {
|
||||||
|
const SettingsTab = this.pluginDispatcher.temp
|
||||||
let settingsTab = this.tabs.find((x) => x instanceof SettingsTab)
|
let settingsTab = this.tabs.find((x) => x instanceof SettingsTab)
|
||||||
if (!settingsTab) {
|
if (!settingsTab) {
|
||||||
settingsTab = new SettingsTab()
|
settingsTab = new SettingsTab()
|
||||||
|
7
app/src/components/titleBar.pug
Normal file
7
app/src/components/titleBar.pug
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
.title((dblclick)='hostApp.toggleMaximize()') Term
|
||||||
|
button.btn.btn-secondary.btn-minimize((click)='hostApp.minimize()')
|
||||||
|
i.fa.fa-window-minimize
|
||||||
|
button.btn.btn-secondary.btn-maximize((click)='hostApp.toggleMaximize()')
|
||||||
|
i.fa.fa-window-maximize
|
||||||
|
button.btn.btn-secondary.btn-close((click)='hostApp.quit()')
|
||||||
|
i.fa.fa-close
|
35
app/src/components/titleBar.scss
Normal file
35
app/src/components/titleBar.scss
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
@import '~variables.scss';
|
||||||
|
|
||||||
|
$titlebar-height: 30px;
|
||||||
|
|
||||||
|
:host {
|
||||||
|
flex: 0 0 $titlebar-height;
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
.title {
|
||||||
|
flex: auto;
|
||||||
|
padding-left: 15px;
|
||||||
|
line-height: $titlebar-height;
|
||||||
|
-webkit-app-region: drag;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
flex: none;
|
||||||
|
border: none;
|
||||||
|
box-shadow: none;
|
||||||
|
border-radius: 0;
|
||||||
|
font-size: 8px;
|
||||||
|
width: 40px;
|
||||||
|
padding: 0;
|
||||||
|
line-height: $titlebar-height;
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
&:not(:hover):not(:active) {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-close {
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
}
|
12
app/src/components/titleBar.ts
Normal file
12
app/src/components/titleBar.ts
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import { Component } from '@angular/core'
|
||||||
|
import { HostAppService } from 'services/hostApp'
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'title-bar',
|
||||||
|
template: require('./titleBar.pug'),
|
||||||
|
styles: [require('./titleBar.scss')],
|
||||||
|
})
|
||||||
|
export class TitleBarComponent {
|
||||||
|
constructor (public hostApp: HostAppService) {
|
||||||
|
}
|
||||||
|
}
|
@@ -2,7 +2,7 @@ import { EventEmitter } from '@angular/core'
|
|||||||
import { BaseTabComponent } from 'components/baseTab'
|
import { BaseTabComponent } from 'components/baseTab'
|
||||||
import { Session } from 'services/sessions'
|
import { Session } from 'services/sessions'
|
||||||
|
|
||||||
declare type ComponentType<T extends Tab> = new (...args: any[]) => BaseTabComponent<T>
|
export declare type ComponentType<T extends Tab> = new (...args: any[]) => BaseTabComponent<T>
|
||||||
|
|
||||||
export class Tab {
|
export class Tab {
|
||||||
id: number
|
id: number
|
||||||
@@ -24,23 +24,6 @@ export class Tab {
|
|||||||
getComponentType (): ComponentType<Tab> {
|
getComponentType (): ComponentType<Tab> {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
destroy (): void { }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
import { SettingsPaneComponent } from 'components/settingsPane'
|
|
||||||
|
|
||||||
export class SettingsTab extends Tab {
|
|
||||||
constructor () {
|
|
||||||
super()
|
|
||||||
this.title = 'Settings'
|
|
||||||
this.scrollable = true
|
|
||||||
}
|
|
||||||
|
|
||||||
getComponentType (): ComponentType<SettingsTab> {
|
|
||||||
return SettingsPaneComponent
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -54,6 +37,4 @@ export class TerminalTab extends Tab {
|
|||||||
getComponentType (): ComponentType<TerminalTab> {
|
getComponentType (): ComponentType<TerminalTab> {
|
||||||
return TerminalTabComponent
|
return TerminalTabComponent
|
||||||
}
|
}
|
||||||
|
|
||||||
onFocus (): void { }
|
|
||||||
}
|
}
|
||||||
|
@@ -6,7 +6,8 @@ import { ElectronService } from 'services/electron'
|
|||||||
@Injectable()
|
@Injectable()
|
||||||
export class PluginDispatcherService {
|
export class PluginDispatcherService {
|
||||||
plugins = []
|
plugins = []
|
||||||
|
temp: any
|
||||||
|
|
||||||
constructor (
|
constructor (
|
||||||
private config: ConfigService,
|
private config: ConfigService,
|
||||||
private electron: ElectronService,
|
private electron: ElectronService,
|
||||||
|
@@ -27,11 +27,11 @@ ngb-tabset(type='tabs')
|
|||||||
| Custom
|
| Custom
|
||||||
small.form-text.text-muted Whether a custom window or an OS native window should be used
|
small.form-text.text-muted Whether a custom window or an OS native window should be used
|
||||||
|
|
||||||
.form-group
|
.row
|
||||||
label Dock the terminal
|
.col.col-auto
|
||||||
br
|
.form-group
|
||||||
.row
|
label Dock the terminal
|
||||||
.col.col-auto
|
br
|
||||||
div(
|
div(
|
||||||
'[(ngModel)]'='config.store.appearance.dock'
|
'[(ngModel)]'='config.store.appearance.dock'
|
||||||
'(ngModelChange)'='config.save(); docking.dock()'
|
'(ngModelChange)'='config.save(); docking.dock()'
|
||||||
@@ -67,7 +67,31 @@ ngb-tabset(type='tabs')
|
|||||||
[value]='"bottom"'
|
[value]='"bottom"'
|
||||||
)
|
)
|
||||||
| Bottom
|
| Bottom
|
||||||
.col
|
|
||||||
|
.form-group(*ngIf='config.store.appearance.dock != "off"')
|
||||||
|
label Display on
|
||||||
|
br
|
||||||
|
div(
|
||||||
|
'[(ngModel)]'='config.store.appearance.dockScreen'
|
||||||
|
'(ngModelChange)'='config.save(); docking.dock()'
|
||||||
|
ngbRadioGroup
|
||||||
|
)
|
||||||
|
label.btn.btn-secondary
|
||||||
|
input(
|
||||||
|
type='radio',
|
||||||
|
[value]='"current"'
|
||||||
|
)
|
||||||
|
| Current
|
||||||
|
label.btn.btn-secondary(*ngFor='let screen of docking.getScreens()')
|
||||||
|
input(
|
||||||
|
type='radio',
|
||||||
|
[value]='screen.id'
|
||||||
|
)
|
||||||
|
| {{screen.name}}
|
||||||
|
.col.col-auto
|
||||||
|
.form-group(*ngIf='config.store.appearance.dock != "off"')
|
||||||
|
label Docked terminal size
|
||||||
|
br
|
||||||
input(
|
input(
|
||||||
type='range',
|
type='range',
|
||||||
'[(ngModel)]'='config.store.appearance.dockFill',
|
'[(ngModel)]'='config.store.appearance.dockFill',
|
||||||
@@ -76,25 +100,6 @@ ngb-tabset(type='tabs')
|
|||||||
max='1',
|
max='1',
|
||||||
step='0.01'
|
step='0.01'
|
||||||
)
|
)
|
||||||
br
|
|
||||||
div(
|
|
||||||
*ngIf='config.store.appearance.dock != "off"',
|
|
||||||
'[(ngModel)]'='config.store.appearance.dockScreen'
|
|
||||||
'(ngModelChange)'='config.save(); docking.dock()'
|
|
||||||
ngbRadioGroup
|
|
||||||
)
|
|
||||||
label.btn.btn-secondary
|
|
||||||
input(
|
|
||||||
type='radio',
|
|
||||||
[value]='"current"'
|
|
||||||
)
|
|
||||||
| Current
|
|
||||||
label.btn.btn-secondary(*ngFor='let screen of docking.getScreens()')
|
|
||||||
input(
|
|
||||||
type='radio',
|
|
||||||
[value]='screen.id'
|
|
||||||
)
|
|
||||||
| {{screen.name}}
|
|
||||||
|
|
||||||
ngb-tab
|
ngb-tab
|
||||||
template(ngbTabTitle)
|
template(ngbTabTitle)
|
@@ -10,7 +10,7 @@ import 'rxjs/add/operator/distinctUntilChanged'
|
|||||||
const childProcessPromise = nodeRequire('child-process-promise')
|
const childProcessPromise = nodeRequire('child-process-promise')
|
||||||
|
|
||||||
import { BaseTabComponent } from 'components/baseTab'
|
import { BaseTabComponent } from 'components/baseTab'
|
||||||
import { SettingsTab } from 'models/tab'
|
import { SettingsTab } from '../tab'
|
||||||
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
42
app/src/settings/index.ts
Normal file
42
app/src/settings/index.ts
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
import { BrowserModule } from '@angular/platform-browser'
|
||||||
|
import { NgModule } from '@angular/core'
|
||||||
|
import { FormsModule } from '@angular/forms'
|
||||||
|
import { NgbModule } from '@ng-bootstrap/ng-bootstrap'
|
||||||
|
|
||||||
|
import { HotkeyInputComponent } from './components/hotkeyInput'
|
||||||
|
import { HotkeyDisplayComponent } from './components/hotkeyDisplay'
|
||||||
|
import { HotkeyHintComponent } from './components/hotkeyHint'
|
||||||
|
import { HotkeyInputModalComponent } from './components/hotkeyInputModal'
|
||||||
|
import { SettingsPaneComponent } from './components/settingsPane'
|
||||||
|
import { PluginDispatcherService } from 'services/pluginDispatcher'
|
||||||
|
|
||||||
|
import { SettingsTab } from './tab'
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
imports: [
|
||||||
|
BrowserModule,
|
||||||
|
FormsModule,
|
||||||
|
NgbModule,
|
||||||
|
],
|
||||||
|
providers: [
|
||||||
|
],
|
||||||
|
entryComponents: [
|
||||||
|
HotkeyInputModalComponent,
|
||||||
|
SettingsPaneComponent,
|
||||||
|
],
|
||||||
|
declarations: [
|
||||||
|
HotkeyDisplayComponent,
|
||||||
|
HotkeyHintComponent,
|
||||||
|
HotkeyInputComponent,
|
||||||
|
HotkeyInputModalComponent,
|
||||||
|
SettingsPaneComponent,
|
||||||
|
],
|
||||||
|
})
|
||||||
|
class SettingsModule {
|
||||||
|
constructor (pluginDispatcher: PluginDispatcherService) {
|
||||||
|
pluginDispatcher.temp = SettingsTab
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export default SettingsModule
|
14
app/src/settings/tab.ts
Normal file
14
app/src/settings/tab.ts
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import { Tab, ComponentType } from '../models/tab'
|
||||||
|
import { SettingsPaneComponent } from './components/settingsPane'
|
||||||
|
|
||||||
|
export class SettingsTab extends Tab {
|
||||||
|
constructor () {
|
||||||
|
super()
|
||||||
|
this.title = 'Settings'
|
||||||
|
this.scrollable = true
|
||||||
|
}
|
||||||
|
|
||||||
|
getComponentType (): ComponentType<SettingsTab> {
|
||||||
|
return SettingsPaneComponent
|
||||||
|
}
|
||||||
|
}
|
@@ -65,6 +65,18 @@ ngb-tabset .tab-content {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$tab-border-radius: 5px;
|
$tab-border-radius: 5px;
|
||||||
|
$button-hover-bg: rgba(0, 0, 0, .25);
|
||||||
|
$button-active-bg: rgba(0, 0, 0, .5);
|
||||||
|
|
||||||
|
title-bar {
|
||||||
|
background: $body-bg2;
|
||||||
|
|
||||||
|
button {
|
||||||
|
&:hover { background: $button-hover-bg !important; }
|
||||||
|
&:active { background: $button-active-bg !important; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
.tabs tab-header {
|
.tabs tab-header {
|
||||||
background: $body-bg;
|
background: $body-bg;
|
||||||
@@ -80,13 +92,8 @@ $tab-border-radius: 5px;
|
|||||||
border: none;
|
border: none;
|
||||||
transition: 0.25s all;
|
transition: 0.25s all;
|
||||||
|
|
||||||
&:hover {
|
&:hover { background: $button-hover-bg !important; }
|
||||||
background: rgba(0, 0, 0, .25) !important;
|
&:active { background: $button-active-bg !important; }
|
||||||
}
|
|
||||||
|
|
||||||
&:active {
|
|
||||||
background: rgba(0, 0, 0, .5) !important;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -10,8 +10,10 @@
|
|||||||
"no-eval": true,
|
"no-eval": true,
|
||||||
"no-invalid-this": true,
|
"no-invalid-this": true,
|
||||||
"no-shadowed-variable": true,
|
"no-shadowed-variable": true,
|
||||||
|
"no-undef": true,
|
||||||
"no-unused-expression": true,
|
"no-unused-expression": true,
|
||||||
"no-unused-new": true,
|
"no-unused-new": true,
|
||||||
|
"no-unused-variable": true,
|
||||||
"no-use-before-declare": true,
|
"no-use-before-declare": true,
|
||||||
"no-var-keyword": true,
|
"no-var-keyword": true,
|
||||||
"new-parens": true
|
"new-parens": true
|
||||||
|
@@ -43,22 +43,22 @@ module.exports = {
|
|||||||
{
|
{
|
||||||
test: /\.less$/,
|
test: /\.less$/,
|
||||||
loader: "style-loader!css-loader!less-loader",
|
loader: "style-loader!css-loader!less-loader",
|
||||||
exclude: [/app\/src\/components\//],
|
exclude: [/app\/.*components\//],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
test: /\.less$/,
|
test: /\.less$/,
|
||||||
loader: "to-string-loader!css-loader!less-loader",
|
loader: "to-string-loader!css-loader!less-loader",
|
||||||
include: [/app\/src\/components\//],
|
include: [/app\/.*components\//],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
test: /\.scss$/,
|
test: /\.scss$/,
|
||||||
use: ['style-loader', 'css-loader', 'sass-loader'],
|
use: ['style-loader', 'css-loader', 'sass-loader'],
|
||||||
exclude: [/app\/src\/components\//],
|
exclude: [/app\/.*components\//],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
test: /\.scss$/,
|
test: /\.scss$/,
|
||||||
use: ['to-string-loader', 'css-loader', 'sass-loader'],
|
use: ['to-string-loader', 'css-loader', 'sass-loader'],
|
||||||
include: [/app\/src\/components\//],
|
include: [/app\/.*components\//],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
test: /\.(png|svg)$/,
|
test: /\.(png|svg)$/,
|
||||||
|
Reference in New Issue
Block a user