Releases: Augani/adabraka-ui
v0.3.3 - Editor UTF-8 Fix
What's Changed
Bug Fix
- Editor: fix rope byte/char offset mismatch — All rope
insert/removeoperations now correctly convert byte offsets to char indices viarope.byte_to_char(). This fixes cursor drift and incorrect text placement in files containing multi-byte UTF-8 characters.
Documentation
- Updated CHANGELOG, README, and docs site for v0.3.1–v0.3.3
- Removed stale files (certs, prototype images, old shiori subdir)
Previous Patches
v0.3.2 — Suppress all compiler warnings across charts and components (zero-warning build)
v0.3.1 — Fix editor cursor positioning with horizontal scroll offset; fix UTF-8 backspace/delete handling
Full Changelog: v0.3.0...v0.3.3
v0.3.0 - crates.io Publishing & GPUI Fork Enhancements
Highlights
- Published to crates.io -- All 12 adabraka-gpui ecosystem crates + adabraka-ui are now on crates.io. Just
cargo add adabraka-uito get started. - GPUI Fork Enhancements -- Inset shadows, letter spacing, squircle corners, text shadows, and animation cancellation built into adabraka-gpui.
- 85+ Components -- New Form builder, DataGrid, SortableList, InfiniteScroll, and Animation Builder.
- Comprehensive Animation System -- 30+ easings, spring physics, gestures, exit animations, ripple effects, and scroll physics.
New Components
- Form - Declarative form builder with validation, field groups, and submit handling
- DataGrid - Spreadsheet-style grid with inline editing, sorting, and column resizing
- SortableList - Drag-to-reorder list with smooth animations
- InfiniteScroll - Automatic loading of paginated data on scroll
- Animation Builder - Preset animations, keyframes, stagger, transitions
GPUI Fork Features (adabraka-gpui)
BoxShadow.inset- Inset shadows across Metal, WGSL, HLSL shader backendsTextStyle.letter_spacing- Withtracking_tight(),tracking_wide()convenience methodswith_cancellable_animation()- Interruptible animations viaAnimationHandlecontinuous_cornersonStyled- iOS-style superellipse (squircle) cornersTextShadow- Withtext_shadow_sm/md/lg()presets
Animation & Polish
- Exit animations for all overlay components (Dialog, Toast, Popover, Sheet, etc.)
- Input shake on validation failure
- Ripple effect on Button and IconButton
- Spring physics, gestures, content transitions, responsive utilities
- ScrollPhysics with momentum scrolling
- Smooth animated scroll-to
DX Improvements
- GPUI re-exports via
gpui_ext.rs StyledExttrait with.center(),.stack(),.row(),.glass(),.elevated(),.ring()- Spacing, duration, z-index tokens on all 18 themes
- Expanded prelude
Breaking Changes
- GPUI dependency changed from
gpuitoadabraka-gpui(our fork with enhancements) - Update your Cargo.toml:
gpui = { package = "adabraka-gpui", version = "0.3" }
Installation
[dependencies]
adabraka-ui = "0.3"
gpui = { package = "adabraka-gpui", version = "0.3" }Full changelog: https://github.com/Augani/adabraka-ui/blob/main/CHANGELOG.md
v0.2.4: Major Component Expansion - 80+ Components
v0.2.4: Major Component Expansion
This release brings 25+ new components and significant improvements, bringing the total to 80+ components.
New Components
Data Visualization
Chart- Declarative chart component with composable seriesLineChart- Line charts with multiple series supportBarChart- Vertical and horizontal bar chartsPieChart- Pie and donut chartsSparkline- Compact inline charts
Media
AudioPlayer- Full-featured audio player with rodio backendVideoPlayer- Video player componentImageViewer- Zoomable image viewer with pan supportCarousel- Image/content carousel with navigation
Input Components
RangeSlider- Dual-handle range selectionDropdown- Customizable dropdown menusTimePicker- Time selection with keyboard supportTagInput- Tag/chip input with autocompleteNumberInput- Numeric input with increment/decrementOTPInput- One-time password inputMentionInput- @mention input with suggestionsFileUpload- Drag & drop file uploadHotkeyInput- Keyboard shortcut captureInlineEdit- Click-to-edit text
Layout & Navigation
SplitPane- Resizable split panelsTimeline- Vertical timeline with alternating layoutStepper- Multi-step wizard navigationFileTree- File browser tree view
Feedback & Display
Spinner- Loading spinnersAlert- Alert banners with variantsEmptyState- Empty state placeholdersNotificationCenter- Toast notification systemCountdown- Countdown timerRating- Star rating componentAvatarGroup- Stacked avatar display
Improvements
- Chart tooltips now work on hover (no click required)
- Timeline component with proper alternating layout
- SplitPane drag handlers improved for better tracking
- Audio player with real playback via rodio
- VideoPlayer API simplified for easy integration
- Fixed vertical bar chart rendering
Installation
[dependencies]
adabraka-ui = "0.2.4"Full Changelog: v0.2.3...v0.2.4
v0.2.3: Slider Improvements with Vertical Orientation
What's New in v0.2.3
✨ Added
- Vertical slider orientation support
- New
SliderAxisenum withHorizontalandVerticalvariants .vertical()and.horizontal()builder methods- Separate rendering logic for horizontal and vertical orientations
- Vertical sliders grow from bottom to top (0% at bottom, 100% at top)
- Adaptive thumb shape: horizontal oval for horizontal sliders, vertical oval for vertical sliders
update_from_position_vertical()method for proper vertical drag handling
- New
🐛 Fixed
- Slider thumb vertical centering
- Container height now matches thumb height for proper alignment
- Thumb positioned at
top: 0instead of calculated offset - Track perfectly centered within container using flex layout
- Thumb now sits centered on the track line instead of above it
🎨 Improved
- Slider component architecture with separate
render_horizontal()andrender_vertical()methods - Cleaner positioning logic using container dimensions matching thumb dimensions
- Better visual consistency across all slider sizes (Sm, Md, Lg)
📚 Examples
- Updated
slider_styled_demo.rswith 10 comprehensive examples- 7 horizontal slider variations demonstrating sizes, styling, and features
- 3 vertical slider examples showcasing the new orientation support
- All examples fully interactive with drag support and onChange handlers
Installation
Add to your `Cargo.toml`:
```toml
[dependencies]
adabraka-ui = "0.2.3"
```
Or install via cargo:
```bash
cargo add adabraka-ui
```
Crates.io: https://crates.io/crates/adabraka-ui/0.2.3
Documentation: https://docs.rs/adabraka-ui/0.2.3
Full Changelog: v0.2.2...v0.2.3
v0.2.2: Keyboard Navigation and Password Input Improvements
adabraka-ui v0.2.2 Release Notes
Release Date: October 28, 2025
Overview
This release focuses on improving form usability and developer experience with keyboard navigation enhancements, password input fixes, and comprehensive project documentation.
What's New
Keyboard Navigation
We've added full Tab/Shift-Tab navigation support for form inputs, making it easier to create accessible forms:
// Tab navigation works automatically with proper FocusHandle configuration
Input::new(&email_input)
.placeholder("Email")
Input::new(&password_input)
.placeholder("Password")
.password(true)
// Press Tab to move to next input, Shift-Tab to go backImplementation Details:
- FocusHandle configured with
.tab_index(0).tab_stop(true)for proper focus management - Window-level navigation using
window.focus_next()andwindow.focus_prev() - Emits
InputEvent::TabandInputEvent::ShiftTabfor custom handling
Password Input Eye Icon Toggle
The password input eye icon now works correctly, allowing users to toggle password visibility:
Input::new(&password_input)
.password(true) // Enables the eye icon toggle
.placeholder("Enter password")Features:
- Icon toggles between "eye" (hidden) and "eye-off" (visible)
- Password masking switches between bullets (••••) and actual text
- Immediate visual feedback with proper state management
- Clean, intuitive UX aligned with modern web standards
Comprehensive ROADMAP
Added detailed ROADMAP.md with complete component inventory:
- 90+ Components organized by category (Display, Forms, Navigation, Overlays, etc.)
- Status indicators (✅ Complete, 🔄 In Progress, ❌ Todo,
⚠️ Partial) - Phase-based development plan with desktop integration features
- Prioritized quick wins and improvements
Improvements
Code Quality
- Removed 13 unnecessary inline comments across 6 files
- Cleaner, more production-ready codebase
- Files improved: color_picker.rs, input_state.rs, input.rs, text.rs, lib.rs, transitions.rs
New Examples
- password_test.rs - Demonstrates password toggle functionality with clear instructions
Bug Fixes
- Fixed password input eye icon not toggling correctly
- Fixed password masking not switching between hidden/visible states
- Fixed state reading to use dynamic
input_state.maskedvalue for immediate updates
Technical Details
Password Toggle Implementation
The password toggle now properly reads state dynamically and triggers UI refresh:
// Dynamic state reading
let is_masked = input_state.masked;
// Toggle on click with immediate refresh
state.update(cx, |state, cx| {
state.masked = !state.masked;
cx.notify();
});
window.refresh();Keyboard Navigation Architecture
Built on GPUI's focus system with proper FocusHandle configuration:
// FocusHandle is the source of truth for tab properties
.track_focus(&self.state.read(cx).focus_handle(cx).tab_index(0).tab_stop(true))
// Tab handlers in InputState
pub fn tab(&mut self, _: &Tab, window: &mut Window, cx: &mut Context<Self>) {
window.focus_next();
cx.emit(InputEvent::Tab);
}Migration Guide
No breaking changes in this release. All existing code will continue to work without modifications.
To use the new keyboard navigation features, ensure your inputs are rendered in the proper order and they will automatically support Tab/Shift-Tab navigation.
Installation
[dependencies]
adabraka-ui = "0.2.2"What's Next
Check out our ROADMAP.md for upcoming features including:
- File upload component
- Virtualized list improvements
- Multi-window support
- System tray integration
- And much more!
Contributors
Thank you to everyone who contributed to this release!
Resources
For questions or feedback, please open an issue on GitHub.
v0.2.1 - New Components: ColorPicker, DatePicker, and Combobox
🎉 What's New
Three New Production-Ready Components
ColorPicker 🎨
- Full-featured color picker with HSL, RGB, and HEX mode switching
- Recent colors history (stores last 10 colors)
- Custom color swatches support
- Optional alpha/opacity slider
- Copy to clipboard (HEX format)
- Popover-based clean UI
DatePicker 📅
- Single date and date range selection modes
- Visual range highlighting with colored backgrounds
- Disabled dates with greyed-out styling
- Weekend disabling helper method
- Auto-close popover after selection
- Multiple date formats (ISO, US, EU, custom)
- Locale support for internationalization
Combobox 🔍
- Single and multi-select modes
- Real-time search/filter with immediate updates
- Keyboard navigation (arrow keys, Enter, Escape)
- Custom display and search functions
- Clear selection button
- Badge display for multi-select items
- Empty state handling
✨ Improvements
- Updated component count from 70+ to 73+
- Zero compiler warnings - completely clean build
- Immediate UI updates - no mouse movement required
- Enhanced Calendar component with DateRange support and visual styling
- Comprehensive documentation with code examples for all new components
- Updated GitHub Pages and README with full feature lists
🛠️ Technical Details
- Proper GPUI
Entity<T>state management pattern - DismissEvent emission for proper popover closing
cx.notify()calls for immediate UI updates- Professional visual styling with theme integration
- Full keyboard navigation support
📚 Examples
Try the new components:
cargo run --example color_picker_demo
cargo run --example date_picker_demo
cargo run --example combobox_demo📦 Installation
[dependencies]
adabraka-ui = "0.2.1"
gpui = "0.2.0"Full Changelog: v0.2.0...v0.2.1
v0.2.0: 100% Styled Trait Coverage - Major Feature Release
Release Notes - v0.2.0
🎉 Major Feature Release: 100% Styled Trait Coverage!
We're excited to announce adabraka-ui v0.2.0, a major feature release that brings complete styling customization to every single component in the library!
🌟 Highlights
100% Styled Trait Coverage - ALL 54 Components!
Every user-facing component in adabraka-ui now implements the Styled trait, giving you complete control over styling using GPUI's powerful styling API.
What this means for you:
- Apply any GPUI styling method to any component
- Custom backgrounds:
.bg(rgb(0x3b82f6)) - Custom borders:
.border_2().border_color(rgb(0xef4444)) - Custom padding:
.p_4(),.px_6(),.py_2() - Custom border radius:
.rounded_lg(),.rounded_xl() - Shadow effects:
.shadow_sm(),.shadow_lg() - Width/height:
.w_full(),.h(px(200.0)) - And hundreds more styling methods!
Components with Styled Trait
✅ Components (14): Button, Input, Checkbox, IconButton, Label, Radio, Toggle, Textarea, Avatar, Progress, Slider, Separator, SearchInput, Select
✅ Display (6): Card, Badge, Accordion, Table, DataTable, Collapsible
✅ Navigation (9): Menu, Tabs, Toolbar, Sidebar, Breadcrumbs, NavigationMenu, StatusBar, Tree, AppMenu
✅ Overlays (11): Dialog, Sheet, AlertDialog, Toast, BottomSheet, CommandPalette, ContextMenu, HoverCard, Popover, PopoverMenu, Tooltip
✅ Advanced (9): TextField, Pagination, ToggleGroup, KeyboardShortcuts, Calendar, Resizable, Editor, Draggable, DropZone
🆕 What's New
Icon System Enhancements
Icon Phase 1:
- Consolidated
IconSourcemodule across all components (DRY principle) - Removed duplicate IconSource definitions
- Improved path detection with separator-first logic
- Added comprehensive unit tests
Icon Phase 2:
- IconSize enum with named sizes:
XSmall,Small,Medium,Large,Custom(Pixels) - Rotation support using GPUI's Transformation API
- Styled trait for Icon component - full customization support
Icon::new("search")
.size(IconSize::Large)
.rotate(Radians::from_degrees(90.0))
.p_2()
.bg(rgb(0x89b4fa))
.rounded_md()Component Enhancements
Text Component - Fixed Decorations!
- ✅ Italic now actually works using HighlightStyle API
- ✅ Strikethrough now actually works with customizable thickness
- ✅ All decorations can be combined
Text::new("Deprecated warning")
.italic()
.strikethrough()
.underline()
.color(red())Button Component
- Improved API with better ID parameter handling
- Fixed compilation across 21 example files
- Styled trait allows complete customization
Checkbox Component
- Replaced emoji icons (✓ and −) with customizable Icon components
- Users can now choose their own check and indeterminate icons
Checkbox::new("check")
.checked_icon("check-circle")
.indeterminate_icon("dash")Calendar Component - Full i18n!
- Added
CalendarLocalestruct for internationalization - Built-in locales: English, French, Spanish, German, Portuguese, Italian
- Support for custom locales
Calendar::new(date)
.locale(CalendarLocale::french())
.on_month_change(|new_date, window, cx| { /* ... */ })54 New Styled Demos
Created comprehensive demonstration examples for every component:
button_styled_demo.rs- 7 button customization examplesinput_styled_demo.rs- 12 input styling variationsdata_table_styled_demo.rs- 6 styled tables with virtual scrollingdrag_drop_styled_demo.rs- Interactive task board with styling- And 50 more demos!
Each demo shows real, working examples of how to customize components using the Styled trait.
💥 Breaking Changes
Icon Component Returns
Before: Non-clickable icons returned Div
After: Non-clickable icons return AnyElement (performance improvement)
Impact: This is a performance optimization. In most cases, you won't notice any difference. If you were explicitly typing the return value, you may need to update to AnyElement.
🐛 Fixes
- Fixed Editor component
.when()pattern to.map()for style application - Fixed DropZone naming conflict (renamed internal
stylefield todrop_style) - Fixed Button API usage across 21 example files
- Fixed various component compilation errors
- Fixed sidebar_demo and menu_demo import paths
- Fixed select_styled_demo unused variable warnings
🎨 Design Philosophy
shadcn/ui Alignment
This release fully embraces the shadcn philosophy:
"Good defaults that users can completely override"
Before v0.2.0: Components had good defaults, but limited customization options.
After v0.2.0: Components have great defaults AND users have 100% control via Styled trait!
Example of complete control:
Button::new("custom", "Click Me")
// Override ALL default styles
.bg(rgb(0x8b5cf6)) // Custom background
.p_8() // Custom padding
.rounded(px(16.0)) // Custom radius
.border_2() // Custom border
.border_color(rgb(0xa78bfa)) // Custom border color
.shadow_lg() // Custom shadow
.w_full() // Custom width
.text_size(px(18.0)) // Custom text sizeDocumentation: See SHADCN_DESIGN_PHILOSOPHY.md for complete details.
📦 Improvements
Code Quality
- Removed 3,274 unnecessary inline comments
- Production-ready code with clean implementations
- Consistent Styled trait API across all 54 components
- Better developer experience
Performance
- Icon component optimization (removed wrapper div for non-clickable icons)
- Efficient style application using
.refine()pattern - No extra overhead from Styled trait
🚀 Migration Guide
From v0.1.1 to v0.2.0
Good news: Most code will work without changes!
Using the New Styled Trait
The Styled trait is additive - you can use it when you need custom styling, but all your existing code continues to work.
Before (still works):
Button::new("btn", "Click")
.variant(ButtonVariant::Primary)
.size(ButtonSize::Large)After (now also possible):
Button::new("btn", "Click")
.variant(ButtonVariant::Primary) // Use built-in variant
.size(ButtonSize::Large) // Use built-in size
.bg(rgb(0x custom)) // ADD custom background
.rounded_xl() // ADD custom radius
.shadow_lg() // ADD shadow effectIcon Component Changes
If you were explicitly typing Icon return values:
// Before
let icon: Div = Icon::new("search"); // ❌ No longer works
// After
let icon = Icon::new("search"); // ✅ Let Rust infer the type
// OR
let icon: AnyElement = Icon::new("search").into_any_element(); // ✅ Explicit typing📚 Resources
- Documentation: https://docs.rs/adabraka-ui
- GitHub Pages: https://augani.github.io/adabraka-ui/
- Repository: https://github.com/Augani/adabraka-ui
- Crates.io: https://crates.io/crates/adabraka-ui
🙏 Acknowledgments
This release represents a massive improvement to the adabraka-ui library:
- 54 components now fully customizable
- 54 new demo examples showing real use cases
- 100% alignment with shadcn design philosophy
- Zero compromises on performance or developer experience
Thank you to everyone using adabraka-ui and providing feedback! 🎉
🔮 What's Next
While we've achieved 100% Styled trait coverage, there's always more to improve:
- Additional component variants
- More built-in themes
- Performance optimizations
- Accessibility enhancements
- More comprehensive documentation
Stay tuned for v0.3.0!
Upgrade today:
[dependencies]
adabraka-ui = "0.2.0"Happy coding! 🚀
v0.1.1: Icon Bundle Optimization & Example Fixes
🎉 Release v0.1.1
This release focuses on bundle size optimization and fixing all examples.
🔥 Breaking Changes
- Icons are no longer bundled with the library (reduces package size by 95%)
- Users must now provide their own icon assets
- Added configurable icon path system with
set_icon_base_path()
🐛 Fixed
- Fixed 20+ examples with incorrect API usage
- Fixed
scrollmodule imports →scrollable - Fixed VStack compatibility with scrollable_vertical
- Fixed Menu and MenuItem API usage
- Fixed toolbar click handlers to use
on_mouse_down - Removed 4 broken/missing examples
✨ Improved
- Removed unnecessary inline comments (cleaner, production-ready code)
- Added comprehensive icon setup documentation in README
- All 53 working examples now compile successfully (100% success rate!)
- Updated examples with proper AssetSource configuration
📦 Package Size
- Before: 3,431 files
- After: 157 files
- Reduction: 95%
📚 Documentation
Users now need to:
- Download their preferred icon set (Lucide, Heroicons, etc.)
- Configure icon path with
set_icon_base_path("path/to/icons") - Set up GPUI's AssetSource (see README for complete example)
🔗 Resources
See CHANGELOG.md for full details.
adabraka-ui v0.1.0 🎉
adabraka-ui v0.1.0 🎉
We're excited to announce the first public release of adabraka-ui - a comprehensive, professional UI component library for GPUI!
🌟 What is adabraka-ui?
adabraka-ui is a complete UI toolkit for building beautiful desktop applications with Rust and GPUI. Inspired by shadcn/ui, it provides 70+ polished, accessible components with a modern design system.
✨ Highlights
🎨 Complete UI System
- 70+ Components covering all your UI needs
- Built-in Theme System with light/dark modes and semantic color tokens
- Professional Animations with cubic-bezier easing and spring physics
- Typography System with semantic text variants
- Lucide Icons integration
📱 Real-World Examples
Check out these apps built with adabraka-ui:
- Desktop Music Player - Beautiful offline music player with smooth animations
- Task Manager - Used to track the development of this library!
- 50+ Component Demos - Learn from comprehensive examples
🧩 Component Categories
Input & Forms
- Button, IconButton, Input, Textarea
- Checkbox, Toggle, Radio, Select
- SearchInput, Editor (with syntax highlighting)
Navigation
- Sidebar, MenuBar, Tabs, Breadcrumbs
- Tree, Toolbar, StatusBar, Command Palette
Data Display
- Table, DataTable (virtual scrolling)
- Card, Badge, Accordion, Progress
Overlays
- Dialog, Popover, Tooltip, Toast
- Alert, Context Menu
Layout
- VStack, HStack, Grid
- Scrollable, Resizable Panels
🎯 Key Features
- ✅ Type-Safe - Leverages Rust's type system for compile-time guarantees
- ✅ Accessible - Full keyboard navigation, ARIA labels, screen reader support
- ✅ High Performance - Optimized for GPUI's retained-mode rendering
- ✅ Well Documented - Comprehensive examples and API documentation
- ✅ Builder Pattern - Ergonomic, chainable API design
📦 Installation
Note: Currently requires Rust nightly due to GPUI dependencies.
[dependencies]
adabraka-ui = "0.1.0"
gpui = "0.2.0"cargo +nightly build🚀 Quick Start
use adabraka_ui::prelude::*;
use gpui::*;
fn main() {
Application::new().run(|cx| {
adabraka_ui::init(cx);
install_theme(cx, Theme::dark());
cx.open_window(
WindowOptions {
titlebar: Some(TitlebarOptions {
title: Some("My App".into()),
..Default::default()
}),
..Default::default()
},
|_, cx| cx.new(|_| MyApp::new()),
).unwrap();
});
}🌐 Resources
- Website: https://augani.github.io/adabraka-ui
- Documentation: https://docs.rs/adabraka-ui
- Crates.io: https://crates.io/crates/adabraka-ui
- Examples: Browse 50+ examples in the
examples/directory
📚 Documentation
Visit our beautiful documentation site featuring:
- Real app showcases
- Installation guide
- Component examples with code
- Comprehensive API reference
🤝 Contributing
We welcome contributions! Check out our Contributing Guide to get started.
- Bug Reports: Use our bug report template
- Feature Requests: Use our feature request template
- Pull Requests: Follow our PR template
🙏 Acknowledgments
Special thanks to:
- Zed Industries - For creating GPUI
- Lucide Icons - For the beautiful icon set
- shadcn/ui - For design inspiration
💖 Support
If you find adabraka-ui helpful, consider buying me a coffee!
📄 License
MIT License - see LICENSE for details.
Built with ❤️ using GPUI and inspired by shadcn/ui