diff --git a/code/__DEFINES/announcements.dm b/code/__DEFINES/announcements.dm
new file mode 100644
index 00000000000..3a2edf6d6f7
--- /dev/null
+++ b/code/__DEFINES/announcements.dm
@@ -0,0 +1,7 @@
+// Priority-type announcement messages for `priority_announcement()`
+/// Prefix this announcement with "Priority Announcement"
+#define ANNOUNCEMENT_TYPE_PRIORITY "Priority"
+/// Make it sound like it's coming from the Captain
+#define ANNOUNCEMENT_TYPE_CAPTAIN "Captain"
+/// Make it sound like it's coming from the Syndicate
+#define ANNOUNCEMENT_TYPE_SYNDICATE "Syndicate"
diff --git a/code/__HELPERS/priority_announce.dm b/code/__HELPERS/priority_announce.dm
index 049bf001f2e..2d174b17436 100644
--- a/code/__HELPERS/priority_announce.dm
+++ b/code/__HELPERS/priority_announce.dm
@@ -1,3 +1,15 @@
+// please don't use these defines outside of this file in order to ensure a unified framework. unless you have a really good reason to make them global, then whatever
+
+// these four are just text spans that furnish the TEXT itself with the appropriate CSS classes
+#define MAJOR_ANNOUNCEMENT_TITLE(string) ("" + string + "")
+#define MAJOR_ANNOUNCEMENT_TEXT(string) ("" + string + "")
+#define MINOR_ANNOUNCEMENT_TITLE(string) ("" + string + "")
+#define MINOR_ANNOUNCEMENT_TEXT(string) ("" + string + "")
+
+// these two are the ones that actually give the striped background
+#define CHAT_ALERT_DEFAULT_SPAN(string) ("
" + string + "
")
+#define CHAT_ALERT_COLORED_SPAN(color, string) ("" + string + "
")
+
/**
* Make a big red text announcement to
*
@@ -13,7 +25,7 @@
* * text - required, the text to announce
* * title - optional, the title of the announcement.
* * sound - optional, the sound played accompanying the announcement
- * * type - optional, the type of the announcement, for some "preset" announcement templates. "Priority", "Captain", "Syndicate Captain"
+ * * type - optional, the type of the announcement, for some "preset" announcement templates. See __DEFINES/announcements.dm
* * sender_override - optional, modifies the sender of the announcement
* * has_important_message - is this message critical to the game (and should not be overridden by station traits), or not
* * players - a list of all players to send the message to. defaults to all players (not including new players)
@@ -31,55 +43,44 @@
if(!length(text))
return
- var/announcement
+ var/list/announcement_strings = list()
+
if(!sound)
sound = SSstation.announcer.get_rand_alert_sound()
else if(SSstation.announcer.event_sounds[sound])
sound = SSstation.announcer.event_sounds[sound]
- announcement += "
"
-
- if(type == "Priority")
- announcement += "[span_priorityannounce("Priority Announcement")]"
- if (title && length(title) > 0)
- announcement += "[span_prioritytitle("
[title]")]"
- else if(type == "Captain")
- announcement += "[span_priorityannounce("Captain Announces")]"
- GLOB.news_network.submit_article(text, "Captain's Announcement", "Station Announcements", null)
- else if(type == "Syndicate Captain")
- announcement += "[span_priorityannounce("Syndicate Captain Announces")]"
-
- else
- if(!sender_override)
- announcement += "[span_priorityannounce("[command_name()] Update")]"
+ var/header
+ switch(type)
+ if(ANNOUNCEMENT_TYPE_PRIORITY)
+ header = MAJOR_ANNOUNCEMENT_TITLE("Priority Announcement")
+ if(length(title) > 0)
+ header += MINOR_ANNOUNCEMENT_TITLE(title)
+ if(ANNOUNCEMENT_TYPE_CAPTAIN)
+ header = MAJOR_ANNOUNCEMENT_TITLE("Captain's Announcement")
+ GLOB.news_network.submit_article(text, "Captain's Announcement", "Station Announcements", null)
+ if(ANNOUNCEMENT_TYPE_SYNDICATE)
+ header = MAJOR_ANNOUNCEMENT_TITLE("Syndicate Captain's Announcement")
else
- announcement += "[span_priorityannounce("[sender_override]")]"
- if (title && length(title) > 0)
- announcement += "[span_prioritytitle("
[title]")]"
+ header += generate_unique_announcement_header(title, sender_override)
- if(!sender_override)
- if(title == "")
- GLOB.news_network.submit_article(text, "Central Command Update", "Station Announcements", null)
- else
- GLOB.news_network.submit_article(title + "
" + text, "Central Command", "Station Announcements", null)
+ announcement_strings += header
///If the announcer overrides alert messages, use that message.
if(SSstation.announcer.custom_alert_message && !has_important_message)
- announcement += "[span_priorityalert("
[SSstation.announcer.custom_alert_message]
")]"
+ announcement_strings += SSstation.announcer.custom_alert_message
else
- announcement += "[span_priorityalert("
[text]
")]"
+ announcement_strings += MAJOR_ANNOUNCEMENT_TEXT(text)
- announcement += "
"
+ var/finalized_announcement = CHAT_ALERT_DEFAULT_SPAN(jointext(announcement_strings, "
"))
- if(!players)
- players = GLOB.player_list
+ dispatch_announcement_to_players(finalized_announcement, players, sound)
- var/sound_to_play = sound(sound)
- for(var/mob/target in players)
- if(!isnewplayer(target) && target.can_hear())
- to_chat(target, announcement)
- if(target.client.prefs.read_preference(/datum/preference/toggle/sound_announcements))
- SEND_SOUND(target, sound_to_play)
+ if(isnull(sender_override))
+ if(length(title) > 0)
+ GLOB.news_network.submit_article(title + "
" + text, "Central Command", "Station Announcements", null)
+ else
+ GLOB.news_network.submit_article(text, "Central Command Update", "Station Announcements", null)
/proc/print_command_report(text = "", title = null, announce=TRUE)
if(!title)
@@ -107,7 +108,7 @@
* sound_override - optional, use the passed sound file instead of the default notice sounds.
* should_play_sound - Whether the notice sound should be played or not.
*/
-/proc/minor_announce(message, title = "Attention:", alert, html_encode = TRUE, list/players = null, sound_override = null, should_play_sound = TRUE)
+/proc/minor_announce(message, title = "Attention:", alert = FALSE, html_encode = TRUE, list/players = null, sound_override = null, should_play_sound = TRUE)
if(!message)
return
@@ -115,17 +116,75 @@
title = html_encode(title)
message = html_encode(message)
+ var/list/minor_announcement_strings = list()
+ minor_announcement_strings += MINOR_ANNOUNCEMENT_TITLE(title)
+ minor_announcement_strings += MINOR_ANNOUNCEMENT_TEXT(message)
+
+ var/finalized_announcement = CHAT_ALERT_DEFAULT_SPAN(jointext(minor_announcement_strings, "
"))
+
+ var/custom_sound = sound_override || (alert ? 'sound/misc/notice1.ogg' : 'sound/misc/notice2.ogg')
+ dispatch_announcement_to_players(finalized_announcement, players, custom_sound, should_play_sound)
+
+/// Sends an announcement about the level changing to players. Uses the passed in datum and the subsystem's previous security level to generate the message.
+/proc/level_announce(datum/security_level/selected_level, previous_level_number)
+ var/current_level_number = selected_level.number_level
+ var/current_level_name = selected_level.name
+ var/current_level_color = selected_level.announcement_color
+ var/current_level_sound = selected_level.sound
+
+ var/title
+ var/message
+
+ if(current_level_number > previous_level_number)
+ title = "Attention! Security level elevated to [current_level_name]:"
+ message = selected_level.elevating_to_announcement
+ else
+ title = "Attention! Security level lowered to [current_level_name]:"
+ message = selected_level.lowering_to_announcement
+
+ var/list/level_announcement_strings = list()
+ level_announcement_strings += MINOR_ANNOUNCEMENT_TITLE(title)
+ level_announcement_strings += MINOR_ANNOUNCEMENT_TEXT(message)
+
+ var/finalized_announcement = CHAT_ALERT_COLORED_SPAN(current_level_color, jointext(level_announcement_strings, "
"))
+
+ dispatch_announcement_to_players(finalized_announcement, GLOB.player_list, current_level_sound)
+
+/// Proc that just generates a custom header based on variables fed into `priority_announce()`
+/// Will return a string.
+/proc/generate_unique_announcement_header(title, sender_override)
+ var/list/returnable_strings = list()
+ if(isnull(sender_override))
+ returnable_strings += MAJOR_ANNOUNCEMENT_TITLE("[command_name()] Update")
+ else
+ returnable_strings += MAJOR_ANNOUNCEMENT_TITLE(sender_override)
+
+ if(length(title) > 0)
+ returnable_strings += MINOR_ANNOUNCEMENT_TITLE(title)
+
+ return jointext(returnable_strings, "
")
+
+/// Proc that just dispatches the announcement to our applicable audience. Only the announcement is a mandatory arg.
+/proc/dispatch_announcement_to_players(announcement, list/players, sound_override = null, should_play_sound = TRUE)
if(!players)
players = GLOB.player_list
+ var/sound_to_play = !isnull(sound_override) ? sound_override : 'sound/misc/notice2.ogg'
+
for(var/mob/target in players)
- if(isnewplayer(target))
- continue
- if(!target.can_hear())
+ if(isnewplayer(target) || !target.can_hear())
continue
- to_chat(target, "
[span_minorannounce(title)]
")
- to_chat(target, "[span_minoralert(message)]
")
- if(should_play_sound && target.client?.prefs.read_preference(/datum/preference/toggle/sound_announcements))
- var/sound_to_play = sound_override || (alert ? 'sound/misc/notice1.ogg' : 'sound/misc/notice2.ogg')
+ to_chat(target, announcement)
+ if(!should_play_sound)
+ continue
+
+ if(target.client?.prefs.read_preference(/datum/preference/toggle/sound_announcements))
SEND_SOUND(target, sound(sound_to_play))
+
+#undef MAJOR_ANNOUNCEMENT_TITLE
+#undef MAJOR_ANNOUNCEMENT_TEXT
+#undef MINOR_ANNOUNCEMENT_TITLE
+#undef MINOR_ANNOUNCEMENT_TEXT
+#undef CHAT_ALERT_DEFAULT_SPAN
+#undef CHAT_ALERT_COLORED_SPAN
diff --git a/code/controllers/subsystem/communications.dm b/code/controllers/subsystem/communications.dm
index c727b17f0ef..d34a066e859 100644
--- a/code/controllers/subsystem/communications.dm
+++ b/code/controllers/subsystem/communications.dm
@@ -38,9 +38,9 @@ SUBSYSTEM_DEF(communications)
else
var/list/message_data = user.treat_message(input)
if(syndicate)
- priority_announce(html_decode(message_data["message"]), null, 'sound/misc/announce_syndi.ogg', "Syndicate Captain", has_important_message = TRUE, players = players)
+ priority_announce(html_decode(message_data["message"]), null, 'sound/misc/announce_syndi.ogg', ANNOUNCEMENT_TYPE_SYNDICATE, has_important_message = TRUE, players = players)
else
- priority_announce(html_decode(message_data["message"]), null, 'sound/misc/announce.ogg', "Captain", has_important_message = TRUE, players = players)
+ priority_announce(html_decode(message_data["message"]), null, 'sound/misc/announce.ogg', ANNOUNCEMENT_TYPE_CAPTAIN, has_important_message = TRUE, players = players)
COOLDOWN_START(src, nonsilicon_message_cooldown, COMMUNICATION_COOLDOWN)
user.log_talk(input, LOG_SAY, tag="priority announcement")
message_admins("[ADMIN_LOOKUPFLW(user)] has made a priority announcement.")
diff --git a/code/controllers/subsystem/security_level.dm b/code/controllers/subsystem/security_level.dm
index d4fb13d9988..b82a113d4fa 100644
--- a/code/controllers/subsystem/security_level.dm
+++ b/code/controllers/subsystem/security_level.dm
@@ -39,7 +39,7 @@ SUBSYSTEM_DEF(security_level)
if(!selected_level)
CRASH("set_level was called with an invalid security level([new_level])")
- announce_security_level(selected_level) // We want to announce BEFORE updating to the new level
+ level_announce(selected_level, current_security_level.number_level) // We want to announce BEFORE updating to the new level
SSsecurity_level.current_security_level = selected_level
@@ -56,18 +56,6 @@ SUBSYSTEM_DEF(security_level)
SSnightshift.check_nightshift()
SSblackbox.record_feedback("tally", "security_level_changes", 1, selected_level.name)
-/**
- * Handles announcements of the newly set security level
- *
- * Arguments:
- * * selected_level - The new security level that has been set
- */
-/datum/controller/subsystem/security_level/proc/announce_security_level(datum/security_level/selected_level)
- if(selected_level.number_level > current_security_level.number_level) // We are elevating to this level.
- minor_announce(selected_level.elevating_to_announcemnt, "Attention! Security level elevated to [selected_level.name]:", sound_override = selected_level.sound)
- else // Going down
- minor_announce(selected_level.lowering_to_announcement, "Attention! Security level lowered to [selected_level.name]:", sound_override = selected_level.sound)
-
/**
* Returns the current security level as a number
*/
diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm
index 9798a6f1e30..fb1f2111412 100644
--- a/code/controllers/subsystem/shuttle.dm
+++ b/code/controllers/subsystem/shuttle.dm
@@ -505,13 +505,13 @@ SUBSYSTEM_DEF(shuttle)
emergency.sound_played = FALSE
priority_announce("Hostile environment detected. \
Departure has been postponed indefinitely pending \
- conflict resolution.", null, 'sound/misc/notice1.ogg', "Priority")
+ conflict resolution.", null, 'sound/misc/notice1.ogg', ANNOUNCEMENT_TYPE_PRIORITY)
if(!emergency_no_escape && (emergency.mode == SHUTTLE_STRANDED))
emergency.mode = SHUTTLE_DOCKED
emergency.setTimer(emergency_dock_time)
priority_announce("Hostile environment resolved. \
You have 3 minutes to board the Emergency Shuttle.",
- null, ANNOUNCER_SHUTTLEDOCK, "Priority")
+ null, ANNOUNCER_SHUTTLEDOCK, ANNOUNCEMENT_TYPE_PRIORITY)
//try to move/request to dock_home if possible, otherwise dock_away. Mainly used for admin buttons
/datum/controller/subsystem/shuttle/proc/toggleShuttle(shuttle_id, dock_home, dock_away, timed)
diff --git a/code/modules/security_levels/security_level_datums.dm b/code/modules/security_levels/security_level_datums.dm
index 175b79d1c87..b3402f643c6 100644
--- a/code/modules/security_levels/security_level_datums.dm
+++ b/code/modules/security_levels/security_level_datums.dm
@@ -9,6 +9,8 @@
/datum/security_level
/// The name of this security level.
var/name = "not set"
+ /// The color of our announcement divider.
+ var/announcement_color = "default"
/// The numerical level of this security level, see defines for more information.
var/number_level = -1
/// The sound that we will play when this security level is set
@@ -22,7 +24,7 @@
/// Our announcement when lowering to this level
var/lowering_to_announcement
/// Our announcement when elevating to this level
- var/elevating_to_announcemnt
+ var/elevating_to_announcement
/// Our configuration key for lowering to text, if set, will override the default lowering to announcement.
var/lowering_to_configuration_key
/// Our configuration key for elevating to text, if set, will override the default elevating to announcement.
@@ -33,7 +35,7 @@
if(lowering_to_configuration_key) // I'm not sure about you, but isn't there an easier way to do this?
lowering_to_announcement = global.config.Get(lowering_to_configuration_key)
if(elevating_to_configuration_key)
- elevating_to_announcemnt = global.config.Get(elevating_to_configuration_key)
+ elevating_to_announcement = global.config.Get(elevating_to_configuration_key)
/**
* GREEN
@@ -42,6 +44,7 @@
*/
/datum/security_level/green
name = "green"
+ announcement_color = "green"
sound = 'sound/misc/notice2.ogg' // Friendly beep
number_level = SEC_LEVEL_GREEN
lowering_to_configuration_key = /datum/config_entry/string/alert_green
@@ -54,6 +57,7 @@
*/
/datum/security_level/blue
name = "blue"
+ announcement_color = "blue"
sound = 'sound/misc/notice1.ogg' // Angry alarm
number_level = SEC_LEVEL_BLUE
lowering_to_configuration_key = /datum/config_entry/string/alert_blue_downto
@@ -67,6 +71,7 @@
*/
/datum/security_level/red
name = "red"
+ announcement_color = "red"
sound = 'sound/misc/notice3.ogg' // More angry alarm
number_level = SEC_LEVEL_RED
lowering_to_configuration_key = /datum/config_entry/string/alert_red_downto
@@ -80,6 +85,7 @@
*/
/datum/security_level/delta
name = "delta"
+ announcement_color = "purple"
sound = 'sound/misc/airraid.ogg' // Air alarm to signify importance
number_level = SEC_LEVEL_DELTA
elevating_to_configuration_key = /datum/config_entry/string/alert_delta
diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm
index 4a9feda1fc8..39e65b75285 100644
--- a/code/modules/shuttle/emergency.dm
+++ b/code/modules/shuttle/emergency.dm
@@ -358,7 +358,7 @@
else
SSshuttle.emergency_last_call_loc = null
- priority_announce("The emergency shuttle has been called. [red_alert ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [timeLeft(600)] minutes.[reason][SSshuttle.emergency_last_call_loc ? "\n\nCall signal traced. Results can be viewed on any communications console." : "" ][SSshuttle.admin_emergency_no_recall ? "\n\nWarning: Shuttle recall subroutines disabled; Recall not possible." : ""]", null, ANNOUNCER_SHUTTLECALLED, "Priority")
+ priority_announce("The emergency shuttle has been called. [red_alert ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [timeLeft(600)] minutes.[reason][SSshuttle.emergency_last_call_loc ? "\n\nCall signal traced. Results can be viewed on any communications console." : "" ][SSshuttle.admin_emergency_no_recall ? "\n\nWarning: Shuttle recall subroutines disabled; Recall not possible." : ""]", null, ANNOUNCER_SHUTTLECALLED, ANNOUNCEMENT_TYPE_PRIORITY)
/obj/docking_port/mobile/emergency/cancel(area/signalOrigin)
if(mode != SHUTTLE_CALL)
@@ -373,7 +373,7 @@
SSshuttle.emergency_last_call_loc = signalOrigin
else
SSshuttle.emergency_last_call_loc = null
- priority_announce("The emergency shuttle has been recalled.[SSshuttle.emergency_last_call_loc ? " Recall signal traced. Results can be viewed on any communications console." : "" ]", null, ANNOUNCER_SHUTTLERECALLED, "Priority")
+ priority_announce("The emergency shuttle has been recalled.[SSshuttle.emergency_last_call_loc ? " Recall signal traced. Results can be viewed on any communications console." : "" ]", null, ANNOUNCER_SHUTTLERECALLED, ANNOUNCEMENT_TYPE_PRIORITY)
SSticker.emergency_reason = null
@@ -462,7 +462,7 @@
mode = SHUTTLE_DOCKED
setTimer(SSshuttle.emergency_dock_time)
send2adminchat("Server", "The Emergency Shuttle has docked with the station.")
- priority_announce("[SSshuttle.emergency] has docked with the station. You have [timeLeft(600)] minutes to board the Emergency Shuttle.", null, ANNOUNCER_SHUTTLEDOCK, "Priority")
+ priority_announce("[SSshuttle.emergency] has docked with the station. You have [timeLeft(600)] minutes to board the Emergency Shuttle.", null, ANNOUNCER_SHUTTLEDOCK, ANNOUNCEMENT_TYPE_PRIORITY)
ShuttleDBStuff()
addtimer(CALLBACK(src, PROC_REF(announce_shuttle_events)), 20 SECONDS)
@@ -514,7 +514,7 @@
mode = SHUTTLE_ESCAPE
launch_status = ENDGAME_LAUNCHED
setTimer(SSshuttle.emergency_escape_time * engine_coeff)
- priority_announce("The Emergency Shuttle has left the station. Estimate [timeLeft(600)] minutes until the shuttle docks at Central Command.", null, null, "Priority")
+ priority_announce("The Emergency Shuttle has left the station. Estimate [timeLeft(600)] minutes until the shuttle docks at Central Command.", null, null, ANNOUNCEMENT_TYPE_PRIORITY)
INVOKE_ASYNC(SSticker, TYPE_PROC_REF(/datum/controller/subsystem/ticker, poll_hearts))
SSmapping.mapvote() //If no map vote has been run yet, start one.
@@ -579,7 +579,7 @@
mode = SHUTTLE_ESCAPE
launch_status = ENDGAME_LAUNCHED
setTimer(SSshuttle.emergency_escape_time)
- priority_announce("The Emergency Shuttle is preparing for direct jump. Estimate [timeLeft(600)] minutes until the shuttle docks at Central Command.", null, null, "Priority")
+ priority_announce("The Emergency Shuttle is preparing for direct jump. Estimate [timeLeft(600)] minutes until the shuttle docks at Central Command.", null, null, ANNOUNCEMENT_TYPE_PRIORITY)
///Generate a list of events to run during the departure
/obj/docking_port/mobile/emergency/proc/setup_shuttle_events()
diff --git a/tgstation.dme b/tgstation.dme
index 9bbff47609b..984ed98a0da 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -35,6 +35,7 @@
#include "code\__DEFINES\airlock.dm"
#include "code\__DEFINES\alarm.dm"
#include "code\__DEFINES\alerts.dm"
+#include "code\__DEFINES\announcements.dm"
#include "code\__DEFINES\anomaly.dm"
#include "code\__DEFINES\antagonists.dm"
#include "code\__DEFINES\apc_defines.dm"
diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss
index 11f04ea98fd..411154815ae 100644
--- a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss
+++ b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss
@@ -3,6 +3,8 @@
* SPDX-License-Identifier: MIT
*/
+@use 'sass:map';
+
em {
font-style: normal;
font-weight: bold;
@@ -941,3 +943,70 @@ em {
font-style: italic;
border-bottom: 1px dashed #fff;
}
+
+.major_announcement_title {
+ color: #ff0066;
+ text-decoration: underline;
+ font-weight: bold;
+ font-size: 175%;
+}
+
+.major_announcement_text {
+ color: #eaeaea;
+ font-weight: bold;
+ font-size: 125%;
+}
+
+.minor_announcement_title {
+ color: #33d5ff;
+ font-weight: bold;
+ font-size: 150%;
+}
+
+.minor_announcement_text {
+ color: #eaeaea;
+ font-size: 125%;
+}
+
+$alert-stripe-colors: (
+ 'default': #292929,
+ 'green': #003d00,
+ 'blue': #00283a,
+ 'pink': #30001b,
+ 'yellow': #574a00,
+ 'orange': #593400,
+ 'red': #540000,
+ 'purple': #2c0030,
+);
+
+$alert-background-colors: (
+ 'default': #252525,
+ 'green': #003800,
+ 'blue': #003045,
+ 'pink': #400025,
+ 'yellow': #4d4100,
+ 'orange': #6b4200,
+ 'red': #6b0000,
+ 'purple': #3a0040,
+);
+
+@each $color-name, $color-value in $alert-stripe-colors {
+ .chat_alert_#{$color-name} {
+ color: #ffffff;
+ padding: 0.5em 0.5em;
+ margin-bottom: 0.5em;
+ box-shadow: none;
+ font-weight: bold;
+ border: 1px solid $color-value;
+ margin: 0.5em 0 0.5em 0;
+ padding: 0.5em 0.75em;
+ background-color: map.get($alert-background-colors, $color-name);
+ background-image: repeating-linear-gradient(
+ -45deg,
+ transparent,
+ transparent 10px,
+ $color-value 10px,
+ $color-value 20px
+ );
+ }
+}
diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss
index 3dcf5796d44..d1be181be43 100644
--- a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss
+++ b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss
@@ -3,6 +3,8 @@
* SPDX-License-Identifier: MIT
*/
+@use 'sass:map';
+
html,
body {
padding: 0;
@@ -973,3 +975,70 @@ h2.alert {
font-style: italic;
border-bottom: 1px dashed #000;
}
+
+.major_announcement_title {
+ color: #ff0066;
+ text-decoration: underline;
+ font-weight: bold;
+ font-size: 175%;
+}
+
+.major_announcement_text {
+ color: #202020;
+ font-weight: bold;
+ font-size: 125%;
+}
+
+.minor_announcement_title {
+ color: #007ee6;
+ font-weight: bold;
+ font-size: 150%;
+}
+
+.minor_announcement_text {
+ color: #202020;
+ font-size: 125%;
+}
+
+$alert-stripe-colors: (
+ 'default': #dedede,
+ 'green': #c2ffcc,
+ 'blue': #b8e6ff,
+ 'pink': #ffc2f4,
+ 'yellow': #ffe880,
+ 'orange': #ffbb99,
+ 'red': #ff99aa,
+ 'purple': #d7c2ff,
+);
+
+$alert-background-colors: (
+ 'default': #d1d1d1,
+ 'green': #a8ffb7,
+ 'blue': #a8e1ff,
+ 'pink': #ffb3f3,
+ 'yellow': #fff0ad,
+ 'orange': #ffc9ad,
+ 'red': #ffadbb,
+ 'purple': #ccb3ff,
+);
+
+@each $color-name, $color-value in $alert-stripe-colors {
+ .chat_alert_#{$color-name} {
+ color: #ffffff;
+ padding: 0.5em 0.5em;
+ margin-bottom: 0.5em;
+ box-shadow: none;
+ font-weight: bold;
+ border: 1px solid $color-value;
+ margin: 0.5em 0 0.5em 0;
+ padding: 0.5em 0.75em;
+ background-color: map.get($alert-background-colors, $color-name);
+ background-image: repeating-linear-gradient(
+ -45deg,
+ transparent,
+ transparent 10px,
+ $color-value 10px,
+ $color-value 20px
+ );
+ }
+}