## Additions
### UI
- The new `ColorPickerComponent` presents an easy-to-use, self-contained way to choose a color. It visually presents a standard HSV picker, with a hue (and optionally alpha) slider and picker for value and saturation. The picker itself shows neither a color preview nor hex field - these can easily be added externally via the color selection event stream supplied by the picker
- UI overlays like popup dialogs can now be easily realized via the new `OverlayContainer`, accessible via `Containers.overlay(...)`. This component, when added to some parent (in most cases the root), renders an overlay covering the entire parent and places its child in the center. By default, it automatically closes itself when a click event is received outside the child
- `ItemComponent` features the new `tooltipFromItem` utility method, which can be used to gather the full tooltip of an item stack, including extra tooltip data
- Rendering of nametags in `EntityComponent` can now be toggled on a per-component basis
- The new `openAsContextMenu` function on `DropdownComponent` enables easy integration of context menus into any screen
- Animations on component properties now provide the `finished()` event stream which emits every time the animation finishes a full run in either direction
- `RenderEffectWrapper`, accessible via `Containers.renderEffect` offers a hassle-free way to apply arbitrary rendering effects to its children. Check out the [component's javadoc](https://github.com/wisp-forest/owo-lib/blob/1.19.3/src/main/java/io/wispforest/owo/ui/container/RenderEffectWrapper.java) for a more complete overview
### Config
- owo-ui's `Color` type is now supported in configs. This means it will be properly serialized as a string representing the color in `#AARRGGBB` format and displayed that way in the config screen. With this also comes an optional color picker, allowing your users to easily pick a color (optionally with alpha as well)
- The Jankson serializer instance used by any given config wrapper can now be customized through the new, optional constructor parameter. This enables non-standard serialization of existing types and also allows serializing completely custom types
- The `@RangeConstraint` annotation has gained the new `decimalPlaces` parameter which controls how many decimal places are shown when this option is edited as a slider
### Rendering
The `Drawer` class has gained a few new rendering functions to fill in missing functionality:
- **drawCircle** and **drawRing** can be used to draw either a filled circle or ring with specific inner and outer radius respectively
- **drawLine** draws an arbitrary line as a quad instead of using OpenGL's line mode, which allows more correct control over thickness
Additionally, the new `GlProgram` class and corresponding infrastructure enables usage of custom core shaders from mod namespaces. Two default programs are provided, although they are not currently part of stable public API:
- **OwoClient.BLUR_PROGRAM** applies an approximate gaussian blur to the area it draws over
- **OwoClient.HSV_PROGRAM** works much the same as the standard position-color program, but accepts the color attribute in HSVA format instead of RGBA
## Changes
### UI
- The HSV interface of `Color` has been improved: Constructing a color with a hue of 1 no longer causes it to become yellow instead of red and the new `hsv()` getter can be used to convert from RGB to HSV easily
- The REI exclusion zone provider now gathers the components directly from the UI adapter instead of simply assuming that it's available as the first drawable child of the screen - this should fix some edge cases in which the exclusion zones were broken due to a different widget somehow being inserted into the screen before the UI adapter
- The `RenderablePlayerEntity` inner class of `EntityComponent` is now publically accessible - this makes it easier to call methods on such entities and allows easily extending the class if so desired
- `DropdownComponent.requiresHover` has been renamed to `closeWhenNotHovered` to more clearly communicate its purpose. The entire dropdown system has been slightly overhauled in general to be more visually pleasing and easier to use
### Config
- `OptionComponentFactory.Result` now features two type parameters to more cleanly carry information about the contained components
- All numeric, range-constrained config options can now be edited with either a slider *or* text field, at the discretion of the user
## Fixes
### UI
- Sprite components with ticked sprites should now properly animate with Sodium's "Only animate visible textures" option enabled (BasiqueEvangelist, #78)
- When cycling UI component focus with the Tab key, the first component no longer get skipped and the children of a grid layout are no longer focused in reverse order (#77)
- Fire and the nametags of entities are now properly aligned in `EntityComponent`
- Buttons and checkboxes in dropdown can now be properly clicked on the entire width of the dropdown
- Layers now handle event parameters in a different way that works around a memory present in Fabric API's event system. This previously caused owo screen instances to be leaked, which is no longer the case (#81)
### Misc
- Items from `OwoItemGroup` sub-tabs which are not the first one are now properly indexed for search in the creative inventory
- owo-sentinel now one again has full functionality when running on the Quilt Loader
Developer information
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle.
maven { name = "Modrinth"; url = "https://api.modrinth.com/maven" }