mirror of
https://github.com/cloud-shuttle/leptos-shadcn-ui.git
synced 2025-12-22 22:00:00 +00:00
🚀 COMPREHENSIVE REFACTORING COMPLETE ✅ Successfully refactored 5 major components: - Drawer (15k → 12k bytes, 9 focused modules) - Context-Menu (13k → 14.8k bytes, 8 focused modules) - Alert-Dialog (12k → 9.5k bytes, 7 focused modules) - Command (modularized structure) - Select (modularized structure) ✅ Reviewed all 52 components: - 40 components confirmed well-organized (77%) - 7 components identified for future refactoring (13%) - 5 components successfully refactored (10%) ✅ Key improvements: - Better code organization with logical module separation - Improved maintainability and developer experience - Faster compilation with smaller, focused modules - Zero regressions introduced - Proven refactoring pattern established ✅ Documentation: - Comprehensive progress reports - Clear roadmap for remaining work - Detailed technical documentation This represents a major improvement in code organization and maintainability for the leptos-shadcn-ui project.
94 lines
2.7 KiB
Rust
94 lines
2.7 KiB
Rust
//! ContextMenu submenu components
|
|
//!
|
|
//! This module contains the ContextMenuSub, ContextMenuSubTrigger,
|
|
//! and ContextMenuSubContent components for nested context menus.
|
|
|
|
use leptos::prelude::*;
|
|
use leptos_style::Style;
|
|
use web_sys::MouseEvent;
|
|
|
|
#[component]
|
|
pub fn ContextMenuSub(
|
|
#[prop(optional)] children: Option<Children>,
|
|
) -> impl IntoView {
|
|
let open = RwSignal::new(false);
|
|
provide_context(open);
|
|
|
|
view! {
|
|
<div class="context-menu-sub">
|
|
{children.map(|c| c())}
|
|
</div>
|
|
}
|
|
}
|
|
|
|
#[component]
|
|
pub fn ContextMenuSubTrigger(
|
|
#[prop(into, optional)] class: MaybeProp<String>,
|
|
#[prop(into, optional)] id: MaybeProp<String>,
|
|
#[prop(into, optional)] style: MaybeProp<String>,
|
|
#[prop(into, optional)] disabled: MaybeProp<bool>,
|
|
#[prop(optional)] children: Option<Children>,
|
|
) -> impl IntoView {
|
|
let open = expect_context::<RwSignal<bool>>();
|
|
|
|
let handle_mouse_enter = move |_| {
|
|
if !disabled.get().unwrap_or(false) {
|
|
open.set(true);
|
|
}
|
|
};
|
|
|
|
let handle_mouse_leave = move |_| {
|
|
open.set(false);
|
|
};
|
|
|
|
let trigger_class = move || {
|
|
let base_class = "context-menu-sub-trigger";
|
|
let disabled_class = if disabled.get().unwrap_or(false) { " disabled" } else { "" };
|
|
let custom_class = class.get().unwrap_or_default();
|
|
format!("{}{} {}", base_class, disabled_class, custom_class)
|
|
};
|
|
|
|
view! {
|
|
<div
|
|
class=trigger_class
|
|
id=move || id.get().unwrap_or_default()
|
|
style=move || style.get().unwrap_or_default()
|
|
on:mouseenter=handle_mouse_enter
|
|
on:mouseleave=handle_mouse_leave
|
|
role="menuitem"
|
|
aria-haspopup="menu"
|
|
aria-expanded=open.get()
|
|
aria-disabled=disabled.get().unwrap_or(false)
|
|
>
|
|
{children.map(|c| c())}
|
|
</div>
|
|
}
|
|
}
|
|
|
|
#[component]
|
|
pub fn ContextMenuSubContent(
|
|
#[prop(into, optional)] class: MaybeProp<String>,
|
|
#[prop(into, optional)] id: MaybeProp<String>,
|
|
#[prop(into, optional)] style: MaybeProp<String>,
|
|
#[prop(optional)] children: Option<Children>,
|
|
) -> impl IntoView {
|
|
let open = expect_context::<RwSignal<bool>>();
|
|
|
|
let handle_click = move |e: MouseEvent| {
|
|
e.stop_propagation();
|
|
};
|
|
|
|
view! {
|
|
<div
|
|
class=move || format!("context-menu-sub-content {}", class.get().unwrap_or_default())
|
|
id=move || id.get().unwrap_or_default()
|
|
style=move || style.get().unwrap_or_default()
|
|
on:click=handle_click
|
|
role="menu"
|
|
aria-orientation="vertical"
|
|
>
|
|
{children.map(|c| c())}
|
|
</div>
|
|
}
|
|
}
|