feat: Add GPUI component library

Add core UI components for TaskWarrior GUI application:

Components:
- Input: Text input with autocomplete suggestions, keyboard navigation
- Button: Multiple variants (Primary, Secondary, Ghost, Danger, Success,
  Text)
- DropdownButton: Compound button with dropdown menu
- Icon: SVG icons with customizable sizes
- Label: Simple text display
- Panel: Container with optional title
- List: List container
- Modal: Modal dialog
- Divider: Visual separator

Infrastructure:
- Theme system with dark/light modes (Catppuccin colors)
- App module with window management
This commit is contained in:
Ignacio Perez
2025-12-24 19:21:04 -03:00
parent 8490fb03f5
commit 7c1824dcf7
14 changed files with 2198 additions and 87 deletions
+70
View File
@@ -0,0 +1,70 @@
pub type Color = gpui::Rgba;
#[derive(Debug, Clone)]
pub struct Theme {
pub background: Color,
pub foreground: Color,
pub panel: Color,
pub muted: Color,
pub accent: Color,
pub border: Color,
pub error: Color,
pub success: Color,
pub selection: Color,
pub selection_foreground: Color,
pub text: Color,
pub text_size: Option<gpui::Size<u32>>,
}
impl Theme {
pub fn dark() -> Self {
Self {
background: gpui::rgb(0x1E1E2E),
panel: gpui::rgb(0x181825),
foreground: gpui::rgb(0xCDD6F4),
muted: gpui::rgb(0x7F849C),
accent: gpui::rgb(0x89B4FA),
border: gpui::rgb(0x313244),
error: gpui::rgb(0xF38BA8),
success: gpui::rgb(0xA6E3A1),
selection: gpui::rgb(0x45475A),
selection_foreground: gpui::rgb(0xCDD6F4),
text: gpui::rgb(0xCDD6F4),
text_size: Some(gpui::Size::new(14, 14)),
}
}
pub fn light() -> Self {
Self {
background: gpui::rgb(0xF5F5F5),
panel: gpui::rgb(0xF0F0F0),
foreground: gpui::rgb(0x333333),
muted: gpui::rgb(0x999999),
accent: gpui::rgb(0x0078D4),
border: gpui::rgb(0xE0E0E0),
error: gpui::rgb(0xFF4444),
success: gpui::rgb(0x4CAF50),
selection: gpui::rgb(0xD0D0D0),
selection_foreground: gpui::rgb(0x333333),
text: gpui::rgb(0x333333),
text_size: Some(gpui::Size::new(14, 14)),
}
}
pub fn global(app: &gpui::App) -> &Self {
app.global::<Self>()
}
}
impl gpui::Global for Theme {}
pub trait ActiveTheme {
fn theme(&self) -> &Theme;
}
impl ActiveTheme for gpui::App {
#[inline(always)]
fn theme(&self) -> &Theme {
Theme::global(self)
}
}