cleanup
This commit is contained in:
		
							
								
								
									
										41
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										41
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							| @@ -743,14 +743,12 @@ dependencies = [ | ||||
|  "serde_json", | ||||
|  "sha3", | ||||
|  "thiserror", | ||||
|  "urlencoding", | ||||
|  "wasm-bindgen", | ||||
|  "wasm-bindgen-futures", | ||||
|  "wasm-bindgen-test", | ||||
|  "wasm-logger", | ||||
|  "web-sys", | ||||
|  "yew", | ||||
|  "yew-router", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| @@ -1469,7 +1467,6 @@ version = "0.3.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "97563d71863fb2824b2e974e754a81d19c4a7ec47b09ced8a0e6656b6d54bd1f" | ||||
| dependencies = [ | ||||
|  "futures-channel", | ||||
|  "gloo-events 0.2.0", | ||||
|  "js-sys", | ||||
|  "wasm-bindgen", | ||||
| @@ -1617,8 +1614,6 @@ version = "0.3.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" | ||||
| dependencies = [ | ||||
|  "futures-channel", | ||||
|  "futures-core", | ||||
|  "js-sys", | ||||
|  "wasm-bindgen", | ||||
| ] | ||||
| @@ -2871,12 +2866,6 @@ dependencies = [ | ||||
|  "windows-sys 0.52.0", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "route-recognizer" | ||||
| version = "0.3.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746" | ||||
|  | ||||
| [[package]] | ||||
| name = "rust_decimal" | ||||
| version = "1.37.2" | ||||
| @@ -4321,36 +4310,6 @@ dependencies = [ | ||||
|  "syn 2.0.103", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "yew-router" | ||||
| version = "0.18.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "4ca1d5052c96e6762b4d6209a8aded597758d442e6c479995faf0c7b5538e0c6" | ||||
| dependencies = [ | ||||
|  "gloo 0.10.0", | ||||
|  "js-sys", | ||||
|  "route-recognizer", | ||||
|  "serde", | ||||
|  "serde_urlencoded", | ||||
|  "tracing", | ||||
|  "urlencoding", | ||||
|  "wasm-bindgen", | ||||
|  "web-sys", | ||||
|  "yew", | ||||
|  "yew-router-macro", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "yew-router-macro" | ||||
| version = "0.18.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "42bfd190a07ca8cfde7cd4c52b3ac463803dc07323db8c34daa697e86365978c" | ||||
| dependencies = [ | ||||
|  "proc-macro2", | ||||
|  "quote", | ||||
|  "syn 2.0.103", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "yoke" | ||||
| version = "0.8.0" | ||||
|   | ||||
| @@ -11,7 +11,6 @@ heromodels = { path = "/Users/timurgordon/code/git.ourworld.tf/herocode/db/herom | ||||
| circle_client_ws = { path = "../client_ws" } | ||||
|  | ||||
| futures = "0.3" | ||||
| yew-router = "0.18" | ||||
| yew = { version = "0.21", features = ["csr"] } | ||||
| wasm-bindgen = "0.2" | ||||
| log = "0.4" | ||||
| @@ -38,7 +37,6 @@ secp256k1 = { workspace = true, features = ["rand", "recovery", "hashes"] } | ||||
| hex = "0.4" | ||||
| sha3 = "0.10" | ||||
| gloo-storage = "0.3" | ||||
| urlencoding = "2.1" | ||||
| thiserror = "1.0" | ||||
|  | ||||
| [dev-dependencies] | ||||
|   | ||||
| @@ -9,14 +9,7 @@ | ||||
|     <link data-trunk rel="css" href="static/css/nav_island.css" /> | ||||
|     <link data-trunk rel="css" href="static/css/library_view.css" /> | ||||
|     <link data-trunk rel="css" href="static/css/library_viewer.css" /> | ||||
|     <link data-trunk rel="css" href="static/css/members_view.css" /> | ||||
|     <link data-trunk rel="css" href="static/css/intelligence_view.css" /> | ||||
|     <link data-trunk rel="css" href="static/css/timeline_view.css" /> | ||||
|     <link data-trunk rel="css" href="static/css/projects_view.css" /> | ||||
|     <link data-trunk rel="css" href="static/css/governance_view.css" /> | ||||
|     <link data-trunk rel="css" href="static/css/calendar_view.css" /> | ||||
|     <link data-trunk rel="css" href="static/css/treasury_view.css" /> | ||||
|     <link data-trunk rel="css" href="static/css/publishing_view.css" /> | ||||
|     <link data-trunk rel="css" href="static/css/customize_view.css" /> | ||||
| <link data-trunk rel="css" href="static/css/circles_view.css" /> | ||||
|     <link data-trunk rel="css" href="static/css/dashboard_view.css" /> | ||||
|   | ||||
| @@ -122,6 +122,7 @@ impl AuthManager { | ||||
|     } | ||||
|  | ||||
|     /// Check if an email is available for authentication | ||||
|     #[allow(dead_code)] | ||||
|     pub fn is_email_available(&self, email: &str) -> bool { | ||||
|         is_email_available(email) | ||||
|     } | ||||
| @@ -244,6 +245,7 @@ impl AuthManager { | ||||
|     } | ||||
|  | ||||
|     /// Get current authentication method if authenticated | ||||
|     #[allow(dead_code)] | ||||
|     pub fn get_auth_method(&self) -> Option<AuthMethod> { | ||||
|         match &*self.state.borrow() { | ||||
|             AuthState::Authenticated { method, .. } => Some(method.clone()), | ||||
| @@ -252,6 +254,7 @@ impl AuthManager { | ||||
|     } | ||||
|  | ||||
|     /// Get current public key if authenticated | ||||
|     #[allow(dead_code)] | ||||
|     pub fn get_public_key(&self) -> Option<String> { | ||||
|         match &*self.state.borrow() { | ||||
|             AuthState::Authenticated { public_key, .. } => Some(public_key.clone()), | ||||
| @@ -260,6 +263,7 @@ impl AuthManager { | ||||
|     } | ||||
|  | ||||
|     /// Validate current authentication state | ||||
|     #[allow(dead_code)] | ||||
|     pub fn validate_current_auth(&self) -> AuthResult<()> { | ||||
|         match &*self.state.borrow() { | ||||
|             AuthState::Authenticated { private_key, .. } => { | ||||
|   | ||||
| @@ -94,12 +94,14 @@ pub fn get_available_emails() -> Vec<String> { | ||||
| } | ||||
|  | ||||
| /// Check if an email address is available in the store | ||||
| #[allow(dead_code)] | ||||
| pub fn is_email_available(email: &str) -> bool { | ||||
|     get_email_key_mappings().contains_key(email) | ||||
| } | ||||
|  | ||||
| /// Add a new email-key mapping (for runtime additions) | ||||
| /// Note: This will only persist for the current session | ||||
| #[allow(dead_code)] | ||||
| pub fn add_email_key_mapping(email: String, private_key: String) -> AuthResult<()> { | ||||
|     // Validate the private key first | ||||
|     let public_key = derive_public_key(&private_key)?; | ||||
|   | ||||
| @@ -24,9 +24,11 @@ pub enum AuthError { | ||||
|     EmailNotFound(String), | ||||
|  | ||||
|     #[error("Generic error: {0}")] | ||||
|     #[allow(dead_code)] | ||||
|     Generic(String), | ||||
|  | ||||
|     #[error("Not authenticated")] | ||||
|     #[allow(dead_code)] | ||||
|     NotAuthenticated, | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -8,6 +8,7 @@ pub struct BookViewerProps { | ||||
| } | ||||
|  | ||||
| pub enum BookViewerMsg { | ||||
|     #[allow(dead_code)] | ||||
|     GoToPage(usize), | ||||
|     NextPage, | ||||
|     PrevPage, | ||||
| @@ -130,6 +131,7 @@ impl BookViewer { | ||||
|         html! { <div>{ for html_content }</div> } | ||||
|     } | ||||
|  | ||||
|     #[allow(dead_code)] | ||||
|     pub fn render_toc(&self, ctx: &Context<Self>, toc: &[TocEntry]) -> Html { | ||||
|         html! { | ||||
|             <ul class="toc-list"> | ||||
|   | ||||
| @@ -20,6 +20,7 @@ pub struct ChatMessage { | ||||
| pub enum ChatSender { | ||||
|     User, | ||||
|     Assistant, | ||||
|     #[allow(dead_code)] | ||||
|     System, | ||||
| } | ||||
|  | ||||
| @@ -88,8 +89,11 @@ pub enum ChatMsg { | ||||
|     UpdateDescription(String), | ||||
|     SendMessage, | ||||
|     AddResponse(ChatResponse), | ||||
|     #[allow(dead_code)] | ||||
|     NewConversation, | ||||
|     #[allow(dead_code)] | ||||
|     SelectConversation(u32), | ||||
|     #[allow(dead_code)] | ||||
|     LoadConversation(u32), | ||||
| } | ||||
|  | ||||
| @@ -493,11 +497,13 @@ impl ChatInterface { | ||||
|         summaries | ||||
|     } | ||||
|  | ||||
|     #[allow(dead_code)] | ||||
|     pub fn new_conversation(&mut self) -> u32 { | ||||
|         self.create_new_conversation(); | ||||
|         self.active_conversation_id.unwrap() | ||||
|     } | ||||
|  | ||||
|     #[allow(dead_code)] | ||||
|     pub fn select_conversation(&mut self, conversation_id: u32) -> bool { | ||||
|         if self.conversations.contains_key(&conversation_id) { | ||||
|             self.active_conversation_id = Some(conversation_id); | ||||
| @@ -507,6 +513,7 @@ impl ChatInterface { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     #[allow(dead_code)] | ||||
|     pub fn get_conversations(&self) -> Vec<ConversationSummary> { | ||||
|         self.get_conversation_summaries() | ||||
|     } | ||||
|   | ||||
| @@ -14,6 +14,7 @@ struct RotationState { | ||||
| } | ||||
|  | ||||
| enum RotationAction { | ||||
|     #[allow(dead_code)] | ||||
|     Rotate(i32), | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -199,14 +199,14 @@ fn render_setting_control( | ||||
|     setting_def: ThemeSettingDefinition, | ||||
|     current_value: String, | ||||
|     circle_ws_url: String, | ||||
|     app_callback: Callback<AppMsg>, | ||||
|     _app_callback: Callback<AppMsg>, | ||||
| ) -> Html { | ||||
|     let setting_key = setting_def.key.clone(); | ||||
|  | ||||
|     let on_value_change = { | ||||
|         let circle_ws_url_clone = circle_ws_url.clone(); | ||||
|         let setting_key_clone = setting_key.clone(); | ||||
|         Callback::from(move |new_value: String| { | ||||
|         let _circle_ws_url_clone = circle_ws_url.clone(); | ||||
|         let _setting_key_clone = setting_key.clone(); | ||||
|         Callback::from(move |_new_value: String| { | ||||
|             // Emit a message to app.rs to update the theme | ||||
|             // AppMsg should have a variant like UpdateCircleTheme(circle_id, theme_key, new_value) | ||||
|             // TODO: Update this to use WebSocket URL instead of u32 ID | ||||
|   | ||||
| @@ -22,6 +22,7 @@ pub struct InspectorInteractTabProps { | ||||
| } | ||||
|  | ||||
| #[derive(Clone, Debug)] | ||||
| #[allow(dead_code)] | ||||
| pub struct CircleInfo { | ||||
|     pub name: String, | ||||
|     pub ws_url: String, | ||||
|   | ||||
| @@ -26,6 +26,7 @@ pub enum IntelligenceMsg { | ||||
|     ScriptExecuted(Result<String, String>), | ||||
| } | ||||
|  | ||||
| #[allow(dead_code)] | ||||
| pub struct IntelligenceView { | ||||
|     current_input: String, | ||||
|     active_conversation_id: Option<u32>, | ||||
| @@ -269,6 +270,7 @@ impl IntelligenceView { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     #[allow(dead_code)] | ||||
|     fn fetch_intelligence_data(&mut self, ws_url: &str) { | ||||
|         let script = r#" | ||||
|             let intelligence = get_intelligence(); | ||||
|   | ||||
| @@ -29,6 +29,7 @@ pub struct DisplayLibraryCollection { | ||||
|     pub title: String, | ||||
|     pub description: Option<String>, | ||||
|     pub items: Vec<Rc<DisplayLibraryItem>>, | ||||
|     #[allow(dead_code)] | ||||
|     pub ws_url: String, | ||||
|     pub collection_key: String, | ||||
| } | ||||
| @@ -265,7 +266,7 @@ impl LibraryView { | ||||
|                                 e.stop_propagation(); | ||||
|                                 Msg::SelectCollection(idx) | ||||
|                             }); | ||||
|                             let item_count = collection.items.len(); | ||||
|                             let _item_count = collection.items.len(); | ||||
|                             html! { | ||||
|                                 <div class="card" onclick={onclick}> | ||||
|                                     <h3 class="collection-title">{ &collection.title }</h3> | ||||
| @@ -394,7 +395,7 @@ async fn get_collections(ws_urls: &[String]) -> HashMap<String, Collection> { | ||||
|  | ||||
|     let mut result = HashMap::new(); | ||||
|     for (ws_url, collections_vec) in collections_arrays { | ||||
|         for (index, collection) in collections_vec.into_iter().enumerate() { | ||||
|         for (_index, collection) in collections_vec.into_iter().enumerate() { | ||||
|             // Use a unique key combining ws_url and collection index/id | ||||
|             let key = format!("{}_{}", ws_url, collection.base_data.id); | ||||
|             result.insert(key, collection); | ||||
|   | ||||
| @@ -22,7 +22,7 @@ pub struct LoginProps { | ||||
|  | ||||
| /// Login method selection | ||||
| #[derive(Debug, Clone, PartialEq)] | ||||
| enum LoginMethod { | ||||
| pub(crate) enum LoginMethod { | ||||
|     Email, | ||||
|     PrivateKey, | ||||
|     CreateKey, | ||||
|   | ||||
| @@ -70,7 +70,7 @@ impl NetworkAnimationView { | ||||
|         ]; | ||||
|  | ||||
|         for (i, (id, circle_data)) in all_circles.iter().enumerate() { | ||||
|             if let Some((x, y, region)) = server_positions.get(i % server_positions.len()) { | ||||
|             if let Some((x, y, _region)) = server_positions.get(i % server_positions.len()) { | ||||
|                 nodes.insert( | ||||
|                     *id, | ||||
|                     ServerNode { | ||||
|   | ||||
| @@ -39,14 +39,17 @@ pub enum PublishingMsg { | ||||
|     SwitchView(PublishingViewEnum), | ||||
|     SwitchPublicationTab(PublishingPublicationTab), | ||||
|     CreateNewPublication, | ||||
|     TriggerDeployment(u32),                         // publication_id | ||||
|     DeletePublication(u32),                         // publication_id | ||||
|     SavePublicationSettings(u32),                   // publication_id | ||||
|     FetchPublications(String),                      // ws_url | ||||
|     TriggerDeployment(u32),       // publication_id | ||||
|     DeletePublication(u32),       // publication_id | ||||
|     SavePublicationSettings(u32), // publication_id | ||||
|     #[allow(dead_code)] | ||||
|     FetchPublications(String), // ws_url | ||||
|     #[allow(dead_code)] | ||||
|     PublicationsReceived(String, Vec<Publication>), // ws_url, publications | ||||
|     ActionCompleted(Result<String, String>), | ||||
| } | ||||
|  | ||||
| #[allow(dead_code)] | ||||
| pub struct PublishingView { | ||||
|     current_view: PublishingViewEnum, | ||||
|     active_publication_tab: PublishingPublicationTab, | ||||
|   | ||||
| @@ -12,7 +12,7 @@ pub struct SidebarLayoutProps { | ||||
| pub fn sidebar_layout(props: &SidebarLayoutProps) -> Html { | ||||
|     let on_background_click_handler = { | ||||
|         let on_background_click = props.on_background_click.clone(); | ||||
|         Callback::from(move |e: MouseEvent| { | ||||
|         Callback::from(move |_e: MouseEvent| { | ||||
|             if let Some(callback) = &on_background_click { | ||||
|                 callback.emit(()); | ||||
|             } | ||||
|   | ||||
| @@ -1,13 +1,13 @@ | ||||
| use circle_client_ws::CircleWsClientBuilder; | ||||
| use engine::{ | ||||
|     create_heromodels_engine, eval_script, | ||||
|     mock_db::{create_mock_db, seed_mock_db}, | ||||
| }; | ||||
| use engine::{create_heromodels_engine, eval_script}; | ||||
| use heromodels::db::hero::OurDB; | ||||
| use rhai::Engine; | ||||
| use std::sync::Arc; | ||||
|  | ||||
| // Since we're in a WASM environment, we need to handle the database differently | ||||
| // We'll create a mock database that works in WASM | ||||
|  | ||||
| #[allow(dead_code)] | ||||
| pub struct RhaiExecutor { | ||||
|     engine: Engine, | ||||
| } | ||||
| @@ -15,12 +15,10 @@ pub struct RhaiExecutor { | ||||
| impl RhaiExecutor { | ||||
|     pub fn new() -> Self { | ||||
|         // Create a mock database for the engine | ||||
|         let db = create_mock_db(); | ||||
|         seed_mock_db(db.clone()); | ||||
|         let db = OurDB::new("app.db", true).expect("Failed to create database"); | ||||
|  | ||||
|         // Create the heromodels engine with all the registered functions | ||||
|         let engine = create_heromodels_engine(db); | ||||
|  | ||||
|         let engine = create_heromodels_engine(Arc::new(db)); | ||||
|         Self { engine } | ||||
|     } | ||||
|  | ||||
| @@ -57,6 +55,7 @@ pub struct ScriptResponse { | ||||
| } | ||||
|  | ||||
| // For local execution (self circle) | ||||
| #[allow(dead_code)] | ||||
| pub fn execute_rhai_script_local(script: &str) -> ScriptResponse { | ||||
|     let executor = RhaiExecutor::new(); | ||||
|  | ||||
| @@ -123,6 +122,7 @@ pub async fn execute_rhai_script_remote( | ||||
| } | ||||
|  | ||||
| // Broadcast script to all WebSocket URLs and return all responses | ||||
| #[allow(dead_code)] | ||||
| pub async fn broadcast_rhai_script(script: &str, ws_urls: &[String]) -> Vec<ScriptResponse> { | ||||
|     let mut responses = Vec::new(); | ||||
|  | ||||
|   | ||||
| @@ -17,6 +17,7 @@ pub type CircleWsManager = WsManager<Circle>; | ||||
| /// Manages multiple WebSocket connections to servers | ||||
| /// Generic over the data type T that will be fetched and deserialized | ||||
| #[derive(Clone)] | ||||
| #[allow(dead_code)] | ||||
| pub struct WsManager<T> | ||||
| where | ||||
|     T: DeserializeOwned + Clone + 'static, | ||||
| @@ -29,6 +30,7 @@ where | ||||
|     auth_manager: Option<AuthManager>, | ||||
| } | ||||
|  | ||||
| #[allow(dead_code)] | ||||
| impl<T> WsManager<T> | ||||
| where | ||||
|     T: DeserializeOwned + Clone + 'static, | ||||
| @@ -315,6 +317,7 @@ where | ||||
| } | ||||
|  | ||||
| /// Fetch data from a single WebSocket server with authentication | ||||
| #[allow(dead_code)] | ||||
| pub async fn fetch_data_from_ws_url_with_auth<T>( | ||||
|     ws_url: &str, | ||||
|     script: &str, | ||||
| @@ -359,6 +362,7 @@ where | ||||
| } | ||||
|  | ||||
| /// Fetch data from multiple WebSocket servers with authentication | ||||
| #[allow(dead_code)] | ||||
| pub async fn fetch_data_from_ws_urls_with_auth<T>( | ||||
|     ws_urls: &[String], | ||||
|     script: String, | ||||
|   | ||||
| @@ -1,676 +0,0 @@ | ||||
| /* Calendar View - Game-like Minimalistic Design */ | ||||
| /* :root variables moved to common.css or are view-specific if necessary */ | ||||
|  | ||||
| .calendar-view-container { | ||||
|     /* Extends .view-container from common.css */ | ||||
|     /* Specific height and margins for calendar view */ | ||||
|     height: calc(100vh - 120px); /* Overrides common.css if different */ | ||||
|     margin: 100px 40px 60px 40px; /* Specific margins */ | ||||
|     /* background: transparent; */ /* Should inherit from body or be set if needed */ | ||||
|     /* color: var(--text-primary); */ /* Inherits from common.css */ | ||||
|     /* font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif; */ /* Uses font from common.css */ | ||||
|     /* display, flex-direction, overflow are covered by .view-container */ | ||||
| } | ||||
|  | ||||
| /* Header */ | ||||
| .calendar-header { | ||||
|     /* Extends .view-header from common.css */ | ||||
|     /* .view-header provides: display, justify-content, align-items, padding-bottom, border-bottom, margin-bottom */ | ||||
|     /* Original margin-bottom: 24px; padding: 0 8px; */ | ||||
|     /* common.css .view-header has margin-bottom: var(--spacing-md) (16px) and padding-bottom for border */ | ||||
|     /* If specific padding for calendar-header itself is needed beyond what .view-header provides, add here */ | ||||
| } | ||||
|  | ||||
| .calendar-navigation { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     gap: 16px; | ||||
| } | ||||
|  | ||||
| .nav-btn { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     justify-content: center; | ||||
|     background: var(--surface-dark); /* Common.css variable */ | ||||
|     color: var(--text-primary); /* Common.css variable */ | ||||
|     border: 1px solid var(--border-color); /* Common.css variable */ | ||||
|     padding: 12px; /* Specific padding */ | ||||
|     border-radius: var(--border-radius-medium); /* Common.css variable (8px) */ | ||||
|     cursor: pointer; | ||||
|     font-size: 14px; /* Specific font size */ | ||||
|     font-weight: 500; | ||||
|     transition: background-color var(--transition-speed) ease, border-color var(--transition-speed) ease, transform var(--transition-speed) ease; /* Align transition properties */ | ||||
|     min-width: 44px; /* Specific size */ | ||||
|     height: 44px; /* Specific size */ | ||||
| } | ||||
|  | ||||
| .nav-btn:hover { | ||||
|     background: var(--surface-medium); /* Common.css variable for hover */ | ||||
|     border-color: var(--primary-accent); /* Common.css variable for primary interaction */ | ||||
|     transform: translateY(-1px); /* Specific transform */ | ||||
| } | ||||
|  | ||||
| .today-btn { | ||||
|     padding: 12px 20px; | ||||
|     min-width: auto; | ||||
| } | ||||
|  | ||||
| .calendar-title { | ||||
|     /* Extends .view-title from common.css */ | ||||
|     /* .view-title provides: font-size, font-weight, color */ | ||||
|     /* Original font-size: 24px; font-weight: 600; color: var(--text-primary); */ | ||||
|     /* common.css .view-title has font-size: 1.8em; color: var(--primary-accent) */ | ||||
|     /* If var(--text-primary) is desired over var(--primary-accent) for this title: */ | ||||
|     color: var(--text-primary); | ||||
| } | ||||
|  | ||||
| .calendar-view-switcher { | ||||
|     display: flex; | ||||
|     gap: 8px; | ||||
|     background: var(--surface-dark); /* Common.css variable */ | ||||
|     border: 1px solid var(--border-color); /* Common.css variable */ | ||||
|     border-radius: 12px; | ||||
|     padding: 6px; | ||||
| } | ||||
|  | ||||
| .view-btn { | ||||
|     background: transparent; | ||||
|     color: var(--text-secondary); /* Common.css variable */ | ||||
|     border: none; | ||||
|     padding: 12px 16px; /* Specific padding */ | ||||
|     border-radius: var(--border-radius-medium); /* Common.css variable (8px) */ | ||||
|     cursor: pointer; | ||||
|     font-size: 14px; /* Specific font size */ | ||||
|     font-weight: 500; | ||||
|     transition: color var(--transition-speed) ease, background-color var(--transition-speed) ease, transform var(--transition-speed) ease; /* Align transition properties */ | ||||
|     position: relative; | ||||
|     overflow: hidden; /* For shimmer effect */ | ||||
| } | ||||
|  | ||||
| .view-btn::before { | ||||
|     content: ''; | ||||
|     position: absolute; | ||||
|     top: 0; | ||||
|     left: -100%; | ||||
|     width: 100%; | ||||
|     height: 100%; | ||||
|     background: linear-gradient(90deg, transparent, rgba(255,255,255,0.1), transparent); | ||||
|     transition: left 0.5s ease; | ||||
| } | ||||
|  | ||||
| .view-btn:hover::before { | ||||
|     left: 100%; | ||||
| } | ||||
|  | ||||
| .view-btn:hover { | ||||
|     color: var(--text-primary); /* Common.css variable */ | ||||
|     background: var(--surface-medium); /* Common.css variable for hover */ | ||||
|     transform: translateY(-1px); /* Specific transform */ | ||||
| } | ||||
|  | ||||
| .view-btn.active { | ||||
|     background: var(--primary-accent); /* Common.css variable */ | ||||
|     color: var(--bg-dark); /* Text color for active/primary state, common pattern */ | ||||
|     box-shadow: 0 0 20px color-mix(in srgb, var(--primary-accent) 30%, transparent); /* Use common variable and alpha mix for glow */ | ||||
| } | ||||
|  | ||||
| .calendar-actions { | ||||
|     display: flex; | ||||
|     gap: 12px; | ||||
| } | ||||
|  | ||||
| .action-btn { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     gap: var(--spacing-sm); /* Use common spacing variable */ | ||||
|     background: var(--surface-dark); /* Use common.css variable */ | ||||
|     color: var(--text-primary); /* Consistent with common.css */ | ||||
|     border: 1px solid var(--border-color); /* Use common.css variable */ | ||||
|     padding: 12px 20px; /* Specific padding for this view's action buttons */ | ||||
|     border-radius: var(--border-radius-medium); /* Use common.css variable (8px) */ | ||||
|     cursor: pointer; | ||||
|     font-size: 14px; /* Specific font size */ | ||||
|     font-weight: 500; | ||||
|     transition: all 0.2s ease; /* Consider aligning with var(--transition-speed) if appropriate */ | ||||
|     position: relative; | ||||
|     overflow: hidden; | ||||
| } | ||||
|  | ||||
| .action-btn.primary { | ||||
|     background: var(--primary-accent); /* Use common.css variable */ | ||||
|     border-color: var(--primary-accent); /* Use common.css variable */ | ||||
|     color: var(--bg-dark); /* Text color for primary button, from common.css .button-primary */ | ||||
|     box-shadow: 0 0 15px color-mix(in srgb, var(--primary-accent) 20%, transparent); /* Use common.css variable in shadow */ | ||||
| } | ||||
|  | ||||
| .action-btn:hover { | ||||
|     /* Specific hover effect for this view's action buttons */ | ||||
|     transform: translateY(-2px); | ||||
|     box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3); /* This shadow is specific */ | ||||
|     /* Consider standardizing hover background if possible, e.g., var(--surface-medium) */ | ||||
|     background: var(--surface-medium); /* Example: align hover bg with common */ | ||||
|     border-color: var(--primary-accent); /* Example: align hover border with common */ | ||||
| } | ||||
|  | ||||
| .action-btn.primary:hover { | ||||
|     /* Specific hover effect for primary action buttons */ | ||||
|     box-shadow: 0 4px 25px color-mix(in srgb, var(--primary-accent) 40%, transparent); /* Use common.css variable in shadow */ | ||||
|     /* background for .primary.hover from common.css .button-primary:hover is color-mix(in srgb, var(--primary-accent) 85%, white) */ | ||||
|     background: color-mix(in srgb, var(--primary-accent) 85%, white); | ||||
| } | ||||
|  | ||||
| /* Content Area */ | ||||
| .calendar-content { | ||||
|     flex: 1; | ||||
|     overflow: hidden; | ||||
|     border-radius: 12px; | ||||
|     background: var(--surface-dark); /* Common.css variable */ | ||||
|     border: 1px solid var(--border-color); /* Common.css variable */ | ||||
| } | ||||
|  | ||||
| /* Month View */ | ||||
| .month-view { | ||||
|     height: 100%; | ||||
|     padding: 20px; | ||||
| } | ||||
|  | ||||
| .month-grid { | ||||
|     height: 100%; | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
| } | ||||
|  | ||||
| .weekday-headers { | ||||
|     display: grid; | ||||
|     grid-template-columns: repeat(7, 1fr); | ||||
|     gap: 1px; | ||||
|     margin-bottom: 1px; | ||||
| } | ||||
|  | ||||
| .weekday-header { | ||||
|     padding: 16px 8px; | ||||
|     text-align: center; | ||||
|     font-size: 12px; | ||||
|     font-weight: 600; | ||||
|     color: var(--text-secondary); | ||||
|     text-transform: uppercase; | ||||
|     letter-spacing: 0.5px; | ||||
|     background: var(--surface-light); /* Common.css variable */ | ||||
| } | ||||
|  | ||||
| .calendar-grid { | ||||
|     display: grid; | ||||
|     grid-template-columns: repeat(7, 1fr); | ||||
|     grid-template-rows: repeat(6, 1fr); | ||||
|     gap: 1px; | ||||
|     flex: 1; | ||||
|     background: var(--border-color); /* Common.css variable */ | ||||
| } | ||||
|  | ||||
| .calendar-day { | ||||
|     background: var(--surface-light); /* Common.css variable */ | ||||
|     padding: 12px 8px; | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     cursor: pointer; | ||||
|     transition: all 0.2s ease; | ||||
|     position: relative; | ||||
|     overflow: hidden; | ||||
| } | ||||
|  | ||||
| .calendar-day:hover { | ||||
|     background: var(--surface-medium); /* Common.css variable */ | ||||
|     transform: scale(1.02); | ||||
| } | ||||
|  | ||||
| .calendar-day.other-month { | ||||
|     opacity: 0.4; | ||||
| } | ||||
|  | ||||
| .calendar-day.today { | ||||
|     background: var(--primary-accent); /* Common.css variable */ | ||||
|     color: var(--bg-dark); /* Text color on primary accent */ | ||||
|     box-shadow: 0 0 20px color-mix(in srgb, var(--primary-accent) 30%, transparent); /* Glow with common primary */ | ||||
| } | ||||
|  | ||||
| .calendar-day.today .day-number { | ||||
|     color: var(--bg-dark); /* Text color on primary accent */ | ||||
|     font-weight: 700; | ||||
| } | ||||
|  | ||||
| .day-number { | ||||
|     font-size: 14px; | ||||
|     font-weight: 600; | ||||
|     color: var(--text-primary); | ||||
|     margin-bottom: 4px; | ||||
| } | ||||
|  | ||||
| .day-events { | ||||
|     flex: 1; | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     gap: 2px; | ||||
| } | ||||
|  | ||||
| .event-dot { | ||||
|     padding: 2px 6px; | ||||
|     border-radius: 4px; | ||||
|     font-size: 10px; | ||||
|     font-weight: 500; | ||||
|     color: white; | ||||
|     cursor: pointer; | ||||
|     transition: all 0.2s ease; | ||||
|     overflow: hidden; | ||||
|     text-overflow: ellipsis; | ||||
|     white-space: nowrap; | ||||
| } | ||||
|  | ||||
| .event-dot:hover { | ||||
|     transform: scale(1.05); | ||||
|     box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3); | ||||
| } | ||||
|  | ||||
| .event-title { | ||||
|     display: block; | ||||
|     overflow: hidden; | ||||
|     text-overflow: ellipsis; | ||||
|     white-space: nowrap; | ||||
| } | ||||
|  | ||||
| .more-events { | ||||
|     font-size: 10px; | ||||
|     color: var(--text-muted); | ||||
|     font-weight: 500; | ||||
|     padding: 2px 4px; | ||||
|     text-align: center; | ||||
| } | ||||
|  | ||||
| /* Week View */ | ||||
| .week-view { | ||||
|     height: 100%; | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     padding: 20px; | ||||
| } | ||||
|  | ||||
| .week-header { | ||||
|     display: grid; | ||||
|     grid-template-columns: repeat(7, 1fr); | ||||
|     gap: 1px; | ||||
|     margin-bottom: 16px; | ||||
| } | ||||
|  | ||||
| .week-day-header { | ||||
|     padding: 16px 8px; | ||||
|     text-align: center; | ||||
|     background: var(--surface-light); /* Common.css variable */ | ||||
|     border-radius: 8px; | ||||
|     transition: all 0.2s ease; | ||||
| } | ||||
|  | ||||
| .week-day-header.today { | ||||
|     background: var(--primary-accent); /* Common.css variable */ | ||||
|     color: var(--bg-dark); /* Text color on primary accent */ | ||||
|     box-shadow: 0 0 15px color-mix(in srgb, var(--primary-accent) 30%, transparent); /* Glow with common primary */ | ||||
| } | ||||
|  | ||||
| .day-name { | ||||
|     font-size: 12px; | ||||
|     font-weight: 600; | ||||
|     text-transform: uppercase; | ||||
|     letter-spacing: 0.5px; | ||||
|     margin-bottom: 4px; | ||||
| } | ||||
|  | ||||
| .day-number { | ||||
|     font-size: 18px; | ||||
|     font-weight: 700; | ||||
| } | ||||
|  | ||||
| .week-grid { | ||||
|     display: grid; | ||||
|     grid-template-columns: repeat(7, 1fr); | ||||
|     gap: 12px; | ||||
|     flex: 1; | ||||
| } | ||||
|  | ||||
| .week-day-column { | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     gap: 8px; | ||||
|     padding: 8px; | ||||
|     background: var(--surface-light); /* Common.css variable */ | ||||
|     border-radius: 8px; | ||||
|     overflow-y: auto; | ||||
| } | ||||
|  | ||||
| /* Day View */ | ||||
| .day-view { | ||||
|     height: 100%; | ||||
|     padding: 20px; | ||||
|     overflow-y: auto; | ||||
| } | ||||
|  | ||||
| .day-schedule { | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
| } | ||||
|  | ||||
| .time-slots { | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
| } | ||||
|  | ||||
| .time-slot { | ||||
|     display: flex; | ||||
|     min-height: 60px; | ||||
|     border-bottom: 1px solid var(--border-color); /* Common.css variable */ | ||||
| } | ||||
|  | ||||
| .time-label { | ||||
|     width: 80px; | ||||
|     padding: 8px 16px; | ||||
|     font-size: 12px; | ||||
|     font-weight: 500; | ||||
|     color: var(--text-secondary); | ||||
|     background: var(--surface-light); /* Common.css variable */ | ||||
|     display: flex; | ||||
|     align-items: flex-start; | ||||
|     justify-content: flex-end; | ||||
| } | ||||
|  | ||||
| .time-content { | ||||
|     flex: 1; | ||||
|     padding: 8px 16px; | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     gap: 4px; | ||||
| } | ||||
|  | ||||
| /* Agenda View */ | ||||
| .agenda-view { | ||||
|     height: 100%; | ||||
|     padding: 20px; | ||||
|     overflow-y: auto; | ||||
| } | ||||
|  | ||||
| .agenda-list { | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     gap: 12px; | ||||
| } | ||||
|  | ||||
| .agenda-item { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     gap: 16px; | ||||
|     padding: 16px; | ||||
|     background: var(--surface-light); /* Common.css variable */ | ||||
|     border-radius: 12px; | ||||
|     cursor: pointer; | ||||
|     transition: all 0.2s ease; | ||||
|     border-left: 4px solid transparent; | ||||
| } | ||||
|  | ||||
| .agenda-item:hover { | ||||
|     background: var(--surface-medium); /* Common.css variable */ | ||||
|     transform: translateX(4px); | ||||
|     box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2); | ||||
| } | ||||
|  | ||||
| .agenda-date { | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     align-items: center; | ||||
|     min-width: 60px; | ||||
|     padding: 8px; | ||||
|     background: var(--surface-dark); /* Common.css variable */ | ||||
|     border-radius: 8px; | ||||
| } | ||||
|  | ||||
| .date-day { | ||||
|     font-size: 20px; | ||||
|     font-weight: 700; | ||||
|     color: var(--text-primary); | ||||
|     line-height: 1; | ||||
| } | ||||
|  | ||||
| .date-month { | ||||
|     font-size: 12px; | ||||
|     font-weight: 500; | ||||
|     color: var(--text-secondary); | ||||
|     text-transform: uppercase; | ||||
| } | ||||
|  | ||||
| .agenda-event-indicator { | ||||
|     width: 4px; | ||||
|     height: 40px; | ||||
|     border-radius: 2px; | ||||
|     flex-shrink: 0; | ||||
| } | ||||
|  | ||||
| .agenda-event-details { | ||||
|     flex: 1; | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     gap: 4px; | ||||
| } | ||||
|  | ||||
| .agenda-event-title { | ||||
|     font-size: 16px; | ||||
|     font-weight: 600; | ||||
|     color: var(--text-primary); | ||||
| } | ||||
|  | ||||
| .agenda-event-time { | ||||
|     font-size: 14px; | ||||
|     color: var(--text-secondary); | ||||
|     font-weight: 500; | ||||
| } | ||||
|  | ||||
| .agenda-event-description { | ||||
|     font-size: 14px; | ||||
|     color: var(--text-secondary); | ||||
|     line-height: 1.4; | ||||
| } | ||||
|  | ||||
| .agenda-event-location { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     gap: 6px; | ||||
|     font-size: 12px; | ||||
|     color: var(--text-muted); | ||||
| } | ||||
|  | ||||
| .agenda-event-location i { | ||||
|     font-size: 10px; | ||||
| } | ||||
|  | ||||
| .agenda-event-type { | ||||
|     padding: 6px 12px; | ||||
|     border-radius: 16px; | ||||
|     font-size: 12px; | ||||
|     font-weight: 600; | ||||
|     text-transform: uppercase; | ||||
|     letter-spacing: 0.5px; | ||||
|     background: var(--surface-dark); /* Common.css variable */ | ||||
|     color: var(--text-secondary); | ||||
| } | ||||
|  | ||||
| /* Event Blocks */ | ||||
| .event-block { | ||||
|     padding: 8px 12px; | ||||
|     background: var(--surface-light); /* Common.css variable */ | ||||
|     border-radius: 6px; | ||||
|     border-left: 4px solid var(--primary-accent); /* Common.css variable */ | ||||
|     cursor: pointer; | ||||
|     transition: all 0.2s ease; | ||||
|     margin-bottom: 4px; | ||||
| } | ||||
|  | ||||
| .event-block:hover { | ||||
|     background: var(--surface-medium); /* Common.css variable */ | ||||
|     transform: translateX(2px); | ||||
|     box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2); | ||||
| } | ||||
|  | ||||
| .event-block .event-title { | ||||
|     font-size: 13px; | ||||
|     font-weight: 600; | ||||
|     color: var(--text-primary); | ||||
|     margin-bottom: 2px; | ||||
| } | ||||
|  | ||||
| .event-block .event-location { | ||||
|     font-size: 11px; | ||||
|     color: var(--text-muted); | ||||
| } | ||||
|  | ||||
| /* Event Type Styles */ | ||||
| .event-meeting { | ||||
|     border-left-color: var(--primary-accent) !important; /* Mapped to common primary */ | ||||
| } | ||||
|  | ||||
| .event-deadline { | ||||
|     border-left-color: #ef4444 !important; /* Literal color (original var(--error)) */ | ||||
| } | ||||
|  | ||||
| .event-milestone { | ||||
|     border-left-color: #10b981 !important; /* Literal color (original var(--success)) */ | ||||
| } | ||||
|  | ||||
| .event-social { | ||||
|     border-left-color: #8b5cf6 !important; /* Literal color (original var(--accent)) */ | ||||
| } | ||||
|  | ||||
| .event-workshop { | ||||
|     border-left-color: #f59e0b !important; /* Literal color (original var(--warning)) */ | ||||
| } | ||||
|  | ||||
| .event-conference { | ||||
|     border-left-color: #06b6d4 !important; /* Literal color (original var(--info)) */ | ||||
| } | ||||
|  | ||||
| .event-personal { | ||||
|     border-left-color: #6b7280 !important; /* Literal color (original var(--secondary)) */ | ||||
| } | ||||
|  | ||||
| /* Agenda Event Type Colors */ | ||||
| .agenda-event-type.event-meeting { | ||||
|     background: var(--primary-accent); /* Mapped to common primary */ | ||||
|     color: var(--bg-dark); /* Text on primary accent */ | ||||
| } | ||||
|  | ||||
| .agenda-event-type.event-deadline { | ||||
|     background: #ef4444; /* Literal color */ | ||||
|     color: white; | ||||
| } | ||||
|  | ||||
| .agenda-event-type.event-milestone { | ||||
|     background: #10b981; /* Literal color */ | ||||
|     color: white; | ||||
| } | ||||
|  | ||||
| .agenda-event-type.event-social { | ||||
|     background: #8b5cf6; /* Literal color */ | ||||
|     color: white; | ||||
| } | ||||
|  | ||||
| .agenda-event-type.event-workshop { | ||||
|     background: #f59e0b; /* Literal color */ | ||||
|     color: var(--bg-dark); /* Text on amber/orange */ | ||||
| } | ||||
|  | ||||
| .agenda-event-type.event-conference { | ||||
|     background: #06b6d4; /* Literal color */ | ||||
|     color: var(--bg-dark); /* Text on cyan */ | ||||
| } | ||||
|  | ||||
| .agenda-event-type.event-personal { | ||||
|     background: #6b7280; /* Literal color */ | ||||
|     color: white; /* Text on gray */ | ||||
| } | ||||
|  | ||||
| /* Scrollbar styling is now handled globally by common.css */ | ||||
|  | ||||
| /* Responsive design */ | ||||
| @media (max-width: 768px) { | ||||
|     .calendar-view-container { | ||||
|         margin: 20px; | ||||
|         height: calc(100vh - 80px); | ||||
|     } | ||||
|      | ||||
|     .calendar-header { | ||||
|         flex-direction: column; | ||||
|         gap: 16px; | ||||
|         align-items: stretch; | ||||
|     } | ||||
|      | ||||
|     .calendar-navigation { | ||||
|         justify-content: center; | ||||
|     } | ||||
|      | ||||
|     .calendar-title { | ||||
|         text-align: center; | ||||
|         font-size: 20px; | ||||
|     } | ||||
|      | ||||
|     .calendar-view-switcher { | ||||
|         justify-content: center; | ||||
|     } | ||||
|      | ||||
|     .weekday-header, | ||||
|     .week-day-header { | ||||
|         padding: 12px 4px; | ||||
|         font-size: 11px; | ||||
|     } | ||||
|      | ||||
|     .calendar-day { | ||||
|         padding: 8px 4px; | ||||
|     } | ||||
|      | ||||
|     .day-number { | ||||
|         font-size: 12px; | ||||
|     } | ||||
|      | ||||
|     .event-dot { | ||||
|         font-size: 9px; | ||||
|         padding: 1px 4px; | ||||
|     } | ||||
|      | ||||
|     .week-grid { | ||||
|         grid-template-columns: 1fr; | ||||
|         gap: 8px; | ||||
|     } | ||||
|      | ||||
|     .agenda-item { | ||||
|         flex-direction: column; | ||||
|         align-items: flex-start; | ||||
|         gap: 12px; | ||||
|     } | ||||
|      | ||||
|     .agenda-date { | ||||
|         align-self: flex-start; | ||||
|     } | ||||
| } | ||||
|  | ||||
| @media (max-width: 480px) { | ||||
|     .calendar-view-switcher { | ||||
|         flex-wrap: wrap; | ||||
|     } | ||||
|      | ||||
|     .view-btn { | ||||
|         flex: 1; | ||||
|         min-width: 0; | ||||
|         justify-content: center; | ||||
|     } | ||||
|      | ||||
|     .calendar-grid { | ||||
|         grid-template-rows: repeat(6, minmax(80px, 1fr)); | ||||
|     } | ||||
|      | ||||
|     .time-label { | ||||
|         width: 60px; | ||||
|         font-size: 10px; | ||||
|     } | ||||
| } | ||||
| @@ -1,125 +0,0 @@ | ||||
| .members-view .view-title { /* Assuming h1 in component is styled this way */ | ||||
|     color: var(--primary-accent); /* Common.css variable */ | ||||
|     text-align: center; | ||||
|     margin-bottom: var(--spacing-xl); /* Was 30px */ | ||||
|     font-size: 2em; | ||||
| } | ||||
|  | ||||
| .member-ripples-container { /* Default flex layout */ | ||||
|     display: flex; | ||||
|     flex-wrap: wrap; | ||||
|     justify-content: center; | ||||
|     gap: 35px; /* Increased gap for circular elements */ | ||||
|     padding: 20px 0; /* Add some vertical padding to the container */ | ||||
| } | ||||
|  | ||||
| .member-ripples-container.geometric-layout { /* For 1-4 members */ | ||||
|     position: relative; /* Context for absolute positioning */ | ||||
|     min-height: 400px; /* Ensure container has space for positioned items */ | ||||
|     /* Override flex properties if they were set directly on the class before */ | ||||
|     display: block; /* Or whatever is appropriate to override flex if needed */ | ||||
|     flex-wrap: nowrap; /* Override */ | ||||
|     justify-content: initial; /* Override */ | ||||
|     gap: 0; /* Override */ | ||||
|     padding: 0; /* Override or adjust as needed */ | ||||
| } | ||||
|  | ||||
| /* Styles for .member-ripple when inside .geometric-layout */ | ||||
| .member-ripples-container.geometric-layout .member-ripple { | ||||
|     position: absolute; | ||||
|     /* left, top, and transform will be set by inline styles from Rust */ | ||||
|     /* Other .member-ripple styles (size, border-radius, etc.) still apply */ | ||||
| } | ||||
|  | ||||
| /* End of rules for .member-ripples-container and its variants */ | ||||
|  | ||||
| .member-ripple { /* Renamed from .member-card */ | ||||
|     background-color: var(--surface-dark); /* Common.css variable */ | ||||
|     width: 180px; | ||||
|     height: 180px; | ||||
|     border-radius: 50%; /* Circular shape */ | ||||
|     padding: var(--spacing-md); /* Was 15px */ | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     align-items: center; | ||||
|     justify-content: center; | ||||
|     text-align: center; | ||||
|     box-shadow: var(--shadow-medium); /* Common.css variable, was 0 5px 15px rgba(0,0,0,0.35) */ | ||||
|     border: 2px solid var(--border-color); /* Common.css variable */ | ||||
|     transition: transform var(--transition-speed) ease, box-shadow var(--transition-speed) ease; /* Common.css variable */ | ||||
|     position: relative; /* For potential future ripple pseudo-elements */ | ||||
| } | ||||
|  | ||||
| .member-ripple:hover { | ||||
|     transform: scale(1.05); | ||||
|     box-shadow: 0 0 25px color-mix(in srgb, var(--primary-accent) 40%, transparent); /* Glow with common primary */ | ||||
| } | ||||
|  | ||||
| .member-avatar { | ||||
|     position: relative; /* For status indicator positioning */ | ||||
|     width: 90px; /* Slightly smaller to give more space for text */ | ||||
|     height: 90px; /* Keep square */ | ||||
|     margin-bottom: 10px; /* Adjusted margin for flex layout */ | ||||
|     border-radius: 50%; | ||||
|     overflow: hidden; /* Ensures image stays within circle */ | ||||
|     border: 3px solid var(--primary-accent); /* Common.css variable */ | ||||
| } | ||||
|  | ||||
| .member-avatar img { | ||||
|     width: 100%; | ||||
|     height: 100%; | ||||
|     object-fit: cover; | ||||
| } | ||||
|  | ||||
| .status-indicator { /* No changes needed for status indicator position relative to avatar */ | ||||
|     position: absolute; | ||||
|     bottom: 5px; /* Relative to avatar */ | ||||
|     right: 5px;  /* Relative to avatar */ | ||||
|     width: 18px; /* Slightly smaller to fit smaller avatar */ | ||||
|     height: 18px; | ||||
|     border-radius: 50%; | ||||
|     border: 2px solid var(--surface-dark); /* Common.css variable, for contrast */ | ||||
| } | ||||
|  | ||||
| .status-online { | ||||
|     background-color: #4CAF50; /* Green */ | ||||
| } | ||||
|  | ||||
| .status-away { | ||||
|     background-color: #FFC107; /* Amber */ | ||||
| } | ||||
|  | ||||
| .status-offline { | ||||
|     background-color: #757575; /* Grey */ | ||||
| } | ||||
|  | ||||
| .member-info { /* Added to ensure text is constrained if needed */ | ||||
|     max-width: 90%; /* Prevent text overflow if names are too long */ | ||||
| } | ||||
|  | ||||
| .member-info h3 { | ||||
|     margin: 5px 0 2px 0; /* Adjusted margins */ | ||||
|     color: var(--text-primary); /* Common.css variable */ | ||||
|     font-size: 1.0em; /* Slightly smaller */ | ||||
|     line-height: 1.2;  | ||||
|     word-break: break-word; /* Prevent long names from breaking layout */ | ||||
| } | ||||
|  | ||||
| .member-info .member-role { | ||||
|     font-size: 0.8em; /* Slightly smaller */ | ||||
|     color: var(--text-secondary); /* Common.css variable */ | ||||
|     font-style: italic; | ||||
|     line-height: 1.1; | ||||
|     word-break: break-word; | ||||
| } | ||||
|  | ||||
| .members-view .empty-state { | ||||
|     text-align: center; | ||||
|     padding: 50px; | ||||
|     color: var(--text-secondary); /* Common.css variable */ | ||||
| } | ||||
|  | ||||
| .members-view .empty-state p { | ||||
|     margin-bottom: 10px; | ||||
|     font-size: 1.1em; | ||||
| } | ||||
| @@ -1,977 +0,0 @@ | ||||
| /* Projects View - Game-like Minimalistic Design */ | ||||
| /* :root variables moved to common.css or are view-specific if necessary */ | ||||
|  | ||||
| .projects-view-container { | ||||
|     /* Extends .view-container from common.css */ | ||||
|     height: calc(100vh - 120px); /* Specific height */ | ||||
|     margin: 100px 40px 60px 40px; /* Specific margins */ | ||||
|     /* font-family will be inherited from common.css body */ | ||||
|     /* Other .view-container properties are inherited or set by common.css */ | ||||
| } | ||||
|  | ||||
| /* Header */ | ||||
| .projects-header { | ||||
|     /* Extends .view-header from common.css */ | ||||
|     /* .view-header provides: display, justify-content, align-items, padding-bottom, border-bottom, margin-bottom */ | ||||
|     /* Original margin-bottom: 24px (var(--spacing-lg)); padding: 0 8px (var(--spacing-sm) on sides) */ | ||||
|     /* common.css .view-header has margin-bottom: var(--spacing-md) (16px). Override if 24px is needed. */ | ||||
|     margin-bottom: var(--spacing-lg); /* Explicitly use 24px equivalent */ | ||||
|     padding: 0 var(--spacing-sm); /* Explicitly use 8px equivalent for side padding */ | ||||
| } | ||||
|  | ||||
| .projects-tabs { | ||||
|     display: flex; | ||||
|     gap: var(--spacing-sm); /* Was 8px */ | ||||
|     background: var(--surface-dark); /* Common.css variable */ | ||||
|     border: 1px solid var(--border-color); /* Common.css variable */ | ||||
|     border-radius: var(--border-radius-large); /* Was 12px */ | ||||
|     padding: 6px; /* Specific padding */ | ||||
| } | ||||
|  | ||||
| .tab-btn { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     gap: var(--spacing-sm); /* Was 8px */ | ||||
|     background: transparent; | ||||
|     color: var(--text-secondary); /* Common.css variable */ | ||||
|     border: none; | ||||
|     padding: 12px 16px; /* Specific padding */ | ||||
|     border-radius: var(--border-radius-medium); /* Common.css variable */ | ||||
|     cursor: pointer; | ||||
|     font-size: 14px; | ||||
|     font-weight: 500; | ||||
|     transition: all 0.2s ease; | ||||
|     position: relative; | ||||
|     overflow: hidden; | ||||
| } | ||||
|  | ||||
| .tab-btn::before { | ||||
|     content: ''; | ||||
|     position: absolute; | ||||
|     top: 0; | ||||
|     left: -100%; | ||||
|     width: 100%; | ||||
|     height: 100%; | ||||
|     background: linear-gradient(90deg, transparent, rgba(255,255,255,0.1), transparent); | ||||
|     transition: left 0.5s ease; | ||||
| } | ||||
|  | ||||
| .tab-btn:hover::before { | ||||
|     left: 100%; | ||||
| } | ||||
|  | ||||
| .tab-btn:hover { | ||||
|     color: var(--text-primary); /* Common.css variable */ | ||||
|     background: var(--surface-medium); /* Common.css variable for hover */ | ||||
|     transform: translateY(-1px); | ||||
| } | ||||
|  | ||||
| .tab-btn.active { | ||||
|     background: var(--primary-accent); /* Common.css variable */ | ||||
|     color: var(--bg-dark); /* Text color on primary accent */ | ||||
|     box-shadow: 0 0 20px color-mix(in srgb, var(--primary-accent) 30%, transparent); /* Glow with common primary */ | ||||
| } | ||||
|  | ||||
| .tab-btn i { | ||||
|     font-size: 16px; | ||||
| } | ||||
|  | ||||
| .projects-actions { | ||||
|     display: flex; | ||||
|     gap: 12px; | ||||
| } | ||||
|  | ||||
| .action-btn { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     gap: var(--spacing-sm); /* Was 8px */ | ||||
|     background: var(--surface-dark); /* Common.css variable */ | ||||
|     color: var(--text-primary); /* Common.css variable */ | ||||
|     border: 1px solid var(--border-color); /* Common.css variable */ | ||||
|     padding: 12px 20px; /* Specific padding */ | ||||
|     border-radius: var(--border-radius-medium); /* Common.css variable */ | ||||
|     cursor: pointer; | ||||
|     font-size: 14px; | ||||
|     font-weight: 500; | ||||
|     transition: all 0.2s ease; | ||||
|     position: relative; | ||||
|     overflow: hidden; | ||||
| } | ||||
|  | ||||
| .action-btn.primary { | ||||
|     background: var(--primary-accent); /* Common.css variable */ | ||||
|     border-color: var(--primary-accent); /* Common.css variable */ | ||||
|     color: var(--bg-dark); /* Text color for primary button */ | ||||
|     box-shadow: 0 0 15px color-mix(in srgb, var(--primary-accent) 20%, transparent); /* Glow with common primary */ | ||||
| } | ||||
|  | ||||
| .action-btn:hover { | ||||
|     transform: translateY(-2px); | ||||
|     box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3); /* Specific shadow */ | ||||
|     background: var(--surface-medium); /* Example: align hover bg with common */ | ||||
|     border-color: var(--primary-accent); /* Example: align hover border with common */ | ||||
| } | ||||
|  | ||||
| .action-btn.primary:hover { | ||||
|     box-shadow: 0 4px 25px color-mix(in srgb, var(--primary-accent) 40%, transparent); /* Glow with common primary */ | ||||
|     background: color-mix(in srgb, var(--primary-accent) 85%, white); /* Common primary button hover */ | ||||
| } | ||||
|  | ||||
| /* Content Area */ | ||||
| .projects-content { | ||||
|     flex: 1; | ||||
|     overflow: hidden; | ||||
|     border-radius: 12px; | ||||
| } | ||||
|  | ||||
| /* Kanban Board */ | ||||
| .kanban-board { | ||||
|     display: flex; | ||||
|     gap: 20px; | ||||
|     height: 100%; | ||||
|     overflow-x: auto; | ||||
|     padding: 8px; | ||||
| } | ||||
|  | ||||
| .kanban-column { | ||||
|     min-width: 300px; | ||||
|     background: var(--surface-dark); /* Common.css variable */ | ||||
|     border: 1px solid var(--border-color); /* Common.css variable */ | ||||
|     border-radius: var(--border-radius-large); /* Common.css variable */ | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     overflow: hidden; | ||||
| } | ||||
|  | ||||
| .column-header { | ||||
|     padding: 16px 20px; | ||||
|     border-bottom: 1px solid var(--border-color); /* Common.css variable */ | ||||
|     display: flex; | ||||
|     justify-content: space-between; | ||||
|     align-items: center; | ||||
|     background: var(--surface-light); /* Common.css variable */ | ||||
| } | ||||
|  | ||||
| .column-header h3 { | ||||
|     margin: 0; | ||||
|     font-size: 16px; | ||||
|     font-weight: 600; | ||||
|     color: var(--text-primary); | ||||
| } | ||||
|  | ||||
| .task-count { | ||||
|     background: var(--surface-medium); /* Common.css variable */ | ||||
|     color: var(--text-secondary); /* Common.css variable */ | ||||
|     padding: 4px 8px; | ||||
|     border-radius: var(--border-radius-large); /* Common.css variable */ | ||||
|     font-size: 12px; | ||||
|     font-weight: 600; | ||||
| } | ||||
|  | ||||
| .column-content { | ||||
|     flex: 1; | ||||
|     padding: 16px; | ||||
|     overflow-y: auto; | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     gap: 12px; | ||||
| } | ||||
|  | ||||
| /* Task Cards */ | ||||
| .task-card { | ||||
|     background: var(--surface-light); /* Common.css variable */ | ||||
|     border: 1px solid var(--border-color); /* Common.css variable */ | ||||
|     border-radius: var(--border-radius-medium); /* Common.css variable */ | ||||
|     padding: var(--spacing-md); /* Was 16px */ | ||||
|     cursor: pointer; | ||||
|     transition: all 0.2s ease; | ||||
|     position: relative; | ||||
|     overflow: hidden; | ||||
| } | ||||
|  | ||||
| .task-card::before { | ||||
|     content: ''; | ||||
|     position: absolute; | ||||
|     top: 0; | ||||
|     left: 0; | ||||
|     right: 0; | ||||
|     bottom: 0; | ||||
|     background: linear-gradient(135deg, rgba(255,255,255,0.05), transparent); | ||||
|     opacity: 0; | ||||
|     transition: opacity 0.2s ease; | ||||
| } | ||||
|  | ||||
| .task-card:hover::before { | ||||
|     opacity: 1; | ||||
| } | ||||
|  | ||||
| .task-card:hover { | ||||
|     transform: translateY(-2px); | ||||
|     border-color: var(--primary-accent); /* Common.css variable */ | ||||
|     box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2); /* Specific shadow */ | ||||
| } | ||||
|  | ||||
| .task-header { | ||||
|     display: flex; | ||||
|     justify-content: space-between; | ||||
|     align-items: center; | ||||
|     margin-bottom: 8px; | ||||
| } | ||||
|  | ||||
| .task-priority { | ||||
|     width: 8px; | ||||
|     height: 8px; | ||||
|     border-radius: 50%; | ||||
| } | ||||
|  | ||||
| .task-id { | ||||
|     font-size: 11px; | ||||
|     color: var(--text-muted); | ||||
|     font-weight: 600; | ||||
|     text-transform: uppercase; | ||||
| } | ||||
|  | ||||
| .task-title { | ||||
|     margin: 0 0 8px 0; | ||||
|     font-size: 14px; | ||||
|     font-weight: 600; | ||||
|     color: var(--text-primary); | ||||
|     line-height: 1.3; | ||||
| } | ||||
|  | ||||
| .task-description { | ||||
|     margin: 0 0 12px 0; | ||||
|     font-size: 12px; | ||||
|     color: var(--text-secondary); | ||||
|     line-height: 1.4; | ||||
|     display: -webkit-box; | ||||
|     -webkit-line-clamp: 2; | ||||
|     -webkit-box-orient: vertical; | ||||
|     overflow: hidden; | ||||
| } | ||||
|  | ||||
| .task-footer { | ||||
|     display: flex; | ||||
|     justify-content: space-between; | ||||
|     align-items: center; | ||||
|     gap: 8px; | ||||
| } | ||||
|  | ||||
| .task-assignee { | ||||
|     width: 24px; | ||||
|     height: 24px; | ||||
|     border-radius: 50%; | ||||
|     overflow: hidden; | ||||
|     border: 2px solid var(--border-color); /* Common.css variable */ | ||||
| } | ||||
|  | ||||
| .task-assignee img { | ||||
|     width: 100%; | ||||
|     height: 100%; | ||||
|     object-fit: cover; | ||||
| } | ||||
|  | ||||
| .task-assignee.unassigned { | ||||
|     background: var(--surface-medium); /* Common.css variable */ | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     justify-content: center; | ||||
|     color: var(--text-muted); | ||||
|     font-size: 10px; | ||||
| } | ||||
|  | ||||
| .story-points { | ||||
|     background: #06b6d4; /* Literal info color */ | ||||
|     color: var(--bg-dark); /* Text on cyan */ | ||||
|     padding: 2px 6px; | ||||
|     border-radius: 4px; | ||||
|     font-size: 11px; | ||||
|     font-weight: 600; | ||||
| } | ||||
|  | ||||
| .task-tags { | ||||
|     display: flex; | ||||
|     gap: 4px; | ||||
| } | ||||
|  | ||||
| .tag { | ||||
|     background: var(--surface-medium); /* Common.css variable */ | ||||
|     color: var(--text-muted); /* Common.css variable */ | ||||
|     padding: 2px 6px; | ||||
|     border-radius: 4px; | ||||
|     font-size: 10px; | ||||
|     font-weight: 500; | ||||
| } | ||||
|  | ||||
| .add-task-placeholder { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     justify-content: center; | ||||
|     gap: var(--spacing-sm); /* Was 8px */ | ||||
|     padding: var(--spacing-md); /* Was 16px */ | ||||
|     border: 2px dashed var(--border-color); /* Common.css variable */ | ||||
|     border-radius: var(--border-radius-medium); /* Common.css variable */ | ||||
|     color: var(--text-muted); /* Common.css variable */ | ||||
|     cursor: pointer; | ||||
|     transition: all 0.2s ease; | ||||
|     margin-top: auto; | ||||
| } | ||||
|  | ||||
| .add-task-placeholder:hover { | ||||
|     border-color: var(--primary-accent); /* Common.css variable */ | ||||
|     color: var(--primary-accent); /* Common.css variable */ | ||||
|     background: color-mix(in srgb, var(--primary-accent) 5%, transparent); /* Use common primary with alpha */ | ||||
| } | ||||
|  | ||||
| /* Epics View */ | ||||
| .epics-view { | ||||
|     height: 100%; | ||||
|     overflow-y: auto; | ||||
|     padding: 8px; | ||||
| } | ||||
|  | ||||
| .epics-grid { | ||||
|     display: grid; | ||||
|     grid-template-columns: repeat(auto-fill, minmax(350px, 1fr)); | ||||
|     gap: 20px; | ||||
| } | ||||
|  | ||||
| .epic-card { | ||||
|     background: var(--surface-dark); /* Common.css variable */ | ||||
|     border: 1px solid var(--border-color); /* Common.css variable */ | ||||
|     border-radius: var(--border-radius-large); /* Common.css variable */ | ||||
|     overflow: hidden; | ||||
|     transition: all 0.2s ease; | ||||
|     cursor: pointer; | ||||
| } | ||||
|  | ||||
| .epic-card:hover { | ||||
|     transform: translateY(-4px); | ||||
|     box-shadow: 0 8px 30px rgba(0, 0, 0, 0.3); | ||||
| } | ||||
|  | ||||
| .epic-header { | ||||
|     padding: 20px; | ||||
|     color: white; | ||||
|     position: relative; | ||||
|     overflow: hidden; | ||||
| } | ||||
|  | ||||
| .epic-header::before { | ||||
|     content: ''; | ||||
|     position: absolute; | ||||
|     top: 0; | ||||
|     left: 0; | ||||
|     right: 0; | ||||
|     bottom: 0; | ||||
|     background: linear-gradient(135deg, rgba(255,255,255,0.1), transparent); | ||||
| } | ||||
|  | ||||
| .epic-header h3 { | ||||
|     margin: 0 0 8px 0; | ||||
|     font-size: 18px; | ||||
|     font-weight: 700; | ||||
|     position: relative; | ||||
|     z-index: 1; | ||||
| } | ||||
|  | ||||
| .epic-status { | ||||
|     font-size: 12px; | ||||
|     font-weight: 600; | ||||
|     text-transform: uppercase; | ||||
|     opacity: 0.9; | ||||
|     position: relative; | ||||
|     z-index: 1; | ||||
| } | ||||
|  | ||||
| .epic-content { | ||||
|     padding: 20px; | ||||
| } | ||||
|  | ||||
| .epic-description { | ||||
|     margin: 0 0 16px 0; | ||||
|     font-size: 14px; | ||||
|     color: var(--text-secondary); | ||||
|     line-height: 1.5; | ||||
| } | ||||
|  | ||||
| .epic-progress { | ||||
|     margin-bottom: 16px; | ||||
| } | ||||
|  | ||||
| .progress-bar { | ||||
|     width: 100%; | ||||
|     height: 6px; | ||||
|     background: var(--surface-medium); /* Common.css variable */ | ||||
|     border-radius: var(--border-radius-small); /* Common.css variable */ | ||||
|     overflow: hidden; | ||||
|     margin-bottom: 8px; | ||||
| } | ||||
|  | ||||
| .progress-fill { | ||||
|     height: 100%; | ||||
|     border-radius: 3px; | ||||
|     transition: width 0.3s ease; | ||||
| } | ||||
|  | ||||
| .progress-text { | ||||
|     font-size: 12px; | ||||
|     color: var(--text-muted); | ||||
|     font-weight: 500; | ||||
| } | ||||
|  | ||||
| .epic-footer { | ||||
|     display: flex; | ||||
|     justify-content: space-between; | ||||
|     align-items: center; | ||||
| } | ||||
|  | ||||
| .epic-owner { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     gap: 8px; | ||||
| } | ||||
|  | ||||
| .epic-owner img, | ||||
| .avatar-placeholder { | ||||
|     width: 24px; | ||||
|     height: 24px; | ||||
|     border-radius: 50%; | ||||
|     border: 2px solid var(--border-color); /* Common.css variable */ | ||||
| } | ||||
|  | ||||
| .avatar-placeholder { | ||||
|     background: var(--surface-medium); /* Common.css variable */ | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     justify-content: center; | ||||
|     color: var(--text-muted); | ||||
|     font-size: 10px; | ||||
| } | ||||
|  | ||||
| .epic-owner span { | ||||
|     font-size: 12px; | ||||
|     color: var(--text-secondary); | ||||
|     font-weight: 500; | ||||
| } | ||||
|  | ||||
| .epic-date { | ||||
|     font-size: 12px; | ||||
|     color: var(--text-muted); | ||||
|     font-weight: 500; | ||||
| } | ||||
|  | ||||
| /* Sprints View */ | ||||
| .sprints-view { | ||||
|     height: 100%; | ||||
|     overflow-y: auto; | ||||
|     padding: 8px; | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     gap: 16px; | ||||
| } | ||||
|  | ||||
| .sprint-card { | ||||
|     background: var(--surface-dark); /* Common.css variable */ | ||||
|     border: 1px solid var(--border-color); /* Common.css variable */ | ||||
|     border-radius: var(--border-radius-large); /* Common.css variable */ | ||||
|     padding: var(--spacing-lg); /* Was 20px */ | ||||
|     transition: all 0.2s ease; | ||||
|     cursor: pointer; | ||||
| } | ||||
|  | ||||
| .sprint-card:hover { | ||||
|     transform: translateY(-2px); | ||||
|     border-color: var(--primary-accent); /* Common.css variable */ | ||||
|     box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2); /* Specific shadow */ | ||||
| } | ||||
|  | ||||
| .sprint-header { | ||||
|     display: flex; | ||||
|     justify-content: space-between; | ||||
|     align-items: flex-start; | ||||
|     margin-bottom: 16px; | ||||
| } | ||||
|  | ||||
| .sprint-info h3 { | ||||
|     margin: 0 0 4px 0; | ||||
|     font-size: 18px; | ||||
|     font-weight: 600; | ||||
|     color: var(--text-primary); | ||||
| } | ||||
|  | ||||
| .sprint-goal { | ||||
|     margin: 0; | ||||
|     font-size: 14px; | ||||
|     color: var(--text-secondary); | ||||
|     line-height: 1.4; | ||||
| } | ||||
|  | ||||
| .sprint-badge { | ||||
|     background: var(--surface-medium); /* Common.css variable */ | ||||
|     color: var(--text-secondary); /* Common.css variable */ | ||||
|     padding: 6px 12px; | ||||
|     border-radius: 16px; | ||||
|     font-size: 12px; | ||||
|     font-weight: 600; | ||||
|     text-transform: uppercase; | ||||
| } | ||||
|  | ||||
| .sprint-badge.active { | ||||
|     background: #10b981; /* Literal success color */ | ||||
|     color: white; | ||||
|     box-shadow: 0 0 15px color-mix(in srgb, #10b981 30%, transparent); /* Glow with literal success */ | ||||
| } | ||||
|  | ||||
| .sprint-metrics { | ||||
|     display: grid; | ||||
|     grid-template-columns: repeat(4, 1fr); | ||||
|     gap: 16px; | ||||
|     margin-bottom: 16px; | ||||
| } | ||||
|  | ||||
| .metric { | ||||
|     text-align: center; | ||||
| } | ||||
|  | ||||
| .metric-value { | ||||
|     display: block; | ||||
|     font-size: 24px; | ||||
|     font-weight: 700; | ||||
|     color: var(--text-primary); | ||||
|     margin-bottom: 4px; | ||||
| } | ||||
|  | ||||
| .metric-label { | ||||
|     font-size: 12px; | ||||
|     color: var(--text-muted); | ||||
|     text-transform: uppercase; | ||||
|     font-weight: 500; | ||||
| } | ||||
|  | ||||
| .sprint-progress { | ||||
|     margin-bottom: 16px; | ||||
| } | ||||
|  | ||||
| .sprint-dates { | ||||
|     display: flex; | ||||
|     justify-content: center; | ||||
|     align-items: center; | ||||
|     gap: 12px; | ||||
|     font-size: 12px; | ||||
|     color: var(--text-muted); | ||||
|     font-weight: 500; | ||||
| } | ||||
|  | ||||
| /* Roadmap View */ | ||||
| .roadmap-view { | ||||
|     height: 100%; | ||||
|     overflow-y: auto; | ||||
|     padding: 8px 40px; | ||||
| } | ||||
|  | ||||
| .roadmap-timeline { | ||||
|     position: relative; | ||||
|     padding-left: 40px; | ||||
| } | ||||
|  | ||||
| .roadmap-timeline::before { | ||||
|     content: ''; | ||||
|     position: absolute; | ||||
|     left: 20px; | ||||
|     top: 0; | ||||
|     bottom: 0; | ||||
|     width: 2px; | ||||
|     background: var(--border-color); /* Common.css variable */ | ||||
| } | ||||
|  | ||||
| .roadmap-item { | ||||
|     position: relative; | ||||
|     margin-bottom: 32px; | ||||
|     padding-left: 40px; | ||||
| } | ||||
|  | ||||
| .roadmap-marker { | ||||
|     position: absolute; | ||||
|     left: -28px; | ||||
|     top: 8px; | ||||
|     width: 16px; | ||||
|     height: 16px; | ||||
|     border-radius: 50%; | ||||
|     border: 4px solid var(--surface-dark); /* Common.css variable */ | ||||
|     box-shadow: 0 0 0 2px var(--border-color); /* Common.css variable */ | ||||
| } | ||||
|  | ||||
| .roadmap-content { | ||||
|     background: var(--surface-dark); /* Common.css variable */ | ||||
|     border: 1px solid var(--border-color); /* Common.css variable */ | ||||
|     border-radius: var(--border-radius-large); /* Common.css variable */ | ||||
|     padding: var(--spacing-lg); /* Was 20px */ | ||||
|     transition: all 0.2s ease; | ||||
| } | ||||
|  | ||||
| .roadmap-content:hover { | ||||
|     transform: translateX(8px); | ||||
|     border-color: var(--primary-accent); /* Common.css variable */ | ||||
| } | ||||
|  | ||||
| .roadmap-content h4 { | ||||
|     margin: 0 0 8px 0; | ||||
|     font-size: 16px; | ||||
|     font-weight: 600; | ||||
|     color: var(--text-primary); | ||||
| } | ||||
|  | ||||
| .roadmap-content p { | ||||
|     margin: 0 0 16px 0; | ||||
|     font-size: 14px; | ||||
|     color: var(--text-secondary); | ||||
|     line-height: 1.5; | ||||
| } | ||||
|  | ||||
| .roadmap-progress { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     gap: 12px; | ||||
| } | ||||
|  | ||||
| .roadmap-progress .progress-bar { | ||||
|     flex: 1; | ||||
| } | ||||
|  | ||||
| .roadmap-progress span { | ||||
|     font-size: 12px; | ||||
|     color: var(--text-muted); | ||||
|     font-weight: 600; | ||||
| } | ||||
|  | ||||
| /* Analytics View */ | ||||
| .analytics-view { | ||||
|     height: 100%; | ||||
|     overflow-y: auto; | ||||
|     padding: 8px; | ||||
| } | ||||
|  | ||||
| .analytics-grid { | ||||
|     display: grid; | ||||
|     grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); | ||||
|     gap: 20px; | ||||
| } | ||||
|  | ||||
| .analytics-card { | ||||
|     background: var(--surface-dark); /* Common.css variable */ | ||||
|     border: 1px solid var(--border-color); /* Common.css variable */ | ||||
|     border-radius: var(--border-radius-large); /* Common.css variable */ | ||||
|     padding: var(--spacing-lg); /* Was 24px */ | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     gap: 16px; | ||||
|     transition: all 0.2s ease; | ||||
|     cursor: pointer; | ||||
|     position: relative; | ||||
|     overflow: hidden; | ||||
| } | ||||
|  | ||||
| .analytics-card::before { | ||||
|     content: ''; | ||||
|     position: absolute; | ||||
|     top: 0; | ||||
|     left: 0; | ||||
|     right: 0; | ||||
|     bottom: 0; | ||||
|     background: linear-gradient(135deg, rgba(255,255,255,0.05), transparent); | ||||
|     opacity: 0; | ||||
|     transition: opacity 0.2s ease; | ||||
| } | ||||
|  | ||||
| .analytics-card:hover::before { | ||||
|     opacity: 1; | ||||
| } | ||||
|  | ||||
| .analytics-card:hover { | ||||
|     transform: translateY(-4px); | ||||
|     box-shadow: 0 8px 30px rgba(0, 0, 0, 0.3); | ||||
| } | ||||
|  | ||||
| .card-icon { | ||||
|     width: 48px; | ||||
|     height: 48px; | ||||
|     border-radius: 12px; | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     justify-content: center; | ||||
|     font-size: 20px; | ||||
|     color: white; | ||||
|     position: relative; | ||||
|     z-index: 1; | ||||
| } | ||||
|  | ||||
| .card-icon.tasks { background: var(--primary-accent); } /* Common.css variable */ | ||||
| .card-icon.completed { background: #10b981; } /* Literal success color */ | ||||
| .card-icon.progress { background: #f59e0b; } /* Literal warning color */ | ||||
| .card-icon.epics { background: #8b5cf6; } /* Literal accent color */ | ||||
| .card-icon.sprints { background: #06b6d4; } /* Literal info color */ | ||||
| /* Text color for .card-icon.progress should be var(--bg-dark) for contrast */ | ||||
| .card-icon.progress { color: var(--bg-dark); } | ||||
| .card-icon.sprints { color: var(--bg-dark); } /* Text on cyan */ | ||||
|  | ||||
| .card-content h3 { | ||||
|     margin: 0 0 4px 0; | ||||
|     font-size: 28px; | ||||
|     font-weight: 700; | ||||
|     color: var(--text-primary); | ||||
| } | ||||
|  | ||||
| .card-content p { | ||||
|     margin: 0; | ||||
|     font-size: 14px; | ||||
|     color: var(--text-secondary); | ||||
|     font-weight: 500; | ||||
| } | ||||
|  | ||||
| /* Gantt View */ | ||||
| .gantt-view { | ||||
|     height: 100%; | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     overflow: hidden; /* Allow internal scrolling for chart */ | ||||
|     padding: 8px; | ||||
| } | ||||
|  | ||||
| .gantt-header { | ||||
|     display: flex; | ||||
|     justify-content: space-between; | ||||
|     align-items: center; | ||||
|     margin-bottom: 16px; | ||||
|     padding: 0 8px; | ||||
| } | ||||
|  | ||||
| .gantt-header h3 { | ||||
|     margin: 0; | ||||
|     font-size: 18px; | ||||
|     font-weight: 600; | ||||
|     color: var(--text-primary); | ||||
| } | ||||
|  | ||||
| .gantt-controls { | ||||
|     display: flex; | ||||
|     gap: 8px; | ||||
| } | ||||
|  | ||||
| .gantt-zoom-btn { | ||||
|     background: var(--surface-dark); /* Common.css variable */ | ||||
|     color: var(--text-secondary); /* Common.css variable */ | ||||
|     border: 1px solid var(--border-color); /* Common.css variable */ | ||||
|     padding: 8px 12px; | ||||
|     border-radius: var(--border-radius-medium); /* Was 6px */ | ||||
|     cursor: pointer; | ||||
|     font-size: 13px; | ||||
|     font-weight: 500; | ||||
|     transition: all 0.2s ease; | ||||
| } | ||||
|  | ||||
| .gantt-zoom-btn:hover { | ||||
|     color: var(--text-primary); /* Common.css variable */ | ||||
|     background: var(--surface-medium); /* Common.css variable */ | ||||
|     border-color: var(--primary-accent); /* Common.css variable */ | ||||
| } | ||||
|  | ||||
| .gantt-zoom-btn.active { | ||||
|     background: var(--primary-accent); /* Common.css variable */ | ||||
|     color: var(--bg-dark); /* Text on primary accent */ | ||||
|     border-color: var(--primary-accent); /* Common.css variable */ | ||||
|     box-shadow: 0 0 10px color-mix(in srgb, var(--primary-accent) 30%, transparent); /* Glow with common primary */ | ||||
| } | ||||
|  | ||||
| .gantt-chart { | ||||
|     flex: 1; | ||||
|     overflow-x: auto; /* Horizontal scroll for timeline */ | ||||
|     overflow-y: auto; /* Vertical scroll for rows */ | ||||
|     background: var(--surface-dark); /* Common.css variable */ | ||||
|     border: 1px solid var(--border-color); /* Common.css variable */ | ||||
|     border-radius: var(--border-radius-large); /* Common.css variable */ | ||||
|     padding: var(--spacing-md); /* Was 16px */ | ||||
| } | ||||
|  | ||||
| .gantt-timeline { | ||||
|     position: relative; | ||||
|     min-width: 1200px; /* Ensure there's enough space for a year view, adjust as needed */ | ||||
| } | ||||
|  | ||||
| .timeline-header { | ||||
|     position: sticky; | ||||
|     top: 0; | ||||
|     background: var(--surface-light); /* Common.css variable */ | ||||
|     z-index: 10; | ||||
|     border-bottom: 1px solid var(--border-color); /* Common.css variable */ | ||||
|     padding-bottom: var(--spacing-sm); /* Was 8px */ | ||||
|     margin-bottom: 8px; | ||||
| } | ||||
|  | ||||
| .timeline-months { | ||||
|     display: flex; | ||||
|     white-space: nowrap; | ||||
| } | ||||
|  | ||||
| .timeline-month { | ||||
|     flex: 1 0 auto; /* Allow shrinking but prefer base size */ | ||||
|     min-width: 80px; /* Approximate width for a month, adjust as needed */ | ||||
|     text-align: center; | ||||
|     padding: 8px 0; | ||||
|     color: var(--text-secondary); /* Common.css variable */ | ||||
|     font-size: 12px; | ||||
|     font-weight: 500; | ||||
|     border-right: 1px solid var(--border-color); /* Common.css variable */ | ||||
| } | ||||
|  | ||||
| .timeline-month:last-child { | ||||
|     border-right: none; | ||||
| } | ||||
|  | ||||
| .gantt-rows { | ||||
|     position: relative; | ||||
| } | ||||
|  | ||||
| .gantt-row { | ||||
|     display: flex; | ||||
|     align-items: stretch; /* Make label and timeline same height */ | ||||
|     border-bottom: 1px solid var(--border-color); /* Common.css variable */ | ||||
|     transition: background-color var(--transition-speed) ease; | ||||
| } | ||||
|  | ||||
| .gantt-row:last-child { | ||||
|     border-bottom: none; | ||||
| } | ||||
|  | ||||
| .gantt-row:hover { | ||||
|     background-color: var(--surface-medium); /* Common.css variable */ | ||||
| } | ||||
|  | ||||
| .gantt-row-label { | ||||
|     width: 250px; /* Fixed width for labels */ | ||||
|     padding: 12px 16px; | ||||
|     border-right: 1px solid var(--border-color); /* Common.css variable */ | ||||
|     background-color: var(--surface-light); /* Common.css variable */ | ||||
|     flex-shrink: 0; /* Prevent label from shrinking */ | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     justify-content: center; | ||||
| } | ||||
|  | ||||
| .epic-info h4 { | ||||
|     margin: 0 0 4px 0; | ||||
|     font-size: 14px; | ||||
|     font-weight: 600; | ||||
|     color: var(--text-primary); | ||||
|     white-space: nowrap; | ||||
|     overflow: hidden; | ||||
|     text-overflow: ellipsis; | ||||
| } | ||||
|  | ||||
| .epic-progress-text { | ||||
|     font-size: 11px; | ||||
|     color: var(--text-muted); | ||||
|     font-weight: 500; | ||||
| } | ||||
|  | ||||
| .gantt-row-timeline { | ||||
|     flex: 1; | ||||
|     position: relative; | ||||
|     padding: 12px 0; /* Vertical padding for bars */ | ||||
|     min-height: 40px; /* Ensure row has some height for the bar */ | ||||
| } | ||||
|  | ||||
| .gantt-bar { | ||||
|     position: absolute; | ||||
|     height: 24px; /* Height of the bar */ | ||||
|     top: 50%; | ||||
|     transform: translateY(-50%); | ||||
|     border-radius: var(--border-radius-small); /* Common.css variable */ | ||||
|     background-color: var(--primary-accent); /* Default bar color, Common.css variable */ | ||||
|     box-shadow: 0 2px 5px rgba(0,0,0,0.2); /* Specific shadow */ | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     overflow: hidden; | ||||
|     transition: all 0.2s ease; | ||||
| } | ||||
|  | ||||
| .gantt-bar:hover { | ||||
|     opacity: 1 !important; /* Ensure hover is visible */ | ||||
|     transform: translateY(-50%) scale(1.02); | ||||
| } | ||||
|  | ||||
| .gantt-progress { | ||||
|     height: 100%; | ||||
|     background-color: #10b981; /* Literal success color */ | ||||
|     border-radius: var(--border-radius-small) 0 0 var(--border-radius-small); /* Common.css variable */ | ||||
|     opacity: 0.7; | ||||
|     transition: width 0.3s ease; | ||||
| } | ||||
|  | ||||
| .gantt-bar .gantt-progress[style*="width: 100%"] { | ||||
|     border-radius: var(--border-radius-small); /* Common.css variable */ | ||||
| } | ||||
|  | ||||
|  | ||||
| /* Scrollbar styling is now handled globally by common.css */ | ||||
|  | ||||
| /* Responsive design */ | ||||
| @media (max-width: 768px) { | ||||
|     .projects-view-container { | ||||
|         margin: 20px; | ||||
|         height: calc(100vh - 80px); | ||||
|     } | ||||
|      | ||||
|     .projects-header { | ||||
|         flex-direction: column; | ||||
|         gap: 16px; | ||||
|         align-items: stretch; | ||||
|     } | ||||
|      | ||||
|     .projects-tabs { | ||||
|         justify-content: center; | ||||
|     } | ||||
|      | ||||
|     .kanban-board { | ||||
|         flex-direction: column; | ||||
|         gap: 16px; | ||||
|     } | ||||
|      | ||||
|     .kanban-column { | ||||
|         min-width: auto; | ||||
|         max-height: 400px; | ||||
|     } | ||||
|      | ||||
|     .epics-grid { | ||||
|         grid-template-columns: 1fr; | ||||
|     } | ||||
|      | ||||
|     .sprint-metrics { | ||||
|         grid-template-columns: repeat(2, 1fr); | ||||
|     } | ||||
|      | ||||
|     .analytics-grid { | ||||
|         grid-template-columns: repeat(2, 1fr); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @media (max-width: 480px) { | ||||
|     .projects-tabs { | ||||
|         flex-wrap: wrap; | ||||
|     } | ||||
|      | ||||
|     .tab-btn { | ||||
|         flex: 1; | ||||
|         min-width: 0; | ||||
|         justify-content: center; | ||||
|     } | ||||
|      | ||||
|     .tab-btn span { | ||||
|         display: none; | ||||
|     } | ||||
|      | ||||
|     .sprint-metrics, | ||||
|     .analytics-grid { | ||||
|         grid-template-columns: 1fr; | ||||
|     } | ||||
| } | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,320 +0,0 @@ | ||||
| /* Timeline View - Ultra Minimalistic Design */ | ||||
| /* :root variables moved to common.css or are view-specific if necessary */ | ||||
|  | ||||
| .timeline-view-container { | ||||
|     /* Extends .view-container from common.css but with flex-direction: row */ | ||||
|     flex-direction: row; /* Specific direction for this view */ | ||||
|     height: calc(100vh - 120px); /* Specific height */ | ||||
|     margin: 60px 40px 60px 40px; /* Specific margins */ | ||||
|     gap: var(--spacing-lg); /* Was 24px */ | ||||
|     /* font-family will be inherited from common.css body */ | ||||
|     /* Other .view-container properties are inherited or set by common.css */ | ||||
| } | ||||
|  | ||||
| .timeline-sidebar { | ||||
|     width: 280px; | ||||
|     background: var(--surface-dark); /* Common.css variable */ | ||||
|     border: 1px solid var(--border-color); /* Common.css variable */ | ||||
|     border-radius: var(--border-radius-large); /* Common.css variable */ | ||||
|     padding: var(--spacing-lg); /* Was 24px */ | ||||
|     overflow-y: auto; | ||||
|     flex-shrink: 0; | ||||
| } | ||||
|  | ||||
| .timeline-sidebar h4 { | ||||
|     margin: 0 0 16px 0; | ||||
|     font-size: 14px; | ||||
|     color: var(--text-primary); | ||||
|     font-weight: 600; | ||||
|     letter-spacing: 0.5px; | ||||
|     text-transform: uppercase; | ||||
| } | ||||
|  | ||||
| .sidebar-section { | ||||
|     margin-bottom: 32px; | ||||
| } | ||||
|  | ||||
| .sidebar-section:last-child { | ||||
|     margin-bottom: 0; | ||||
| } | ||||
|  | ||||
| .filter-options, | ||||
| .time-range-options { | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     gap: 8px; | ||||
| } | ||||
|  | ||||
| .filter-btn { | ||||
|     background: transparent; | ||||
|     color: var(--text-secondary); /* Common.css variable */ | ||||
|     border: 1px solid var(--border-color); /* Common.css variable */ | ||||
|     padding: 12px 16px; | ||||
|     border-radius: var(--border-radius-medium); /* Common.css variable */ | ||||
|     cursor: pointer; | ||||
|     font-size: 14px; | ||||
|     font-weight: 500; | ||||
|     transition: all 0.2s ease; | ||||
|     text-align: left; | ||||
| } | ||||
|  | ||||
| .filter-btn:hover { | ||||
|     background: var(--surface-medium); /* Common.css variable for hover */ | ||||
|     color: var(--text-primary); /* Common.css variable */ | ||||
|     border-color: var(--primary-accent); /* Common interaction color */ | ||||
| } | ||||
|  | ||||
| .filter-btn.active { | ||||
|     background: var(--primary-accent); /* Common.css variable */ | ||||
|     color: var(--bg-dark); /* Text color on primary accent */ | ||||
|     border-color: var(--primary-accent); /* Common.css variable */ | ||||
| } | ||||
|  | ||||
| .timeline-content { | ||||
|     flex: 1; | ||||
|     background: var(--surface-dark); /* Common.css variable */ | ||||
|     border: 1px solid var(--border-color); /* Common.css variable */ | ||||
|     border-radius: var(--border-radius-large); /* Common.css variable */ | ||||
|     overflow-y: auto; | ||||
|     padding: var(--spacing-lg); /* Was 24px */ | ||||
| } | ||||
|  | ||||
| .timeline-feed { | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     gap: 32px; | ||||
| } | ||||
|  | ||||
| .timeline-day-group { | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
| } | ||||
|  | ||||
| .timeline-date-header { | ||||
|     margin-bottom: 20px; | ||||
|     padding-bottom: 12px; | ||||
|     border-bottom: 1px solid var(--border-color); /* Common.css variable */ | ||||
| } | ||||
|  | ||||
| .timeline-date-header h3 { | ||||
|     margin: 0; | ||||
|     font-size: 18px; | ||||
|     font-weight: 600; | ||||
|     color: var(--text-primary); | ||||
| } | ||||
|  | ||||
| .timeline-day-actions { | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     gap: 20px; | ||||
|     position: relative; | ||||
| } | ||||
|  | ||||
| .timeline-day-actions::before { | ||||
|     content: ''; | ||||
|     position: absolute; | ||||
|     left: 32px; | ||||
|     top: 0; | ||||
|     bottom: 0; | ||||
|     width: 2px; | ||||
|     background: var(--border-color); /* Common.css variable */ | ||||
| } | ||||
|  | ||||
| .timeline-action { | ||||
|     display: flex; | ||||
|     gap: 16px; | ||||
|     position: relative; | ||||
|     padding-left: 8px; | ||||
| } | ||||
|  | ||||
| .timeline-action-avatar { | ||||
|     position: relative; | ||||
|     flex-shrink: 0; | ||||
| } | ||||
|  | ||||
| .timeline-action-avatar img { | ||||
|     width: 48px; | ||||
|     height: 48px; | ||||
|     border-radius: 50%; | ||||
|     border: 2px solid var(--border-color); /* Common.css variable */ | ||||
| } | ||||
|  | ||||
| .timeline-action-icon { | ||||
|     position: absolute; | ||||
|     bottom: -4px; | ||||
|     right: -4px; | ||||
|     width: 24px; | ||||
|     height: 24px; | ||||
|     border-radius: 50%; | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     justify-content: center; | ||||
|     border: 2px solid var(--surface-dark); /* Common.css variable */ | ||||
| } | ||||
|  | ||||
| .timeline-action-icon i { | ||||
|     font-size: 10px; | ||||
|     color: white; | ||||
| } | ||||
|  | ||||
| .timeline-action-content { | ||||
|     flex: 1; | ||||
|     background: var(--surface-medium); /* Common.css variable */ | ||||
|     border: 1px solid var(--border-color); /* Common.css variable */ | ||||
|     border-radius: var(--border-radius-large); /* Common.css variable */ | ||||
|     padding: var(--spacing-md); /* Was 16px */ | ||||
|     transition: all 0.2s ease; | ||||
| } | ||||
|  | ||||
| .timeline-action-content:hover { | ||||
|     border-color: var(--primary-accent); /* Common interaction color */ | ||||
| } | ||||
|  | ||||
| .timeline-action-header { | ||||
|     display: flex; | ||||
|     flex-wrap: wrap; | ||||
|     align-items: center; | ||||
|     gap: 6px; | ||||
|     margin-bottom: 8px; | ||||
|     font-size: 14px; | ||||
|     line-height: 1.4; | ||||
| } | ||||
|  | ||||
| .timeline-actor-name { | ||||
|     font-weight: 600; | ||||
|     color: var(--text-primary); | ||||
| } | ||||
|  | ||||
| .timeline-action-title { | ||||
|     color: var(--text-secondary); | ||||
| } | ||||
|  | ||||
| .timeline-circle-name { | ||||
|     color: var(--text-muted); | ||||
|     font-size: 13px; | ||||
| } | ||||
|  | ||||
| .timeline-action-description { | ||||
|     margin: 12px 0; | ||||
|     font-size: 14px; | ||||
|     line-height: 1.5; | ||||
|     color: var(--text-secondary); | ||||
| } | ||||
|  | ||||
| .timeline-action-target { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     gap: var(--spacing-sm); /* Was 8px */ | ||||
|     margin: 12px 0; | ||||
|     padding: 8px 12px; | ||||
|     background: var(--surface-dark); /* Common.css variable */ | ||||
|     border: 1px solid var(--border-color); /* Common.css variable */ | ||||
|     border-radius: var(--border-radius-medium); /* Common.css variable */ | ||||
|     font-size: 13px; | ||||
|     color: var(--text-secondary); | ||||
| } | ||||
|  | ||||
| .timeline-action-target i { | ||||
|     color: var(--text-muted); | ||||
|     font-size: 12px; | ||||
| } | ||||
|  | ||||
| .timeline-action-footer { | ||||
|     display: flex; | ||||
|     justify-content: space-between; | ||||
|     align-items: center; | ||||
|     margin-top: 12px; | ||||
|     padding-top: 12px; | ||||
|     border-top: 1px solid var(--border-color); /* Common.css variable */ | ||||
| } | ||||
|  | ||||
| .timeline-timestamp { | ||||
|     font-size: 12px; | ||||
|     color: var(--text-muted); | ||||
|     font-weight: 500; | ||||
| } | ||||
|  | ||||
| .timeline-metadata { | ||||
|     display: flex; | ||||
|     gap: 8px; | ||||
|     flex-wrap: wrap; | ||||
| } | ||||
|  | ||||
| .metadata-tag { | ||||
|     background: var(--surface-dark); /* Common.css variable */ | ||||
|     color: var(--text-muted); /* Common.css variable */ | ||||
|     padding: 4px 8px; | ||||
|     border-radius: var(--border-radius-small); /* Common.css variable */ | ||||
|     font-size: 11px; | ||||
|     font-weight: 500; | ||||
|     border: 1px solid var(--border-color); /* Common.css variable */ | ||||
| } | ||||
|  | ||||
| .empty-state { | ||||
|     text-align: center; | ||||
|     color: var(--text-secondary); | ||||
|     font-size: 14px; | ||||
|     margin-top: 40px; | ||||
| } | ||||
|  | ||||
| /* Action type color variations */ | ||||
| .timeline-action-icon.primary { | ||||
|     background-color: var(--primary-accent); /* Common.css variable */ | ||||
| } | ||||
|  | ||||
| .timeline-action-icon.secondary { | ||||
|     background-color: #6b7280; /* Literal secondary color */ | ||||
| } | ||||
|  | ||||
| .timeline-action-icon.success { | ||||
|     background-color: #10b981; /* Literal success color */ | ||||
| } | ||||
|  | ||||
| .timeline-action-icon.warning { | ||||
|     background-color: #f59e0b; /* Literal warning color */ | ||||
| } | ||||
| .timeline-action-icon.warning i { color: var(--bg-dark); } /* Adjust icon color for contrast */ | ||||
|  | ||||
| .timeline-action-icon.info { | ||||
|     background-color: #06b6d4; /* Literal info color */ | ||||
| } | ||||
| .timeline-action-icon.info i { color: var(--bg-dark); } /* Adjust icon color for contrast */ | ||||
|  | ||||
| .timeline-action-icon.accent { | ||||
|     background-color: #8b5cf6; /* Literal accent color */ | ||||
| } | ||||
|  | ||||
| /* Scrollbar styling is now handled globally by common.css */ | ||||
|  | ||||
| /* Responsive design */ | ||||
| @media (max-width: 768px) { | ||||
|     .timeline-view-container { | ||||
|         flex-direction: column; | ||||
|         margin: 20px; | ||||
|         height: calc(100vh - 80px); | ||||
|     } | ||||
|      | ||||
|     .timeline-sidebar { | ||||
|         width: 100%; | ||||
|         height: auto; | ||||
|         max-height: 200px; | ||||
|     } | ||||
|      | ||||
|     .timeline-day-actions::before { | ||||
|         left: 24px; | ||||
|     } | ||||
|      | ||||
|     .timeline-action-avatar img { | ||||
|         width: 40px; | ||||
|         height: 40px; | ||||
|     } | ||||
|      | ||||
|     .timeline-action-icon { | ||||
|         width: 20px; | ||||
|         height: 20px; | ||||
|     } | ||||
|      | ||||
|     .timeline-action-icon i { | ||||
|         font-size: 8px; | ||||
|     } | ||||
| } | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -16,9 +16,7 @@ pub use auth::{AuthCredentials, AuthError, AuthResult}; | ||||
| // Platform-specific WebSocket imports and spawn function | ||||
| #[cfg(target_arch = "wasm32")] | ||||
| use { | ||||
|     gloo_net::websocket::{ | ||||
|         futures::WebSocket, Message as GlooWsMessage, WebSocketError as GlooWebSocketError, | ||||
|     }, | ||||
|     gloo_net::websocket::{futures::WebSocket, Message as GlooWsMessage}, | ||||
|     wasm_bindgen_futures::spawn_local, | ||||
| }; | ||||
|  | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								src/server_ws/.DS_Store
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/server_ws/.DS_Store
									
									
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							
		Reference in New Issue
	
	Block a user