Enhanced dropdown capabilities, improved field submission behavior, and streamlined sidebar state management. This release introduces multi-select dropdowns, automatic field submission on blur, and performance improvements to sidebar state handling.BREAKING CHANGES ๐จ
- The widget is now generic and uses
selected instead of selectedId
- Migration:
- Change
selectedId: String? to selected: String? (for single-select) or selected: Set<String> (for multi-select)
- Change
onChanged: ValueChanged<String?> to onChanged: ValueChanged<String?> (single-select) or ValueChanged<Set<String>> (multi-select)
- The property
activeItem and method setActiveItem(String item) have been removed from NeoSidebarStates and NeoCurrentSidebarStates notifier
- Rationale: This property was not needed as you can determine the current path locally in your application code. Use the current path to decide which
NeoSidebarButton should be active, rather than storing it in the sidebar state. Additionally, tracking the active path did not fit within the scope of sidebar states, which should focus on UI state (collapsed, hidden, etc.) rather than application routing state
- Migration: Remove all references to
activeItem and any calls to setActiveItem(). Instead, determine the active button based on your current route path locally
New ๐
- Added multi-select support to
NeoDropdownField. When using Set<String> as the generic type, users can select multiple items
- Selected items are displayed as comma-separated labels
Improvements ๐ช
Field Submission Behavior
- Added
submitOnBlur property to NeoTextField, NeoTextArea, NeoDateField, and NeoTimeField. When enabled (defaults to true), these fields will automatically call onSubmitted when the field loses focus, providing better form submission behavior
- Added
size parameter to NeoModal.show() method. The modal now supports three size options (NeoModalSize.small, NeoModalSize.medium, NeoModalSize.large) with corresponding max widths (400px, 500px, 600px respectively). Defaults to NeoModalSize.small for backward compatibility
- Improved sidebar state management performance.
NeoSidebarStates provider now only initializes when actually using NeoSidebarLayout, preventing unnecessary provider initialization in apps that donโt use the sidebar layout
Fixes ๐
- Fixed validation assert:
maintainFocusOnSubmit and submitOnBlur cannot both be true in NeoTextField and NeoTextArea. An assert now prevents this invalid configuration
- Fixed
maintainFocusOnSubmit not working properly in NeoTextField. The field now correctly maintains focus when Enter is pressed and maintainFocusOnSubmit is true
- Fixed duplicate submission bug where pressing Enter would trigger both Enter submission and blur submission. Fields now track submission source to prevent duplicate calls to
onSubmitted
Introducing Neoโs time input capabilities! This release adds a time field widget with segmented input and intelligent navigation.New ๐
- Time input widget with segmented HH:MM format and advanced interaction features:
- Smart segmented input: HH:MM format with intelligent auto-advance between segments
- Keyboard navigation: Arrow keys for navigation between segments and value increment/decrement
- Input validation: Real-time value capping for valid time ranges (00:00-23:59)
Quick bug fix release addressing field widget issues within modals and text area resizing behavior.Improvements ๐ช
- Fixed
NeoTextArea manual resize behavior by correcting height calculation
Fixes ๐
Major expansion of Neoโs input capabilities! ๐ This release introduces the multi-line NeoTextArea widget, comprehensive date validation utilities, a clean card component, and significant improvements to date field functionality with a completely rewritten segmented input experience.BREAKING CHANGES ๐จ
NeoDateField API Changes:
- Changed from
DateTime? properties to string-based API for enhanced flexibility
dateString property replaces previous date properties
onSubmitted(String) callback replaces previous onSubmitted(DateTime?) callback
- This enables custom validation flows, internationalized error messages, and auto-correction features
New ๐
- Multi-line text input widget with advanced features:
- Auto-resizing: Configurable min/max lines with automatic height adjustment
- Manual resizing: Optional drag handle for user-controlled sizing
- Keyboard shortcuts: Smart text submission (Enter vs Cmd/Ctrl+Enter based on
submitOnEnter setting)
- Comprehensive properties: Label, placeholder, description, error text, validation, and focus management
- Clean card component with configurable padding (defaults to
theme.spacings.large)
- Perfect for grouping content with consistent styling and subtle shadows
- Comprehensive date validation utility with 7 validation methods:
validate(String) - Parses and validates DD-MM-YYYY format with detailed error messages
validateIsBefore(DateTime, DateTime) - Validates date is before another date
validateIsAfter(DateTime, DateTime) - Validates date is after another date
validateIsInRange(DateTime, DateTime, DateTime) - Validates date is within range (inclusive)
validateIsNotFuture(DateTime) - Validates date is today or earlier
validateIsNotPast(DateTime) - Validates date is today or later
format(DateTime) - Formats DateTime objects to DD-MM-YYYY string
Other New Features
NeoApp: Added optional wrapper parameter for custom root-level widget wrapping
Improvements ๐ช
- Smart segmented input: DD-MM-YYYY format with intelligent auto-advance between segments
- Keyboard navigation: Arrow keys for navigation between segments and value increment/decrement
- Focus management: Proper tab order integration with automatic segment selection
- Input validation: Real-time value capping and context-aware month day limits
- Enhanced UX: Tap-to-select segments, automatic padding, and seamless interaction flow
- Flexible error handling: Allows invalid dates in field state, moving validation to end-user side for custom UX flows
- Enhanced platform consistency: Replaced
EditableText with CupertinoTextField for better native behavior
- Improved error handling: Fixed error text display to only show when error text is not empty, preventing layout jumps
- Enhanced backdrop: Added gradient effect for smoother visual transition
Fixes ๐
NeoTextField: Fixed error text layout jumps from empty error messages
API standardization and UX polish across the board. This release finalizes the Date Field, unifies disabled/error states, and introduces a few small but meaningful visual improvements and fixes.BREAKING CHANGES ๐จ
These rename-only changes standardize content and boolean property names. Behavior is unchanged.| Widget | Old Property | New Property |
|---|
NeoButton | text | label |
NeoSidebarButton | text | label |
NeoSidebarButton | caret | hasCaret |
NeoBadge | text | label |
NeoTable | selectable | isSelectable |
NeoTooltip | text | label |
NeoTooltip | trigger | child |
NeoTabBar | expanded | isExpanded |
NeoTab | text | label |
NeoDropdownMenuItem | danger | isDanger |
New ๐
NeoDateField: finalized segmented DD-MM-YYYY input
- Keyboard navigation and smart selection handling
- Normalizes input and supports disabled state
- New
onSubmitted(DateTime? value) callback
- Added
autofocusSearchOnOpen property to NeoDropdownField. When true, the search field will be focused when the dropdown is opened
- Added
isEnabled property to NeoTextField, NeoDropdownField and NeoToggleSwitch for consistent disabled-state visuals and behavior
Improvements ๐ช
Fixes ๐
Major improvements across the framework! ๐ This release introduces a new Modal widget and brings significant enhancements to buttons, toasts, themingโplus important API improvements and some breaking changes to be aware of.BREAKING CHANGES ๐จ
NeoButton: Removed NeoButtonSize.expanded from the size property enumโuse the new isExpanded boolean property instead
NeoTabBar: activeTabId and onChange properties are now required (changed from nullable)
- Field widgets height change:
NeoTextField, NeoDropdownField, and NeoDateField changed from flexible height to fixed height (44.0) - may affect layouts relying on flexible field height
New ๐
- A new overlay widget for creating modals, dialogs, confirmations, and custom popups
- Features builder-based API with
contentBuilder and actionsBuilder for flexible layouts
Theming System Additions
- Added
NeoShadowTokens with small and medium shadow definitions
- Added semantic color tokens:
success/onSuccess, warning/onWarning, danger/dangerHover/dangerPressed/onDanger
- Added button-specific tokens:
buttonBg, buttonBgHover, buttonBgPressed, buttonFg
- Added contrast tokens:
fgOnContrast and bgContrast
- Added
green color to NeoPalette with fgSuccess and fgOnSuccess tokens
- Added new states:
isLoading, isDanger, isEnabled properties for loading, danger, and disabled states
- Added a new variant:
NeoButtonVariant.link, for underlined link-style buttons
- Added
isExpanded property for expanded buttons (replaces NeoButtonSize.expanded)
- Added
isCaretRotated property for animated dropdown-style carets
- Added enhanced color customization:
bgColor, bgHoverColor, bgPressedColor, and fgColor properties
- Added
NeoToastType enum with preset configurations (info, loading, success, warning, danger)
- Added
NeoToast.update() method for dynamically updating existing toasts
- Added toast descriptions with optional
description parameter
- Added sophisticated toast stacking system with dynamic height calculation
- Added
label property to NeoDivider for labeled dividers
- Added
errorText and allowDeselect properties to NeoDropdownField
- Added
fixedRowHeight property to NeoTable for consistent row heights
- Added optional
focusNode property to NeoTextField for better focus management
- Added smart log filtering to
NeoLogger with automatic build mode detection
- Debug builds show all log levels (
trace, debug, info, warning, error, fatal) for comprehensive debugging
- Release builds only show info level and above to reduce noise and improve performance
- This means you can safely leave
trace and debug calls throughout your codebase during development - they wonโt clutter the user experience in production builds
Improvements ๐ช
- Better interaction feedback with refined animations and shadows
- More sophisticated color calculations for different variants and states
- Complete visual redesign with modern card-based styling and enhanced shadows
- Intelligent preset system with automatic icon/color configuration and auto-dismiss behavior
- Advanced animation system with staggered entrance, elastic positioning, and smooth dismissal
- Restructured color palette with semantic naming (e.g.,
green500, red500, red600)
NeoDropdownField: Improved search bar implementation
- Standardized logging format across all Neo widgets with consistent
[Neo] [WidgetName] prefixes for easier debugging and filtering
Fixes ๐
- Fixed toast positioning, stacking, memory leaks, and race conditions
- Fixed
isDismissable bug in dropdown widgets
- Updated deprecated
withOpacity() calls to use withValues(alpha:) for Flutter compatibility
A new widget has landed! ๐ (Plus a few improvements)New ๐
- Added
NeoTabBar. Itโs a barโฆ of tabs! Useful for content switching.
- Added
NeoTab. This is used within NeoTabBar to pass data like text and icon.
Improvements ๐ช
- Added the
enabled property to NeoCheckbox. If it is false, it is not clickable and has a visual disabled state
- Added
onRowHover property to NeoTable. This is a callback that can be used, for example, to show action buttons only on hover over a single row, giving your overall screen a cleaner look
- Removed the scaling animation from both
NeoButton and NeoSidebarButton
- Removed the border from the
filled variant of the NeoButton; this gives it a cleaner look
Hey there! ๐ Hereโs a quick improvement and fix for you!Improvements ๐ช
- Added
defaultLightTheme and defaultDarkTheme properties to NeoApp. This will now allow you to set default themes at startup. When not provided, NeoApp will use the default NeoThemeLight and NeoThemeDark
Fixes ๐
- We forgot to add the new
NeoSidebarLayout to neo.dart, so you had to import this separately to use it. This is fixed!
The official 1.0.0 release of Neo! ๐ This is a major milestone in our journey to empower developers to create stunning, responsive apps with ease. From the first pre-release almost exactly one year ago to now, weโve been building a robust foundation, and this release brings powerful new features and polished improvements to make your development experience smoother and more delightful. Now letโs craft beautiful apps together! ๐New ๐
- Added the
NeoTable widget. We finally got tables now! ๐ More features to come in the future.
- Added the
NeoSidebarLayout assembly (weโre still deciding on the naming of these big โwidgetsโ). It manages the layout of a NeoSidebar and main content, providing the ability to collapse or completely hide the sidebar. Hiding the sidebar will now also completely hide the padding around the main area, giving a more fullscreen feel. This change animates so everything feels fluent! The NeoSidebarLayout also supports mobile platforms, and there the sidebar pushes the main content to the side instead of scaling it
Improvements ๐ช
- Made the
NeoBadge stable. It now always scales correctly to its contents; this was a bit wonky before, but not anymore!
- Improve the look of the
NeoBadge; itโs now a lot more visible in different theming scenarios.
- Made the
NeoSidebarButton work with the improved NeoBadge, it now correctly animated into an indicator when collapsing the sidebar
- Added
isIndeterminate property to NeoCheckbox which will show a dash inside of the checkbox for indeterminate states like a select/deselect all box in a table when some but not all rows are selected
New ๐
- Added haptic feedback support for MacOS trackpads
- Added new
NeoHaptics.error() haptic
Improvements ๐ช
- Added optional MacOS support toggle for haptic feedback methods (disabled by default since trackpads already provide native feedback for clicks - enable with
enableMacOS: true when additional feedback is desired, e.g., during drag operations)
- Updated documentation to align with all the recent changes and the Neo CLI
Here we go againโฆ We forgot to keep track of changes again so this is a bit rough. ๐ตโ๐ซ Butโฆ weโve implemented a new system for creating release notes so from now on it should be a lot better! ๐There are a lot more small improvements and fixes but here are the most notable ones:New ๐
Improvements ๐ช
- Added search functionality to
NeoDropdownField (Including an empty state)
- Added sticky header functionality to
NeoDropdown
- Added icon and suffix support to
NeoTextField
- Improved animation curves of
NeoToggleSwitch
- Added
keyboardType, inputFormatters, errorText, autofillHints, onSubmitted and maintainFocusOnSubmit properties to NeoTextField
- Weโve completely overhauled the way overlays work
- Improved the docs
This is a big pre-release with a lot of changes. We kind of forgot to keep track of changes so this is a bit rough. ๐ตโ๐ซNew ๐
NeoSidebarButton A button widget specifically designed for the use in sidebars
NeoHaptics A system that provides haptic feedback on iOS (Also works with Apple Pencil!)
NeoSidebar
NeoSafeArea A widget that ensures content is not obstructed by system UI
NeoToggleSwitch
NeoCheckbox
NeoLogger A system that provides a better debugging experience
NeoBadge A widget designed to display status information or tags, for instance
NeoDivider A widget that can be used to separate content
NeoTooltip A widget that can be used to display information on hover over a trigger
NeoTextField A widget that can be used to input text
NeoDropdownSectionPrimitive
NeoFieldPrimitive
NeoListItemPrimitive
NeoDropdown
NeoDropdownMenuSection A section of a dropdown menu
NeoDropdownMenuItem A single item in a dropdown menu (Used in NeoDropdownMenuSection)
NeoDropdownFieldSection A section of a dropdown field
NeoDropdownFieldItem A single item in a dropdown field (Used in NeoDropdownFieldSection)
Improvements ๐ช
- Improved the theming system
- Improved
NeoButton
New ๐
- Added
primary, filled, outline and ghost variants for the NeoButton
- Replaced the font
Geist with Inter. This is now the default font for Neo
- Added more (and renamed some) colors, textstyles, radii, spacings and durations
Improvements ๐ช
- Made the default text blue and
strikethrough so itโs obvious where a textstyle should be added
New ๐
- Added
NeoInitializer widget. A utility widget designed to streamline the initialization process of the Neo framework. This widget manages crucial startup tasks, ensuring that the environment is properly set up before any UI components are loaded
- Added
Geist and Geist Mono fonts. These are now the default fonts for Neo
The first pre-release of Neo is here! ๐ This is just the beginningโour starting line. With this release, we lay the groundwork for a future where our developers can build beautiful apps incredibly fast. Hereโs to the journey ahead! ๐ปNew ๐
NeoApp widget. This will act as the root of the app and manage everything
NeoButton widget
- Initial release of the Neo theming system, including:
- Basic light and dark theme support
- Dynamic theme switching based on system settings and user preferences
- Basic color, radii and spacing settings in
NeoTheme class
Last modified on November 21, 2025