diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 9fa094b0aa0..6a81025a513 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -6,10 +6,9 @@ "dbaeumer.vscode-eslint", "vscode.typescript-language-features", "redhat.vscode-yaml", - "esbenp.prettier-vscode", "rome.rome", "dbaeumer.vscode-eslint", "editorconfig.editorconfig", - "esbenp.prettier-vscode", "biomejs.biome" + ] } diff --git a/code/controllers/subsystems/plants.dm b/code/controllers/subsystems/plants.dm index 78747e967e7..60ef691e6a0 100644 --- a/code/controllers/subsystems/plants.dm +++ b/code/controllers/subsystems/plants.dm @@ -12,6 +12,8 @@ SUBSYSTEM_DEF(plants) var/list/seeds = list() /// Gene obfuscation for delicious trial and error goodness. var/list/gene_tag_masks = list() + /// Reverse lookup for gene_tag_masks, keyed by real gene tag. + var/list/gene_masks_by_tag = list() /// Stores images of growth, fruits and seeds. var/list/plant_icon_cache = list() /// List of all harvested product sprites. @@ -83,6 +85,7 @@ SUBSYSTEM_DEF(plants) used_masks += gene_mask plant_traits -= gene_tag gene_tag_masks[gene_mask] = gene_tag + gene_masks_by_tag[gene_tag] = gene_mask plant_gene_datums[gene_mask] = G gene_masked_list += (list(list("tag" = gene_tag, "mask" = gene_mask))) @@ -93,6 +96,7 @@ SUBSYSTEM_DEF(plants) src.product_descs = SSplants.product_descs src.seeds = SSplants.seeds src.gene_tag_masks = SSplants.gene_tag_masks + src.gene_masks_by_tag = SSplants.gene_masks_by_tag src.plant_icon_cache = SSplants.plant_icon_cache src.plant_sprites = SSplants.plant_sprites src.plant_product_sprites = SSplants.plant_product_sprites @@ -146,6 +150,9 @@ SUBSYSTEM_DEF(plants) SET_SEED_TRAIT(seed, TRAIT_HIGHKPA_TOLERANCE, 200) return seed +/datum/controller/subsystem/plants/proc/get_gene_mask(var/gene_tag) + return gene_masks_by_tag[gene_tag] || gene_tag + /// Debug for testing seed genes. /client/proc/show_plant_genes() set category = "Debug" diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 37afb399f1b..91f00a7dc2f 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -139,7 +139,7 @@ /datum/tgui_module/moderator/shared/player_panel/ui_interact(mob/user, var/datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, "PlayerPanel", "Player Panel", 960, 600) + ui = new(user, src, "PlayerPanel", "Player Panel", 1080, 720) ui.open() /datum/tgui_module/moderator/shared/player_panel/ui_data(mob/user) diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm index fd5f1f98c40..1b04dcaaf21 100644 --- a/code/modules/hydroponics/seed_machines.dm +++ b/code/modules/hydroponics/seed_machines.dm @@ -245,6 +245,7 @@ var/gene_tag = params["gene"] if(!gene_tag) return TRUE + var/gene_label = params["gene_label"] || SSplants.get_gene_mask(gene_tag) last_action = world.time active = TRUE @@ -259,8 +260,8 @@ if(!genetics.roundstart) loaded_disk.genesource += " (variety #[genetics.uid])" - loaded_disk.name += " ([SSplants.gene_tag_masks[gene_tag]], #[genetics.uid])" - loaded_disk.desc += " The label reads 'gene [SSplants.gene_tag_masks[gene_tag]], sampled from [genetics.display_name]'." + loaded_disk.name += " ([gene_label], #[genetics.uid])" + loaded_disk.desc += " The label reads 'gene [gene_label], sampled from [genetics.display_name]'." eject_disk = TRUE degradation += rand(20,60) @@ -312,7 +313,7 @@ for(var/datum/plantgene/P in loaded_disk.genes) if(data["locus"] != "") data["locus"] += ", " - data["locus"] += "[SSplants.gene_tag_masks[P.genetype]]" + data["locus"] += "[SSplants.get_gene_mask(P.genetype)]" data["loadedseed"] = seed ? "[seed.name]" : null diff --git a/code/modules/shieldgen/shield_capacitor.dm b/code/modules/shieldgen/shield_capacitor.dm index 990438e4851..181fe3ecc7a 100644 --- a/code/modules/shieldgen/shield_capacitor.dm +++ b/code/modules/shieldgen/shield_capacitor.dm @@ -110,6 +110,11 @@ return ui_interact(user) +/obj/structure/machinery/shield_capacitor/attack_ai(mob/user) + if(!ai_can_interact(user)) + return + return attack_hand(user) + /obj/structure/machinery/shield_capacitor/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) @@ -180,4 +185,3 @@ /// Horizon-specific non-variant, for now. /obj/structure/machinery/shield_capacitor/multiz - diff --git a/code/modules/shieldgen/shield_gen.dm b/code/modules/shieldgen/shield_gen.dm index 7665d807b47..5d177effd09 100644 --- a/code/modules/shieldgen/shield_gen.dm +++ b/code/modules/shieldgen/shield_gen.dm @@ -137,6 +137,7 @@ /obj/structure/machinery/shield_gen/attack_ai(mob/user) if(!ai_can_interact(user)) return + return attack_hand(user) /obj/structure/machinery/shield_gen/attack_hand(mob/user) if(stat & BROKEN) diff --git a/code/modules/tgui/states.dm b/code/modules/tgui/states.dm index ddc2bae9b75..188fb7f48a1 100644 --- a/code/modules/tgui/states.dm +++ b/code/modules/tgui/states.dm @@ -86,6 +86,34 @@ return UI_DISABLED return ..() +/mob/living/silicon/ai/proc/can_use_remote_ui(src_object) + if(src_object == src) + return TRUE + + if(control_disabled || !istype(src_object, /atom)) + return FALSE + + var/atom/source = src_object + var/atom/interaction_source = eyeobj || src + var/turf/interaction_turf = get_turf(interaction_source) + var/turf/source_turf = get_turf(source) + if(!interaction_turf || !source_turf || interaction_turf.z != source_turf.z) + return FALSE + + var/view_setting = world.view + if(client) + view_setting = client.view + + var/list/clientviewlist = getviewsize(view_setting) + var/x_range = round((clientviewlist[1] - 1) / 2) + var/y_range = round((clientviewlist[2] - 1) / 2) + if(!IsInRange(source_turf.x, interaction_turf.x - x_range, interaction_turf.x + x_range)) + return FALSE + if(!IsInRange(source_turf.y, interaction_turf.y - y_range, interaction_turf.y + y_range)) + return FALSE + + return can_see(interaction_source, source, max(x_range, y_range)) + /mob/living/silicon/robot/shared_ui_interaction(src_object) // Disable UIs if the object isn't installed in the borg AND the borg has a dead cell, or no cell. var/atom/device = src_object diff --git a/code/modules/tgui/states/default.dm b/code/modules/tgui/states/default.dm index 475131803ae..24a3d7e1ff0 100644 --- a/code/modules/tgui/states/default.dm +++ b/code/modules/tgui/states/default.dm @@ -48,12 +48,8 @@ GLOBAL_DATUM_INIT(default_state, /datum/ui_state/default, new) if(. < UI_INTERACTIVE) return - if(src_object == src) - return UI_INTERACTIVE - - // The AI can interact with anything it can see nearby, or with cameras while wireless control is enabled. - var/atom/interaction_source = eyeobj || src - if(!control_disabled && can_see(interaction_source, src_object)) + // The AI can interact with anything visible from its eye while wireless control is enabled. + if(can_use_remote_ui(src_object)) return UI_INTERACTIVE return UI_CLOSE diff --git a/code/modules/tgui/status_composers.dm b/code/modules/tgui/status_composers.dm index 2ca997bb7a0..4777c9d012c 100644 --- a/code/modules/tgui/status_composers.dm +++ b/code/modules/tgui/status_composers.dm @@ -104,12 +104,8 @@ return UI_DISABLED // Otherwise they can keep the UI open. /mob/living/silicon/ai/get_ui_access(atom/source) - if(source == src) - return UI_INTERACTIVE - - // The AI can interact with anything it can see nearby, or with cameras while wireless control is enabled. - var/atom/interaction_source = eyeobj || src - if(!control_disabled && can_see(interaction_source, source)) + // The AI can interact with anything visible from its eye while wireless control is enabled. + if(can_use_remote_ui(source)) return UI_INTERACTIVE return UI_CLOSE diff --git a/html/changelogs/Bat-TGUIHotfixes4.yml b/html/changelogs/Bat-TGUIHotfixes4.yml new file mode 100644 index 00000000000..913c353d248 --- /dev/null +++ b/html/changelogs/Bat-TGUIHotfixes4.yml @@ -0,0 +1,17 @@ +author: Batrachophrenoboocosmomachia +delete-after: True +changes: + - bugfix: "Restores chat highlight background color selection functionality (PR #20701)" + - bugfix: "Restores customizable chat message retention settings." + - bugfix: "Updates recommended vscode extension config file." + - bugfix: "Fixes some mismapped and missing scss files as well as removing temporary working files leftover in PR." + - bugfix: "Fixes silicons/AI being unable to interact remotely with shield capacitor and shield generator machinery." + - bugfix: "Fixes gene data disks produced by xenobotany's lysis-isolation centrifuge machine not displaying gene names." + - bugfix: "Makes AI remote access to machinery TGUIs more consistent." + - bugfix: "Fixes the Sensors interface not displaying sensor machinery's current health." + - bugfix: "Fixes the Sensors interface displaying strange values for current range." + - bugfix: "Fixes modular computer software displaying device themes instead of explicit software themes." + - bugfix: "Fixes MC tab links." + - bugfix: "Fixes Manifest and LateJoin department colors to match pre-React settings." + - bugfix: "Aligns mismatched radio channel keys between tgui-say and the radio subsystem." + - spellcheck: "Fixes a typo in the TGUI fatal error message." diff --git a/html/statbrowser.js b/html/statbrowser.js index d9a54fb4bfc..1de23783591 100644 --- a/html/statbrowser.js +++ b/html/statbrowser.js @@ -379,20 +379,16 @@ function draw_mc() { td0.className = 'monospace'; td0.textContent = part[0]; var td1 = document.createElement('td'); - td1.textContent = part[1]; - var td2 = document.createElement('td'); - if (part[3]) { + if (part[2]) { var a = document.createElement('a'); - a.href = - 'byond://?_src_=vars;admin_token=' + href_token + ';Vars=' + part[3]; - a.textContent = part[2]; - td2.appendChild(a); + a.href = 'byond://?_src_=vars;Vars=' + part[2]; + a.textContent = part[1]; + td1.appendChild(a); } else { - td2.textContent = part[2]; + td1.textContent = part[1]; } tr.appendChild(td0); tr.appendChild(td1); - tr.appendChild(td2); table.appendChild(tr); } document.getElementById('statcontent').appendChild(table); @@ -848,7 +844,7 @@ Byond.subscribeTo('update_stat', (payload) => { Byond.subscribeTo('update_mc', (payload) => { mc_tab_parts = payload.mc_data; - mc_tab_parts.splice(0, 0, ['', 'Location:', payload.coord_entry]); + mc_tab_parts.splice(0, 0, ['Location:', payload.coord_entry]); if (!verb_tabs.includes('MC')) { verb_tabs.push('MC'); diff --git a/tgui/packages/tgui-panel/chat/constants.ts b/tgui/packages/tgui-panel/chat/constants.ts index 45adf7d204a..4f3733cd887 100644 --- a/tgui/packages/tgui-panel/chat/constants.ts +++ b/tgui/packages/tgui-panel/chat/constants.ts @@ -4,8 +4,9 @@ * @license MIT */ -export const MAX_VISIBLE_MESSAGES = 2500; -export const MAX_PERSISTED_MESSAGES = 1000; +export const MAX_MESSAGES = 2500; +export const MIN_CONFIGURABLE_MESSAGES = 1000; +export const MAX_CONFIGURABLE_MESSAGES = 10000; export const MESSAGE_SAVE_INTERVAL = 10000; export const MESSAGE_PRUNE_INTERVAL = 60000; export const COMBINE_MAX_MESSAGES = 5; diff --git a/tgui/packages/tgui-panel/chat/helpers.ts b/tgui/packages/tgui-panel/chat/helpers.ts index ff0eb29c044..d8c47b0407f 100644 --- a/tgui/packages/tgui-panel/chat/helpers.ts +++ b/tgui/packages/tgui-panel/chat/helpers.ts @@ -8,10 +8,10 @@ import { currentPageAtom, scrollTrackingAtom, } from './atom'; -import { MAX_PERSISTED_MESSAGES } from './constants'; import { canPageAcceptType, serializeMessage } from './model'; import { chatRenderer } from './renderer'; import type { StoredChatSettings } from './types'; +import { settingsAtom } from '../settings/atoms'; chatRenderer.events.on( 'batchProcessed', @@ -70,9 +70,10 @@ export function saveChatToStorage(): void { } function saveChatMessages(): void { + const { maxMessages } = store.get(settingsAtom); const fromIndex = Math.max( 0, - chatRenderer.messages.length - MAX_PERSISTED_MESSAGES, + chatRenderer.messages.length - maxMessages, ); const messages = chatRenderer.messages diff --git a/tgui/packages/tgui-panel/chat/renderer.tsx b/tgui/packages/tgui-panel/chat/renderer.tsx index 9aeee6267fc..b29b1a4456c 100644 --- a/tgui/packages/tgui-panel/chat/renderer.tsx +++ b/tgui/packages/tgui-panel/chat/renderer.tsx @@ -17,8 +17,7 @@ import { IMAGE_RETRY_DELAY, IMAGE_RETRY_LIMIT, IMAGE_RETRY_MESSAGE_AGE, - MAX_PERSISTED_MESSAGES, - MAX_VISIBLE_MESSAGES, + MAX_MESSAGES, MESSAGE_PRUNE_INTERVAL, MESSAGE_TYPE_INTERNAL, MESSAGE_TYPE_UNKNOWN, @@ -117,6 +116,7 @@ class ChatRenderer { scrollNode: HTMLElement | null; scrollTracking: boolean; lastScrollHeight: number; + maxMessages: number; highlightParsers: Array | null; handleScroll: (type: any) => void; @@ -133,6 +133,7 @@ class ChatRenderer { this.scrollNode = null; this.scrollTracking = true; this.lastScrollHeight = 0; + this.maxMessages = MAX_MESSAGES; this.handleScroll = (evt) => { const node = this.scrollNode; if (!node) { @@ -194,6 +195,10 @@ class ChatRenderer { } } + setMaxMessages(maxMessages: number) { + this.maxMessages = maxMessages; + } + setHighlight(highlightSettings, highlightSettingById) { this.highlightParsers = null; if (!highlightSettings) { @@ -204,6 +209,10 @@ class ChatRenderer { const text = setting.highlightText; const highlightColor = setting.highlightColor; const highlightWholeMessage = setting.highlightWholeMessage; + const backgroundHighlightColor = + setting.backgroundHighlightColor || highlightColor; + const backgroundHighlightOpacity = + setting.backgroundHighlightOpacity ?? 10; const matchWord = setting.matchWord; const matchCase = setting.matchCase; const enabled = setting.enabled; @@ -282,6 +291,8 @@ class ChatRenderer { highlightRegex, highlightColor, highlightWholeMessage, + backgroundHighlightColor, + backgroundHighlightOpacity, }); }); } @@ -455,8 +466,12 @@ class ChatRenderer { if (highlighted && parser.highlightWholeMessage) { node.className += ' ChatMessage--highlighted'; node.style.setProperty( - '--highlight-color', - parser.highlightColor, + '--highlight-background-color', + parser.backgroundHighlightColor, + ); + node.style.setProperty( + '--highlight-background-opacity', + (parser.backgroundHighlightOpacity / 100).toString(), ); } }); @@ -526,7 +541,7 @@ class ChatRenderer { // Visible messages { const messages = this.visibleMessages; - const fromIndex = Math.max(0, messages.length - MAX_VISIBLE_MESSAGES); + const fromIndex = Math.max(0, messages.length - this.maxMessages); if (fromIndex > 0) { this.visibleMessages = messages.slice(fromIndex); for (let i = 0; i < fromIndex; i++) { @@ -547,7 +562,7 @@ class ChatRenderer { { const fromIndex = Math.max( 0, - this.messages.length - MAX_PERSISTED_MESSAGES, + this.messages.length - this.maxMessages, ); if (fromIndex > 0) { this.messages = this.messages.slice(fromIndex); @@ -563,7 +578,7 @@ class ChatRenderer { // Make a copy of messages const fromIndex = Math.max( 0, - this.messages.length - MAX_PERSISTED_MESSAGES, + this.messages.length - this.maxMessages, ); const messages = this.messages.slice(fromIndex); // Remove existing nodes diff --git a/tgui/packages/tgui-panel/settings/SettingsGeneral.tsx b/tgui/packages/tgui-panel/settings/SettingsGeneral.tsx index cf0a8c19a5c..940747947b4 100644 --- a/tgui/packages/tgui-panel/settings/SettingsGeneral.tsx +++ b/tgui/packages/tgui-panel/settings/SettingsGeneral.tsx @@ -11,6 +11,10 @@ import { } from 'tgui-core/components'; import { toFixed } from 'tgui-core/math'; import { capitalize } from 'tgui-core/string'; +import { + MAX_CONFIGURABLE_MESSAGES, + MIN_CONFIGURABLE_MESSAGES, +} from '../chat/constants'; import { chatRenderer } from '../chat/renderer'; import { FONTS, THEMES } from './constants'; import { resetPaneSplitters, setEditPaneSplitters } from './scaling'; @@ -124,11 +128,11 @@ export function SettingsGeneral(props) { )} - - + + + + toFixed(value)} + onChange={(_, value) => + updateSettings({ + maxMessages: value, + }) + } + /> + diff --git a/tgui/packages/tgui-panel/settings/TextHighlight.tsx b/tgui/packages/tgui-panel/settings/TextHighlight.tsx index 2b352f5dae1..b7055d43b14 100644 --- a/tgui/packages/tgui-panel/settings/TextHighlight.tsx +++ b/tgui/packages/tgui-panel/settings/TextHighlight.tsx @@ -7,9 +7,11 @@ import { Icon, Input, Section, + Slider, Stack, TextArea, } from 'tgui-core/components'; +import { toFixed } from 'tgui-core/math'; import { chatRenderer } from '../chat/renderer'; import { WARN_AFTER_HIGHLIGHT_AMT } from './constants'; import { useHighlights } from './use-highlights'; @@ -86,6 +88,8 @@ function TextHighlightSetting(props) { removeHighlight, } = useHighlights(); const { + backgroundHighlightColor, + backgroundHighlightOpacity, enabled, highlightColor, highlightText, @@ -133,10 +137,50 @@ function TextHighlightSetting(props) { Delete + {highlightWholeMessage && ( + + + + toFixed(value)} + onChange={(_, value) => + updateHighlight({ + id, + backgroundHighlightOpacity: value, + }) + } + /> + + + + + updateHighlight({ + id, + backgroundHighlightColor: value, + }) + } + /> + + + + )} updateHighlight({ id, diff --git a/tgui/packages/tgui-panel/settings/atoms.ts b/tgui/packages/tgui-panel/settings/atoms.ts index 275d5b8f2fb..5deafe2fb97 100644 --- a/tgui/packages/tgui-panel/settings/atoms.ts +++ b/tgui/packages/tgui-panel/settings/atoms.ts @@ -1,4 +1,5 @@ import { atom } from 'jotai'; +import { MAX_MESSAGES } from '../chat/constants'; import { FONTS, SETTINGS_TABS } from './constants'; import type { HighlightSetting, HighlightState, SettingsState } from './types'; @@ -8,6 +9,7 @@ export const defaultSettings: SettingsState = { fontSize: 13, initialized: false, lineHeight: 1.2, + maxMessages: MAX_MESSAGES, statFontSize: 12, statLinked: true, statTabsStyle: 'default', @@ -24,6 +26,8 @@ export const defaultHighlightSetting: HighlightSetting = { highlightText: '', highlightColor: '#ffdd44', highlightWholeMessage: true, + backgroundHighlightColor: '#ffdd44', + backgroundHighlightOpacity: 10, matchWord: false, matchCase: false, enabled: true, diff --git a/tgui/packages/tgui-panel/settings/helpers.ts b/tgui/packages/tgui-panel/settings/helpers.ts index f6eab7bb5f7..d3f6e6211a8 100644 --- a/tgui/packages/tgui-panel/settings/helpers.ts +++ b/tgui/packages/tgui-panel/settings/helpers.ts @@ -5,6 +5,11 @@ */ import { FONTS_DISABLED } from './constants'; +import { + MAX_CONFIGURABLE_MESSAGES, + MIN_CONFIGURABLE_MESSAGES, +} from '../chat/constants'; +import { chatRenderer } from '../chat/renderer'; import { setClientTheme } from './themes'; import type { SettingsState } from './types'; @@ -13,6 +18,13 @@ let statTabsTimer: NodeJS.Timeout; let overrideFontFamily: string | undefined; let overrideFontSize: string; +export function clampMaxMessages(maxMessages: number): number { + return Math.min( + MAX_CONFIGURABLE_MESSAGES, + Math.max(MIN_CONFIGURABLE_MESSAGES, maxMessages), + ); +} + /** Updates the global CSS rule to override the font family and size. */ function updateGlobalOverrideRule(): void { let fontFamily: string | null = null; @@ -58,6 +70,9 @@ function setStatTabsStyle(style: string): void { } export function generalSettingsHandler(update: SettingsState): void { + update.maxMessages = clampMaxMessages(update.maxMessages); + chatRenderer.setMaxMessages(update.maxMessages); + // Set client theme const theme = update?.theme; if (theme) { diff --git a/tgui/packages/tgui-panel/settings/migration.ts b/tgui/packages/tgui-panel/settings/migration.ts index d90f89fcd44..38b577651c0 100644 --- a/tgui/packages/tgui-panel/settings/migration.ts +++ b/tgui/packages/tgui-panel/settings/migration.ts @@ -60,13 +60,22 @@ function migrateHighlights(next: HighlightState): HighlightState { } // Ensure that all highlights have the "enabled" var, - // setting it to true if it doesn't exist. + // setting it to true if it doesn't exist, and fill newer highlight fields. for (const id in draft.highlightSettingById) { - if ( - draft.highlightSettingById[id] && - draft.highlightSettingById[id].enabled === undefined - ) { - draft.highlightSettingById[id].enabled = true; + const highlight = draft.highlightSettingById[id]; + if (!highlight) { + continue; + } + if (highlight.enabled === undefined) { + highlight.enabled = true; + } + if (!highlight.backgroundHighlightColor) { + highlight.backgroundHighlightColor = + highlight.highlightColor ?? defaultHighlightSetting.highlightColor; + } + if (highlight.backgroundHighlightOpacity === undefined) { + highlight.backgroundHighlightOpacity = + defaultHighlightSetting.backgroundHighlightOpacity; } } diff --git a/tgui/packages/tgui-panel/settings/types.ts b/tgui/packages/tgui-panel/settings/types.ts index f7284e41e24..831928f8f81 100644 --- a/tgui/packages/tgui-panel/settings/types.ts +++ b/tgui/packages/tgui-panel/settings/types.ts @@ -12,6 +12,7 @@ export const settingsSchema = z.object({ fontSize: z.number(), initialized: z.boolean(), lineHeight: z.number(), + maxMessages: z.number(), statFontSize: z.number(), statLinked: z.boolean(), statTabsStyle: z.string(), @@ -21,6 +22,8 @@ export const settingsSchema = z.object({ }); export type HighlightSetting = { + backgroundHighlightColor: string; + backgroundHighlightOpacity: number; highlightColor: string; highlightText: string; highlightWholeMessage: boolean; diff --git a/tgui/packages/tgui-panel/styles/components/Chat.scss b/tgui/packages/tgui-panel/styles/components/Chat.scss index f5a3e6c6139..38ae27e41c6 100644 --- a/tgui/packages/tgui-panel/styles/components/Chat.scss +++ b/tgui/packages/tgui-panel/styles/components/Chat.scss @@ -79,7 +79,10 @@ } .ChatMessage--highlighted { - background: oklch(from var(--highlight-color) l c h / 8%); - border-left: 2px solid var(--highlight-color); + background: oklch( + from var(--highlight-background-color, #ffdd44) l c h / + var(--highlight-background-opacity, 10%) + ); + border-left: 2px solid var(--highlight-background-color, #ffdd44); padding-left: 0.5em; } diff --git a/tgui/packages/tgui-say/TguiSay.tsx b/tgui/packages/tgui-say/TguiSay.tsx index 29e945b1d1b..7d6f0c31249 100644 --- a/tgui/packages/tgui-say/TguiSay.tsx +++ b/tgui/packages/tgui-say/TguiSay.tsx @@ -186,13 +186,10 @@ export function TguiSay() { newValue = newValue.slice(3); iterator.set('Say'); - if (newPrefix === ':b ') { - Byond.sendMessage('thinking', { visible: false }); - } } // Handles typing indicators - if (channelIterator.current.isVisible() && newPrefix !== ':b ') { + if (channelIterator.current.isVisible()) { messages.current.typingMsg(); messages.current.saveText(newValue, iterator.current()); } diff --git a/tgui/packages/tgui-say/constants.ts b/tgui/packages/tgui-say/constants.ts index 999a9070453..5ce464e4730 100644 --- a/tgui/packages/tgui-say/constants.ts +++ b/tgui/packages/tgui-say/constants.ts @@ -18,18 +18,30 @@ export enum LineLength { * Displays the name in the left button, tags a css class. */ export const RADIO_PREFIXES = { + ':r ': 'REar', + ':l ': 'LEar', + ':i ': 'Int', + ':h ': 'Dept', + ':+ ': 'Spec', ':a ': 'Hive', - ':b ': 'io', + ':b ': 'Burg', ':c ': 'Cmd', + ':d ': 'Exp', ':e ': 'Engi', + ':f ': 'Navy', ':g ': 'Cling', + ':j ': 'Blue', + ':k ': 'Jock', ':m ': 'Med', ':n ': 'Sci', - ':o ': 'AI', - ':p ': 'Ent', + ':p ': 'AI', + ':q ': 'Penal', ':s ': 'Sec', - ':t ': 'Synd', - ':u ': 'Supp', + ':t ': 'Merc', + ':u ': 'Ops', ':v ': 'Svc', - ':y ': 'CCom', + ':w ': 'Whsp', + ':x ': 'Raid', + ':y ': 'Hail', + ':z ': 'Ent', } as const; diff --git a/tgui/packages/tgui-say/helpers.ts b/tgui/packages/tgui-say/helpers.ts index f5619b7965a..9d2fe64602e 100644 --- a/tgui/packages/tgui-say/helpers.ts +++ b/tgui/packages/tgui-say/helpers.ts @@ -49,7 +49,7 @@ function setWindowVisibility(visible: boolean, scale: boolean): void { }); } -const CHANNEL_REGEX = /^[:.]\w\s/; +const CHANNEL_REGEX = /^[:.][\w+]\s/; /** Tests for a channel prefix, returning it or none */ export function getPrefix( diff --git a/tgui/packages/tgui-say/styles/colors.scss b/tgui/packages/tgui-say/styles/colors.scss index 42a7144b9e2..ed8babb93f3 100644 --- a/tgui/packages/tgui-say/styles/colors.scss +++ b/tgui/packages/tgui-say/styles/colors.scss @@ -10,24 +10,41 @@ $scrollbar-color-multiplier: 1 !default; $_channel_map: ( 'Admin': hsl(300, 100%, 86.7%), 'AI': hsl(332.2, 59.6%, 60.2%), + 'Blue': hsl(248, 69%, 62%), + 'Burg': hsl(197, 56.6%, 28%), 'CCom': hsl(197, 62.6%, 39.8%), 'Cling': hsl(86.7, 56.6%, 28%), - 'Cmd': hsl(53, 97.6%, 50%), + 'Cmd': hsl(197, 62.6%, 39.8%), + 'Com': hsl(132.8, 74.4%, 45.9%), + 'Dept': hsl(132.8, 74.4%, 45.9%), 'Engi': hsl(17, 87.8%, 61.4%), + 'Exp': hsl(176.1, 20%, 45.1%), + 'Hail': hsl(197, 62.6%, 39.8%), 'Hive': hsl(300, 17.7%, 44.3%), + 'Int': hsl(132.8, 74.4%, 45.9%), 'io': hsl(209.6, 100%, 55.9%), + 'Jock': hsl(33.7, 44.9%, 49.8%), + 'LEar': hsl(132.8, 74.4%, 45.9%), 'Me': hsl(227, 63.5%, 60.2%), 'Med': hsl(202, 83.6%, 64.1%), + 'Merc': hsl(359.1, 31.8%, 42.5%), + 'Navy': hsl(216, 62%, 42%), 'OOC': hsl(47.9, 100%, 40%), - 'Ent': hsl(176.1, 20%, 45.1%), + 'Ops': hsl(33.7, 44.9%, 49.8%), + 'Penal': hsl(0, 71.2%, 53.7%), + 'Ent': hsl(173, 7%, 74%), 'Pray': hsl(214, 86%, 30%), + 'Raid': hsl(359.1, 31.8%, 42.5%), 'Radio': hsl(132.8, 74.4%, 45.9%), + 'REar': hsl(132.8, 74.4%, 45.9%), 'Say': hsl(213.6, 37.9%, 74.1%), 'Sci': hsl(271.6, 91.7%, 76.5%), 'Sec': hsl(0, 71.2%, 53.7%), + 'Spec': hsl(132.8, 74.4%, 45.9%), 'Supp': hsl(33.7, 44.9%, 49.8%), 'Svc': hsl(88.1, 60.6%, 40.8%), 'Synd': hsl(359.1, 31.8%, 42.5%), + 'Whsp': hsl(213.6, 37.9%, 74.1%), ); $channel_keys: map.keys($_channel_map) !default; diff --git a/tgui/packages/tgui/constants.ts b/tgui/packages/tgui/constants.ts index 1b55c62c945..812cf2d8220 100644 --- a/tgui/packages/tgui/constants.ts +++ b/tgui/packages/tgui/constants.ts @@ -30,7 +30,7 @@ export const COLORS = { cargo: '#f39c12', service: '#7cc46a', centcom: '#00c100', - other: '#c38312', + other: '#888888', }, // Damage type colors damageType: { diff --git a/tgui/packages/tgui/interfaces/BotanyIsolator.tsx b/tgui/packages/tgui/interfaces/BotanyIsolator.tsx index 908c10ac5aa..28482657972 100644 --- a/tgui/packages/tgui/interfaces/BotanyIsolator.tsx +++ b/tgui/packages/tgui/interfaces/BotanyIsolator.tsx @@ -64,7 +64,10 @@ export const BotanyIsolator = (_props) => { content={`Extract ${entry.mask}`} icon="arrow-down" onClick={() => - act('get_gene', { gene: entry.tag }) + act('get_gene', { + gene: entry.tag, + gene_label: entry.mask, + }) } /> diff --git a/tgui/packages/tgui/interfaces/LateJoin.tsx b/tgui/packages/tgui/interfaces/LateJoin.tsx index 6a29e54e4d7..a47be352329 100644 --- a/tgui/packages/tgui/interfaces/LateJoin.tsx +++ b/tgui/packages/tgui/interfaces/LateJoin.tsx @@ -8,7 +8,7 @@ import { import type { BooleanLike } from 'tgui-core/react'; import { useBackend } from '../backend'; import { Window } from '../layouts'; -import { departmentClass } from './common/departmentClass'; +import { departmentClass, departmentStyle } from './common/departmentClass'; export type LateJoinData = { character_name: string; @@ -91,7 +91,8 @@ export const JobsList = (props) => {
{data.jobs_list .filter((job) => job.department === department) diff --git a/tgui/packages/tgui/interfaces/Sensors.tsx b/tgui/packages/tgui/interfaces/Sensors.tsx index 0fd0c434f30..42dbffbff6b 100644 --- a/tgui/packages/tgui/interfaces/Sensors.tsx +++ b/tgui/packages/tgui/interfaces/Sensors.tsx @@ -26,7 +26,7 @@ export type SensorsData = { is_ship: BooleanLike; on: BooleanLike; range: number; - health: number; + integrity: number; max_health: number; deep_scan_name: string; deep_scan_range: number; @@ -141,14 +141,14 @@ const SensorSection = (act, data: SensorsData) => { backgroundColor={Color.lerp( new Color(62, 97, 137, 0), new Color(189, 32, 32), - data.range / range_choice_max, + data.range, ).toString()} minValue={1} maxValue={range_choice_max} value={data.range} > Current Range:{' '} - + @@ -176,12 +176,12 @@ const SensorSection = (act, data: SensorsData) => { backgroundColor={Color.lerp( Color.fromHex('#20b142'), Color.fromHex('#db2828'), - data.health / data.max_health, + data.integrity / data.max_health, ).toString()} color={(() => { - if (data.health > (data.max_health / 3) * 2) { + if (data.integrity > (data.max_health / 3) * 2) { return 'green'; - } else if (data.health > (data.max_health / 3) * 1) { + } else if (data.integrity > (data.max_health / 3) * 1) { return 'yellow'; } else { return 'red'; @@ -189,9 +189,9 @@ const SensorSection = (act, data: SensorsData) => { })()} minValue={0} maxValue={data.max_health} - value={data.health} + value={data.integrity} > - {data.health} / {data.max_health} + {data.integrity} / {data.max_health} diff --git a/tgui/packages/tgui/interfaces/common/ManifestSection.tsx b/tgui/packages/tgui/interfaces/common/ManifestSection.tsx index 2ac6cb977e9..f04e46bf042 100644 --- a/tgui/packages/tgui/interfaces/common/ManifestSection.tsx +++ b/tgui/packages/tgui/interfaces/common/ManifestSection.tsx @@ -1,7 +1,7 @@ import { Button, Icon, Section, Table, Tooltip } from 'tgui-core/components'; import type { BooleanLike } from 'tgui-core/react'; import { useBackend } from '../../backend'; -import { departmentClass } from './departmentClass'; +import { departmentClass, departmentStyle } from './departmentClass'; type ManifestData = { manifest: { department: Crew[] }; @@ -29,7 +29,8 @@ export const ManifestSection = (props) => { key={dept} title={dept} textAlign="center" - className={departmentClass(dept)} + className={departmentClass()} + style={departmentStyle(dept)} backgroundColor="rgba(10, 10, 10, 0.75)" > diff --git a/tgui/packages/tgui/interfaces/common/departmentClass.ts b/tgui/packages/tgui/interfaces/common/departmentClass.ts index 6d82db8ce3e..3547e1d5bca 100644 --- a/tgui/packages/tgui/interfaces/common/departmentClass.ts +++ b/tgui/packages/tgui/interfaces/common/departmentClass.ts @@ -1,5 +1,42 @@ -export const departmentClass = (department: string) => - `border-dept-${department +import type { CSSProperties } from 'react'; + +import { COLORS } from '../../constants'; + +type DepartmentStyle = CSSProperties & { + '--department-color': string; +}; + +const departmentColorByName: Record = { + cargo: COLORS.department.cargo, + operations: COLORS.department.cargo, + command: COLORS.department.medbay, + 'command-support': COLORS.department.medbay, + security: COLORS.department.security, + engineering: COLORS.department.engineering, + medical: COLORS.department.medbay, + science: COLORS.department.science, + service: COLORS.department.service, + civilian: COLORS.department.other, + centcom: COLORS.department.centcom, + miscellaneous: COLORS.department.other, + silicon: COLORS.department.other, + equipment: COLORS.department.other, + 'off-ship': COLORS.department.other, + other: COLORS.department.other, +}; + +const normalizeDepartment = (department: string) => + department .toLowerCase() .replace(/[^a-z0-9]+/g, '-') - .replace(/^-|-$/g, '')}`; + .replace(/^-|-$/g, ''); + +export const departmentColor = (department: string) => + departmentColorByName[normalizeDepartment(department)] || + COLORS.department.other; + +export const departmentClass = () => 'border-dept'; + +export const departmentStyle = (department: string): DepartmentStyle => ({ + '--department-color': departmentColor(department), +}); diff --git a/tgui/packages/tgui/layouts/NtosWindow.tsx b/tgui/packages/tgui/layouts/NtosWindow.tsx index c4b2fd8aa99..338af51370c 100644 --- a/tgui/packages/tgui/layouts/NtosWindow.tsx +++ b/tgui/packages/tgui/layouts/NtosWindow.tsx @@ -54,7 +54,7 @@ type Login = { }; export const NtosWindow = (props) => { - const { title, width = 575, height = 700, children } = props; + const { title, width = 575, height = 700, theme, children } = props; const { act, data } = useBackend(); const { PC_device_theme, @@ -71,7 +71,12 @@ export const NtosWindow = (props) => { } = data; return ( - +
diff --git a/tgui/packages/tgui/styles/base_original.scss b/tgui/packages/tgui/styles/base_original.scss deleted file mode 100644 index 3a99d5d28d7..00000000000 --- a/tgui/packages/tgui/styles/base_original.scss +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (c) 2020 Aleksej Komarov - * SPDX-License-Identifier: MIT - */ - -@use 'sass:color'; -@use 'sass:math'; - -$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; -$color-bg-end: color.adjust( - $color-bg, - $lightness: -$color-bg-grad-spread -) !default; - -$unit: 12px; -$font-size: 1 * $unit !default; -$border-radius: 0.16em !default; - -@function em($px) { - @return 1em * math.div($px, $unit); -} - -@function rem($px) { - @return 1rem * math.div($px, $unit); -} diff --git a/tgui/packages/tgui/styles/colors.scss b/tgui/packages/tgui/styles/colors.scss index 0434c897022..1efccad5269 100644 --- a/tgui/packages/tgui/styles/colors.scss +++ b/tgui/packages/tgui/styles/colors.scss @@ -89,7 +89,7 @@ $_gen_map: ( 'label': $label, ); -// Modern tgui-core atomic styles expect a generic color map. +// Modern tgui-core atomic styles $color-map-keys: map.keys($_gen_map) !default; $color-map: (); @each $color-name in $color-map-keys { @@ -101,7 +101,7 @@ $color-map: (); ); } -// Legacy Aurora theme styles configure these maps directly. +// Aurora theme styles configure these maps directly. $fg-map-keys: map.keys($_gen_map) !default; $bg-map-keys: map.keys($_gen_map) !default; diff --git a/tgui/packages/tgui/styles/colors_original.scss b/tgui/packages/tgui/styles/colors_original.scss deleted file mode 100644 index 1521c1e5f6f..00000000000 --- a/tgui/packages/tgui/styles/colors_original.scss +++ /dev/null @@ -1,100 +0,0 @@ -/** - * Copyright (c) 2020 Aleksej Komarov - * SPDX-License-Identifier: MIT - */ - -@use 'sass:color'; -@use 'sass:map'; -@use 'sass:meta'; - -// Base colors -$black: #000000 !default; -$white: #ffffff !default; -$red: #db2828 !default; -$orange: #f2711c !default; -$yellow: #fbd608 !default; -$olive: #b5cc18 !default; -$green: #20b142 !default; -$teal: #00b5ad !default; -$blue: #2185d0 !default; -$violet: #6435c9 !default; -$purple: #a333c8 !default; -$pink: #e03997 !default; -$brown: #a5673f !default; -$grey: #767676 !default; -$light-grey: #aaa !default; -$silver: #c0c0c0 !default; -$crimson: #dc143c !default; -$cyan: #00ffff !default; -$gold: #ffd700 !default; -$magenta: #ff00ff !default; -$lime: #32cd32 !default; - -$primary: #4972a1 !default; -$good: #5baa27 !default; -$average: #f08f11 !default; -$bad: #db2828 !default; -$label: #7e90a7 !default; - -// Background and foreground color lightness ratios -$bg-lightness: -15% !default; -$fg-lightness: 10% !default; - -@function bg($color) { - @return color.scale($color, $lightness: $bg-lightness); -} - -@function fg($color) { - @return color.scale($color, $lightness: $fg-lightness); -} - -// Mappings of color names - -$_gen_map: ( - 'black': $black, - 'white': $white, - 'red': $red, - 'orange': $orange, - 'yellow': $yellow, - 'olive': $olive, - 'green': $green, - 'teal': $teal, - 'blue': $blue, - 'violet': $violet, - 'purple': $purple, - 'pink': $pink, - 'brown': $brown, - 'grey': $grey, - 'light-grey': $light-grey, - 'silver': $silver, - 'crimson': $crimson, - 'cyan': $cyan, - 'gold': $gold, - 'magenta': $magenta, - 'lime': $lime, - 'good': $good, - 'average': $average, - 'bad': $bad, - 'label': $label, -); - -// Foreground color names for which to generate a color map -$fg-map-keys: map.keys($_gen_map) !default; -// Background color names for which to generate a color map -$bg-map-keys: map.keys($_gen_map) !default; - -$fg-map: (); -@each $color-name in $fg-map-keys { - // prettier-ignore - $fg-map: map-merge($fg-map, ( - $color-name: fg(map.get($_gen_map, $color-name)), - )); -} - -$bg-map: (); -@each $color-name in $bg-map-keys { - // prettier-ignore - $bg-map: map-merge($bg-map, ( - $color-name: bg(map.get($_gen_map, $color-name)), - )); -} diff --git a/tgui/packages/tgui/styles/interfaces/CrewManifest.scss b/tgui/packages/tgui/styles/interfaces/CrewManifest.scss index a7d21bade05..6a36674493e 100644 --- a/tgui/packages/tgui/styles/interfaces/CrewManifest.scss +++ b/tgui/packages/tgui/styles/interfaces/CrewManifest.scss @@ -1,21 +1,3 @@ -$department_map: ( - 'cargo': var(--color-brown), - 'operations': var(--color-brown), - 'command': var(--color-yellow), - 'command-support': var(--color-blue), - 'security': var(--color-red), - 'engineering': var(--color-orange), - 'medical': var(--color-teal), - 'misc': var(--color-white), - 'miscellaneous': var(--color-white), - 'science': var(--color-purple), - 'service': var(--color-green), - 'civilian': var(--color-green), - 'silicon': var(--color-pink), - 'equipment': var(--color-pink), - 'off-ship': var(--color-white), -); - $manifest_status_map: ( 'active': var(--color-green), 'online': var(--color-green), @@ -27,15 +9,13 @@ $manifest_status_map: ( 'disabled': var(--color-grey), ); -@each $department-name, $color-value in $department_map { - .border-dept-#{$department-name} { - .Section { - &__title { - border-color: $color-value; - } - &__titleText { - color: $color-value; - } +.border-dept { + .Section { + &__title { + border-color: var(--department-color); + } + &__titleText { + color: var(--department-color); } } } diff --git a/tgui/packages/tgui/styles/interfaces/FactionSelect.scss b/tgui/packages/tgui/styles/interfaces/FactionSelect.scss index d01b13e937c..5446cd188bc 100644 --- a/tgui/packages/tgui/styles/interfaces/FactionSelect.scss +++ b/tgui/packages/tgui/styles/interfaces/FactionSelect.scss @@ -1,4 +1,4 @@ -@use '../components/Divider.scss'; +@use 'tgui-core/styles/components/Divider.scss'; // Colours based on the companies' 'Official Colours' sections on the wiki. $company-colors: ( @@ -15,7 +15,8 @@ $company-colors: ( .theme-faction_select { .Divider { &--vertical--dashed { - border-left: Divider.$thickness dashed Divider.$color; + border-left: var(--divider-border); + border-left-style: dashed; } } diff --git a/tgui/packages/tgui/styles/interfaces/LoreConsole.scss b/tgui/packages/tgui/styles/interfaces/LoreConsole.scss new file mode 100644 index 00000000000..8aa6e81c243 --- /dev/null +++ b/tgui/packages/tgui/styles/interfaces/LoreConsole.scss @@ -0,0 +1,17 @@ +@use '../base.scss'; + +$background-color: rgba(0, 0, 0, 0.33) !default; + +.LoreConsole__titleText { + font-size: 300%; + font-weight: bold; + margin: 0; + padding: 4px; +} + +.LoreConsole__entryText { + color: chocolate; + font-size: 150%; + font-family: 'Courier New', Courier, monospace; + padding: 32px; +} diff --git a/tgui/packages/tgui/styles/interfaces/Radio.scss b/tgui/packages/tgui/styles/interfaces/Radio.scss new file mode 100644 index 00000000000..8d2a1370936 --- /dev/null +++ b/tgui/packages/tgui/styles/interfaces/Radio.scss @@ -0,0 +1,53 @@ +/* Radio Channels */ +.radio { + color: #00a700; +} +.deptradio { + color: #ff00ff; +} +.comradio { + color: #5b8deb; +} +.syndradio { + color: #ac6667; +} +.coalitionradio { + color: #0091ce; +} +.centradio { + color: #7272a7; +} +.airadio { + color: #ec00ec; +} +.entradio { + color: #cfcfcf; +} +.hailradio { + color: #8b4cd8; +} +.shipradio { + color: #738465; +} + +.secradio { + color: #e21111; +} +.engradio { + color: #cc7b01; +} +.medradio { + color: #0f7e62; +} +.sciradio { + color: #c03bc0; +} +.supradio { + color: #c09141; +} +.srvradio { + color: #7fc732; +} +.expradio { + color: #ffeeb5; +} diff --git a/tgui/packages/tgui/styles/main.scss b/tgui/packages/tgui/styles/main.scss index 4f01038d289..ed7d56d4b10 100644 --- a/tgui/packages/tgui/styles/main.scss +++ b/tgui/packages/tgui/styles/main.scss @@ -51,6 +51,13 @@ @include meta.load-css('./interfaces/AnomalyTower.scss'); @include meta.load-css('./interfaces/CivCargoHoldTerminal.scss'); @include meta.load-css('./interfaces/EventLogger.scss'); +@include meta.load-css('./interfaces/AlertModal.scss'); +@include meta.load-css('./interfaces/FactionSelect.scss'); +@include meta.load-css('./interfaces/HealthAnalyzer.scss'); +@include meta.load-css('./interfaces/ListInput.scss'); +@include meta.load-css('./interfaces/PersonalCrafting.scss'); +@include meta.load-css('./interfaces/Radio.scss'); +@include meta.load-css('./interfaces/LoreConsole.scss'); // Layouts @include meta.load-css('./layouts/Layout.scss'); @@ -61,14 +68,13 @@ @include meta.load-css('~highlight.js/scss/a11y-dark.scss'); -// NT Theme +// SCC Theme .Layout__content { - background-image: url('tgui-core/assets/bg-nanotrasen.svg'); - background-size: 70% 70%; + background-image: url('../assets/bg-scc.svg'); + background-size: 70%; background-position: center; background-repeat: no-repeat; } - // A default, in case someone uses the vp() function outside of a :root { --scaling-amount: 1; diff --git a/tgui/packages/tgui/styles/main_original.scss b/tgui/packages/tgui/styles/main_original.scss deleted file mode 100644 index 5bcee3437c1..00000000000 --- a/tgui/packages/tgui/styles/main_original.scss +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Copyright (c) 2020 Aleksej Komarov - * SPDX-License-Identifier: MIT - */ - -@use 'sass:meta'; -@use './base.scss'; - -// Core styles -@include meta.load-css('./reset.scss'); - -// Atomic classes -@include meta.load-css('./atomic/candystripe.scss'); -@include meta.load-css('./atomic/centered-image.scss'); -@include meta.load-css('./atomic/color.scss'); -@include meta.load-css('./atomic/debug-layout.scss'); -@include meta.load-css('./atomic/fit-text.scss'); -@include meta.load-css('./atomic/links.scss'); -@include meta.load-css('./atomic/outline.scss'); -@include meta.load-css('./atomic/text.scss'); - -// Components -@include meta.load-css('./components/BlockQuote.scss'); -@include meta.load-css('./components/Button.scss'); -@include meta.load-css('./components/ColorBox.scss'); -@include meta.load-css('./components/Dialog.scss'); -@include meta.load-css('./components/Dimmer.scss'); -@include meta.load-css('./components/Divider.scss'); -@include meta.load-css('./components/Dropdown.scss'); -@include meta.load-css('./components/Flex.scss'); -@include meta.load-css('./components/Icon.scss'); -@include meta.load-css('./components/Input.scss'); -@include meta.load-css('./components/Knob.scss'); -@include meta.load-css('./components/LabeledList.scss'); -@include meta.load-css('./components/MenuBar.scss'); -@include meta.load-css('./components/Modal.scss'); -@include meta.load-css('./components/NoticeBox.scss'); -@include meta.load-css('./components/NumberInput.scss'); -@include meta.load-css('./components/ProgressBar.scss'); -@include meta.load-css('./components/RoundGauge.scss'); -@include meta.load-css('./components/Section.scss'); -@include meta.load-css('./components/Slider.scss'); -@include meta.load-css('./components/Stack.scss'); -@include meta.load-css('./components/Table.scss'); -@include meta.load-css('./components/Tabs.scss'); -@include meta.load-css('./components/TextArea.scss'); -@include meta.load-css('./components/Tooltip.scss'); - -// Interfaces -@include meta.load-css('./interfaces/AlertModal.scss'); -@include meta.load-css('./interfaces/CrewManifest.scss'); -@include meta.load-css('./interfaces/FactionSelect.scss'); -@include meta.load-css('./interfaces/HealthAnalyzer.scss'); -@include meta.load-css('./interfaces/ListInput.scss'); -@include meta.load-css('./interfaces/PersonalCrafting.scss'); -@include meta.load-css('./interfaces/RequestManager.scss'); -@include meta.load-css('./interfaces/Radio.scss'); -@include meta.load-css('./interfaces/LoreConsole.scss'); - -// Layouts -@include meta.load-css('./layouts/Layout.scss'); -@include meta.load-css('./layouts/NtosHeader.scss'); -@include meta.load-css('./layouts/NtosWindow.scss'); -@include meta.load-css('./layouts/TitleBar.scss'); -@include meta.load-css('./layouts/Window.scss'); - -@include meta.load-css('highlight.js/scss/github-dark.scss'); - -// SCC Theme -.Layout__content { - background-image: url('../assets/bg-scc.svg'); - background-size: 70%; - background-position: center; - background-repeat: no-repeat; -} - -// A default, in case someone uses the vp() function outside of a -:root { - --scaling-amount: 1; -} diff --git a/tgui/public/tgui.html b/tgui/public/tgui.html index 53b4c150fda..dbfa5339eca 100644 --- a/tgui/public/tgui.html +++ b/tgui/public/tgui.html @@ -39,7 +39,7 @@ o8o `8 "888" `Y8bood8P' 8""88888P' A fatal exception has occurred at 002B:C562F1B7 in TGUI. The current application will be terminated. Send the copy of the following stack trace to an authorized Nanotrasen incident handler at - https://github.com/Aurora.3/tgstation. Thank you for your cooperation. + https://github.com/Aurorastation/Aurora.3. Thank you for your cooperation.