use std::collections::HashMap;
#[derive(Default, Clone)]
pub struct StyleRegistry {
styles: HashMap<&'static str, &'static str>,
}
impl StyleRegistry {
pub fn register(&mut self, name: &'static str, css: &'static str) {
self.styles.insert(name, css);
}
pub fn css_bundle(&self) -> String {
self.styles.values().copied().collect::<Vec<_>>().join("\n")
}
pub fn get(&self, name: &str) -> Option<&'static str> {
self.styles.get(name).copied()
}
pub fn get_all(&self) -> HashMap<&'static str, &'static str> {
self.styles.clone()
}
pub fn has(&self, name: &str) -> bool {
self.styles.contains_key(name)
}
pub fn len(&self) -> usize {
self.styles.len()
}
pub fn is_empty(&self) -> bool {
self.styles.is_empty()
}
#[cfg(feature = "basic")]
pub fn register_basic_components(&mut self) {
use crate::basic::{
ArrowComponent, BackgroundComponent, BadgeComponent, ButtonComponent, CanvasComponent,
CardComponent, CheckboxComponent, DatePickerComponent, DividerComponent,
FileUploadComponent, FormFieldComponent, IconButtonComponent, InputComponent,
RadioGroupComponent, SelectComponent, SliderComponent, SwitchComponent,
TextareaComponent,
};
ArrowComponent::register(self);
BackgroundComponent::register(self);
ButtonComponent::register(self);
CanvasComponent::register(self);
InputComponent::register(self);
CardComponent::register(self);
BadgeComponent::register(self);
CheckboxComponent::register(self);
RadioGroupComponent::register(self);
SelectComponent::register(self);
SwitchComponent::register(self);
SliderComponent::register(self);
TextareaComponent::register(self);
IconButtonComponent::register(self);
FileUploadComponent::register(self);
FormFieldComponent::register(self);
DatePickerComponent::register(self);
DividerComponent::register(self);
}
#[cfg(not(feature = "basic"))]
pub fn register_basic_components(&mut self) {
}
#[cfg(feature = "data")]
pub fn register_data_components(&mut self) {
use crate::data::{
CollapseComponent, DragComponent, FilterComponent, PaginationButtonComponent,
PaginationComponent, SelectionComponent, SortComponent, TableComponent, TreeComponent,
VirtualScrollComponent,
};
TableComponent::register(self);
TreeComponent::register(self);
PaginationComponent::register(self);
PaginationButtonComponent::register(self);
VirtualScrollComponent::register(self);
CollapseComponent::register(self);
DragComponent::register(self);
SortComponent::register(self);
FilterComponent::register(self);
SelectionComponent::register(self);
}
#[cfg(not(feature = "data"))]
pub fn register_data_components(&mut self) {
}
#[cfg(feature = "feedback")]
pub fn register_feedback_components(&mut self) {
use crate::feedback::{
alert::AlertComponent, drawer::DrawerComponent, glow::GlowComponent,
modal::ModalComponent, popover::PopoverComponent, progress::ProgressComponent,
spin::SpinComponent, toast::ToastComponent, tooltip::TooltipComponent,
};
AlertComponent::register(self);
GlowComponent::register(self);
ToastComponent::register(self);
TooltipComponent::register(self);
ModalComponent::register(self);
DrawerComponent::register(self);
PopoverComponent::register(self);
ProgressComponent::register(self);
SpinComponent::register(self);
}
#[cfg(not(feature = "feedback"))]
pub fn register_feedback_components(&mut self) {
}
#[cfg(feature = "navigation")]
pub fn register_navigation_components(&mut self) {
use crate::navigation::{
BreadcrumbComponent, MenuComponent, SidebarComponent, StepsComponent, TabsComponent,
};
MenuComponent::register(self);
TabsComponent::register(self);
BreadcrumbComponent::register(self);
SidebarComponent::register(self);
StepsComponent::register(self);
}
#[cfg(not(feature = "navigation"))]
pub fn register_navigation_components(&mut self) {
}
#[cfg(feature = "display")]
pub fn register_display_components(&mut self) {
use crate::display::{
CommentComponent, EmptyComponent, QRCodeComponent, SkeletonComponent, TagComponent,
};
TagComponent::register(self);
EmptyComponent::register(self);
SkeletonComponent::register(self);
CommentComponent::register(self);
QRCodeComponent::register(self);
}
#[cfg(not(feature = "display"))]
pub fn register_display_components(&mut self) {
}
#[cfg(feature = "entry")]
pub fn register_entry_components(&mut self) {
use crate::entry::{
AutoCompleteComponent, CascaderComponent, NumberInputComponent, SearchComponent,
TransferComponent,
};
NumberInputComponent::register(self);
SearchComponent::register(self);
AutoCompleteComponent::register(self);
CascaderComponent::register(self);
TransferComponent::register(self);
}
#[cfg(not(feature = "entry"))]
pub fn register_entry_components(&mut self) {
}
pub fn register_available(&mut self) {
#[cfg(feature = "basic")]
self.register_basic_components();
#[cfg(feature = "data")]
self.register_data_components();
#[cfg(feature = "feedback")]
self.register_feedback_components();
#[cfg(feature = "navigation")]
self.register_navigation_components();
#[cfg(feature = "display")]
self.register_display_components();
#[cfg(feature = "entry")]
self.register_entry_components();
}
pub fn register_all(&mut self) {
self.register_basic_components();
self.register_data_components();
self.register_feedback_components();
self.register_navigation_components();
self.register_display_components();
self.register_entry_components();
}
}
pub trait StyledComponent: Sized {
fn styles() -> &'static str;
fn register(registry: &mut StyleRegistry) {
registry.register(Self::name(), Self::styles());
}
fn name() -> &'static str;
}