tailwind_rs_leptos/lib.rs
1//! # Tailwind-rs Leptos Integration
2//!
3//! This crate provides seamless integration between Tailwind CSS and the Leptos framework.
4//! It follows our TDD-first approach (ADR-001) and comprehensive testing pyramid strategy (ADR-002).
5//!
6//! ## 🌐 WASM Compatibility
7//!
8//! This crate is **fully WASM-compatible** and compiles to `wasm32-unknown-unknown`.
9//! Perfect for building modern web applications with Leptos and Tailwind CSS.
10//!
11//! ## Features
12//!
13//! - **🌐 WASM Compatible** - Compiles to WebAssembly for browser environments
14//! - **⚡ High Performance** - Synchronous operations for optimal WASM performance
15//! - **📦 Smaller Bundles** - ~20% reduction in bundle size
16//! - **Type-safe class generation** - Compile-time validation of Tailwind classes
17//! - **Reactive styling** - Dynamic class generation with Leptos signals
18//! - **Performance optimized** - Efficient class caching and tree-shaking
19//! - **Framework integration** - Native Leptos component support
20//!
21//! ## Quick Start
22//!
23//! ```rust
24//! use tailwind_rs_leptos::DynamicClassBuilder;
25//!
26//! // Create dynamic classes with reactive updates
27//! let builder = DynamicClassBuilder::new()
28//! .base("px-4 py-2 rounded-md font-medium")
29//! .variant("bg-blue-600 text-white");
30//!
31//! let classes = builder.classes();
32//! assert!(classes.contains("px-4"));
33//! ```
34
35// Core working modules with Leptos 0.8.8 support
36pub mod components;
37pub mod dynamic_class_builder;
38pub mod e2e_tests;
39pub mod performance_tests;
40pub mod signal_manager;
41pub mod test_utils;
42pub mod visual_tests;
43
44// Legacy modules (temporarily disabled due to deprecated API usage)
45// pub mod class_generator;
46// pub mod reactive;
47// pub mod signals;
48// pub mod utils;
49
50pub use components::*;
51pub use dynamic_class_builder::*;
52pub use e2e_tests::*;
53pub use performance_tests::*;
54pub use signal_manager::*;
55pub use test_utils::*;
56pub use visual_tests::*;
57
58// Legacy exports (disabled)
59// pub use class_generator::*;
60// pub use reactive::*;
61// pub use signals::*;
62// pub use utils::*;
63
64// Re-export core functionality
65pub use tailwind_rs_core::*;
66pub use tailwind_rs_macros::*;
67
68/// Leptos-specific class generation utilities
69/*
70pub mod leptos_classes {
71 use leptos::prelude::*;
72 use tailwind_rs_core::ClassBuilder;
73
74 /// Create reactive classes for Leptos components
75 pub fn create_reactive_classes<F>(class_fn: F) -> ReadSignal<String>
76 where
77 F: Fn() -> String + 'static,
78 {
79 let (classes, set_classes) = create_signal(class_fn());
80 classes
81 }
82
83 /// Generate classes for Leptos components with reactive updates
84 pub fn generate_reactive_classes(
85 builder: ClassBuilder,
86 update_trigger: ReadSignal<bool>,
87 ) -> ReadSignal<String> {
88 let (classes, set_classes) = create_signal(builder.clone().build().to_css_classes());
89
90 // Update classes when trigger changes
91 create_effect(move |_| {
92 update_trigger.get();
93 set_classes.set(builder.clone().build().to_css_classes());
94 });
95
96 classes
97 }
98}
99*/
100
101#[cfg(test)]
102mod tests {
103 use super::*;
104 use leptos::prelude::Get;
105
106 #[test]
107 fn test_class_builder_integration() {
108 let builder = ClassBuilder::new()
109 .class("flex items-center")
110 .class("justify-center");
111
112 let result = builder.build().to_css_classes();
113 assert!(result.contains("flex"));
114 assert!(result.contains("items-center"));
115 assert!(result.contains("justify-center"));
116 }
117
118 #[test]
119 fn test_signal_manager_creation() {
120 let manager = TailwindSignalManager::new();
121
122 // Test signal manager can be created
123 assert_eq!(manager.variant().get(), "primary");
124 assert_eq!(manager.size().get(), "medium");
125 assert_eq!(manager.disabled().get(), false);
126 assert_eq!(manager.loading().get(), false);
127 }
128
129 #[test]
130 fn test_dynamic_class_builder() {
131 let builder = DynamicClassBuilder::new();
132
133 // Initially should be empty
134 assert!(builder.is_empty());
135 assert_eq!(builder.classes(), "");
136
137 // Add base classes
138 let builder = builder.base("px-4 py-2");
139 let classes = builder.classes();
140 assert!(classes.contains("px-4"));
141 assert!(classes.contains("py-2"));
142 }
143}