From 48dc5f593d102f9fa5cdc287fbf73c5d65a5a6ec Mon Sep 17 00:00:00 2001 From: aKromatopzia <94389683+aKromatopzia@users.noreply.github.com> Date: Fri, 21 Nov 2025 01:46:06 +0800 Subject: [PATCH] The full-custom blood colour quirk, again (#4332) ## About The Pull Request Technically, this is also a bugfix for the removed portion of the evil quirk. This is a blood colour quirk which aims to create an entirely new blood_type datum per color-modified base type, and acts as a launching pad into developing more blood stuff. As an additional note: In our testing injected blood wouldn't override the recipient's blood colour. However if this does happen at all in live, do state such! ## Why It's Good For The Game Blood colour good? Near-fully custom blood color better? ## Proof Of Testing oh hey it works now. The three lizards in the video use red blood, cyan/vox blood, and white/nanite blood respectively. https://github.com/user-attachments/assets/cec6465f-68de-4c6f-97f4-58061f4f7241 Not rigorously tested, but my process was to only dev the lizard type then copy to everything else... so it should be fine? Just to show it should work on blood types with existing compatible_type fields though - as in, it actually copies the list: Screenshot_92 ## What We Learnt Trust our gut. We shouldve replaced it ages ago but thought original refactorer knew better ## Changelog :cl: add: blood colour quirk. it's mechanically near-identical to the normal type. code: more blood colour presets. yum. --------- Co-authored-by: LT3 <83487515+lessthnthree@users.noreply.github.com> Co-authored-by: Arturlang <24881678+Arturlang@users.noreply.github.com> --- code/__DEFINES/~~bubber_defines/colors.dm | 7 + .../customization/_globalvars/lists.dm | 13 + .../client/preferences/unique_blood_color.dm | 41 +++ .../clothing/under/accessories/badges.dm | 10 + .../code/modules/mob/living/blood_types.dm | 280 ++++++++++++++++++ .../neutral_quirks/unique_blood_color.dm | 75 +++++ tgstation.dme | 3 + .../bubbers/unique_blood_color.tsx | 15 + 8 files changed, 444 insertions(+) create mode 100644 modular_zubbers/code/modules/client/preferences/unique_blood_color.dm create mode 100644 modular_zubbers/code/modules/clothing/under/accessories/badges.dm create mode 100644 modular_zubbers/code/modules/quirks/neutral_quirks/unique_blood_color.dm create mode 100644 tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/bubbers/unique_blood_color.tsx diff --git a/code/__DEFINES/~~bubber_defines/colors.dm b/code/__DEFINES/~~bubber_defines/colors.dm index 95cf66938e1..6a1b181357f 100644 --- a/code/__DEFINES/~~bubber_defines/colors.dm +++ b/code/__DEFINES/~~bubber_defines/colors.dm @@ -9,8 +9,15 @@ GLOBAL_LIST_INIT(chat_colors_by_mob_name, list( "Unknown" = list("#ffffff", "#d8d8d8"), )) +/// Blood colors #define BLOOD_COLOR_COPPER "#6E3B08" #define BLOOD_COLOR_NANITE_SLURRY "#CCCCCC" +//alternate lizard blood +#define BLOOD_COLOR_GREEN "#339933" +//old-canon avalis had violet blood, so... +#define BLOOD_COLOR_VIOLET "#9966FF" +//cyan vox blood +#define BLOOD_COLOR_CYAN "#33FFFF" /// Modsuit hardlight colors diff --git a/modular_skyrat/modules/customization/_globalvars/lists.dm b/modular_skyrat/modules/customization/_globalvars/lists.dm index 69e4eb1af32..df9f3640200 100644 --- a/modular_skyrat/modules/customization/_globalvars/lists.dm +++ b/modular_skyrat/modules/customization/_globalvars/lists.dm @@ -110,3 +110,16 @@ GLOBAL_LIST_INIT(color_list_ghoul, list( \ "Plutonium Blue" = "a5cfcc", \ "Marked Red" = "f05b68" \ )) + +//blood colours +GLOBAL_LIST_INIT(custom_blood_colors, list( + "Red/Human" = BLOOD_COLOR_RED, + "D.Green/Lizard" = BLOOD_COLOR_LIZARD, + "Green" = BLOOD_COLOR_GREEN, + "Lime/Xeno" = BLOOD_COLOR_XENO, + "Violet/Avali" = BLOOD_COLOR_VIOLET, + "Cyan/Vox" = BLOOD_COLOR_CYAN, + "Brown/Skrell" = BLOOD_COLOR_COPPER, + "White/Nanites" = BLOOD_COLOR_NANITE_SLURRY, + "Black" = BLOOD_COLOR_BLACK, +)) diff --git a/modular_zubbers/code/modules/client/preferences/unique_blood_color.dm b/modular_zubbers/code/modules/client/preferences/unique_blood_color.dm new file mode 100644 index 00000000000..ca5f43853e5 --- /dev/null +++ b/modular_zubbers/code/modules/client/preferences/unique_blood_color.dm @@ -0,0 +1,41 @@ +///see modular_zubbers\code\modules\quirks\neutral_quirks\unique_blood_color.dm + +///manual colour input +/datum/preference/color/input_blood_color + category = PREFERENCE_CATEGORY_MANUALLY_RENDERED + savefile_key = "input_blood_color" + savefile_identifier = PREFERENCE_CHARACTER + +/datum/preference/color/input_blood_color/create_default_value() + return BLOOD_COLOR_BLACK + +/datum/preference/color/input_blood_color/is_accessible(datum/preferences/preferences) + if (!..(preferences)) + return FALSE + + return /datum/quirk/item_quirk/unique_blood_color::name in preferences.all_quirks + +/datum/preference/color/input_blood_color/apply_to_human(mob/living/carbon/human/target, value) + return + +///colour preset selection +/datum/preference/choiced/select_blood_color + category = PREFERENCE_CATEGORY_MANUALLY_RENDERED + savefile_key = "select_blood_color" + savefile_identifier = PREFERENCE_CHARACTER + can_randomize = FALSE + +/datum/preference/choiced/select_blood_color/create_default_value() + return "Custom" + +/datum/preference/choiced/select_blood_color/is_accessible(datum/preferences/preferences) + if (!..(preferences)) + return FALSE + + return /datum/quirk/item_quirk/unique_blood_color::name in preferences.all_quirks + +/datum/preference/choiced/select_blood_color/apply_to_human(mob/living/carbon/human/target, value) + return + +/datum/preference/choiced/select_blood_color/init_possible_values() + return list("Custom") + assoc_to_keys(GLOB.custom_blood_colors) diff --git a/modular_zubbers/code/modules/clothing/under/accessories/badges.dm b/modular_zubbers/code/modules/clothing/under/accessories/badges.dm new file mode 100644 index 00000000000..bc802004a9d --- /dev/null +++ b/modular_zubbers/code/modules/clothing/under/accessories/badges.dm @@ -0,0 +1,10 @@ +/obj/item/clothing/accessory/dogtag/unique_blood + name = "Blood dogtag" + desc = "A dogtag with a listing of blood properties." + +/obj/item/clothing/accessory/dogtag/unique_blood/Initialize(mapload, blood_type, color_string) + . = ..() + if(color_string && blood_type) + display = span_notice("\"Hi! My blood is [blood_type] despite being [color_string]!\"") + else + display = span_notice("The dogtag is all scratched up.") diff --git a/modular_zubbers/code/modules/mob/living/blood_types.dm b/modular_zubbers/code/modules/mob/living/blood_types.dm index 090be02def8..012ca54c9c8 100644 --- a/modular_zubbers/code/modules/mob/living/blood_types.dm +++ b/modular_zubbers/code/modules/mob/living/blood_types.dm @@ -1,3 +1,15 @@ +/datum/blood_type + ///blood type to be edited for change_blood_color + var/recolor_blood_type //datum typepath for the alt_color version of the blood type + +/datum/blood_type/proc/make_alt_color(override, datum/blood_type/orig) + var/datum/blood_type/original = orig + name = "[name] ([override])" + color = override + id = name + testing("created alternate [id]") + compatible_types = LAZYLISTDUPLICATE(original?.compatible_types) + // For Skrell /datum/blood_type/copper name = BLOOD_TYPE_COPPER @@ -5,6 +17,16 @@ reagent_type = /datum/reagent/copper color = BLOOD_COLOR_COPPER restoration_chem = null + recolor_blood_type = /datum/blood_type/copper/alt_color + +/datum/blood_type/copper/alt_color + abstract_type = /datum/blood_type/copper + +/datum/blood_type/copper/alt_color/type_key() + return /datum/blood_type/copper + +/datum/blood_type/copper/alt_color/New(override, datum/blood_type/orig) + make_alt_color(override, orig) // For Proteans /datum/blood_type/nanite_slurry @@ -13,3 +35,261 @@ reagent_type = /datum/reagent/medicine/nanite_slurry color = BLOOD_COLOR_NANITE_SLURRY restoration_chem = null + recolor_blood_type = /datum/blood_type/nanite_slurry/alt_color + +/datum/blood_type/nanite_slurry/alt_color + abstract_type = /datum/blood_type/nanite_slurry + +/datum/blood_type/nanite_slurry/alt_color/type_key() + return /datum/blood_type/nanite_slurry + +/datum/blood_type/nanite_slurry/alt_color/New(override, datum/blood_type/orig) + make_alt_color(override, orig) + +/* blood type template for alt_colors +/datum/blood_type/namehere + recolor_blood_type = /datum/blood_type/namehere/alt_color + +/datum/blood_type/namehere/alt_color + abstract_type = /datum/blood_type/namehere/alt_color + +/datum/blood_type/namehere/alt_color/New(override, datum/blood_type/orig) + make_alt_color(override, orig) + +/datum/blood_type/alt_color/type_key() + return /datum/blood_type/PARENT_TYPE_HERE +*/ + +///A- +/datum/blood_type/human/a_minus + recolor_blood_type = /datum/blood_type/human/a_minus/alt_color + +/datum/blood_type/human/a_minus/alt_color + /* abstract_type = /datum/blood_type/human/a_minus/alt_color */ + +/datum/blood_type/human/a_minus/alt_color/New(override, datum/blood_type/orig) + make_alt_color(override, orig) + +/datum/blood_type/human/a_minus/alt_color/type_key() + return /datum/blood_type/human/a_minus + +///A+ +/datum/blood_type/human/a_plus + recolor_blood_type = /datum/blood_type/human/a_plus/alt_color + +/datum/blood_type/human/a_plus/alt_color + /* abstract_type = /datum/blood_type/human/a_plus/alt_color */ + +/datum/blood_type/human/a_plus/alt_color/New(override, datum/blood_type/orig) + make_alt_color(override, orig) + +/datum/blood_type/human/a_plus/alt_color/type_key() + return /datum/blood_type/human/a_plus + +///B+ +/datum/blood_type/human/b_plus + recolor_blood_type = /datum/blood_type/human/b_plus/alt_color + +/datum/blood_type/human/b_plus/alt_color + /* abstract_type = /datum/blood_type/human/b_plus/alt_color */ + +/datum/blood_type/human/b_plus/alt_color/New(override, datum/blood_type/orig) + make_alt_color(override, orig) + +/datum/blood_type/human/b_plus/alt_color/type_key() + return /datum/blood_type/human/b_plus + +///B- +/datum/blood_type/human/b_minus + recolor_blood_type = /datum/blood_type/human/b_minus/alt_color + +/datum/blood_type/human/b_minus/alt_color + /* abstract_type = /datum/blood_type/human/b_minus/alt_color */ + +/datum/blood_type/human/b_minus/alt_color/New(override, datum/blood_type/orig) + make_alt_color(override, orig) + +/datum/blood_type/human/b_minus/alt_color/type_key() + return /datum/blood_type/human/b_minus + +///AB- +/datum/blood_type/human/ab_minus + recolor_blood_type = /datum/blood_type/human/ab_minus/alt_color + +/datum/blood_type/human/ab_minus/alt_color + /* abstract_type = /datum/blood_type/human/ab_minus/alt_color */ + +/datum/blood_type/human/ab_minus/alt_color/New(override, datum/blood_type/orig) + make_alt_color(override, orig) + +/datum/blood_type/human/ab_minus/alt_color/type_key() + return /datum/blood_type/human/ab_minus + +///AB+ +/datum/blood_type/human/ab_plus + recolor_blood_type = /datum/blood_type/human/ab_plus/alt_color + +/datum/blood_type/human/ab_plus/alt_color + /* abstract_type = /datum/blood_type/human/ab_plus/alt_color */ + +/datum/blood_type/human/ab_plus/alt_color/New(override, datum/blood_type/orig) + make_alt_color(override, orig) + +/datum/blood_type/human/ab_plus/alt_color/type_key() + return /datum/blood_type/human/ab_plus + +///O- +/datum/blood_type/human/o_minus + recolor_blood_type = /datum/blood_type/human/o_minus/alt_color + +/datum/blood_type/human/o_minus/alt_color + /* abstract_type = /datum/blood_type/human/o_minus/alt_color */ + +/datum/blood_type/human/o_minus/alt_color/New(override, datum/blood_type/orig) + make_alt_color(override, orig) + +/datum/blood_type/human/o_minus/alt_color/type_key() + return /datum/blood_type/human/o_minus + +///O+ +/datum/blood_type/human/o_plus + recolor_blood_type = /datum/blood_type/human/o_plus/alt_color + +/datum/blood_type/human/o_plus/alt_color + /* abstract_type = /datum/blood_type/human/o_plus/alt_color */ + +/datum/blood_type/human/o_plus/alt_color/New(override, datum/blood_type/orig) + make_alt_color(override, orig) + +/datum/blood_type/human/o_plus/alt_color/type_key() + return /datum/blood_type/human/o_plus + +///Y- +/datum/blood_type/animal + recolor_blood_type = /datum/blood_type/animal/alt_color + +/datum/blood_type/animal/alt_color + abstract_type = /datum/blood_type/animal/alt_color + +/datum/blood_type/animal/alt_color/New(override, datum/blood_type/orig) + make_alt_color(override, orig) + +/datum/blood_type/animal/alt_color/type_key() + return /datum/blood_type/animal + +///L +/datum/blood_type/lizard + recolor_blood_type = /datum/blood_type/lizard/alt_color + +/datum/blood_type/lizard/alt_color + abstract_type = /datum/blood_type/lizard/alt_color + +/datum/blood_type/lizard/alt_color/New(override, datum/blood_type/orig) + make_alt_color(override, orig) + +/datum/blood_type/lizard/alt_color/type_key() + return /datum/blood_type/lizard + +///LE +/datum/blood_type/ethereal + recolor_blood_type = /datum/blood_type/ethereal/alt_color + +/datum/blood_type/ethereal/alt_color + abstract_type = /datum/blood_type/ethereal/alt_color + +/datum/blood_type/ethereal/alt_color/New(override, datum/blood_type/orig) + make_alt_color(override, orig) + +/datum/blood_type/ethereal/alt_color/type_key() + return /datum/blood_type/ethereal + +///Oil +/datum/blood_type/oil + recolor_blood_type = /datum/blood_type/oil/alt_color + +/datum/blood_type/oil/alt_color + abstract_type = /datum/blood_type/oil/alt_color + +/datum/blood_type/oil/alt_color/New(override, datum/blood_type/orig) + make_alt_color(override, orig) + +/datum/blood_type/oil/alt_color/type_key() + return /datum/blood_type/oil + +///V +/datum/blood_type/vampire + recolor_blood_type = /datum/blood_type/vampire/alt_color + +/datum/blood_type/vampire/alt_color + abstract_type = /datum/blood_type/vampire/alt_color + +/datum/blood_type/vampire/alt_color/New(override, datum/blood_type/orig) + make_alt_color(override, orig) + +/datum/blood_type/vampire/alt_color/type_key() + return /datum/blood_type/vampire + +///U +/datum/blood_type/universal + recolor_blood_type = /datum/blood_type/universal/alt_color + +/datum/blood_type/universal/alt_color + abstract_type = /datum/blood_type/universal/alt_color + +/datum/blood_type/universal/alt_color/New(override, datum/blood_type/orig) + make_alt_color(override, orig) + +/datum/blood_type/universal/alt_color/type_key() + return /datum/blood_type/universal + +///MT- +/datum/blood_type/meat + recolor_blood_type = /datum/blood_type/meat/alt_color + +/datum/blood_type/meat/alt_color + abstract_type = /datum/blood_type/meat/alt_color + +/datum/blood_type/meat/alt_color/New(override, datum/blood_type/orig) + make_alt_color(override, orig) + +/datum/blood_type/meat/alt_color/type_key() + return /datum/blood_type/meat + +///TOX +/datum/blood_type/slime + recolor_blood_type = /datum/blood_type/slime/alt_color + +/datum/blood_type/slime/alt_color + abstract_type = /datum/blood_type/slime/alt_color + +/datum/blood_type/slime/alt_color/New(override, datum/blood_type/orig) + make_alt_color(override, orig) + +/datum/blood_type/slime/alt_color/type_key() + return /datum/blood_type/slime + +///H2O +/datum/blood_type/water + recolor_blood_type = /datum/blood_type/water/alt_color + +/datum/blood_type/water/alt_color + abstract_type = /datum/blood_type/water/alt_color + +/datum/blood_type/water/alt_color/New(override, datum/blood_type/orig) + make_alt_color(override, orig) + +/datum/blood_type/water/alt_color/type_key() + return /datum/blood_type/water + +///S +/datum/blood_type/snail + recolor_blood_type = /datum/blood_type/snail/alt_color + +/datum/blood_type/snail/alt_color + abstract_type = /datum/blood_type/snail/alt_color + +/datum/blood_type/snail/alt_color/New(override, datum/blood_type/orig) + make_alt_color(override, orig) + +/datum/blood_type/snail/alt_color/type_key() + return /datum/blood_type/snail diff --git a/modular_zubbers/code/modules/quirks/neutral_quirks/unique_blood_color.dm b/modular_zubbers/code/modules/quirks/neutral_quirks/unique_blood_color.dm new file mode 100644 index 00000000000..e2d66c5daa2 --- /dev/null +++ b/modular_zubbers/code/modules/quirks/neutral_quirks/unique_blood_color.dm @@ -0,0 +1,75 @@ +//i dont enjoy this implementation, but we're also not going to figure out how to write a proper do-all replace_blood_type() without |some| help.... + +/datum/quirk/item_quirk/unique_blood_color + name = "Blood Pigmentation" + desc = "Your blood has a different colour than what your species usually has." + gain_text = span_purple("Your flesh shifts in hue.") + lose_text = span_purple("Your flesh returns to a natural look.") + medical_record_text = "Patient has unusual blood pigmentation." + value = 0 + icon = FA_ICON_DROPLET + //this should only ever be a hex + var/color_code = NONE + var/datum/blood_type/new_blood = NONE + //for removal, and having an un-appended type name + var/datum/blood_type/old_blood = NONE + +/datum/quirk_constant_data/uniquebloodcolor + associated_typepath = /datum/quirk/item_quirk/unique_blood_color + customization_options = list( + /datum/preference/color/input_blood_color, + /datum/preference/choiced/select_blood_color, + ) + + +/datum/quirk/item_quirk/unique_blood_color/add(client/client_source) + var/mob/living/carbon/human/human_holder = quirk_holder + //If you want to change the blood of a non-human mob, just varedit. It'll reset when changing species tho + if(!istype(human_holder)) + return + old_blood = human_holder.dna.blood_type + var/selected_color = client_source?.prefs.read_preference(/datum/preference/choiced/select_blood_color) || "Custom" + testing("selected_color is [selected_color]") + if(selected_color != "Custom") + color_code = GLOB.custom_blood_colors[selected_color] + testing("selected_color is not Custom") + else if(selected_color == "Custom") + color_code = client_source?.prefs.read_preference(/datum/preference/color/input_blood_color) + testing("selected_color is Custom") + testing("color_code set to [color_code]") + change_blood_color(quirked = human_holder, override = color_code) + +/datum/quirk/item_quirk/unique_blood_color/remove() + var/mob/living/carbon/human/human_holder = quirk_holder + if (!istype(human_holder) || isnull(old_blood)) + return + var/datum/blood_type/new_blood = new old_blood.type + human_holder.set_blood_type(new_blood) + human_holder.dna.species.exotic_bloodtype = initial(human_holder.dna.species.exotic_bloodtype) + +//someone could turn this into a universal replace_blood() or something... but not me + +/datum/quirk/item_quirk/unique_blood_color/proc/change_blood_color(datum/source, mob/living/carbon/human/quirked, override, update_cached_blood_dna_info) + SIGNAL_HANDLER +///Check if new blood type is same as old. Jank, but it should prevent cases of special blood types made from relative normal blood + if(quirked.dna.blood_type.get_color() == color_code) + to_chat(quirked, span_notice("...but nothing had actually changed.")) + remove_from_current_holder() + WARNING("quirk 'unique_blood_color' automatically removed from [quirked.name]") + return +///Making the new blood type + new_blood = get_blood_type("[quirked.dna.blood_type] ([override])") //for example, A-_#69af19 +///check if blood type already exists before making it new + if(isnull(new_blood)) + var/recolor_type = quirked.dna.blood_type.recolor_blood_type + new_blood = new recolor_type(override = override, orig = quirked.dna.blood_type) + GLOB.blood_types[new_blood.id] = new_blood + NOTICE("finalized new blood type [new_blood.id] for [quirked.name]") + quirked.dna.species.exotic_bloodtype = new_blood + quirked.set_blood_type(new_blood) + + +/datum/quirk/item_quirk/unique_blood_color/add_unique(client/client_source) + var/get_bloodtype_id = old_blood.name + var/obj/item/clothing/accessory/dogtag/unique_blood/dogtag = new(quirk_holder, get_bloodtype_id, color_code) + give_item_to_holder(dogtag, list(LOCATION_BACKPACK, LOCATION_HANDS), flavour_text = "Medical should probably see this...", notify_player = TRUE) diff --git a/tgstation.dme b/tgstation.dme index 665f7fb42dd..6b967e68537 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9218,6 +9218,7 @@ #include "modular_zubbers\code\modules\client\preferences\permanent_limp.dm" #include "modular_zubbers\code\modules\client\preferences\player_panel.dm" #include "modular_zubbers\code\modules\client\preferences\sounds.dm" +#include "modular_zubbers\code\modules\client\preferences\unique_blood_color.dm" #include "modular_zubbers\code\modules\client\verbs\character_directory.dm" #include "modular_zubbers\code\modules\clothing\_job.dm" #include "modular_zubbers\code\modules\clothing\donator_clothing.dm" @@ -9261,6 +9262,7 @@ #include "modular_zubbers\code\modules\clothing\under\security.dm" #include "modular_zubbers\code\modules\clothing\under\skirts_dresses.dm" #include "modular_zubbers\code\modules\clothing\under\syndicate.dm" +#include "modular_zubbers\code\modules\clothing\under\accessories\badges.dm" #include "modular_zubbers\code\modules\clothing\under\jobs\command.dm" #include "modular_zubbers\code\modules\colony_fabricator\code\design_datums\fabricator_flag_additions\tools.dm" #include "modular_zubbers\code\modules\contractor\code\items\boxes.dm" @@ -9609,6 +9611,7 @@ #include "modular_zubbers\code\modules\protected_roles\code\antag_restricted_jobs.dm" #include "modular_zubbers\code\modules\public_logging\public_logging.dm" #include "modular_zubbers\code\modules\quirks\neutral_quirks\body_temp.dm" +#include "modular_zubbers\code\modules\quirks\neutral_quirks\unique_blood_color.dm" #include "modular_zubbers\code\modules\quirks\positive_quirks\telepathy.dm" #include "modular_zubbers\code\modules\quote_of_the_round\config.dm" #include "modular_zubbers\code\modules\quote_of_the_round\debug_verbs.dm" diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/bubbers/unique_blood_color.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/bubbers/unique_blood_color.tsx new file mode 100644 index 00000000000..34f59c7f829 --- /dev/null +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/bubbers/unique_blood_color.tsx @@ -0,0 +1,15 @@ +import { Feature, FeatureChoiced, FeatureColorInput } from '../../base'; +import { FeatureDropdownInput } from '../../dropdowns'; + +export const input_blood_color: Feature = { + name: 'Custom color', + description: + 'NOTE: This matches the colour to the BRIGHTEST px. So, make this slightly (about 10?) more luminescent (HSL) than you want the blood to be.', + component: FeatureColorInput, +}; + +export const select_blood_color: FeatureChoiced = { + name: 'Preset color', + description: 'NOTE: Use the Custom option for custom color.', + component: FeatureDropdownInput, +};