Changelog¶
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Types of changes:
- Added for new features.
- Changed for changes in existing functionality.
- Deprecated for soon-to-be removed features.
- Removed for now removed features.
- Fixed for any bug fixes.
- Security in case of vulnerabilities.
[0.13.1] - 2026-03-26¶
Changed¶
- Changed
MorphDialogdefault_configauto_sizeto(False, True).
Fixed¶
- Fixed
MorphAutoSizingBehaviorinitialization by deferringrefresh_auto_sizing()to the next frame viaClock.schedule_once, preventing layout timing issues on widget construction.
Refactored¶
- Consolidated pressed-state management, ripple trigger, and
on_press/on_releasedispatch into_do_press(pos)and_do_release()inMorphButtonBehavior, removing redundantClock.schedule_oncecall foron_releaseinon_touch_up. - Removed
MorphToggleButtonBehavior._do_pressoverride (no longer needed); addedsuper()._do_release()call inMorphToggleButtonBehavior._do_release. - Simplified
trigger_actionto delegate directly to_do_press/_do_release.
[0.13.0] - 2026-03-25¶
Added¶
- Added
MorphLinearProgresswidget: horizontal progress indicator with determinate and indeterminate modes, rounded caps, split-track gap animation, anddefault_configsizing (size_hint=(1, None),height=dp(8)). - Added
MorphCircularProgresswidget: circular arc progress indicator with determinate and indeterminate modes; indeterminate mode rotates the canvas group with a sinusoidal speed pulse and animates the arc span between 1/6 and 5/6 of the circle (Material Design comet effect). - Added
MorphWavyLinearProgresswidget: extendsMorphLinearProgresswith a continuous sine-wave polyline stroke; phase is tied to absolute x coordinate so indicator and track share one seamless wave pattern. - Added
MorphWavyCircularProgresswidget: extendsMorphCircularProgresswith a radial sine-wave stroke; wave count is derived from the circumference (_CIRCULAR_WAVE_COUNT = 9) so all 9 cycles connect seamlessly at 360° regardless of widget size. - Added
_WavePhaseAnimMixin: mixin class providingwave_speedand_wave_phaseproperties and a per-frameClockevent that produces a travelling-wave animation on all wavy progress widgets. - Added
_display_valueinternal property to_MorphProgressBasethat drives all canvas rendering and is smoothly animated byon_value. - Added
value_animation_duration(default0.2s) andvalue_animation_transition(default'out_quad') properties to_MorphProgressBasefor configuring the automatic value transition animation. - Added
redraw()public method to_MorphProgressBasefor triggering an immediate canvas and color refresh from external code. - Added
indeterminate_durationproperty to_MorphProgressBase(default1.33s, matching the Material Design specification). - Added 4-phase Material Design indeterminate animation to
MorphLinearProgress: bar grows from 1/7 to 5/6 of the track width while accelerating, then pauses before repeating; driven by an animatable_ind_speedproperty. - Added
MorphSimpleTooltipsubclass ofMorphTooltipencapsulating a single text label. - Added
MorphRichTooltipsubclass withheading(bold title) andsupporting(detail text) string properties; the supporting label is added and removed from the widget tree dynamically. - Added
MorphTooltipLabelandMorphTooltipHeadingLabeltouix/label.py. - Added
update_tooltip_text(text)interface method onMorphTooltip, overridden inMorphSimpleTooltipandMorphRichTooltip. - Added
linspacegenerator tomorphui/utils/helpers.py(pure-Python, no NumPy dependency).
Changed¶
- Changed
valueproperty on_MorphProgressBasefrom a direct render trigger to a target property; setting it now starts an animated transition of_display_valuerather than updating the canvas immediately. - Changed
MorphCircularProgresscanvas to useLine.circleprimitive for arc tessellation, removing manual point generation. - Changed
MorphCircularProgress._refresh_canvasto use aPushMatrix/Rotate/PopMatrixwrapper so onlyRotate.angleis updated per frame during indeterminate mode (no geometry recalculation per frame). - Changed
MorphTooltipBehavior.update_tooltip_textto delegate totooltip.update_tooltip_text()instead of walking the tooltip's children list. - Changed
MorphDatePickerCalendarViewto storeselected_dates: ListProperty(plaindatetime.datevalues) instead ofselected_day_buttons(widget references) so selection state survives month navigation.
Refactored¶
- Introduced
_MorphProgressBaseas a shared base class for all progress indicators, consolidating common properties (value,indeterminate,indicator_color,track_color,thickness), canvas bindings, and the abstract_setup_canvas/_refresh_canvasinterface.
Fixed¶
- Fixed
MorphAutoSizingBehaviortext label growing horizontally beyond its container. - Fixed
MorphDatePickerCalendarViewweekday header alignment and improved format hint UX.
[0.12.0] - 2026-03-09¶
Added¶
- Added
MorphMotionBaseBehaviorclass holding all base properties and methods used for motion behavior classes. - Added
MorphDialogMotionBehaviorclass which extendsMorphMotionBaseBehaviorto provide motion functionality specific to dialogs. - Added
MorphScrimLayerclass that provides a semi-transparent overlay appearing behind dialogs to focus user attention. - Added
MorphDialogclass that provides a customizable dialog component for displaying information, prompting user input, or presenting interactive content in modal overlays. - Added
animate_opacityduring scale in and out animations toMorphScaleBehavior. - Added
__events__properties to behavior classes instead of callingself.register_event_type()in__init__. - Added comprehensive test suite for motion behaviors (15 tests for
MorphMotionBaseBehavior, 13 tests forMorphDialogMotionBehavior, 4 tests forMorphMenuMotionBehavior).
Changed¶
- Changed
MorphMenuMotionBehaviorto extendMorphMotionBaseBehaviorclass for better code organization. - Changed property names in
MorphMotionBaseBehaviorby removing themenu_prefix since they are used for multiple behavior types, not just menus. - Changed
MorphAutoSizingBehaviorto first settext_sizeto(None, None)and update texture to ensure correct dimensions before settingtext_sizeto matchtexture_size.
Removed¶
- Removed adding padding to
texture_sizefor calculating minimum size properties inBaseLabelsincetexture_sizealready includes padding. - Removed calling
self.register_event_type()method in behavior__init__methods in favor of using__events__properties.
[0.11.1] - 2026-03-03¶
Added¶
- Added
caller_collide_pointmethod to MorphMenuMotionBehavior as a workaround for the fact that the nativecollide_pointmethod does not work correctly for the caller button when the menu is open. - Added
on_releasemethod to MorphDropdownSelect that toggles the dropdown menu.
Changed¶
- Changed MorphDropdownMenu to no longer handle the
activestate of the caller button, simplifying state management. - Changed MorphDropdownSelect to bind
is_openproperty to setter ofactivestate for better state synchronization.
[0.11.0] - 2026-02-20¶
Removed¶
- Removed
dismiss_allowedproperty from MorphMenuMotionBehavior since the dismissing is now handled by the on_touch_up() method. If the caller has a ripple in progress or a touch collides the caller widget, it will not call dismiss.
Changed¶
- Changed MorphDropdownSelect to set its active state to False when the dropdown menu is dismissed, ensuring that the button's visual state correctly reflects the menu's visibility.
- Changed MorphMenuMotionBehavior to not call dismiss in on_touch_up() method if the caller's on_touch_up() method returns True, which indicates that the touch event was handled by the caller and should not trigger dismissing the menu. This allows for more flexible interactions where the caller can choose to handle touch events without automatically dismissing the menu.
Fixed¶
- Fixed property name from
label_texttoheading_textin MorphDockedDatePickerField to better reflect its purpose and to align with common terminology for form fields. This change also involved updating internal logic to ensure that the correct property is used for setting the heading text of the date picker field.
[0.10.0] - 2026-02-18¶
Added¶
- Added setting of active state to False on dropdown button when dropdown menu is dismissed to ensure visual state consistency.
- Added
_bound_leading_widgetproperty to MorphLeadingWidgetBehavior to store references to widgets with active property bindings. - Added
_bound_trailing_widgetproperty to MorphTrailingWidgetBehavior to store references to widgets with active property bindings. - Added unbinding of properties to previous leading/trailing widgets when they change.
- Added
refresh_widget()function to morphui.utils.helpers that iterates through all attributes of a given widget and calls any method that starts with'refresh_'. - Added visibility properties to composition behaviors.
Changed¶
- Changed all composition behavior classes to inherit from EventDispatcher.
- Changed state-sensitive properties in composition behaviors from AliasProperties to StringProperty.
- Changed child widgets' state-sensitive properties to be bound to their behavior properties instead of using getter/setter methods.
- Changed MorphTextField to inherit from MorphDelegatedThemeBehavior, MorphLeadingWidgetBehavior, MorphTripleLabelBehavior, and MorphTrailingWidgetBehavior.
- Changed MorphFilterChip to no longer inherit from MorphIconBehavior due to changes in composition behaviors.
- Changed default spacing and padding of chips and their child widget classes.
- Changed defining the leading icon for recycled widgets to be done via
normal_leading_iconinstead ofleading_icon(which only works at init). - Improved naming in composition behaviors.
Removed¶
- Removed obsolete getter and setter methods used for AliasProperties in composition behaviors.
- Removed obsolete
_update_iconmethod from MorphFilterChip. - Removed obsolete reinvented code from MorphTextField that is now covered by new behavior inheritance.
Fixed¶
- Fixed bug where
label_textwas used instead ofheading_textwhere needed.
[0.9.0] - 2026-02-16¶
Added¶
- Added
explicit_color_propertiesset to MorphColorThemeBehavior for tracking user-specified colors that should not be automatically updated by theme changes. - Added
_detect_explicit_properties()method to MorphColorThemeBehavior to auto-detect explicitly set color properties from kwargs during initialization. - Added
_refresh_list_views()method to MorphDockedDatePickerMenu for refreshing list views before displaying. - Added 'disabled' theme style to
THEME.STYLESconstant.
Changed¶
- Changed MorphColorThemeBehavior to give
theme_color_bindingsprecedence overtheme_style, allowing override of predefined theme style bindings. - Changed all widgets to use
default_config.copy() | kwargspattern in__init__, replacing clean_config usage. - Changed MorphDockedDatePickerMenu to inherit from MorphElevationBoxLayout.
- Changed MorphDockedDatePickerMenu to return to calendar view when a month is selected in month view.
- Changed MorphDockedDatePickerMenu to reposition menu when size changes to ensure it connects to caller.
- Changed MorphDockedDatePickerMenu to return to calendar view when using arrow keys while in list view (year or month).
- Changed MorphChartToolbar to inherit from MorphToggleButtonBehavior class.
- Changed MorphChartToolbar menu toggling to use active state instead of manual open/close.
- Changed composition behaviors to call
_update_iconwithin refreshing leading or trailing widget methods. - Changed ListView classes to use f-strings for Builder.load_string and define tree using
__name__attribute. - Changed all THEME.STYLES to have consistent disabled colors across all styles.
Removed¶
- Removed
clean_config()function from morphui.utils.helpers, replaced with dynamic explicit property tracking system. - Removed obsolete
_update_content_layeroverride from MorphDelegatedThemeBehavior.
Fixed¶
- Fixed MorphDockedDatePickerMenu where highlighting and marking selected buttons when using text input instead of clicking on a button now works correctly.
- Fixed MorphDockedDatePickerMenu where wrong item had check mark when switching to list view; list view is now refreshed before entering.
- Fixed MorphDockedDatePickerMenu to set the correct item active when changing year or month using arrow buttons.
- Fixed MorphChartToolbar where menu was closed and reopened when clicking on button while menu was already open.
- Fixed MorphContentLayerBehavior where resetting
disabled_content_coloris now done in_update_content_layermethod instead ofrefresh_contentmethod with outdated color. - Fixed MorphDelegatedThemeBehavior where delegating states are now done in
_update_current_statemethod override instead of using bindings which didn't work properly.
[0.8.0] - 2026-02-12¶
Added¶
- Added container theme style to
THEME.STYLESconstant. - Added
_clear_activeandset_active_by_textmethods to BaseDatePickerListView for updating each item when showing the view. - Added getter and setter methods for
disabled_content_colorin MorphContentLayerBehavior. - Added default
pos_hint={'center_y': 0.5}for labels and buttons used within containers.
Changed¶
- Changed buttons to use 'container' as
theme_style. - Changed MorphContentLayerBehavior's
disabled_content_colorto an AliasProperty to handle kivy native disabled colors. - Changed MorphListItemFlat to also call refreshing state and interaction in
refresh_view_attrsmethod. - Changed MorphTextField where setting y position for leading and trailing widget is obsolete since widgets are centered by pos_hint.
- Changed MorphDropdownList to remove obsolete checking for children length within
set_focus_by_textmethod.
Removed¶
- Removed obsolete
get_resolved_content_colormethod from MorphContentLayerBehavior since_get_content_colormethod exists for thecontent_colorAliasProperty.
Fixed¶
- Fixed MorphContentLayerBehavior where resetting
disabled_content_colorwas done inrefresh_contentmethod with outdated color. Now resetting is done in_update_content_layermethod. - Fixed MorphDropdownMenu where dropdown reopened when clicking a caller. Now it checks if a ripple is in progress and only sets caller active state to False if no ripple is in progress.
[0.7.0] - 2026-02-11¶
Added¶
- Added
hex_colormapas DictProperty to ThemeManager to store registered seed colors. - Added
available_seed_colorsas AliasProperty to ThemeManager that is bound to changes of hex_colormap. - Added
colormapas read-only property to ThemeManager to return a RGBA colormap derived from hex_colormap. - Added
leading_scale_enabledBooleanProperty to MorphLeadingWidgetBehavior as flag, whether scale animations are enabled for the leading widget. - Added
on_pre_openmethod to chart in which the flagdismiss_allowedis set to True. - Added refreshing view from data in
on_pre_openand inon_pre_dismissto MorphDropdownMenu to ensure the view is up to date after a selection.
Changed¶
- Changed ThemeManager's
is_dark_modeto an AliasProperty so we can react to that when theme style changes (e.g. a theme toggle button can get active and normal state based on is_dark_mode status). - Changed storing registered colors in ThemeManager to be handled locally instead of storing to kivy global colormap.
- Changed default theme_color_bindings for buttons.
- Changed predefined theme styles.
- Changed default border width to dp(0.5).
- Changed layer.py color retrieval to use a consistent method: tries to get the color for current state; if a specific color for the state is not set, it falls back to the normal color; if that is also not set it returns the transparent color.
[0.6.0] - 2026-02-10¶
Added¶
- Added MorphDropdownButton class (a simple dropdown select button that can be used to trigger a dropdown menu).
- Added MorphSimpleBoxLayout class that is basic kivy BoxLayout with support for auto_sizing.
- Added MorphTripleLabelBehavior class for managing heading, supporting and tertiary label widgets.
- Added MorphHeadingLabel, MorphSupportingLabel and MorphTertiaryLabel classes.
- Added MorphListItem which provides a more complex layout than MorphListItemFlat with heading, supporting and tertiary labels.
- Added MorphToggleListItem that extends MorphListItem with toggling its active state.
- Added tests for MorphTripleLabelBehavior class.
Changed¶
- Changed MorphDropdownList to set focus to lowest child at
on_arrow_up_pressmethod if none has focus. - Changed Container classes to inherit from the new MorphSimpleBoxLayout.
- Changed attribute name from
default_child_widgetstodefault_child_classesin Container. - Changed MorphMenuMotionBehavior, moved presetting size from
_adjust_and_repositionmethod into_adjust_to_fit_windowmethod. - Changed touch behavior, removed overlapping transition part for ripple in and out.
Fixed¶
- Fixed MorphMenuMotionBehavior where presetting size before adjusting to window did not consider adjusting size to caller when
same_width_as_callerwas set to True.
[0.5.0] - 2026-02-05¶
Added¶
- Added MorphScrollView class to scrollview.py module.
- Added MorphTabNavigationManagerBehavior and MorphTabNavigableBehavior for managing tab navigation between widgets.
- Added
is_emptyproperty to MorphDataViewTable to indicate when table has no data to show. - Added attributes for top left and lower left widgets in MorphDataViewTable.
- Added
available_textsproperty to BaseListView. - Added
_clear_hovermethod to MorphDropdownList. - Added
_set_focus_by_textmethod to MorphDropdownList. - Added tests for refactored KeyPressBehavior.
- Added tests for MorphTabNavigableBehavior class.
- Added tests for MorphTabNavigationManagerBehavior.
Changed¶
- Changed MorphStateBehavior's
update_available_statesmethod to bind and unbind only available states. - Changed default
disabled_state_opacityto 0.0 in MorphInteractionLayerBehavior. - Changed all properties named
interaction_layer_tointeraction_in InteractionLayer. - Changed property name from
delegate_to_childrentodelegated_childrenin MorphDelegatedThemeBehavior. - Changed method name from
_update_delegated_childrento_setup_child_delegationin MorphDelegatedThemeBehavior. - Changed MorphDataViewTable to remove edges of top_left widget when table is empty.
- Changed MorphDropdownMenu to set current focus of current text at
on_pre_openmethod. - Changed MorphDropdownMenu to clear focus and hover state for all items at
on_dismissmethod. - Changed MorphTabNavigableBehavior to automatically remove tabs in text property.
- Changed
return Nonetoreturnfor early exit at functions and methods where no return value is expected. - Removed tab handling from MorphKeyPressBehavior and moved to MorphTabNavigationManagerBehavior.
- Removed random added imports.
Fixed¶
- Fixed delegating content in MorphDelegatedThemeBehavior which did not work correctly.
- Fixed MRO error by removing redundant base classes from MorphDataViewNavigationButton.
- Fixed MorphPlotWidget where calling home of navigation during double tap failed if there is no navigation.
- Fixed MorphTextField trying to recalculate layout when widget is on a Screen of ScreenManager and was never visible.
- Fixed MorphDropDownMenu where listview registered key presses even when it was not open.
- Fixed Composition behavior where getting and setting icons failed for recycled widgets, using wrong icons for setting new ones.
[0.4.0] - 2026-01-29¶
Added¶
- Added key press behavior to MorphDropdownList to allow navigation and selection using keyboard arrows and enter key.
- Added focus state flag to MorphListItemFlat to visually indicate when an item is focused.
- Added MorphKeyPressBehavior inheritance to BaseListView.
- Added overloads for clamp function in helpers module.
- Added default item_release_callback for MorphDropdownFilterField, setting on_item_release method as the default.
Fixed¶
- Fixed an issue where the filter_value property in Dropdown was set to wrong child widget, preventing filtering from working.
- Fixed MorphTooltip not dismissing anymore after introduction of MorphMenuBehavior.
Changed¶
- Changed binding of hovering flag to dismiss_allowed flag for Tooltip.
- Changed binding of focus flag to dismiss_allowed flag for Dropdown.
Removed¶
- Removed on_open override in Dropdown to keep it available for further customization.
[0.3.1] - 2026-01-21¶
Added¶
- Added active state to OverlayState.
- Added active_overlay_edge_color property to MorphOverlayLayerBehavior.
Fixed¶
- Fixed an issue where the datepicker menu would not dismiss correctly when the text field lost focus.
- Fixed overlay layer not updating correctly on state change in MorphOverlayLayerBehavior.
- Fixed MorphMenuMotionBehavior to schedule calling dismiss in on_touch_up() method to ensure it registers allowing_dismiss when clicking outside of caller and menu.
Changed¶
- Changed MorphMenuMotionBehavior to set dismiss_allowed to False before opening.
- Changed MorphMenuMotionBehavior to dispatch on_open after animation.
- Changed MorphMenuMotionBehavior to dispatch on_dismiss after animation.
Removed¶
- Removed override of on_touch_down() method from MorphMenuMotionBehavior.
[0.3.0] - 2026-01-19¶
Added¶
- The module datepicker.py was added to MorphUI which provides a date picker widget with single and range selection modes.
- The MorphScreenManager was added to MorphUI which extends the Kivy ScreenManager with MorphUI theming and transitions.
- The MorphDelegatedThemeBehavior was added to MorphUI which allows delegating theming properties to a target widget.
- The MorphHighlightLayerBehavior was added to MorphUI which provides a highlight layer for widgets.
Changed¶
- The default configuration for some buttons and labels was changed.
Fixed¶
- Fixed missing inheritance of MorphContentLayerBehavior for MorphSimpleiconButton
- Storing original size and size_hint was a list instead of a tuple which leads to unpredictable behaviors when using MorphSizeBoundsBehavior.
[0.2.0] - 2026-01-06¶
Added¶
- Added themeing support for MorphUI widgets.
- Added uix folder for MorphUI widgets.
- Added utility functions for MorphUI.
- Added dataviews for MorphUI.
- Added visualizations for MorphUI.