pub mod accessibility;
pub mod cross_platform;
pub mod engine;
pub mod performance;
pub mod three_d;
pub mod types;
pub mod usability;
pub mod vibe_benchmark;
pub mod visual_analysis;
pub use engine::AestheticMasteryEngine;
pub use engine::QuickAssessment;
pub use types::*;
pub use accessibility::{
ContrastAnalyzer, KeyboardAccessibilityAnalyzer, KeyboardAccessibilityResult,
ScreenReaderAnalyzer, ScreenReaderResult, WcagChecker,
};
pub use cross_platform::{CrossPlatformValidator, ResponsiveValidationResult, ResponsiveValidator};
pub use performance::{
CoreWebVitalsAnalyzer, CoreWebVitalsEstimate, PerformanceAnalyzer, VitalRating,
};
pub use three_d::{
R3FAnalysisResult, ReactThreeFiberAnalyzer, ThreeDEvaluator, M2_R3F_INSTANCE_CAPABILITY,
};
pub use usability::{
FlowAnalysisResult, FlowStep, FrictionLevel, FrictionPoint, HeuristicEvaluator, HeuristicScore,
UsabilityEvaluator, UserFlowAnalyzer,
};
pub use vibe_benchmark::{
M2BenchmarkComparison, M2ComparisonResult, M2ComparisonStatus, MultiPlatformVibeEvaluator,
VibeBenchmarkEvaluator, VibeInterpretation, VibeRating, VibeScoreInterpreter,
VIBE_ANDROID_BENCHMARK, VIBE_IOS_BENCHMARK, VIBE_WEB_BENCHMARK,
};
pub use visual_analysis::{
ColorHarmonyAnalyzer, ConsistencyAnalyzer, HierarchyAnalyzer, LayoutAnalyzer,
TypographyAnalyzer, WhiteSpaceAnalyzer,
};
use crate::error::Error;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
pub struct VibeBenchmarkTargets {
pub web: f64, pub android: f64, pub ios: f64, }
impl Default for VibeBenchmarkTargets {
fn default() -> Self {
Self {
web: 0.915,
android: 0.897,
ios: 0.880,
}
}
}
#[derive(Debug, Clone)]
pub struct AestheticExpressionService {
#[allow(dead_code)]
config: AestheticConfig,
vibe_targets: VibeBenchmarkTargets,
engine: AestheticMasteryEngine,
}
impl AestheticExpressionService {
pub async fn new(config: AestheticConfig) -> Result<Self, Error> {
let vibe_targets = VibeBenchmarkTargets::default();
let engine = AestheticMasteryEngine::new(config.clone())?;
Ok(Self {
config,
vibe_targets,
engine,
})
}
pub async fn assess_design(&self, input: DesignInput) -> Result<DesignAssessmentResult, Error> {
self.engine.comprehensive_assessment(input).await
}
pub async fn quick_visual_check(
&self,
input: DesignInput,
) -> Result<VisualAssessmentResult, Error> {
self.engine.visual_assessment(input).await
}
pub async fn check_accessibility(
&self,
input: DesignInput,
) -> Result<AccessibilityResult, Error> {
self.engine.accessibility_assessment(input).await
}
pub async fn validate_cross_platform(
&self,
input: DesignInput,
) -> Result<CrossPlatformResult, Error> {
self.engine.cross_platform_validation(input).await
}
pub async fn assess_3d_design(
&self,
input: ThreeDDesignInput,
) -> Result<ThreeDAssessmentResult, Error> {
self.engine.three_d_assessment(input).await
}
pub fn get_vibe_compliance(&self, platform: Platform) -> f64 {
match platform {
Platform::Web => self.vibe_targets.web,
Platform::Android => self.vibe_targets.android,
Platform::IOS => self.vibe_targets.ios,
Platform::Desktop => (self.vibe_targets.web + self.vibe_targets.ios) / 2.0,
}
}
}
#[derive(Debug, Clone, Default)]
pub struct AestheticServiceBuilder {
config: Option<AestheticConfig>,
custom_vibe_targets: Option<VibeBenchmarkTargets>,
}
impl AestheticServiceBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn with_config(mut self, config: AestheticConfig) -> Self {
self.config = Some(config);
self
}
pub fn with_vibe_targets(mut self, targets: VibeBenchmarkTargets) -> Self {
self.custom_vibe_targets = Some(targets);
self
}
pub async fn build(self) -> Result<AestheticExpressionService, Error> {
let config = self.config.unwrap_or_default();
let mut service = AestheticExpressionService::new(config).await?;
if let Some(targets) = self.custom_vibe_targets {
service.vibe_targets = targets;
}
Ok(service)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_vibe_defaults() {
let targets = VibeBenchmarkTargets::default();
assert!((targets.web - 0.915).abs() < 0.001);
assert!((targets.android - 0.897).abs() < 0.001);
assert!((targets.ios - 0.880).abs() < 0.001);
}
}