{typeof title === 'string'
&& title === title.toLowerCase()
diff --git a/tgui/packages/tgui/links.js b/tgui/packages/tgui/links.js
new file mode 100644
index 0000000000..b941f14c9c
--- /dev/null
+++ b/tgui/packages/tgui/links.js
@@ -0,0 +1,38 @@
+/**
+ * @file
+ * @copyright 2020 Aleksej Komarov
+ * @license MIT
+ */
+
+/**
+ * Prevents baby jailing the user when he clicks an external link.
+ */
+export const captureExternalLinks = () => {
+ // Click handler
+ const listenerFn = e => {
+ const tagName = String(e.target.tagName).toLowerCase();
+ const href = String(e.target.href);
+ // Must be a link
+ if (tagName !== 'a') {
+ return;
+ }
+ // Leave BYOND links alone
+ const isByondLink = href.charAt(0) === '?'
+ || href.startsWith(location.origin)
+ || href.startsWith('byond://');
+ if (isByondLink) {
+ return;
+ }
+ // Prevent default action
+ e.preventDefault();
+ // Open the link
+ Byond.topic({
+ tgui: 1,
+ window_id: window.__windowId__,
+ type: 'openLink',
+ url: href,
+ });
+ };
+ // Subscribe to all document clicks
+ document.addEventListener('click', listenerFn);
+};
diff --git a/tgui/packages/tgui/package.json b/tgui/packages/tgui/package.json
index 70c0e0c771..fbbd15901f 100644
--- a/tgui/packages/tgui/package.json
+++ b/tgui/packages/tgui/package.json
@@ -1,7 +1,7 @@
{
"private": true,
"name": "tgui",
- "version": "3.1.0",
+ "version": "4.1.0",
"dependencies": {
"@babel/core": "^7.6.2",
"@babel/plugin-transform-jscript": "^7.2.0",
diff --git a/tgui/packages/tgui/public/tgui.html b/tgui/packages/tgui/public/tgui.html
index 990a84a0f1..a651788f9d 100644
--- a/tgui/packages/tgui/public/tgui.html
+++ b/tgui/packages/tgui/public/tgui.html
@@ -9,8 +9,6 @@
@@ -226,6 +269,9 @@ Byond.topic({
+
+
+
diff --git a/tgui/packages/tgui/renderer.js b/tgui/packages/tgui/renderer.js
new file mode 100644
index 0000000000..4abb7b0e6f
--- /dev/null
+++ b/tgui/packages/tgui/renderer.js
@@ -0,0 +1,57 @@
+import { perf } from 'common/perf';
+import { render } from 'inferno';
+import { createLogger } from './logging';
+
+const logger = createLogger('renderer');
+
+let reactRoot;
+let initialRender = true;
+let suspended = false;
+
+// These functions are used purely for profiling.
+export const resumeRenderer = () => {
+ initialRender = initialRender || 'resumed';
+ suspended = false;
+};
+
+export const suspendRenderer = () => {
+ suspended = true;
+};
+
+export const createRenderer = getVNode => () => {
+ perf.mark('render/start');
+ // Start rendering
+ if (!reactRoot) {
+ reactRoot = document.getElementById('react-root');
+ }
+ render(getVNode(), reactRoot);
+ perf.mark('render/finish');
+ if (suspended) {
+ return;
+ }
+ // Report rendering time
+ if (process.env.NODE_ENV !== 'production') {
+ if (initialRender === 'resumed') {
+ logger.log('rendered in',
+ perf.measure('render/start', 'render/finish'));
+ }
+ else if (initialRender) {
+ logger.debug('serving from:', location.href);
+ logger.debug('bundle entered in',
+ perf.measure('inception', 'init'));
+ logger.debug('initialized in',
+ perf.measure('init', 'render/start'));
+ logger.log('rendered in',
+ perf.measure('render/start', 'render/finish'));
+ logger.log('fully loaded in',
+ perf.measure('inception', 'render/finish'));
+ }
+ else {
+ logger.debug('rendered in',
+ perf.measure('render/start', 'render/finish'));
+ }
+ }
+ if (initialRender) {
+ initialRender = false;
+ }
+};
diff --git a/tgui/packages/tgui/routes.js b/tgui/packages/tgui/routes.js
index d01340eae2..1740587e43 100644
--- a/tgui/packages/tgui/routes.js
+++ b/tgui/packages/tgui/routes.js
@@ -5,7 +5,7 @@
*/
import { selectBackend } from './backend';
-import { selectDebug } from './debug';
+import { selectDebug } from './debug/selectors';
import { Window } from './layouts';
const requireInterface = require.context('./interfaces', false, /\.js$/);
@@ -33,7 +33,8 @@ const SuspendedWindow = () => {
);
};
-export const getRoutedComponent = state => {
+export const getRoutedComponent = store => {
+ const state = store.getState();
const { suspended, config } = selectBackend(state);
if (suspended) {
return SuspendedWindow;
@@ -42,7 +43,7 @@ export const getRoutedComponent = state => {
const debug = selectDebug(state);
// Show a kitchen sink
if (debug.kitchenSink) {
- return require('./debug/KitchenSink').KitchenSink;
+ return require('./debug').KitchenSink;
}
}
const name = config?.interface;
diff --git a/tgui/packages/tgui/store.js b/tgui/packages/tgui/store.js
index 27419e85e1..751c4e25db 100644
--- a/tgui/packages/tgui/store.js
+++ b/tgui/packages/tgui/store.js
@@ -5,33 +5,41 @@
*/
import { flow } from 'common/fp';
-import { applyMiddleware, combineReducers, createStore as createReduxStore } from 'common/redux';
+import { applyMiddleware, combineReducers, createStore } from 'common/redux';
import { Component } from 'inferno';
-import { backendMiddleware, backendReducer } from './backend';
-import { debugReducer } from './debug';
-import { hotKeyMiddleware } from './hotkeys';
-import { createLogger } from './logging';
import { assetMiddleware } from './assets';
+import { backendMiddleware, backendReducer } from './backend';
+import { debugMiddleware, debugReducer, relayMiddleware } from './debug';
+import { createLogger } from './logging';
const logger = createLogger('store');
-export const createStore = () => {
+export const configureStore = (options = {}) => {
const reducer = flow([
- // State initializer
- (state = {}, action) => state,
combineReducers({
debug: debugReducer,
backend: backendReducer,
}),
+ options.reducer,
]);
const middleware = [
- process.env.NODE_ENV !== 'production' && loggingMiddleware,
+ ...(options.middleware?.pre || []),
assetMiddleware,
- hotKeyMiddleware,
backendMiddleware,
+ ...(options.middleware?.post || []),
];
- return createReduxStore(reducer,
- applyMiddleware(...middleware.filter(Boolean)));
+ if (process.env.NODE_ENV !== 'production') {
+ middleware.unshift(
+ loggingMiddleware,
+ debugMiddleware,
+ relayMiddleware);
+ }
+ const enhancer = applyMiddleware(...middleware);
+ const store = createStore(reducer, enhancer);
+ // Globals
+ window.__store__ = store;
+ window.__augmentStack__ = createStackAugmentor(store);
+ return store;
};
const loggingMiddleware = store => next => action => {
@@ -45,6 +53,34 @@ const loggingMiddleware = store => next => action => {
return next(action);
};
+/**
+ * Creates a function, which can be assigned to window.__augmentStack__
+ * to augment reported stack traces with useful data for debugging.
+ */
+const createStackAugmentor = store => (stack, error) => {
+ if (!error) {
+ error = new Error(stack.split('\n')[0]);
+ error.stack = stack;
+ }
+ else if (typeof error === 'object' && !error.stack) {
+ error.stack = stack;
+ }
+ logger.log('FatalError:', error);
+ const state = store.getState();
+ const config = state?.backend?.config;
+ let augmentedStack = stack;
+ augmentedStack += '\nUser Agent: ' + navigator.userAgent;
+ augmentedStack += '\nState: ' + JSON.stringify({
+ ckey: config?.client?.ckey,
+ interface: config?.interface,
+ window: config?.window,
+ });
+ return augmentedStack;
+};
+
+/**
+ * Store provider for Inferno apps.
+ */
export class StoreProvider extends Component {
getChildContext() {
const { store } = this.props;
@@ -55,7 +91,3 @@ export class StoreProvider extends Component {
return this.props.children;
}
}
-
-export const useDispatch = context => {
- return context.store.dispatch;
-};
diff --git a/tgui/packages/tgui/styles/base.scss b/tgui/packages/tgui/styles/base.scss
index 5c1a20278f..86e82dc948 100644
--- a/tgui/packages/tgui/styles/base.scss
+++ b/tgui/packages/tgui/styles/base.scss
@@ -7,6 +7,7 @@
$color-fg: #ffffff !default;
$color-bg: #252525 !default;
+$color-bg-section: rgba(0, 0, 0, 0.33) !default;
$color-bg-grad-spread: 2% !default;
$color-bg-start: color.adjust(
$color-bg, $lightness: $color-bg-grad-spread) !default;
diff --git a/tgui/packages/tgui/styles/colors.scss b/tgui/packages/tgui/styles/colors.scss
index eef558968c..ca894ffab3 100644
--- a/tgui/packages/tgui/styles/colors.scss
+++ b/tgui/packages/tgui/styles/colors.scss
@@ -31,7 +31,7 @@ $label: #7e90a7 !default;
// Background and foreground color lightness ratios
$bg-lightness: -15% !default;
-$fg-lightness: 5% !default;
+$fg-lightness: 10% !default;
@function bg($color) {
@return color.scale($color, $lightness: $bg-lightness);
diff --git a/tgui/packages/tgui/styles/components/Button.scss b/tgui/packages/tgui/styles/components/Button.scss
index 3634b908ab..eed09b241f 100644
--- a/tgui/packages/tgui/styles/components/Button.scss
+++ b/tgui/packages/tgui/styles/components/Button.scss
@@ -45,7 +45,7 @@ $bg-map: colors.$bg-map !default;
.Button {
position: relative;
display: inline-block;
- line-height: base.em(20px);
+ line-height: 1.667em;
padding: 0 0.5em;
margin-right: base.em(2px);
white-space: nowrap;
@@ -58,12 +58,13 @@ $bg-map: colors.$bg-map !default;
&:last-child {
margin-right: 0;
+ margin-bottom: 0;
}
.fa, .fas, .far {
margin-left: -0.25em;
margin-right: -0.25em;
- min-width: base.em(16px);
+ min-width: 1.333em;
text-align: center;
}
}
@@ -84,7 +85,15 @@ $bg-map: colors.$bg-map !default;
display: block;
margin-left: 0;
margin-right: 0;
- // padding: 3px 6px;
+}
+
+.Button--circular {
+ border-radius: 50%;
+}
+
+.Button--compact {
+ padding: 0 0.25em;
+ line-height: 1.333em;
}
@each $color-name, $color-value in $bg-map {
diff --git a/tgui/packages/tgui/styles/components/Dropdown.scss b/tgui/packages/tgui/styles/components/Dropdown.scss
index eafbbd2968..fc03eb9d8e 100644
--- a/tgui/packages/tgui/styles/components/Dropdown.scss
+++ b/tgui/packages/tgui/styles/components/Dropdown.scss
@@ -34,6 +34,7 @@
max-height: base.em(200px);
overflow-y: scroll;
border-radius: 0 0 base.em(2px) base.em(2px);
+ color: #fff;
background-color: #000;
background-color: rgba(0, 0, 0, 0.75);
}
@@ -45,6 +46,7 @@
width: base.em(100px);
max-height: base.em(200px);
border-radius: 0 0 base.em(2px) base.em(2px);
+ color: #fff;
background-color: #000;
background-color: rgba(0, 0, 0, 0.75);
}
@@ -55,8 +57,9 @@
font-size: base.em(12px);
line-height: base.em(17px);
transition: background-color 100ms;
+
&:hover {
- background-color: #444;
+ background-color: rgba(255, 255, 255, 0.2);
transition: background-color 0ms;
}
}
diff --git a/tgui/packages/tgui/styles/components/Flex.scss b/tgui/packages/tgui/styles/components/Flex.scss
index cc34ea6746..e58cb93114 100644
--- a/tgui/packages/tgui/styles/components/Flex.scss
+++ b/tgui/packages/tgui/styles/components/Flex.scss
@@ -14,20 +14,41 @@
.Flex--iefix {
display: table !important;
+ width: 105%;
+ border-collapse: collapse;
+ border-spacing: 0;
+
+ &:after {
+ content: '';
+ display: table-cell;
+ width: 5%;
+ }
}
.Flex--iefix--column {
- display: block !important;
+ display: table !important;
+ width: 100% !important;
+ height: 100% !important;
+ border-collapse: collapse;
+ border-spacing: 0;
- & > .Flex__item {
- display: block !important;
- margin-left: 0.5em;
- margin-right: 0.5em;
+ & > .Flex__item--iefix {
+ display: table-row !important;
+ }
+
+ & > .Flex__item--iefix--grow {
+ height: 100% !important;
}
}
.Flex__item--iefix {
display: table-cell !important;
+ width: 1% !important;
+ min-width: 99%;
+}
+
+.Flex__item--iefix--grow {
+ width: auto !important;
}
@for $i from 1 through 2 {
diff --git a/tgui/packages/tgui/styles/components/Input.scss b/tgui/packages/tgui/styles/components/Input.scss
index 1aaefeec2e..c2e779529f 100644
--- a/tgui/packages/tgui/styles/components/Input.scss
+++ b/tgui/packages/tgui/styles/components/Input.scss
@@ -6,6 +6,8 @@
@use '../base.scss';
@use '../functions.scss' as *;
+$text-color: base.$color-fg !default;
+$background-color: #0a0a0a !default;
$border-color: #88bfff !default;
$border-radius: base.$border-radius !default;
@@ -16,9 +18,8 @@ $border-radius: base.$border-radius !default;
border: base.em(1px) solid $border-color;
border: base.em(1px) solid rgba($border-color, 0.75);
border-radius: $border-radius;
- color: #fff;
- background-color: #000;
- background-color: rgba(0, 0, 0, 0.75);
+ color: $text-color;
+ background-color: $background-color;
padding: 0 base.em(4px);
margin-right: base.em(2px);
line-height: base.em(17px);
@@ -52,7 +53,7 @@ $border-radius: base.$border-radius !default;
padding: 0 0.5em;
font-family: Verdana, sans-serif;
background-color: transparent;
- color: #fff;
+ color: $text-color;
color: inherit;
&:-ms-input-placeholder {
@@ -61,3 +62,7 @@ $border-radius: base.$border-radius !default;
color: rgba(255, 255, 255, 0.45);
}
}
+
+.Input--monospace .Input__input {
+ font-family: 'Consolas', monospace;
+}
diff --git a/tgui/packages/tgui/styles/components/Knob.scss b/tgui/packages/tgui/styles/components/Knob.scss
index 962b4175d4..d376661641 100644
--- a/tgui/packages/tgui/styles/components/Knob.scss
+++ b/tgui/packages/tgui/styles/components/Knob.scss
@@ -11,6 +11,8 @@ $bg-map: colors.$bg-map !default;
$fg-map: colors.$fg-map !default;
$ring-color: #6a96c9 !default;
$knob-color: #333333 !default;
+$popup-background-color: #000000 !default;
+$popup-text-color: #ffffff !default;
$inner-padding: 0.1em;
@@ -71,7 +73,8 @@ $inner-padding: 0.1em;
font-size: 1rem;
text-align: center;
padding: 0.25rem 0.5rem;
- background-color: #000;
+ color: $popup-text-color;
+ background-color: $popup-background-color;
transform: translateX(50%);
white-space: nowrap;
}
diff --git a/tgui/packages/tgui/styles/components/Modal.scss b/tgui/packages/tgui/styles/components/Modal.scss
index 173ecfa24d..005ffe3165 100644
--- a/tgui/packages/tgui/styles/components/Modal.scss
+++ b/tgui/packages/tgui/styles/components/Modal.scss
@@ -5,10 +5,10 @@
@use '../base.scss';
-$color-background: base.$color-bg !default;
+$background-color: base.$color-bg !default;
.Modal {
- background-color: $color-background;
+ background-color: $background-color;
max-width: calc(100% - 1rem);
padding: 1rem;
}
diff --git a/tgui/packages/tgui/styles/components/NoticeBox.scss b/tgui/packages/tgui/styles/components/NoticeBox.scss
index ac4116d634..154905f870 100644
--- a/tgui/packages/tgui/styles/components/NoticeBox.scss
+++ b/tgui/packages/tgui/styles/components/NoticeBox.scss
@@ -9,14 +9,14 @@
@use '../functions.scss' as *;
// NoticeBox
-$color-background: #bb9b68 !default;
+$background-color: #bb9b68 !default;
$color-stripes: rgba(0, 0, 0, 0.1) !default;
$color-border: #272727 !default;
$bg-map: colors.$bg-map !default;
.NoticeBox {
// Adapt text color to background luminance to ensure high contast
- $luminance: luminance($color-background);
+ $luminance: luminance($background-color);
$text-color: if($luminance > 0.35,
rgba(0, 0, 0, 1),
rgba(255, 255, 255, 1));
@@ -27,7 +27,7 @@ $bg-map: colors.$bg-map !default;
font-weight: bold;
font-style: italic;
color: $text-color;
- background-color: $color-background;
+ background-color: $background-color;
background-image: repeating-linear-gradient(
-45deg,
transparent,
diff --git a/tgui/packages/tgui/styles/components/NumberInput.scss b/tgui/packages/tgui/styles/components/NumberInput.scss
index 8787a00ec1..ef2aba4d47 100644
--- a/tgui/packages/tgui/styles/components/NumberInput.scss
+++ b/tgui/packages/tgui/styles/components/NumberInput.scss
@@ -8,6 +8,8 @@
@use '../functions.scss' as *;
@use './Input.scss';
+$text-color: Input.$text-color !default;
+$background-color: Input.$background-color !default;
$border-color: Input.$border-color !default;
$border-radius: Input.$border-radius !default;
@@ -18,8 +20,7 @@ $border-radius: Input.$border-radius !default;
border: base.em(1px) solid rgba($border-color, 0.75);
border-radius: $border-radius;
color: $border-color;
- background-color: #000;
- background-color: rgba(0, 0, 0, 0.75);
+ background-color: $background-color;
padding: 0 base.em(4px);
margin-right: base.em(2px);
line-height: base.em(17px);
@@ -69,7 +70,7 @@ $border-radius: Input.$border-radius !default;
margin: 0;
padding: 0 0.5em;
font-family: Verdana, sans-serif;
- background-color: #000;
- color: #fff;
+ background-color: $background-color;
+ color: $text-color;
text-align: right;
}
diff --git a/tgui/packages/tgui/styles/components/ProgressBar.scss b/tgui/packages/tgui/styles/components/ProgressBar.scss
index fb77fa9c6d..92381412df 100644
--- a/tgui/packages/tgui/styles/components/ProgressBar.scss
+++ b/tgui/packages/tgui/styles/components/ProgressBar.scss
@@ -7,8 +7,8 @@
@use '../colors.scss';
@use '../functions.scss' as *;
-$color-default: colors.bg(colors.$primary) !default;
-$color-background: rgba(0, 0, 0, 0) !default;
+$color-default-fill: colors.bg(colors.$primary) !default;
+$background-color: rgba(0, 0, 0, 0) !default;
$border-radius: base.$border-radius !default;
$bg-map: colors.$bg-map !default;
@@ -18,7 +18,7 @@ $bg-map: colors.$bg-map !default;
width: 100%;
padding: 0 0.5em;
border-radius: $border-radius;
- background-color: $color-background;
+ background-color: $background-color;
transition: border-color 500ms;
}
@@ -41,10 +41,10 @@ $bg-map: colors.$bg-map !default;
}
.ProgressBar--color--default {
- border: base.em(1px) solid $color-default;
+ border: base.em(1px) solid $color-default-fill;
.ProgressBar__fill {
- background-color: $color-default;
+ background-color: $color-default-fill;
}
}
diff --git a/tgui/packages/tgui/styles/components/Section.scss b/tgui/packages/tgui/styles/components/Section.scss
index 1e2ad798fd..d53ff65bdd 100644
--- a/tgui/packages/tgui/styles/components/Section.scss
+++ b/tgui/packages/tgui/styles/components/Section.scss
@@ -6,22 +6,21 @@
@use 'sass:color';
@use '../base.scss';
@use '../colors.scss';
+@use '../functions.scss';
-$color-title: #ffffff !default;
-$color-background: rgba(0, 0, 0, 0.33) !default;
-$color-shadow: rgba(0, 0, 0, 0.5) !default;
-$color-separator: colors.$primary !default;
+$title-text-color: base.$color-fg !default;
+$background-color: base.$color-bg-section !default;
+$separator-color: colors.$primary !default;
+$shadow-color: rgba(0, 0, 0, 0.5) !default;
+$shadow-type: inset !default;
+$shadow-size: 0.5em !default;
+$shadow-offset: 0 0 !default;
.Section {
position: relative;
margin-bottom: 0.5em;
- // IE8: Does not support rgba colors
- background-color: color.adjust(
- $color-background,
- $lightness: 10%,
- $alpha: 1);
- background-color: $color-background;
- box-shadow: inset 0 0 5px $color-shadow;
+ background-color: functions.fake-alpha($background-color, base.$color-bg);
+ background-color: $background-color;
box-sizing: border-box;
&:last-child {
@@ -32,12 +31,13 @@ $color-separator: colors.$primary !default;
.Section__title {
position: relative;
padding: 0.5em;
- border-bottom: base.em(2px) solid $color-separator;
+ border-bottom: base.em(2px) solid $separator-color;
}
.Section__titleText {
font-size: base.em(14px);
font-weight: bold;
+ color: $title-text-color;
}
.Section__buttons {
@@ -61,6 +61,24 @@ $color-separator: colors.$primary !default;
flex-grow: 1;
}
+.Section--iefix.Section--fill {
+ display: table !important;
+ width: 100% !important;
+ height: 100% !important;
+ border-collapse: collapse;
+ border-spacing: 0;
+
+ & .Section__content {
+ display: table-row !important;
+ height: 100% !important;
+ }
+}
+
+.Section--scrollable {
+ overflow-x: hidden;
+ overflow-y: scroll;
+}
+
.Section--level--1 .Section__titleText {
font-size: base.em(14px);
}
diff --git a/tgui/packages/tgui/styles/components/Slider.scss b/tgui/packages/tgui/styles/components/Slider.scss
index 4644129c32..83baf71dc0 100644
--- a/tgui/packages/tgui/styles/components/Slider.scss
+++ b/tgui/packages/tgui/styles/components/Slider.scss
@@ -5,6 +5,10 @@
@use '../base.scss';
+$cursor-color: base.$color-fg !default;
+$popup-background-color: #000000 !default;
+$popup-text-color: #ffffff !default;
+
.Slider {
cursor: e-resize;
}
@@ -23,7 +27,7 @@
right: base.em(-1px);
bottom: 0;
width: 0;
- border-left: base.em(2px) solid #fff;
+ border-left: base.em(2px) solid $cursor-color;
}
.Slider__pointer {
@@ -34,7 +38,7 @@
height: 0;
border-left: base.em(5px) solid transparent;
border-right: base.em(5px) solid transparent;
- border-bottom: base.em(5px) solid #fff;
+ border-bottom: base.em(5px) solid $cursor-color;
}
.Slider__popupValue {
@@ -43,7 +47,8 @@
top: -2rem;
font-size: 1rem;
padding: 0.25rem 0.5rem;
- background-color: #000;
+ color: $popup-text-color;
+ background-color: $popup-background-color;
transform: translateX(50%);
white-space: nowrap;
}
diff --git a/tgui/packages/tgui/styles/components/Tabs.scss b/tgui/packages/tgui/styles/components/Tabs.scss
index 6e8a6bcb68..4939876ff6 100644
--- a/tgui/packages/tgui/styles/components/Tabs.scss
+++ b/tgui/packages/tgui/styles/components/Tabs.scss
@@ -3,59 +3,105 @@
* SPDX-License-Identifier: MIT
*/
+@use 'sass:color';
@use '../base.scss';
+@use '../colors.scss';
+$color-default: color.scale(colors.fg(colors.$primary), $lightness: 75%) !default;
+$text-color: rgba(255, 255, 255, 0.5) !default;
+$text-color-selected: color.scale($color-default, $lightness: 25%) !default;
$border-radius: base.$border-radius !default;
+$fg-map: colors.$fg-map !default;
+
+.Tabs {
+ display: flex;
+ align-items: stretch;
+ overflow: hidden;
+}
+
+.Tabs--vertical {
+ flex-direction: column;
+}
.Tabs--horizontal {
- border-bottom: base.em(2px) solid rgba(255, 255, 255, 0.1);
margin-bottom: 0.5em;
- .Tabs__tab--altSelection::after {
- content: '';
- position: absolute;
- bottom: 0;
- right: 0;
- left: 0;
- height: base.em(2px);
- width: 100%;
- background-color: #fff;
- border-radius: $border-radius;
+ &:last-child {
+ margin-bottom: 0;
+ }
+}
+
+.Tabs__Tab {
+ flex-grow: 0;
+}
+
+.Tabs--fluid .Tabs__Tab {
+ flex-grow: 1;
+}
+
+.Tab {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ color: $text-color;
+ min-height: 2.25em;
+ min-width: 4em;
+}
+
+.Tab--selected {
+ color: $text-color-selected;
+}
+
+.Tab__text {
+ flex-grow: 1;
+ margin: 0 0.5em;
+}
+
+.Tab__left {
+ min-width: 1.5em;
+ text-align: center;
+ margin-left: 0.25em;
+}
+
+.Tab__right {
+ min-width: 1.5em;
+ text-align: center;
+ margin-right: 0.25em;
+}
+
+.Tabs--horizontal {
+ .Tab {
+ border-top: (1em / 6) solid transparent;
+ border-bottom: (1em / 6) solid transparent;
+ }
+
+ .Tab--selected {
+ border-bottom: (1em / 6) solid $color-default;
}
}
.Tabs--vertical {
- margin-right: 0.75em;
-
- .Tabs__tabBox {
- border-right: base.em(2px) solid rgba(255, 255, 255, 0.1);
- // Disable baseline alignment when doing vertical tabs
- vertical-align: top;
+ .Tab {
+ min-height: 2em;
+ border-left: (1em / 6) solid transparent;
+ border-right: (1em / 6) solid transparent;
}
- .Tabs__tab {
- // Force display block because Button theme overrides it via cascading.
- display: block !important;
- // Override to stop themed buttons from taking priority over it.
- margin-right: 0 !important;
- margin-bottom: 0;
- padding: base.em(1px) base.em(9px) 0px 0.5em;
- border-bottom: base.em(2px) solid rgba(255, 255, 255, 0.1);
-
- &:last-child {
- border-bottom: 0;
- }
- }
-
- .Tabs__tab--altSelection::after {
- content: '';
- position: absolute;
- top: 0;
- bottom: 0;
- right: 0;
- height: 100%;
- width: 0.25em;
- background-color: #fff;
- border-radius: $border-radius;
+ .Tab--selected {
+ border-right: (1em / 6) solid $color-default;
+ }
+}
+
+@each $color-name, $color-value in $fg-map {
+ .Tab--selected.Tab--color--#{$color-name} {
+ color: color.scale($color-value, $lightness: 25%);
+ }
+
+ .Tabs--horizontal .Tab--selected.Tab--color--#{$color-name} {
+ border-bottom-color: $color-value;
+ }
+
+ .Tabs--vertical .Tab--selected.Tab--color--#{$color-name} {
+ border-right-color: $color-value;
}
}
diff --git a/tgui/packages/tgui/styles/components/TextArea.scss b/tgui/packages/tgui/styles/components/TextArea.scss
index 61597c1623..97494ecf06 100644
--- a/tgui/packages/tgui/styles/components/TextArea.scss
+++ b/tgui/packages/tgui/styles/components/TextArea.scss
@@ -5,40 +5,24 @@
@use '../base.scss';
@use '../functions.scss' as *;
+@use './Input.scss';
-$text-color: #272727 !default;
-$border-color: #88bfff !default;
-$border-radius: base.$border-radius !default;
-$color-background: #bb9b68 !default;
-$color-border: #272727 !default;
+$text-color: Input.$text-color !default;
+$background-color: Input.$background-color !default;
+$border-color: Input.$border-color !default;
+$border-radius: Input.$border-radius !default;
.TextArea {
- overflow: hidden;
position: relative;
display: inline-block;
- height: "100%";
- border: 1px solid $border-color;
- border: 1px solid rgba($border-color, 0.75);
+ border: base.em(1px) solid $border-color;
+ border: base.em(1px) solid rgba($border-color, 0.75);
border-radius: $border-radius;
- background-color: $color-background;
- margin-right: 2px;
- line-height: 17px;
- overflow: visible;
- -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
- -moz-box-sizing: border-box; /* Firefox, other Gecko */
- box-sizing: border-box; /* Opera/IE 8+ */
- width:100%;
-
-
-
-.TextArea_filler {
- word-wrap: break-word; /* make sure the div and the textarea wrap words in the same way */
+ background-color: $background-color;
+ margin-right: base.em(2px);
+ line-height: base.em(17px);
box-sizing: border-box;
- padding: 2px;
width: 100%;
-
- padding-bottom: 1.5em; /* A bit more than one additional line of text. */
- visibility: hidden;
}
.TextArea--fluid {
@@ -47,11 +31,6 @@ $color-border: #272727 !default;
height: auto;
}
-.TextArea__baseline {
- display: inline-block;
- color: transparent;
-}
-
.TextArea__textarea {
display: block;
position: absolute;
@@ -63,36 +42,22 @@ $color-border: #272727 !default;
outline: 0;
width: 100%;
height: 100%;
- font-size: 12px;
- line-height: 17px;
- height: 17px;
+ font-size: 1em;
+ line-height: base.em(17px);
+ min-height: base.em(17px);
margin: 0;
- padding: 0 6px;
+ padding: 0 0.5em;
font-family: inherit;
background-color: transparent;
color: inherit;
box-sizing: border-box;
- width: 100%;
-
- /* Cut and paste to auto resize the textarea */
- word-wrap: break-word; /* make sure the div and the textarea wrap words in the same way */
- box-sizing: border-box;
- -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
- -moz-box-sizing: border-box; /* Firefox, other Gecko */
- box-sizing: border-box; /* Opera/IE 8+ */
-
- padding: 2px;
- width: 100%;
-
+ // Make sure the div and the textarea wrap words in the same way
+ word-wrap: break-word;
overflow: hidden;
- position: absolute;
- height: 100%;
&:-ms-input-placeholder {
font-style: italic;
color: #777;
- /* color: rgba(255, 255, 255, 0.45);*/
+ color: rgba(255, 255, 255, 0.45);
}
}
-
-}
diff --git a/tgui/packages/tgui/styles/components/Tooltip.scss b/tgui/packages/tgui/styles/components/Tooltip.scss
index 505209ac00..c871584f90 100644
--- a/tgui/packages/tgui/styles/components/Tooltip.scss
+++ b/tgui/packages/tgui/styles/components/Tooltip.scss
@@ -6,7 +6,7 @@
@use '../base.scss';
@use '../functions.scss' as *;
-$color-background: #000000 !default;
+$background-color: #000000 !default;
$border-radius: base.$border-radius !default;
.Tooltip {
@@ -31,7 +31,7 @@ $border-radius: base.$border-radius !default;
text-align: left;
content: attr(data-tooltip);
transition: all 150ms;
- background-color: $color-background;
+ background-color: $background-color;
box-shadow: 0.1em 0.1em 1.25em -0.1em rgba(0, 0, 0, 0.5);
border-radius: $border-radius;
}
diff --git a/tgui/packages/tgui/styles/functions.scss b/tgui/packages/tgui/styles/functions.scss
index 84e3152848..9f00edf23f 100644
--- a/tgui/packages/tgui/styles/functions.scss
+++ b/tgui/packages/tgui/styles/functions.scss
@@ -63,3 +63,12 @@
+ (map.get($colors, 'green') * .7152)
+ (map.get($colors, 'blue') * .0722);
}
+
+// Blends an RGBA color with a static background color based on its
+// alpha channel. Returns an RGB color, which is compatible with IE8.
+@function fake-alpha($color-rgba, $color-background) {
+ @return color.mix(
+ color.change($color-rgba, $alpha: 1),
+ $color-background,
+ color.alpha($color-rgba) * 100%);
+}
diff --git a/tgui/packages/tgui/styles/interfaces/CameraConsole.scss b/tgui/packages/tgui/styles/interfaces/CameraConsole.scss
index 26fae61bb5..7e8f99fdcc 100644
--- a/tgui/packages/tgui/styles/interfaces/CameraConsole.scss
+++ b/tgui/packages/tgui/styles/interfaces/CameraConsole.scss
@@ -1,6 +1,6 @@
@use '../base.scss';
-$color-background: rgba(0, 0, 0, 0.33) !default;
+$background-color: rgba(0, 0, 0, 0.33) !default;
.CameraConsole__left {
position: absolute;
@@ -16,7 +16,7 @@ $color-background: rgba(0, 0, 0, 0.33) !default;
bottom: 0;
left: base.em(220px);
right: 0;
- background-color: $color-background;
+ background-color: $background-color;
}
.CameraConsole__toolbar {
diff --git a/tgui/packages/tgui/styles/layouts/Layout.scss b/tgui/packages/tgui/styles/layouts/Layout.scss
index 7368b24f24..32b94bf125 100644
--- a/tgui/packages/tgui/styles/layouts/Layout.scss
+++ b/tgui/packages/tgui/styles/layouts/Layout.scss
@@ -6,30 +6,32 @@
@use 'sass:color';
@use '../base.scss';
+$scrollbar-color-multiplier: 1 !default;
+
.Layout,
.Layout * {
// Fancy scrollbar
scrollbar-base-color: color.scale(
base.$color-bg,
- $lightness: -25%);
+ $lightness: -25% * $scrollbar-color-multiplier);
scrollbar-face-color: color.scale(
base.$color-bg,
- $lightness: 10%);
+ $lightness: 10% * $scrollbar-color-multiplier);
scrollbar-3dlight-color: color.scale(
base.$color-bg,
- $lightness: 0%);
+ $lightness: 0% * $scrollbar-color-multiplier);
scrollbar-highlight-color: color.scale(
base.$color-bg,
- $lightness: 0%);
+ $lightness: 0% * $scrollbar-color-multiplier);
scrollbar-track-color: color.scale(
base.$color-bg,
- $lightness: -25%);
+ $lightness: -25% * $scrollbar-color-multiplier);
scrollbar-arrow-color: color.scale(
base.$color-bg,
- $lightness: 50%);
+ $lightness: 50% * $scrollbar-color-multiplier);
scrollbar-shadow-color: color.scale(
base.$color-bg,
- $lightness: 10%);
+ $lightness: 10% * $scrollbar-color-multiplier);
}
.Layout__content {
diff --git a/tgui/packages/tgui/styles/layouts/TitleBar.scss b/tgui/packages/tgui/styles/layouts/TitleBar.scss
index 4333a54357..6b146bae4c 100644
--- a/tgui/packages/tgui/styles/layouts/TitleBar.scss
+++ b/tgui/packages/tgui/styles/layouts/TitleBar.scss
@@ -7,23 +7,23 @@
@use '../base.scss';
@use '../colors.scss';
-$color-text: rgba(255, 255, 255, 0.75) !default;
-$color-background: #363636 !default;
-$color-shadow-core: #161616 !default;
-$color-shadow: rgba(0, 0, 0, 0.1) !default;
+$text-color: rgba(255, 255, 255, 0.75) !default;
+$background-color: #363636 !default;
+$shadow-color-core: #161616 !default;
+$shadow-color: rgba(0, 0, 0, 0.1) !default;
.TitleBar {
- background-color: $color-background;
- border-bottom: 1px solid $color-shadow-core;
- box-shadow: 0 2px 2px $color-shadow;
- box-shadow: 0 base.rem(2px) base.rem(2px) $color-shadow;
+ background-color: $background-color;
+ border-bottom: 1px solid $shadow-color-core;
+ box-shadow: 0 2px 2px $shadow-color;
+ box-shadow: 0 base.rem(2px) base.rem(2px) $shadow-color;
user-select: none;
-ms-user-select: none;
}
.TitleBar__clickable {
- color: color.change($color-text, $alpha: 0.5);
- background-color: $color-background;
+ color: color.change($text-color, $alpha: 0.5);
+ background-color: $background-color;
transition: color 250ms, background-color 250ms;
&:hover {
@@ -38,7 +38,7 @@ $color-shadow: rgba(0, 0, 0, 0.1) !default;
top: 0;
left: 46px;
left: base.rem(46px);
- color: $color-text;
+ color: $text-color;
font-size: 14px;
font-size: base.rem(14px);
line-height: 31px;
diff --git a/tgui/packages/tgui/styles/layouts/Window.scss b/tgui/packages/tgui/styles/layouts/Window.scss
index f67bc7d131..3d00c90233 100644
--- a/tgui/packages/tgui/styles/layouts/Window.scss
+++ b/tgui/packages/tgui/styles/layouts/Window.scss
@@ -42,6 +42,8 @@
.Window__contentPadding {
margin: 0.5rem;
+ // IE8: Calc not supported
+ height: 100%;
// 0.01 is needed to make the scrollbar not appear
// due to rem rendering inaccuracies in IE11.
height: calc(100% - 1.01rem);
diff --git a/tgui/packages/tgui/styles/themes/abductor.scss b/tgui/packages/tgui/styles/themes/abductor.scss
index c0d339d264..2e3738bf93 100644
--- a/tgui/packages/tgui/styles/themes/abductor.scss
+++ b/tgui/packages/tgui/styles/themes/abductor.scss
@@ -33,24 +33,24 @@
'border-color': #404b6e,
));
@include meta.load-css('../components/NoticeBox.scss', $with: (
- 'color-background': #a82d55,
+ 'background-color': #a82d55,
));
@include meta.load-css('../components/NumberInput.scss', $with: (
'border-color': #404b6e,
));
@include meta.load-css('../components/ProgressBar.scss', $with: (
- 'color-background': rgba(0, 0, 0, 0.5),
+ 'background-color': rgba(0, 0, 0, 0.5),
));
@include meta.load-css('../components/Section.scss');
@include meta.load-css('../components/Tooltip.scss', $with: (
- 'color-background': #a82d55,
+ 'background-color': #a82d55,
));
// Layouts
@include meta.load-css('../layouts/Layout.scss');
@include meta.load-css('../layouts/Window.scss');
@include meta.load-css('../layouts/TitleBar.scss', $with: (
- 'color-background': #9e1b46,
+ 'background-color': #9e1b46,
));
.Layout__content {
diff --git a/tgui/packages/tgui/styles/themes/cardtable.scss b/tgui/packages/tgui/styles/themes/cardtable.scss
index 45427076ba..e5c1c6ef9e 100644
--- a/tgui/packages/tgui/styles/themes/cardtable.scss
+++ b/tgui/packages/tgui/styles/themes/cardtable.scss
@@ -34,7 +34,7 @@
'border-color': #fff,
));
@include meta.load-css('../components/ProgressBar.scss', $with: (
- 'color-background': rgba(0, 0, 0, 0.5),
+ 'background-color': rgba(0, 0, 0, 0.5),
));
@include meta.load-css('../components/Section.scss');
@@ -42,7 +42,7 @@
@include meta.load-css('../layouts/Layout.scss');
@include meta.load-css('../layouts/Window.scss');
@include meta.load-css('../layouts/TitleBar.scss', $with: (
- 'color-background': #381608,
+ 'background-color': #381608,
));
.Button {
diff --git a/tgui/packages/tgui/styles/themes/hackerman.scss b/tgui/packages/tgui/styles/themes/hackerman.scss
index 719f35f45f..a0255c862d 100644
--- a/tgui/packages/tgui/styles/themes/hackerman.scss
+++ b/tgui/packages/tgui/styles/themes/hackerman.scss
@@ -36,7 +36,7 @@
@include meta.load-css('../layouts/Layout.scss');
@include meta.load-css('../layouts/Window.scss');
@include meta.load-css('../layouts/TitleBar.scss', $with: (
- 'color-background': #223d22,
+ 'background-color': #223d22,
));
.Layout__content {
diff --git a/tgui/packages/tgui/styles/themes/malfunction.scss b/tgui/packages/tgui/styles/themes/malfunction.scss
index 3389785491..5fb621cf8d 100644
--- a/tgui/packages/tgui/styles/themes/malfunction.scss
+++ b/tgui/packages/tgui/styles/themes/malfunction.scss
@@ -32,24 +32,24 @@
'border-color': #910101,
));
@include meta.load-css('../components/NoticeBox.scss', $with: (
- 'color-background': #1a3f57,
+ 'background-color': #1a3f57,
));
@include meta.load-css('../components/NumberInput.scss', $with: (
'border-color': #910101,
));
@include meta.load-css('../components/ProgressBar.scss', $with: (
- 'color-background': rgba(0, 0, 0, 0.5),
+ 'background-color': rgba(0, 0, 0, 0.5),
));
@include meta.load-css('../components/Section.scss');
@include meta.load-css('../components/Tooltip.scss', $with: (
- 'color-background': #235577,
+ 'background-color': #235577,
));
// Layouts
@include meta.load-css('../layouts/Layout.scss');
@include meta.load-css('../layouts/Window.scss');
@include meta.load-css('../layouts/TitleBar.scss', $with: (
- 'color-background': #1a3f57,
+ 'background-color': #1a3f57,
));
.Layout__content {
diff --git a/tgui/packages/tgui/styles/themes/neutral.scss b/tgui/packages/tgui/styles/themes/neutral.scss
index 05eab7537c..0ef5a74a39 100644
--- a/tgui/packages/tgui/styles/themes/neutral.scss
+++ b/tgui/packages/tgui/styles/themes/neutral.scss
@@ -25,8 +25,8 @@
'color-transparent-text': color.scale($neutral, $lightness: 30%),
));
@include meta.load-css('../components/ProgressBar.scss', $with: (
- 'color-default': $neutral,
- 'color-background': rgba(0, 0, 0, 0.5),
+ 'color-default-fill': $neutral,
+ 'background-color': rgba(0, 0, 0, 0.5),
));
@include meta.load-css('../components/Section.scss');
@@ -34,7 +34,7 @@
@include meta.load-css('../layouts/Layout.scss');
@include meta.load-css('../layouts/Window.scss');
@include meta.load-css('../layouts/TitleBar.scss', $with: (
- 'color-background': color.scale($neutral, $lightness: -25%),
+ 'background-color': color.scale($neutral, $lightness: -25%),
));
.Layout__content {
diff --git a/tgui/packages/tgui/styles/themes/ntos.scss b/tgui/packages/tgui/styles/themes/ntos.scss
index 4891b4d163..a1b11c78b9 100644
--- a/tgui/packages/tgui/styles/themes/ntos.scss
+++ b/tgui/packages/tgui/styles/themes/ntos.scss
@@ -23,8 +23,8 @@ $nanotrasen: #384e68;
'color-transparent-text': rgba(227, 240, 255, 0.75),
));
@include meta.load-css('../components/ProgressBar.scss', $with: (
- 'color-default': $nanotrasen,
- 'color-background': rgba(0, 0, 0, 0.5),
+ 'color-default-fill': $nanotrasen,
+ 'background-color': rgba(0, 0, 0, 0.5),
));
@include meta.load-css('../components/Section.scss');
@@ -32,6 +32,6 @@ $nanotrasen: #384e68;
@include meta.load-css('../layouts/Layout.scss');
@include meta.load-css('../layouts/Window.scss');
@include meta.load-css('../layouts/TitleBar.scss', $with: (
- 'color-background': color.scale($nanotrasen, $lightness: -25%),
+ 'background-color': color.scale($nanotrasen, $lightness: -25%),
));
}
diff --git a/tgui/packages/tgui/styles/themes/paper.scss b/tgui/packages/tgui/styles/themes/paper.scss
index cfbe451110..2b0f969566 100644
--- a/tgui/packages/tgui/styles/themes/paper.scss
+++ b/tgui/packages/tgui/styles/themes/paper.scss
@@ -32,8 +32,8 @@ $font-size: 24px;
// Components
@include meta.load-css('../components/Tabs.scss');
@include meta.load-css('../components/Section.scss', $with: (
- 'color-background': rgba(0, 0, 0, 0.1),
- 'color-shadow': rgba(0, 0, 0, 0.2),
+ 'background-color': rgba(0, 0, 0, 0.1),
+ 'shadow-color': rgba(0, 0, 0, 0.2),
));
@include meta.load-css('../components/Button.scss', $with: (
'color-default': #E8E4C9,
@@ -48,9 +48,9 @@ $font-size: 24px;
@include meta.load-css('../layouts/Layout.scss');
@include meta.load-css('../layouts/Window.scss');
@include meta.load-css('../layouts/TitleBar.scss', $with: (
- 'color-text': rgba(0, 0, 0, 0.75),
- 'color-background': base.$color-bg,
- 'color-shadow-core': rgba(0, 0, 0, 0.25),
+ 'text-color': rgba(0, 0, 0, 0.75),
+ 'background-color': base.$color-bg,
+ 'shadow-color-core': rgba(0, 0, 0, 0.25),
));
.PaperInput {
diff --git a/tgui/packages/tgui/styles/themes/retro.scss b/tgui/packages/tgui/styles/themes/retro.scss
index da666a3638..5c2a5f0bdb 100644
--- a/tgui/packages/tgui/styles/themes/retro.scss
+++ b/tgui/packages/tgui/styles/themes/retro.scss
@@ -32,7 +32,7 @@
'color-danger': #9a9d00,
));
@include meta.load-css('../components/ProgressBar.scss', $with: (
- 'color-background': rgba(0, 0, 0, 0.5),
+ 'background-color': rgba(0, 0, 0, 0.5),
));
@include meta.load-css('../components/Section.scss');
@@ -40,7 +40,7 @@
@include meta.load-css('../layouts/Layout.scss');
@include meta.load-css('../layouts/Window.scss');
@include meta.load-css('../layouts/TitleBar.scss', $with: (
- 'color-background': #585337,
+ 'background-color': #585337,
));
.Button {
diff --git a/tgui/packages/tgui/styles/themes/syndicate.scss b/tgui/packages/tgui/styles/themes/syndicate.scss
index eca28f8aba..b440710969 100644
--- a/tgui/packages/tgui/styles/themes/syndicate.scss
+++ b/tgui/packages/tgui/styles/themes/syndicate.scss
@@ -32,24 +32,24 @@
'border-color': #87ce87,
));
@include meta.load-css('../components/NoticeBox.scss', $with: (
- 'color-background': #910101,
+ 'background-color': #910101,
));
@include meta.load-css('../components/NumberInput.scss', $with: (
'border-color': #87ce87,
));
@include meta.load-css('../components/ProgressBar.scss', $with: (
- 'color-background': rgba(0, 0, 0, 0.5),
+ 'background-color': rgba(0, 0, 0, 0.5),
));
@include meta.load-css('../components/Section.scss');
@include meta.load-css('../components/Tooltip.scss', $with: (
- 'color-background': #4a0202,
+ 'background-color': #4a0202,
));
// Layouts
@include meta.load-css('../layouts/Layout.scss');
@include meta.load-css('../layouts/Window.scss');
@include meta.load-css('../layouts/TitleBar.scss', $with: (
- 'color-background': #910101,
+ 'background-color': #910101,
));
.Layout__content {
diff --git a/tgui/packages/tgui/webpack.config.js b/tgui/packages/tgui/webpack.config.js
index c9ed58e065..b9146b8676 100644
--- a/tgui/packages/tgui/webpack.config.js
+++ b/tgui/packages/tgui/webpack.config.js
@@ -25,21 +25,20 @@ const createStats = verbose => ({
module.exports = (env = {}, argv) => {
const config = {
mode: argv.mode === 'production' ? 'production' : 'development',
- context: __dirname,
+ context: path.resolve(__dirname, '../..'),
entry: {
- tgui: [
- path.resolve(__dirname, './index.js'),
- ],
+ 'tgui': ['tgui'],
+ 'tgui-panel': ['tgui-panel'],
},
output: {
- path: argv.mode === 'production'
- ? path.resolve(__dirname, './public')
- : path.resolve(__dirname, './public/.tmp'),
+ path: argv.useTmpFolder
+ ? path.resolve(__dirname, './public/.tmp')
+ : path.resolve(__dirname, './public'),
filename: '[name].bundle.js',
chunkFilename: '[name].chunk.js',
},
resolve: {
- extensions: ['.mjs', '.js', '.jsx'],
+ extensions: ['.js', '.jsx'],
alias: {},
},
module: {
@@ -54,7 +53,7 @@ module.exports = (env = {}, argv) => {
['@babel/preset-env', {
modules: 'commonjs',
useBuiltIns: 'entry',
- corejs: '3',
+ corejs: '3.6',
spec: false,
loose: true,
targets: {
@@ -104,6 +103,10 @@ module.exports = (env = {}, argv) => {
},
optimization: {
noEmitOnErrors: true,
+ splitChunks: {
+ chunks: 'initial',
+ name: 'tgui-common',
+ },
},
performance: {
hints: false,
@@ -133,7 +136,7 @@ module.exports = (env = {}, argv) => {
];
}
- // Production specific options
+ // Production build specific options
if (argv.mode === 'production') {
const TerserPlugin = require('terser-webpack-plugin');
const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');
@@ -166,18 +169,22 @@ module.exports = (env = {}, argv) => {
];
}
- // Development specific options
+ // Development build specific options
if (argv.mode !== 'production') {
+ if (argv.hot) {
+ config.plugins.push(new webpack.HotModuleReplacementPlugin());
+ }
+ config.devtool = 'cheap-module-source-map';
+ }
+
+ // Development server specific options
+ if (argv.devServer) {
config.plugins = [
...config.plugins,
new BuildNotifierPlugin({
suppressSuccess: true,
}),
];
- if (argv.hot) {
- config.plugins.push(new webpack.HotModuleReplacementPlugin());
- }
- config.devtool = 'cheap-module-source-map';
config.devServer = {
progress: false,
quiet: false,
diff --git a/tgui/yarn.lock b/tgui/yarn.lock
index e3781bdc13..872acbbadd 100644
--- a/tgui/yarn.lock
+++ b/tgui/yarn.lock
@@ -1204,6 +1204,13 @@ available-typed-arrays@^1.0.0, available-typed-arrays@^1.0.2:
dependencies:
array-filter "^1.0.0"
+axios@^0.19.2:
+ version "0.19.2"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27"
+ integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==
+ dependencies:
+ follow-redirects "1.5.10"
+
babel-eslint@^10.0.3:
version "10.1.0"
resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232"
@@ -2081,6 +2088,13 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3:
dependencies:
ms "2.0.0"
+debug@=3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+ integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
+ dependencies:
+ ms "2.0.0"
+
debug@^4.0.1, debug@^4.1.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
@@ -2763,6 +2777,13 @@ flush-write-stream@^1.0.0:
inherits "^2.0.3"
readable-stream "^2.3.6"
+follow-redirects@1.5.10:
+ version "1.5.10"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a"
+ integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==
+ dependencies:
+ debug "=3.1.0"
+
for-in@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
diff --git a/tools/deploy.sh b/tools/deploy.sh
index 8a4c4d4c79..01c681cbfc 100755
--- a/tools/deploy.sh
+++ b/tools/deploy.sh
@@ -37,5 +37,4 @@ cp *byond-extools.* $1/ || true
#find $1/_maps -name "*.dm" -type f -delete
#dlls on windows
-cp rust_g* $1/ || true
-cp *BSQL.* $1/ || true
+cp *.dll $1/ || true