Updates & Changelog
Stay informed about the latest features, improvements, and fixes in Cristalyse.π Tooltip Offset Fix
Fixed tooltip positioning when panning!What was fixed:- Tooltips now correctly align with data points even after panning the chart.
- Previously, a mismatch between the estimated and actual plot area caused offsets.
- The fix ensures the interaction detector uses the exact geometry calculated by the painter.
- Zero breaking changes.
- Fully backward compatible.
π Interactive Legend Tooltip Fix
Tooltips now work correctly with interactive legends!What was fixed:- Tooltips now appear when hovering over charts with
interactive: truelegends - Previously, enabling interactive legends caused tooltips to stop working
- Affected chart types: line charts, area charts, bar charts, and all other geometries
- When interactive legends filter data, the chart creates a new widget for filtered data
- This filtered chart was missing the
ChartTooltipOverlaywrapper - Fix ensures tooltip overlay is properly applied to filtered charts
- All 297 tests passing
- Zero breaking changes
- Example app updated with demonstration
π Bar Chart Positive/Negative Value Styling
Smart rounded corners and conditional colors for financial charts!Smart Rounded Corners (roundOutwardEdges):- Positive bars: Rounded top (vertical) or right (horizontal)
- Negative bars: Rounded bottom (vertical) or left (horizontal)
- Sharp edge at zero baseline for clean alignment
- Works seamlessly with existing
borderRadiusparameter
- New
positiveColorparameter for values >= 0 - New
negativeColorparameter for values < 0 - Smart fallback: positiveColor/negativeColor β color β colorScale β theme
- Perfect for profit/loss, variance analysis, financial dashboards
- Financial dashboards showing gains and losses
- Variance charts highlighting positive and negative deviations
- Performance metrics with above/below target visualization
- Budget analysis with overspending and savings
- Updated bar chart demo with positive/negative value showcase
- Live demonstration at
#/bar-chartroute - Visual comparison of standard vs. smart-rounded bars
- Fixed negative bar rendering (bars extending below zero)
- Corrected bar rect calculation for negative heights
- Extracted
_computeOutwardRRect()helper to eliminate code duplication - Optimized example with const widgets and top-level data
- Zero breaking changes - fully backward compatible
- All new parameters optional (default to
false/null) flutter analyzepasses with no issues
π Integer-Only Ticks
Force axis ticks to be integers!Integer-Only Ticks:- New
integersOnlyparameter inTickConfig - Automatically clamps ticks to integer values
- Ensures step size is at least 1
- Ideal for count data (people, items, events) where fractional values donβt make sense
- Count data (e.g., number of users, items sold)
- Discrete events
- Avoiding β1.5 peopleβ in charts
- Zero breaking changes - fully backward compatible
- Production ready
π Zoom & Pan Interactions
Pinch, scroll wheel, and button-based zooming!Zoom Interaction Modes:- Pinch gestures for multi-touch zooming
- Scroll wheel support for precise zoom control
- Floating +/- buttons for touch-friendly interfaces
- Independent X-axis, Y-axis, or dual-axis zooming
- New
ZoomConfigclass with extensive customization axesparameter: ChooseZoomAxis.x,ZoomAxis.y, orZoomAxis.bothwheelSensitivity: Fine-tune scroll wheel responsiveness (0.0005-0.0035)buttonStep: Control zoom increment for +/- buttons (default 1.4x)maxScale/minScale: Set zoom boundaries (default 16x / 1x)showButtons: Toggle floating control buttonsbuttonAlignment&buttonPadding: Customize button placement
onZoomStart,onZoomUpdate,onZoomEndfor lifecycle eventsZoomInfoprovides real-time zoom metrics:- Current visible range:
visibleMinX,visibleMaxX,visibleMinY,visibleMaxY - Scale factors:
scaleX,scaleY(e.g., 4.0 = 4x zoom) - State:
ZoomState.start/update/end
- Current visible range:
- Full zoom demo in example app showing all interaction methods
- Live zoom state display with visible ranges and scale factors
- Interactive controls to adjust sensitivity and zoom modes
- Demonstrates combined zoom + pan workflows
- Time-series exploration: Zoom into specific date ranges
- Scientific visualizations: Independent X/Y axis zoom control
- Mobile dashboards: Touch-friendly zoom buttons for accessibility
- Financial charts: Precise zoom with scroll wheel support
- Works alongside existing pan interactions
- Respects domain boundaries and scale configuration
- Responsive gesture handling (pinch, scroll, single-touch pan)
- Full touch and mouse support across all platforms
- Zero breaking changes - fully backward compatible
- All new parameters optional with sensible defaults
π― Tick Configuration for Scales
Authored by @jbbjarnason - Thank you for this contribution!Reviewed and documented by maintainer @rudi-qControl Tick Generation:- New
TickConfigclass for customizing tick marks and labels ticksparameter: Specify explicit tick positions for precise controlsimpleLinearflag: Generate uniform linear spacing instead of Wilkinsonβs algorithm
- Industry-standard reference points (freezing point, percentiles, etc.)
- Time-series charts with consistent intervals
- Scientific/technical charts requiring uniform spacing
- Matching ticks across multiple related charts
- TimeBasedLineChartWidget demonstrating TickConfig usage
- Toggle between simple linear and Wilkinsonβs algorithm
- Practical reference for common use cases
- Added
TickConfigclass withticksandsimpleLinearproperties - Extended
LinearScaleto accept and storeTickConfig - Enhanced Wilkinson labeling algorithm with simple linear fallback
- All three scale methods (
scaleXContinuous,scaleYContinuous,scaleY2Continuous) now supporttickConfig
- Zero breaking changes - fully backward compatible
- New feature is opt-in with sensible defaults
- Production ready
π Label Size Calculation Fix
Authored by @jbbjarnason - Thank you for this fix!Fixed label size deduction based on formatter- Label size now calculated based on actual text width with default font size
- Ensures consistent and accurate label spacing in charts
- Improves readability with properly-sized axis labels
- Added
_calculatePixelsPerLabel()method to measure text dimensions - Uses TextPainter with default TextStyle (fontSize: 12) for accurate measurement
- Includes proper padding calculation (10px)
- Applied to both LinearScale and OrdinalScale
- Made
optimalPixelsPerLabelprivate
- More accurate label sizing across all chart types
- Better space utilization for axis labels
- Consistent behavior regardless of label content
- Zero breaking changes - fully backward compatible
- Focused single-file bug fix
- Production ready
π¨ 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