Media
## New loadouts/traits UI
![image](https://github.com/user-attachments/assets/9a9c3f64-6ba4-40ea-a89e-d5f57efcf7c0)
![image](https://github.com/user-attachments/assets/3b6f0a36-a474-4ca6-a7c8-90c13e3faa0b)
## NeoTabContainer allows changing the tab orientation
### https://youtu.be/krg8TJoQG3I
![image](https://github.com/user-attachments/assets/81491ad9-45bd-41ed-833e-7295a2216a04)
![image](https://github.com/user-attachments/assets/deb72919-7efe-4be9-a661-b12aa7dc6976)
---
# Changelog
:cl:
- fix: The loadout/trait editors' performance has been improved by
100~1000x
- tweak: The character editor's tabs look, feel, and function much
better
- fix: Unusable loadouts/traits have an orange color when selected
- tweak: Loadout previews are now inside the button
- add: Added a button to remove any unusable loadouts (or traits) you
have selected
- add: Loadouts and traits can have subcategories, though only Command
loadouts use them at the moment
- fix: Fixed empty loadout categories not hiding
- fix: Fixed spacing on some loadout requirements' reason text
- fix: Fixed traits not updating after saving
---
.../Administration/UI/AdminUIHelpers.cs | 2 +-
Content.Client/Changelog/ChangelogButton.cs | 4 +-
Content.Client/FlavorText/FlavorText.xaml | 2 +-
.../Gateway/UI/GatewayWindow.xaml.cs | 2 +-
Content.Client/LateJoin/LateJoinGui.cs | 3 +-
.../Options/UI/Tabs/KeyRebindTab.xaml.cs | 2 +-
.../Preferences/UI/AntagPreferenceSelector.cs | 1 +
.../Preferences/UI/CharacterSetupGui.xaml.cs | 2 +-
.../Preferences/UI/HumanoidProfileEditor.xaml | 79 +-
.../UI/HumanoidProfileEditor.xaml.cs | 805 ++++++++------
.../UI/LoadoutPreferenceSelector.cs | 99 +-
.../Preferences/UI/TraitPreferenceSelector.cs | 43 +-
.../Salvage/UI/OfferingWindowOption.xaml.cs | 4 +-
Content.Client/Stylesheets/StyleBase.cs | 1 +
Content.Client/Stylesheets/StyleNano.cs | 48 +-
Content.Client/Stylesheets/StyleSpace.cs | 8 +-
.../Controls/NeoTabContainer.Props.xaml.cs | 163 +++
.../Controls/NeoTabContainer.xaml | 30 +
.../Controls/NeoTabContainer.xaml.cs | 299 ++++++
.../Ghost/Controls/Roles/GhostRolesEui.cs | 20 +-
.../Systems/Ghost/Widgets/GhostGui.xaml.cs | 4 +-
.../PlayTimeTrackingSystem.cs | 21 +-
Content.Server/Traits/TraitSystem.cs | 5 +-
.../Prototypes/LoadoutCategoryPrototype.cs | 8 +-
.../Loadouts/Prototypes/LoadoutPrototype.cs | 19 +-
.../Loadouts/Systems/LoadoutSystem.cs | 10 +-
.../Systems/CharacterRequirements.Job.cs | 20 +-
.../Systems/CharacterRequirements.Logic.cs | 147 +++
.../Systems/CharacterRequirements.Profile.cs | 224 +++-
.../CharacterRequirements.Whitelist.cs | 4 +-
.../Systems/CharacterRequirements.cs | 6 +-
.../Systems/CharacterRequirementsSystem.cs | 31 +-
.../Prototypes/CharacterItemGroupPrototype.cs | 55 +
.../Prototypes/TraitCategoryPrototype.cs | 6 +
.../Traits/Prototypes/TraitPrototype.cs | 4 +-
.../customization/character-requirements.ftl | 152 ++-
.../Locale/en-US/loadouts/categories.ftl | 10 +
.../ui/humanoid-profile-editor.ftl | 22 +-
.../CharacterItemGroups/itemGroups.yml | 67 ++
.../Loadouts/Categories/categories.yml | 95 ++
.../Loadouts/Jobs/Heads/captain.yml | 31 +-
.../Loadouts/Jobs/Heads/chiefEngineer.yml | 13 +-
.../Jobs/Heads/chiefMedicalOfficer.yml | 17 +-
.../Loadouts/Jobs/Heads/command.yml | 2 +-
.../Loadouts/Jobs/Heads/headOfPersonnel.yml | 25 +-
.../Loadouts/Jobs/Heads/headOfSecurity.yml | 35 +-
.../Loadouts/Jobs/Heads/quarterMaster.yml | 17 +-
.../Loadouts/Jobs/Heads/researchDirector.yml | 15 +-
Resources/Prototypes/Loadouts/Jobs/cargo.yml | 13 +-
.../Prototypes/Loadouts/Jobs/engineering.yml | 32 +-
.../Prototypes/Loadouts/Jobs/medical.yml | 121 +--
.../Prototypes/Loadouts/Jobs/science.yml | 22 +-
.../Prototypes/Loadouts/Jobs/security.yml | 142 +--
.../Prototypes/Loadouts/Jobs/service.yml | 128 +--
Resources/Prototypes/Loadouts/categories.yml | 37 -
Resources/Prototypes/Loadouts/shoes.yml | 149 ---
Resources/Prototypes/Loadouts/uniform.yml | 989 ++++++++----------
Resources/Prototypes/Traits/categories.yml | 6 +
58 files changed, 2691 insertions(+), 1630 deletions(-)
create mode 100644 Content.Client/UserInterface/Controls/NeoTabContainer.Props.xaml.cs
create mode 100644 Content.Client/UserInterface/Controls/NeoTabContainer.xaml
create mode 100644 Content.Client/UserInterface/Controls/NeoTabContainer.xaml.cs
create mode 100644 Content.Shared/Customization/Systems/CharacterRequirements.Logic.cs
create mode 100644 Content.Shared/Prototypes/CharacterItemGroupPrototype.cs
create mode 100644 Resources/Prototypes/CharacterItemGroups/itemGroups.yml
create mode 100644 Resources/Prototypes/Loadouts/Categories/categories.yml
delete mode 100644 Resources/Prototypes/Loadouts/categories.yml
diff --git a/Content.Client/Administration/UI/AdminUIHelpers.cs b/Content.Client/Administration/UI/AdminUIHelpers.cs
index 89ab33e931d..7fa81728910 100644
--- a/Content.Client/Administration/UI/AdminUIHelpers.cs
+++ b/Content.Client/Administration/UI/AdminUIHelpers.cs
@@ -50,7 +50,7 @@ public static bool TryConfirm(Button button, Dictionary