Updates & Changelog
Stay informed about the latest features, improvements, and fixes in Cristalyse.🎨 Legend Enhancements
Authored by @jbbjarnason - Thank you for this contribution!Optional Y-Axis Titles in Legends!Legend Enhancements:- New
showTitlesoption to display Y-axis titles alongside legend entries - Improves chart legend readability when multiple Y-axes are present
- Optional feature - legends work as before by default
- Seamless integration with existing legend styling and layout
- Multi-axis charts with clearer data context
- Better legend readability for complex visualizations
- Maintain visual hierarchy with optional titles
- Extended
LegendWidgetto support optional Y-axis title rendering - Enhanced
legend.dartcore logic to handle title display - Updated chart configuration to expose new option
- Comprehensive test coverage included
- All existing tests continue to pass
- Zero breaking changes - fully backward compatible
- New feature is opt-in
- Production ready
🐛 Right Padding & Secondary Y-Axis Fixes
Fixed excessive right padding and layout misalignment- Removed hardcoded 80px padding applied unconditionally for secondary y-axis
- Charts without secondary y-axis now use only theme padding (no waste)
- Widget layout uses conservative estimate only when y2Scale exists
- Painter performs precise calculation at paint time with full scale information
- Eliminates divergence between layout and rendering phases
- Added proper null checking for
y2Scaleto prevent unnecessary padding
- Better space utilization on single-axis charts
- Proper secondary y-axis spacing based on actual label widths
- Ensures hit-testing alignment for interactions (hover, click, pan)
- Consistent plot area between layout and render phases
- Zero breaking changes - fully backward compatible
- Improved interaction reliability with secondary y-axis charts
- Maintains consistent dimensions during pan/zoom operations
🏔️ Boundary Clamping for Pan Operations
Authored by @jbbjarnason - Thank you for this contribution!Control infinite panning with boundary clamping!Boundary Clamping:- New
boundaryClampingXandboundaryClampingYoptions inPanConfig - Prevents panning beyond data boundaries when enabled
- Maintains intuitive pan behavior within configured domain limits
- Perfect for constrained data exploration and guided navigation
- Prevent users from panning too far from relevant data
- Create bounded exploration areas for large datasets
- Maintain data context during navigation
- Improve UX for time-series and scientific visualizations
- Scale boundaries tracked via
valuesBoundariesinLinearScale - Pan domain clamping applied during interaction handling
- Seamless integration with existing pan callbacks and pan controller
- No changes to default behavior - opt-in feature
- Zero breaking changes - fully backward compatible
- Default clamping disabled (infinite panning by default)
- Tested with pan controller and manual pan interactions
- Production ready
🐛 Y-axis Bounds Fix During Panning
Authored by @jbbjarnason - Thank you for this fix!Fixed Y-axis getting stuck during X-axis pan operations- Y-axis bounds now correctly update when configured with
updateYDomain: false - Previously remained locked to original
panYDomainbounds during X-axis panning - Enables proper dynamic Y-axis scaling while panning horizontally
- Zero breaking changes - fully backward compatible
- Patch bump release
🎯 Programmatic Pan Controller
Code authored by @jbbjarnason - Thank you for this contribution!New PanController Class:- External control of chart panning via new
PanControllerclass panTo(PanInfo)method for programmatic pan operationspanReset()method to restore original chart view- ChangeNotifier-based architecture for reactive updates
- Optional
controllerparameter inPanConfig
- Widget lifecycle management (initState, didUpdateWidget, dispose)
- Automatic listener registration and cleanup
- Full integration with existing pan callbacks
- Programmatic zoom controls with buttons/sliders
- Reset to original view functionality
- Coordinated panning across multiple charts
- External UI controls for chart navigation
- Jump to specific data ranges programmatically
- Zero breaking changes - fully backward compatible
- Optional controller parameter (defaults to null)
- Proper lifecycle management with listener cleanup
- Example integration in pan_example.dart
🐛 Scale Padding Fix
Authored by @jbbjarnason - Thank you for this fix!Fixed chart shrinking when panning- Scale padding now initialized before painting charts
- Prevents setupYScale from changing padding during panning
- Chart maintains consistent size during all pan operations
- Smooth user experience without unintended resize behavior
- All existing tests continue to pass
- Zero breaking changes - fully backward compatible
🎨 Heat Map Unification & Bounds Validation
Authored by @davidlrichmond - Thank you for this contribution!Heat Map Color System Unification:- Unified heat maps to use
GradientColorScalefor consistent color handling - Eliminates duplicate color logic between heat maps and other chart types
- Improves code maintainability and reduces technical debt
- Heat map colors now follow the same scaling principles as other geometries
- Fixed guard condition for corner case where
min > maxin bounds calculations - Prevents invalid scale configurations that could crash rendering
- Added comprehensive test coverage for edge cases
- Improved documentation for bounds behavior with notes on invalid configurations
- Addressed code review feedback on refactored code
- Fixed deprecated
intRGB getters for Flutter compatibility - Applied code formatting linter fixes
- Added 34 new test cases for bounds edge cases
- Added 106 lines of tests for GradientColorScale functionality
- All existing tests continue to pass
- Zero breaking changes - fully backward compatible
🐛 Wilkinson Labeling Precision
Authored by @jbbjarnason - Thank you for this fix!Fixed floating-point rounding in epoch millisecond label calculations- Replaced
round()withroundToDouble()for proper double precision handling - Resolves issues with large number labeling (e.g., epoch timestamps)
- Added comprehensive test case for epoch millisecond labeling
- Test validates correct tick generation: [1760527000000.0, 1760528000000.0, 1760529000000.0, 1760530000000.0]
_cleanNumber()method inWilkinsonLabelingclass now usesroundToDouble()instead ofround()- Fixes edge case with very large timestamp values (>1.7 trillion milliseconds)
- Maintains precision in float arithmetic for astronomical numbers
- All 286 tests passing (285 existing + 1 new test)
- Zero breaking changes - fully backward compatible
🎨 Axis Titles & Bubble Size Guide
Descriptive axis titles and visual bubble size legends!Axis Titles:- Add titles to X, Y, and Y2 axes with optional
titleparameter - Smart positioning with automatic spacing calculations
- Vertical axes display rotated titles (-90° for Y, +90° for Y2)
- Theme-aware styling with customizable fonts
- Visual legend shows min, mid, and max bubble sizes
- Automatically appears when
titleprovided ongeomBubble() - Horizontal and vertical layout support
- Seamlessly integrates with existing legend system
- Fixed edge case where zero/negative bubble sizes could cause rendering errors
- Added validation to ensure bubble legend sizes are always positive
- Clamps invalid values to safe minimum (1.0px radius)
- Prevents Container dimension errors with edge-case data
- Precise spacing calculations for axis labels and titles
- Pre-calculated label dimensions for optimal layout
- Consistent spacing constants across all axes
- Validated bubble sizes in legend rendering
- 8 new edge case tests for bubble validation
- All 285 tests passing (20 new tests added)
- Zero breaking changes - fully backward compatible
- Titles optional and render only when provided
- Production ready
🎯 Interactive & Floating Legends
Authored by @davidlrichmond - Valuable contribution!Transform your charts with interactive legend controls and advanced positioning!Interactive Legend Toggle:- Click-to-hide/show data points with visual feedback
- Simple
.legend(interactive: true)to enable - Toggled items show reduced opacity + strikethrough styling
- Smooth chart updates with preserved color consistency
- Both auto-managed and external state control
- New
LegendPosition.floatingwith custom offsets - Negative offsets supported (legends outside chart bounds!)
clipBehavior: Clip.noneenables overflow rendering- Full creative control over placement
interactive: Enable click-to-toggle functionalityhiddenCategories: External state managementonToggle: Custom toggle callbacksfloatingOffset: Precise Offset positioning
- Original ColorScale preserved when filtering
- No color shifting when toggling categories
- Chart painter respects provided ColorScale
- Legend backgrounds adapt to theme colors
- Automatic contrast for light/dark modes
- No hardcoded white backgrounds
- All 268 tests passing
- Zero breaking changes
- Production ready
🔗 Enhanced Developer Experience
Seamless navigation between documentation and live examples!- Bidirectional Links: Jump between docs and example app instantly
- View Docs Button: All 19 example app screens link to documentation
- View Live Example Cards: 9 chart docs pages link to interactive examples
- Better Learning Flow: Quickly switch from reading to seeing live code
- Scatter plots, line charts, bar charts, area charts
- Bubble charts, pie charts, dual-axis charts
- Heat maps, progress bars
- Opens in appropriate context (external browser for app, new tab for docs)
- Clean architecture with single source of truth for URL mappings
- Type-safe implementation with proper null checks
- Consistent UI patterns across both navigation methods
- Added
url_launcherpackage for external link handling
- All Flutter analyze checks passing
- Zero breaking changes
- Backward compatible
🎯 Intelligent Axis Bounds & Labeling
Authored by @davidlrichmond - Exceptional contribution!Wilkinson Extended Algorithm for professional axis labels:- Based on IEEE paper by Talbot, Lin, and Hanrahan (2010)
- Generates “nice” round numbers: 0, 5, 10, 50, 100
- Optimizes simplicity, coverage, density, and legibility
- Smart pruning for performance
- Bar/area charts: Zero baseline for quantity comparison
- Line/scatter charts: Data-driven bounds for trend analysis
- Automatic appropriate defaults based on chart type
- 803 lines of new tests added
- All 263 tests passing
- Zero breaking changes
- Production ready
📊 Progress Bar Charts
Professional progress visualization with multiple styles!- Multiple Orientations: Horizontal, vertical, and circular progress bars
- Advanced Styles: Stacked, grouped, gauge, and concentric layouts
- Theme-Responsive: Full dark mode and custom palette support
- Robust Validation: Comprehensive input validation and error handling
- Enhanced SEO with comprehensive metadata
- Custom 404 page with helpful navigation
- Subscribable RSS feed for updates
- Fixed all broken links
- Improved contextual menu copy
🤖 MCP Server Integration
Cristalyse now integrates with AI coding assistants!- New documentation guide for connecting Cristalyse docs to AI coding assistants (Cursor, Windsurf, Warp, Claude)
- Enable AI assistants to access complete documentation, examples, and best practices directly in your IDE
- Setup instructions: Add
"cristalyse_docs": {"url": "https://docs.cristalyse.com/mcp"}to MCP settings
🌈 Gradient Color Support (Experimental)
Transform your charts with stunning gradient effects!- Category-specific gradients with
categoryGradientsproperty - Support for Linear, Radial, and Sweep gradients
- Advanced alpha blending that respects animation transparency
- Works with bar charts and scatter plots
🔥 Built-In Legend Support
Professional legends with zero configuration!- Simple
.legend()method with smart defaults - 8 flexible positioning options (topLeft, topRight, bottom, etc.)
- Automatic symbol generation based on chart type
- Full dark mode support with theme-aware text colors
🎨 Custom Category Colors
Brand-consistent charts with custom color palettes!- New
customPalette()method for category-specific colors - Smart fallback system for unmapped categories
- Perfect for corporate dashboards and brand consistency
🐛 Multi-Series Line Chart Fixes
- Fixed critical rendering issues with multi-series line charts
- Resolved missing data points on multi-series visualizations
- Fixed overlapping series lines for better visual separation
🫧 Bubble Chart Support
Three-dimensional data visualization is here!- Full bubble chart implementation with size mapping
- Advanced
SizeScaleclass for proportional bubble sizing - Interactive tooltips with rich hover information
- New
geomBubble()API following grammar of graphics
Bug Fixes & Improvements
- Fixed heatmap cell ordering to match axis labels
- Fixed horizontal grouped bar charts crash
- Fixed heatmap alpha calculation overflow
- Improved code quality with comprehensive docstrings
🎨 Enhanced HeatMap Text Readability
- Improved text visibility for low-value cells
- Values < 15% now display with black text for guaranteed readability
- Values ≥ 15% use smart brightness-based contrast
- Zero breaking changes - fully backward compatible
🔥 Heat Map Chart Support
Visualize 2D data patterns with professional heat maps!- Comprehensive heat map implementation with customizable styling
- Advanced color mapping with smooth gradients
- Wave-effect animations with staggered cell appearance
- Smart value visualization with automatic contrast detection
🎯 Advanced Label Formatting
Professional data visualization with NumberFormat integration!- Full callback-based label formatting system
- Seamless integration with Flutter’s
intlpackage - Currency, percentages, compact notation support
Fixed
- Grouped Bar Chart Alignment: Fixed positioning of grouped bars on ordinal scales
- Bars now center properly on tick marks
- Thanks @davidlrichmond!
🥧 Pie & Donut Charts
Major v1.0 release with comprehensive pie chart support!- Full pie chart and donut chart implementation
- Smooth slice animations with staggered timing
- Smart label positioning with percentage display
- Exploded slice functionality for emphasis
- New
.mappingPie()and.geomPie()API
📖 Documentation Site Launch
- docs.cristalyse.com is now live!
- Comprehensive guides, examples, and API reference
- Improved web WASM compatibility
Advanced Pan Control System
- Fixed chart position reset bug
- Infinite panning capability in any direction
- Visual clipping implementation for clean boundaries
- Selective axis panning with
updateXDomainandupdateYDomain
Enhanced SVG Export
- Professional-quality vector graphics output
- Support for all chart types
- Perfect for presentations and reports
- Editable in Figma, Adobe Illustrator, etc.
🎨 Area Chart Support
Visualize volume and trends with area charts!- Comprehensive
AreaGeometrywith customizable styling - Progressive area animations
- Multi-series support with transparency
- Dual Y-axis compatibility
Interactive Panning System
- Persistent pan state across gestures
- Real-time visible range synchronization
- Comprehensive
PanConfigAPI with callbacks - Perfect for time series data exploration
🎯 Interactive Chart Layer
Tooltips, hover, and click interactions!- New interaction system for user engagement
- Flexible tooltip system with
TooltipConfig onHover,onExit, andonTapcallbacks
🚀 Dual Y-Axis Support
Professional business dashboards unlocked!- Independent left and right Y-axes
- New
.mappingY2()and.scaleY2Continuous()methods - Perfect for Revenue vs Conversion Rate charts
- Fixed ordinal scale support for lines and points
Bar Charts & Theming
- Stacked Bar Charts: Full support with progressive animations
- Enhanced Theming: Solarized Light/Dark themes
- Color Palettes: Warm, cool, and pastel options
- Horizontal Bars: Via
coordFlip()method
Line Charts & Animations
- Line chart support with
geomLine() - Configurable animations with curves
- Multi-series support with color grouping
- Progressive line drawing animations
- Dark theme support