Skip to content

Releases: nalu-development/nalu

10.7.1

28 Feb 13:02
c59ec95

Choose a tag to compare

🧰 Maintenance

  • Adding workarounds trying to prevent a non-reproducible random crash on iPads
    NSInternalInconsistencyException Reason: Preferred size is ZERO for auxiliary item <NSCollectionLayoutBoundarySupplementaryItem 0x145c75740; name=(null); size={.containerWidthFactor(1), .estimated(64)};
    	 edgeSpacing=<leading=<NSCollectionLayoutSpacing - 0x130114040: fixed:0>; top=<NSCollectionLayoutSpacing - 0x130114040: fixed:0>; trailing=<NSCollectionLayoutSpacing - 0x130114040: fixed:0>; bottom=<NSCollectionLayoutSpacing - 0x130114040: fixed:0>; outsets=@{0,0,0,0}>;
    	 identfier=4DD3F5DD-45FA-42C4-A9AC-F1518C63778C;
    	 contentInsets={0,0,0,0}> in container <_UICollectionLayoutContainer: 0x145c38880 contentSize={0, 915}; contentInsets={0, 0, 0, 0}}>
    
  • Prevent potential mid-animation crash from happening: System.ArgumentOutOfRangeException in object VirtualScrollNotifyCollectionChangedAdapter<ReadOnlyObservableCollection<IBundleItemBaseViewModel>>.GetItem(int, int)

👨🏼‍💻 Contributors

@albyrock87, @dependabot[bot] and dependabot[bot]

10.7.0

16 Feb 18:15

Choose a tag to compare

🧰 Bug fixes

  • Prevent a potential crash on iOS VirtualScroll when the user tries to drag a non-draggable VirtualScroll
  • Fixes VirtualScrollScrolledEventArgs never reaching 1.0 scroll percentage (#126)

✨ Improvements

  • VirtualScroll: Enhanced VirtualScrollScrolledEventArgs with new properties for better scroll handling:
    • Added ViewportWidth and ViewportHeight to get the viewport dimensions
    • Added RemainingScrollX and RemainingScrollY to easily detect proximity to scroll boundaries - useful for infinite scroll scenarios (#126)
    • [BREAKING CHANGE] ScrollPercentageX and ScrollPercentageY now return 1.0 (instead of 0.0) when content is not scrollable, which better represents "fully scrolled" state (#126)

👨🏼‍💻 Contributors

@albyrock87

10.6.2

04 Feb 19:21

Choose a tag to compare

🧰 Maintenance

  • Fix VirtualScroll on iOS causing crashes under some specific layout / data source changes conditions
  • Fix NaluTabBar-enabled Shell pages not resizing correctly upon orientation change or iPad free-window resizing
  • Fix VirtualScroll carousel layout on iOS not snapping automatically during window resize

👨🏼‍💻 Contributors

@albyrock87

10.6.1

28 Jan 21:13

Choose a tag to compare

🚀 New Features

🧰 Maintenance

👨🏼‍💻 Contributors

@albyrock87

10.6.0

16 Jan 19:04
dbf3611

Choose a tag to compare

Release Notes

🎠 Carousel Layout Support

VirtualScroll now supports carousel layout!

Use HorizontalCarouselVirtualScrollLayout or VerticalCarouselVirtualScrollLayout to create full-screen, page-snapping carousels.

Features:

  • Items automatically fill the available viewport space
  • Smooth page snapping behavior
  • Two-way CurrentRange binding to track the current visible item
  • CurrentRange can be bound to int for simple use cases

Example:

<vs:VirtualScroll ItemsLayout="{vs:HorizontalCarouselVirtualScrollLayout}"
                  vs:CarouselVirtualScrollLayout.CurrentRange="{Binding CurrentIndex}">
    <!-- ItemTemplate -->
</vs:VirtualScroll>

📜 Enhanced Scroll Events

New scroll lifecycle events for better control over scroll behavior:

  • OnScrollStarted / ScrollStartedCommand - Fired when user begins scrolling
  • OnScrollEnded / ScrollEndedCommand - Fired when scrolling completes (after deceleration)

These events are particularly useful for carousel layouts to update the current page indicator.

🔧 Improvements

  • VirtualScrollRange now supports implicit conversion to/from int for simpler carousel index binding
  • Improved layout update handling for better carousel synchronization
  • Fixed an issue on Android where removing all the items from a flat list and adding a new one was causing an empty item to appear right after leading to further unwanted behaviors

📚 Documentation

Updated documentation with comprehensive carousel layout examples and scroll event usage. See the VirtualScroll documentation for details.

10.5.2

14 Jan 11:10

Choose a tag to compare

🧰 Bug fixes

  • Fixes a regression caused by AOT compatibility where IEnteringAware<TIntent> and IAppearingAware<TIntent> where not being invoked when passing a T which inherits from TIntent 34b03e3

👨🏼‍💻 Contributors

@albyrock87

10.5.1

13 Jan 16:03

Choose a tag to compare

Bug fixes

  • Fix NaluTabBar on iOS not applying safe area insets when popping a page while having a different tab bar visibility, resulting in having content not reachable behind the tab bar

👨🏼‍💻 Contributors

@albyrock87

10.5.0

12 Jan 12:14

Choose a tag to compare

AOT Compatibility is here!!

Overview

This release makes Nalu libraries fully AOT-compatible (Ahead-of-Time compilation).
To achieve AOT compatibility, we've removed reflection-based code paths and made APIs more explicit.
This ensures Nalu works correctly with .NET Native AOT compilation, which is required for certain deployment scenarios and provides better performance.

Breaking Changes

Navigation

  • NavigationConfigurator.AddPages() is now marked with [RequiresUnreferencedCode] and is not AOT/trim-compatible.
    • Migration: Use AddPage<TPageModel, TPage>() for each page instead of AddPages().
    • Example: Replace .AddPages() with .AddPage<MainPageModel, MainPage>().AddPage<SettingsPageModel, SettingsPage>()

This is the same concept used by dependency injection.

VirtualScroll

  • Automatic adapter creation for INotifyCollectionChanged collections is not supported in AOT mode.

    • When using AOT, binding ObservableCollection<T> or ReadOnlyObservableCollection<T> directly to ItemsSource will throw NotSupportedException.
    • Migration: Use factory methods to create adapters explicitly:
      // Instead of: ItemsSource="{Binding Items}" where Items is ObservableCollection<T>
      // Use:
      var adapter = VirtualScroll.CreateObservableCollectionAdapter(items);
      ItemsSource = adapter;
  • Factory method return types have changed for ReadOnlyObservableCollection<T>-based adapters.

    • Factory methods that accept ReadOnlyObservableCollection<T> now return IVirtualScrollAdapter instead of IReorderableVirtualScrollAdapter.
    • This is correct since read-only collections cannot be reordered.
    • Migration: If you were using the return value as IReorderableVirtualScrollAdapter, change the target variable to IVirtualScrollAdapter or use a different collection type.
  • Preset Adapter classes have changed:

    • VirtualScrollObservableCollectionAdapter<TItemCollection>VirtualScrollObservableCollectionAdapter<TItem>
      • The generic type parameter now represents the item type, not the collection type.
      • Migration: Change VirtualScrollObservableCollectionAdapter<ObservableCollection<MyItem>> to VirtualScrollObservableCollectionAdapter<MyItem>.
    • VirtualScrollGroupedObservableCollectionAdapter<TSectionCollection, TItemCollection>VirtualScrollGroupedObservableCollectionAdapter<TSectionCollection, TItem>
      • The second generic type parameter now represents the item type (TItem), not the items collection type.
      • The items collection type is now fixed to ObservableCollection<TItem>.
      • Migration: Change VirtualScrollGroupedObservableCollectionAdapter<ObservableCollection<Section>, ObservableCollection<Item>> to VirtualScrollGroupedObservableCollectionAdapter<ObservableCollection<Section>, Item>.
    • If you were extending these classes to provide custom behavior (e.g., overriding CanDragItem, MoveItem, etc.), you need to update your class declarations to use the new generic parameter types.

Navigation Extensions

  • NavigationExtensions.Matches() no longer uses reflection-based intent comparer lookup.
    • The default Matches() method now uses EqualityComparer<object>.Default for intent comparison.
    • Custom intent comparers can still be provided via the overloaded Matches() methods.

Recommendations

For AOT Compatibility

  1. Navigation: Use AddPage<TPageModel, TPage>() for each page instead of AddPages().
  2. VirtualScroll: Always provide an IVirtualScrollAdapter explicitly using factory methods (CreateObservableCollectionAdapter, CreateStaticCollectionAdapter, etc.) instead of binding collections directly.

Migration Strategy

  • For new projects: Use IVirtualScrollAdapter and explicit AddPage() calls from the start for AOT compatibility.
  • For existing projects: Migrate gradually, starting with VirtualScroll adapters, then navigation registration.

👨🏼‍💻 Contributors

@albyrock87

10.4.0

08 Jan 20:48
c1c554d

Choose a tag to compare

🚀 New Features

Simulator_Screen_Recording_-_iPhone_16e_-_2026-01-08_at_20.19.45.mov

👨🏼‍💻 Contributors

@albyrock87

10.3.4

06 Jan 18:31

Choose a tag to compare

🧰 Bug fixes

  • [BREAKING CHANGE] The XAML namespace of VirtualScroll is now correctly set to https://nalu-development.github.com/nalu/virtualscroll (previously it was clashing with the layouts namespace
  • Fix iOS SoftKeyboardManager crashing when a field is inside a popup not driven by a view controller

👨🏼‍💻 Contributors

@albyrock87