v1.5.0 is a major UX overhaul — the Manifest editor is rebuilt as an interactive category builder, every dynamic list gets per-row remove buttons, loot entries become clearly separated multi-line cards, and Skills gains a texture picker and a live XP curve table.

New Features

AreaChange
ManifestRebuilt as interactive category builder — all 9 MDK sections always present (required by engine); categories are optional rows with a sub-key field and translation key field; sections start empty and collapsible; MDK known keys shown as tooltip hints only
All editorsPer-row x remove buttons on every dynamic list — Manifest, Recipes, Rooms, Enemies, Dungeons, and Quests all have a red x button on each individual row instead of a shared Remove Last button
Enemies / RoomsLoot entry multi-line card layout — Item ID on its own full-width row, Drop Chance on its own row, Min Count + Max Count on their own row; all labels aligned to a fixed 130px left column with a 3px accent border grouping each card
SkillsTexture picker — browse, preview in chooser, auto-copy to assets/textures/skills/, path written to JSON as "texture"
SkillsLive XP curve table — scrollable panel below the JSON preview showing Level, XP This Level, Total XP, and difficulty indicator for every level up to Max Level; updates instantly on any spinner change. Difficulty ratings: * Easy / ~ Moderate / ! Hard / !! Brutal / !!! Nightmare
ManifestCategory hover tooltips — label shows full text on hover (100ms delay); key field tooltip shows the composed pack:subkey; translation key field tooltip tracks the full key live

Changes

  • Manifest category rows start empty — MDK-known sub-keys no longer pre-populated; they appear as tooltip hints on the key field when a new row is added
  • Save dialog routing expanded — Materials route by type combo, Equipment by category, Recipes by craft type, Skills by category, Enemies/Rooms by group field, Dungeons by ID prefix, Quests by quest type, Languages to assets/languages/

Fixes

  • Manifest intro label now wraps instead of clipping — replaced plain JLabel with HTML-wrapped label
  • DynamicOptions circular import resolved — SafeIdDocument filter inlined directly in DynamicOptions to avoid util importing from ui
  • RecipeEditor stale removeInputBtn reference removed after per-row x conversion
  • RoomEditor removeLastLoot() call in loadFromData replaced with inline clear to match new loot card layout