diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml
index 4b874a1c..ce510d9a 100644
--- a/.github/workflows/deploy-docs.yml
+++ b/.github/workflows/deploy-docs.yml
@@ -4,6 +4,7 @@ on:
push:
branches:
- main
+ - website-customDeviceSimulation
workflow_dispatch:
permissions:
diff --git a/website/docs/technical/architecture.md b/website/docs/technical/architecture.md
index 9d104d68..a72f56ab 100644
--- a/website/docs/technical/architecture.md
+++ b/website/docs/technical/architecture.md
@@ -51,10 +51,6 @@ graph TD
UI -->|Import / Call| State
State -->|D-Bus / Sync Commands| Service
```
-
-
-*Figure 1: Component layout and communication lines between UI, JavaScript models, and Python backend services.*
-
## Documentation intent
This technical section should answer:
diff --git a/website/sidebars.js b/website/sidebars.js
index 06fe3175..dc9a322e 100644
--- a/website/sidebars.js
+++ b/website/sidebars.js
@@ -7,8 +7,8 @@ const sidebars = {
"user/overview",
"user/install-and-run",
"user/setup-and-sync",
- "user/features",
- "user/all-features",
+ // "user/features",
+ // "user/all-features",
"user/troubleshooting",
{
type: "category",
diff --git a/website/src/pages/index.js b/website/src/pages/index.js
index 56e97128..72de5c79 100644
--- a/website/src/pages/index.js
+++ b/website/src/pages/index.js
@@ -177,6 +177,1668 @@ function TerminalPreview() {
);
}
+function DeviceSimulator() {
+ const [orientation, setOrientation] = useState("portrait");
+ const [menuOpen, setMenuOpen] = useState(false);
+ const [activeScreen, setActiveScreen] = useState("Dashboard");
+ const [searchQuery, setSearchQuery] = useState("");
+ const [filterType, setFilterType] = useState("most-time");
+ const [themeMode, setThemeMode] = useState("light"); // Forced light mode by default
+ const [portraitWidth, setPortraitWidth] = useState(360);
+ const [portraitHeight, setPortraitHeight] = useState(720);
+ const [landscapeWidth, setLandscapeWidth] = useState(900);
+ const [landscapeHeight, setLandscapeHeight] = useState(520);
+
+ const containerRef = useRef(null);
+ const [scale, setScale] = useState(1);
+
+ useEffect(() => {
+ if (typeof window === "undefined" || !containerRef.current) return;
+
+ const handleResize = () => {
+ if (!containerRef.current) return;
+ const containerWidth = containerRef.current.getBoundingClientRect().width;
+ const frameWidth = (orientation === "portrait" ? portraitWidth : landscapeWidth) + 28;
+ const buffer = 16; // breathing room gutter (8px on each side)
+ const targetWidth = frameWidth + buffer;
+
+ if (containerWidth < targetWidth) {
+ setScale(containerWidth / targetWidth);
+ } else {
+ setScale(1);
+ }
+ };
+
+ handleResize();
+
+ const observer = new ResizeObserver(() => {
+ handleResize();
+ });
+
+ observer.observe(containerRef.current);
+
+ return () => {
+ observer.disconnect();
+ };
+ }, [orientation, portraitWidth, landscapeWidth, portraitHeight, landscapeHeight]);
+
+ const menuItems = [
+ { name: "Dashboard", icon: "π ", target: "Dashboard" },
+ { name: "Timesheet", icon: "β±", target: "Timesheets" },
+ { name: "Activities", icon: "π
", target: "Activities" },
+ { name: "My Tasks", icon: "β", target: "My Tasks" },
+ { name: "All Tasks", icon: "β", target: "All Tasks" },
+ { name: "Projects", icon: "π", target: "Projects" },
+ { name: "Project Updates", icon: "π", target: "Project Updates" },
+ { name: "About Us", icon: "βΉ", target: "About Us" },
+ { name: "Settings", icon: "β", target: "Settings" }
+ ];
+
+ const projectsData = [
+ { name: "Project Alpha - Phase 1", time: "4507.0 h", percent: 92, color: "#e07a24", tasks: 6 },
+ { name: "Core Productivity Suite", time: "2187.6 h", percent: 75, color: "#e53935", tasks: 124 },
+ { name: "Database Migration v18", time: "1240.0 h", percent: 55, color: "#1e88e5", tasks: 28 },
+ { name: "Mobile Client App", time: "680.0 h", percent: 40, color: "#43a047", tasks: 15 },
+ { name: "Collaborative Editor", time: "420.0 h", percent: 28, color: "#ffb300", tasks: 10 },
+ { name: "OS Platform Layer", time: "280.0 h", percent: 18, color: "#00acc1", tasks: 8 },
+ { name: "Technical Support Queue", time: "230.0 h", percent: 12, color: "#8e24aa", tasks: 5 },
+ { name: "API Documentation", time: "150.0 h", percent: 8, color: "#d81b60", tasks: 2 }
+ ];
+
+ const timesheetsData = [
+ {
+ title: "test timesheet this thing this...",
+ project: "Project Alpha / Child A (Demo)",
+ task: "User manual",
+ author: "Alex Mercer",
+ hours: "5:00 H",
+ date: "2026-04-24",
+ action: "Do",
+ borderColor: "#e07a24"
+ },
+ {
+ title: "Test",
+ project: "Project Alpha / Child A (Demo)",
+ task: "This is a Notification Test.",
+ author: "Sarah Connor",
+ hours: "4500:00 H",
+ date: "2026-05-05",
+ action: "Unknown",
+ borderColor: "#999999"
+ },
+ {
+ title: "sub taSK 2 TIMESHEETY",
+ project: "Project Alpha / Child A (Demo)",
+ task: "HR Bundle",
+ author: "Sarah Connor",
+ hours: "2:00 H",
+ date: "2026-04-24",
+ action: "Unknown",
+ borderColor: "#e07a24"
+ },
+ {
+ title: "test",
+ project: "Mobile Client App / Email module (Demo)",
+ task: "Coordination",
+ author: "Sarah Connor",
+ hours: "3:00 H",
+ date: "2026-04-24",
+ action: "Unknown",
+ borderColor: "#e07a24"
+ },
+ {
+ title: "Time Off (1/1)",
+ project: "Internal (Demo)",
+ task: "Time Off",
+ author: "Alex Mercer",
+ hours: "8:00 H",
+ date: "2026-05-01",
+ action: "Unknown",
+ borderColor: "#999999"
+ },
+ {
+ title: "Time Off (1/1)",
+ project: "Internal (Demo)",
+ task: "Time Off",
+ author: "David Miller",
+ hours: "8:00 H",
+ date: "2026-05-01",
+ action: "Unknown",
+ borderColor: "#999999"
+ }
+ ];
+
+ const tasksData = [
+ {
+ title: "[Req] Content hub",
+ project: "Core Productivity Suite",
+ stage: "Analysis",
+ stars: [false, false, false],
+ planned: "N/A",
+ start: "2025-08-08",
+ end: "2025-08-22",
+ overdue: "299 days overdue"
+ },
+ {
+ title: "[IMP - Weblates improvements]",
+ project: "Core Productivity Suite",
+ stage: "Analysis",
+ stars: [true, false, false],
+ planned: "N/A",
+ start: "2025-11-17",
+ end: "2026-01-16",
+ overdue: "152 days overdue"
+ },
+ {
+ title: "Activity Retention",
+ project: "Core Productivity Suite",
+ stage: "Design",
+ stars: [false, false, false],
+ planned: "N/A",
+ start: "2026-01-20",
+ end: "Not set",
+ overdue: null
+ },
+ {
+ title: "Parent task",
+ project: "Project Alpha - Phase 1",
+ stage: "Analysis",
+ stars: [false, false, false],
+ planned: "N/A",
+ start: "2026-04-24",
+ end: "2026-06-08",
+ overdue: "9 days overdue",
+ locked: true,
+ hasTasks: true,
+ borderColor: "#e07a24"
+ },
+ {
+ title: "UI Improvements And Bug Fixes",
+ project: "Core Productivity Suite",
+ stage: "Development",
+ stars: [false, false, false],
+ planned: "N/A",
+ start: "2026-01-21",
+ end: "Not set",
+ overdue: null,
+ borderColor: "#999999"
+ }
+ ];
+
+ const allTasksData = [
+ {
+ title: "Design app launch icon",
+ project: "Mobile App Core",
+ stage: "Completed",
+ stars: [true, true, true],
+ planned: "8.0 H",
+ start: "2026-06-01",
+ end: "2026-06-03",
+ overdue: null,
+ status: "complete",
+ borderColor: "#43a047"
+ },
+ {
+ title: "Implement Docusaurus Search Option",
+ project: "Docs Integration",
+ stage: "Active",
+ stars: [true, true, false],
+ planned: "12.0 H",
+ start: "2026-06-10",
+ end: "2026-06-15",
+ overdue: "2 days overdue",
+ status: "active",
+ borderColor: "#1e88e5"
+ },
+ {
+ title: "Refactor navigation drawer layout",
+ project: "QML Layout Refactoring",
+ stage: "Draft",
+ stars: [true, false, false],
+ planned: "4.0 H",
+ start: "2026-06-15",
+ end: "Not set",
+ overdue: null,
+ status: "draft",
+ borderColor: "#e07a24"
+ },
+ {
+ title: "Write unit tests for Timesheet model",
+ project: "Mobile App Core",
+ stage: "Active",
+ stars: [true, true, true],
+ planned: "16.0 H",
+ start: "2026-06-11",
+ end: "2026-06-18",
+ overdue: null,
+ status: "active",
+ borderColor: "#43a047"
+ }
+ ];
+
+ const projectUpdatesData = [
+ {
+ title: "New Project Update.",
+ author: "Alex Mercer",
+ date: "2026-06-04",
+ project: "25-00005 - Mobile Client App",
+ status: "on_track",
+ completion: 40
+ },
+ {
+ title: "New Update.",
+ author: "Alex Mercer",
+ date: "2026-05-14",
+ project: "25-00005 - Mobile Client App",
+ status: "at_risk",
+ completion: 90
+ },
+ {
+ title: "project update edit after notificat...",
+ author: "Alex Mercer",
+ date: "2026-04-28",
+ project: "Project Alpha - Phase 1...",
+ status: "at_risk",
+ completion: 15
+ },
+ {
+ title: "project update edit after notificat...",
+ author: "Alex Mercer",
+ date: "2026-04-27",
+ project: "Project Alpha - Phase 1...",
+ status: "on_hold",
+ completion: 30
+ },
+ {
+ title: "New project Update",
+ author: "Alex Mercer",
+ date: "2026-04-27",
+ project: "Project Alpha - Phase 1...",
+ status: "on_track",
+ completion: 10
+ }
+ ];
+
+ const activitiesData = [
+ {
+ title: "Activity test for Al...",
+ notes: "No Notes",
+ assigned: "Assigned to: Alex Mercer",
+ type: "To Do",
+ date: "08 May",
+ status: "overdue",
+ iconType: "ellipsis",
+ hasDraft: true
+ },
+ {
+ title: "This is a Activity- ...",
+ notes: "Hello World.",
+ assigned: "Assigned to: Alex Mercer",
+ type: "Meeting",
+ date: "14 May",
+ status: "overdue",
+ iconType: "meeting",
+ hasDraft: false
+ },
+ {
+ title: "Activity assigned to...",
+ notes: "No Notes",
+ assigned: "Assigned to: Alex Mercer",
+ type: "Call",
+ date: "17 May",
+ status: "overdue",
+ iconType: "call",
+ hasDraft: false
+ },
+ {
+ title: "New Activity",
+ notes: "Hello World.",
+ assigned: "Assigned to: Alex Mercer",
+ type: "Call",
+ date: "18 Jun",
+ status: "today",
+ iconType: "call",
+ hasDraft: false
+ }
+ ];
+
+ const filteredProjects = projectsData.filter(p =>
+ p.name.toLowerCase().includes(searchQuery.toLowerCase())
+ );
+
+ // Reusable Left Menu Content
+ const renderMenuList = () => (
+
+ {menuItems.map((item) => (
+ {
+ setActiveScreen(item.target);
+ setMenuOpen(false);
+ }}
+ >
+ {item.icon}
+ {item.name}
+
+ ))}
+
+ );
+
+ // Reusable Eisenhower Matrix Content
+ const renderDashboardMatrix = () => (
+
+
Time spent based on priorities
+
+
+
+
+
URGENT
+
NOT URGENT
+
+
+
+
+ IMPORTANT
+
+
+
+
β
+
Do First
+
{themeMode === "dark" ? "100H" : "9521H"}
+
+
+
+
+
+
+
+ NOT IMPORTANT
+
+
+
+
+
+
π
+
Don't do
+
{themeMode === "dark" ? "0H" : "13H"}
+
+
+
+
+ );
+
+ // Reusable Project Overview Pie & Bar Chart Content
+ const renderProjectOverview = () => (
+ <>
+
+
+ Overview
+
+
+ Projects
+
+
+ Tasks
+
+
+
+ Most Time-Consuming Projects
+
+
+
+
+
+ {/* Segment 1: Orange (Child Project) */}
+
+
+ {/* Segment 2: Red (UT TimeManagement) */}
+
+
+ {/* Segment 3: Blue (CURQ Migration) */}
+
+
+ {/* Segment 4: Green (UT App Dev) */}
+
+
+ {/* Segment 5: Cyan (Notes App Dev) */}
+
+
+
+
+
+
+
+
+ β²
+
+
+ >
+ );
+
+ // Render Timesheets List Screen
+ const renderTimesheetsList = () => (
+
+
+ All
+ Active
+ Draft
+
+
+ {timesheetsData.map((t, idx) => (
+
+
+
+
{t.title}
+ {t.project}
+ {t.task}
+ {t.author}
+
+
+ {t.hours}
+ {t.date}
+ {t.action}
+
+
+ ))}
+
+ );
+
+ // Render My Tasks Screen
+ const renderMyTasksList = () => (
+
+
+ Inbox
+ Today
+ This Week
+ This Month
+
+
+
+ {tasksData.map((task, idx) => (
+
+ {task.borderColor && (
+
+ )}
+
+
{task.title}
+
+ {task.project} {task.locked && "π"}
+
+
+ {task.stars.map((filled, sIdx) => (
+
+ β
+
+ ))}
+
+ {task.hasTasks && (
+
[+1] Tasks
+ )}
+
{task.stage}
+
+
+ Planned (H): {task.planned}
+ Start Date: {task.start}
+ End Date: {task.end}
+ {task.overdue && (
+ {task.overdue}
+ )}
+
+
+ ))}
+
+
+ );
+
+ // Render Timesheet Entry Form
+ const renderTimesheetEntryForm = () => (
+
+
+ Account
+ {themeMode === "dark" ? "demo" : "demo_db"}
+
+
+
+ Project
+
+ {themeMode === "dark" ? "Project Alpha - Phase 1..." : "Project Alpha - Phase 1"}
+
+
+
+
+ Subproject
+ Tap to select
+
+
+
+ Task
+ {themeMode === "dark" ? "Database Migration" : "sub task1"}
+
+
+
+ Subtask
+ Tap to select
+
+
+
+ Priority
+ β
+
+
+
+
+
+
Important, Urgent (1)
+
+
+
+
Important, Not Urgent (2)
+
+
+
+
Urgent, Not Important (3)
+
+
+
+
Not Urgent, Not Important (4)
+
+
+
+
+ Time Tracking
+
+
+
+
+
+
+ {themeMode === "dark" ? "5:04" : "5:00"}
+
+
+
+
+ Date
+ {themeMode === "dark" ? (
+ 10-03-2026
+ ) : (
+
+ Today
+ 24-04-2026
+
+ )}
+
+
+
+
+ );
+
+ // Render Projects List
+ const renderProjectsList = () => (
+
+
+ {projectsData.map((project, idx) => (
+
+
+
{project.name}
+
+ {project.tasks} Tasks
+
+
+
+
+ Total Logged: {project.time}
+ {project.percent}%
+
+
+ {/* Simulated Progress Bar */}
+
+
+ ))}
+
+
+ );
+
+ // Render Project Updates
+ const renderProjectUpdates = () => (
+
+ {/* Tab Bar sticky */}
+
+
+
On Track
+
At Risk
+
Off Track
+
+
+ {/* Project Updates Card list */}
+
+ {projectUpdatesData.map((log, idx) => (
+
+
+ {/* Left description col */}
+
+
{log.title}
+
By: {log.author} | {log.date}
+
{log.project}
+
+ {/* Progress Bar representing Project Completion */}
+
+
+
+ {/* Right status details col */}
+
+
+ {log.status}
+
+ Details
+
+
+ ))}
+
+
+ );
+
+ // Render Activities
+ const renderActivitiesList = () => (
+
+ {/* Tab Bar sticky */}
+
+
+
This Week
+
This Month
+
Later
+
+
+ {/* Activity Card list */}
+
+ {activitiesData.map((act, idx) => (
+
+ {/* Left border strip */}
+
+
+ {/* Left circular icon */}
+
+ {act.iconType === "ellipsis" && (
+
+
+
+
+
+ )}
+ {act.iconType === "meeting" && (
+
+
+
+
+
+
+ )}
+ {act.iconType === "call" && (
+
+
+
+ )}
+
+
+ {/* Middle description col */}
+
+
{act.title}
+
{act.notes}
+
{act.assigned}
+ {act.hasDraft && (
+
Draft
+ )}
+
+
+ {/* Right meta details col */}
+
+ {act.type}
+ {act.date}
+
+ {act.status}
+
+
+
+ ))}
+
+
+ );
+
+ // Render All Tasks List
+ const renderAllTasksList = () => (
+
+
+ All
+ Active
+ Completed
+
+
+
+ {allTasksData.map((task, idx) => (
+
+
+
+
+
+ {task.status === "complete" ? "β" : "β"}
+
+
+ {task.title}
+
+
+
+ {task.project}
+
+
+ {task.stars.map((filled, sIdx) => (
+
+ β
+
+ ))}
+
+
{task.stage}
+
+
+ Planned: {task.planned}
+ Start: {task.start}
+ End: {task.end}
+ {task.overdue && (
+ {task.overdue}
+ )}
+
+
+ ))}
+
+
+ );
+
+ // Render Settings Screen
+ const renderSettingsScreen = () => (
+
+
+
+
Connected Accounts
+
βΊ
+
+
+
+
+
+
Notifications
+
βΊ
+
+
+
+
+
+
Background Sync
+
βΊ
+
+
+
+
+
+
Theme Settings
+
βΊ
+
+
+
+
+
+
Voice Model Settings
+
βΊ
+
+
+ );
+
+ // Render About Screen
+ const renderAboutScreen = () => (
+
+
Time Management - Alpha Draft
+
+
Version 1.2.9
+
+
+ Time Management is a native time-tracking and productivity application built exclusively for Ubuntu Touch phones. It empowers users to manage projects, tasks, timesheets, and activitiesβboth offline and onlineβthrough seamless integration with CURQ and Odoo servers.
+
+
+
What Does This App Do?
+
+ This app is your all-in-one productivity companion on Ubuntu Touch. Whether you're a freelancer tracking billable hours, a project manager overseeing team tasks, or simply someone who wants to stay organized, Time Management has you covered.
+
+
+
Key Features
+
+
+ Project Management: Create and organize projects with full hierarchy support (Projects β Subprojects β Tasks β Subtasks)
+
+
+ Task Tracking: Manage tasks with deadlines, priorities, stages, and assignees
+
+
+ Timesheet Logging: Track your work hours with built-in timers and sync to your server
+
+
+ Activity Management: Log and schedule activities linked to projects and tasks
+
+
+ Project Updates: Create and share project status updates with rich text support
+
+
+ Push Notifications: Stay informed with real-time notifications for assignments and updates
+
+
+ Auto-Sync: Automatic bidirectional synchronization with your CURQ/Odoo server
+
+
+ Offline Support: Work offline and sync when connected
+
+
+ Visual Dashboard: See where your time goes with charts and analytics
+
+
+ Multi-Account: Connect to multiple server instances simultaneously
+
+
+ Dark Mode: Full dark theme support for comfortable viewing
+
+
+
+
+ Recommended Server: CURQ
+
+
+
+ CURQ
+ is the all-in-one platform for your business, fully Open Source and tailored to your needs.
+
+
+ );
+
+ return (
+
+
+
+ {/* Controls Panel */}
+
+
Live Preview
+
Interactive Device Simulator
+
+ Experience the actual TimeManagement user interface directly on an interactive Ubuntu Touch emulator.
+
+
+
+
+
Device Form Factor
+
+ setOrientation("portrait")}
+ >
+ π± Mobile (Portrait)
+
+ setOrientation("landscape")}
+ >
+ π» Convergent (Tablet/Desktop)
+
+
+
+
+
+
+
+
Quick Navigate
+
+ setActiveScreen("Dashboard")}
+ >
+ π Dashboard
+
+ setActiveScreen("Timesheets")}
+ >
+ β± Timesheets
+
+
+
+ setActiveScreen("Timesheet")}
+ >
+ π Entry Form
+
+ setActiveScreen("My Tasks")}
+ >
+ β Tasks
+
+
+
+ setActiveScreen("Projects")}
+ >
+ π Projects
+
+ setActiveScreen("Project Updates")}
+ >
+ π Updates
+
+
+
+ setActiveScreen("Settings")}
+ >
+ β Settings
+
+ setActiveScreen("About Us")}
+ >
+ βΉ About Us
+
+
+
+
+
+
+
Resize Simulator
+
+ {orientation === "portrait" ? (
+
+
+
+ Width: {portraitWidth}px
+ 300 - 480px
+
+
setPortraitWidth(Number(e.target.value))}
+ style={{ width: "100%", accentColor: "#e05a2b", cursor: "ew-resize" }}
+ />
+
+
+
+ Height: {portraitHeight}px
+ 550 - 850px
+
+
setPortraitHeight(Number(e.target.value))}
+ style={{ width: "100%", accentColor: "#e05a2b", cursor: "ew-resize" }}
+ />
+
+
+ ) : (
+
+
+
+ Width: {landscapeWidth}px
+ 750 - 1100px
+
+
setLandscapeWidth(Number(e.target.value))}
+ style={{ width: "100%", accentColor: "#e05a2b", cursor: "ew-resize" }}
+ />
+
+
+
+ Height: {landscapeHeight}px
+ 450 - 700px
+
+
setLandscapeHeight(Number(e.target.value))}
+ style={{ width: "100%", accentColor: "#e05a2b", cursor: "ew-resize" }}
+ />
+
+
+ )}
+
+
{
+ setPortraitWidth(360);
+ setPortraitHeight(720);
+ setLandscapeWidth(900);
+ setLandscapeHeight(520);
+ }}
+ style={{ marginTop: "12px", width: "100%", display: "block", textAlign: "center", fontSize: "0.75rem", padding: "6px" }}
+ >
+ π Reset Dimensions
+
+
+
+
+
π‘
+
Ubuntu Touch gesture: Hover or swipe from the left screen border to toggle the menu drawer, or tap the blue Floating Action Button (FAB).
+
+
+
+
+
+
+
+ {orientation === "portrait" ? (
+ /* ββ PORTRAIT MOBILE VIEW ββ */
+
+ {/* Swipe Hotspot */}
+
setMenuOpen(true)}
+ />
+
+ {/* Top Status Bar */}
+
+
Ubuntu Touch
+
+ πΆ
+ π 88%
+ {themeMode === "dark" ? "12:15 PM" : "5:31 PM"}
+
+
+
+ {/* App Header */}
+
+ {activeScreen === "Timesheet" ? (
+ <>
+ setActiveScreen("Timesheets")}
+ >
+ β¨
+
+ Timesheet
+
+
+ {themeMode === "dark" ? "π" : "β"}
+
+
+ >
+ ) : (
+ <>
+ setMenuOpen(!menuOpen)}
+ >
+ β°
+
+
+ {activeScreen === "Dashboard" && `Account [${themeMode === "dark" ? "demo" : "demo_db"}]`}
+ {activeScreen === "Timesheets" && "Timesheets"}
+ {activeScreen === "My Tasks" && "My Tasks"}
+ {activeScreen === "About Us" && "About"}
+ {activeScreen !== "Dashboard" && activeScreen !== "Timesheets" && activeScreen !== "My Tasks" && activeScreen !== "About Us" && activeScreen}
+
+
+ {activeScreen === "My Tasks" ? (
+ <>
+ π
+ β
+ π
+ β
+ setActiveScreen("Timesheet")}
+ >
+ +
+
+ >
+ ) : activeScreen === "Activities" ? (
+ <>
+ π₯
+ +
+ π
+ >
+ ) : activeScreen === "Project Updates" ? (
+ <>
+ +
+ π
+ >
+ ) : (
+ <>
+ setActiveScreen("Timesheet")}
+ >
+ β±βΊ
+
+ π
+ β
+ >
+ )}
+
+ >
+ )}
+
+
+ {/* Screen Scrollable Body */}
+
+ {activeScreen === "Dashboard" && (
+
+ {renderDashboardMatrix()}
+ {renderProjectOverview()}
+
+ )}
+ {activeScreen === "Timesheets" && (
+
+ {renderTimesheetsList()}
+
+ )}
+ {activeScreen === "Timesheet" && (
+
+ {renderTimesheetEntryForm()}
+
+ )}
+ {activeScreen === "My Tasks" && (
+
+ {renderMyTasksList()}
+
+ )}
+ {activeScreen === "All Tasks" && (
+
+ {renderAllTasksList()}
+
+ )}
+ {activeScreen === "Projects" && (
+
+ {renderProjectsList()}
+
+ )}
+ {activeScreen === "Project Updates" && renderProjectUpdates()}
+ {activeScreen === "Activities" && renderActivitiesList()}
+ {activeScreen === "Settings" && (
+
+ {renderSettingsScreen()}
+
+ )}
+ {activeScreen === "About Us" && (
+
+ {renderAboutScreen()}
+
+ )}
+
+
+ {/* Floating Action Button (FAB) */}
+
{
+ if (activeScreen === "Timesheet") {
+ setActiveScreen("Timesheets");
+ } else {
+ setMenuOpen(!menuOpen);
+ }
+ }}
+ >
+ {activeScreen === "Timesheet" ? "β¨" : "β°"}
+
+
+ {/* Ubuntu Left Menu Drawer */}
+
+
+ {/* Dimmed backdrop when Menu is open */}
+
setMenuOpen(false)}
+ />
+
+ {/* Bottom Home Indicator Gesture bar */}
+
setActiveScreen("Dashboard")}
+ />
+
+ ) : (
+ /* ββ LANDSCAPE CONVERGENT VIEW ββ */
+
+ {/* Top Status Bar */}
+
+
Ubuntu Touch converged workspace
+
+ πΆ
+ π 88%
+ {themeMode === "dark" ? "12:15 PM" : "5:31 PM"}
+
+
+
+
+ {/* Column 1: Permanent Sidebar Menu */}
+
+
+ {/* Column 2: Dashboard/Account Main View */}
+
+
+
+
+ {activeScreen === "Dashboard" && (
+
+ {renderDashboardMatrix()}
+ {renderProjectOverview()}
+
+ )}
+ {activeScreen === "Timesheets" && (
+
+ {renderTimesheetsList()}
+
+ )}
+ {activeScreen === "Timesheet" && (
+
+ {renderTimesheetEntryForm()}
+
+ )}
+ {activeScreen === "My Tasks" && (
+
+ {renderMyTasksList()}
+
+ )}
+ {activeScreen === "All Tasks" && (
+
+ {renderAllTasksList()}
+
+ )}
+ {activeScreen === "Projects" && (
+
+ {renderProjectsList()}
+
+ )}
+ {activeScreen === "Project Updates" && renderProjectUpdates()}
+ {activeScreen === "Activities" && renderActivitiesList()}
+ {activeScreen === "Settings" && (
+
+ {renderSettingsScreen()}
+
+ )}
+ {activeScreen === "About Us" && (
+
+ {renderAboutScreen()}
+
+ )}
+
+
+ setActiveScreen("Timesheet")}
+ >
+ β±βΊ
+
+
+
+ {/* Column 3: Charts / Projects View */}
+
+
+
+
+
+ Projectwise Time Spent
+
+
+
+ {projectsData.map((p) => (
+
+
+ {p.name}
+
+
+
+
+ {p.time.split(" ")[0]}
+
+
+
+ ))}
+
+
+
+ Show next 10 β
+
+
+
+
+ Projects
+
+ 9490.0 h
+
+
+
setSearchQuery(e.target.value)}
+ style={{
+ background: themeMode === "dark" ? "#222" : "#fff",
+ borderColor: themeMode === "dark" ? "#444" : "#ccc",
+ color: themeMode === "dark" ? "#fff" : "#333"
+ }}
+ />
+
+
+ setFilterType("most-time")}
+ style={{ color: themeMode === "dark" ? "#aaa" : "#666" }}
+ >
+ Most time
+
+ setFilterType("tasks")}
+ style={{ color: themeMode === "dark" ? "#aaa" : "#666" }}
+ >
+ Tasks
+
+ setFilterType("a-z")}
+ style={{ color: themeMode === "dark" ? "#aaa" : "#666" }}
+ >
+ A-Z
+
+
+
+
+ {filteredProjects.map((p) => (
+
+
+
+ {p.name}
+
+
+ {p.time}
+
+
+
+ {p.tasks} tasks
+
+
+
+ ))}
+
+
+
+
+
+ {/* Bottom indicator gesture bar */}
+
setActiveScreen("Dashboard")}
+ />
+
+ )}
+
+
+
+
+
+
+
+ );
+}
+
export default function Home() {
const mainRef = useScrollReveal();
@@ -247,6 +1909,9 @@ export default function Home() {
+ {/* ββ INTERACTIVE MOBILE MODEL ββ */}
+
+
{/* ββ ARCHITECTURE ββ */}
diff --git a/website/src/pages/index.module.css b/website/src/pages/index.module.css
index 08b5710c..6bba28c5 100644
--- a/website/src/pages/index.module.css
+++ b/website/src/pages/index.module.css
@@ -580,3 +580,2085 @@
border-right: none;
}
}
+
+/* ββ Interactive Device Workbench ββ */
+.workbenchSection {
+ background: #0b110e;
+ color: #c8bfa8;
+ border-top: 1px solid rgba(224, 122, 36, 0.15);
+ border-bottom: 1px solid rgba(224, 122, 36, 0.15);
+ padding: 6rem 0;
+ position: relative;
+ overflow: hidden;
+}
+
+.workbenchSection::before {
+ content: "";
+ position: absolute;
+ inset: 0;
+ background-image:
+ linear-gradient(rgba(224, 122, 36, 0.02) 1px, transparent 1px),
+ linear-gradient(90deg, rgba(224, 122, 36, 0.02) 1px, transparent 1px);
+ background-size: 24px 24px;
+ pointer-events: none;
+}
+
+.workbenchGrid {
+ display: grid;
+ grid-template-columns: 1fr;
+ gap: 3rem;
+ align-items: center;
+}
+
+@media (min-width: 1200px) {
+ .workbenchGrid {
+ grid-template-columns: 360px 1fr;
+ }
+}
+
+.workbenchPanel {
+ z-index: 2;
+}
+
+.panelTitle {
+ font-family: "Space Grotesk", sans-serif;
+ font-size: 2.2rem;
+ font-weight: 700;
+ line-height: 1.1;
+ color: #f0ebe0;
+ margin-bottom: 1rem;
+ letter-spacing: -0.02em;
+}
+
+.panelDesc {
+ color: #9aa89c;
+ font-size: 0.95rem;
+ line-height: 1.6;
+ margin-bottom: 2rem;
+}
+
+.controlGroup {
+ display: flex;
+ flex-direction: column;
+ gap: 1.25rem;
+ background: #111a14;
+ border: 1px solid rgba(224, 122, 36, 0.15);
+ padding: 1.5rem;
+ border-radius: 2px;
+}
+
+.controlLabel {
+ font-size: 0.65rem;
+ font-weight: 700;
+ letter-spacing: 0.12em;
+ text-transform: uppercase;
+ color: #8f9e91;
+ margin-bottom: 0.5rem;
+ display: block;
+}
+
+.toggleRow {
+ display: flex;
+ gap: 0.5rem;
+ margin-bottom: 1rem;
+}
+
+.toggleRow:last-child {
+ margin-bottom: 0;
+}
+
+.toggleBtn {
+ flex: 1;
+ background: rgba(224, 122, 36, 0.05);
+ border: 1px solid rgba(224, 122, 36, 0.2);
+ color: #c8bfa8;
+ padding: 0.6rem 0.75rem;
+ font-size: 0.8rem;
+ font-weight: 600;
+ cursor: pointer;
+ border-radius: 2px;
+ transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
+ font-family: inherit;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ gap: 0.4rem;
+}
+
+.toggleBtn:hover {
+ background: rgba(224, 122, 36, 0.1);
+ color: #f0ebe0;
+ border-color: rgba(224, 122, 36, 0.4);
+}
+
+.toggleBtnActive {
+ background: #e07a24;
+ color: #0f1a14 !important;
+ border-color: #e07a24;
+ box-shadow: 0 4px 12px rgba(224, 122, 36, 0.2);
+}
+
+.gestureHint {
+ margin-top: 1.5rem;
+ font-size: 0.8rem;
+ color: #8a9b8c;
+ display: flex;
+ align-items: flex-start;
+ gap: 0.5rem;
+ background: rgba(224, 122, 36, 0.05);
+ border-left: 2px solid #e07a24;
+ padding: 0.75rem;
+}
+
+/* ββ Device Simulator Canvas ββ */
+.deviceCanvas {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ position: relative;
+ min-height: 680px;
+ z-index: 1;
+ width: 100%;
+}
+
+.deviceTurntable {
+ position: relative;
+ transition: all 0.6s cubic-bezier(0.16, 1, 0.3, 1);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ max-width: 100%;
+}
+
+/* Phone Bezel Frame */
+.deviceFrame {
+ background: #1e1e1e;
+ border: 14px solid #282828;
+ border-radius: 36px;
+ box-shadow:
+ 0 30px 60px -15px rgba(0, 0, 0, 0.7),
+ 0 0 0 1px rgba(255, 255, 255, 0.08),
+ inset 0 0 8px rgba(0, 0, 0, 0.8);
+ position: relative;
+ overflow: hidden;
+ transition: width 0.4s cubic-bezier(0.16, 1, 0.3, 1), height 0.4s cubic-bezier(0.16, 1, 0.3, 1);
+ will-change: width, height;
+ display: flex;
+ flex-direction: column;
+}
+
+.portrait {
+ width: 360px;
+ height: 720px;
+}
+
+.landscape {
+ width: 900px;
+ height: 520px;
+}
+
+/* Earpiece notch area for portrait */
+.deviceFrame::before {
+ content: "";
+ position: absolute;
+ top: 0;
+ left: 50%;
+ transform: translateX(-50%);
+ width: 130px;
+ height: 20px;
+ background: #282828;
+ border-bottom-left-radius: 12px;
+ border-bottom-right-radius: 12px;
+ z-index: 120;
+ transition: opacity 0.3s ease;
+}
+
+.landscape .deviceFrame::before {
+ opacity: 0;
+ pointer-events: none;
+}
+
+/* Screen container */
+.deviceScreen {
+ width: 100%;
+ height: 100%;
+ position: relative;
+ overflow: hidden;
+ display: flex;
+ flex-direction: column;
+ user-select: none;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
+ background: #ffffff;
+}
+
+/* Status Bar */
+.statusBarActual {
+ height: 24px;
+ padding: 0 12px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ font-size: 0.65rem;
+ font-weight: 600;
+ z-index: 80;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.05);
+ background: #f4f2ea;
+ color: #5d6d60;
+ flex-shrink: 0;
+}
+
+/* App Header Actual */
+.appHeaderActual {
+ height: 48px;
+ background: #e05a2b;
+ color: #ffffff;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 0 12px;
+ z-index: 10;
+ flex-shrink: 0;
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
+}
+
+.headerTitle {
+ font-size: 0.95rem;
+ font-weight: 600;
+ margin: 0;
+ color: #ffffff;
+}
+
+.headerIcons {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+}
+
+.headerIconBtn {
+ background: transparent;
+ border: none;
+ color: #ffffff;
+ cursor: pointer;
+ padding: 4px;
+ font-size: 1rem;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ transition: opacity 0.2s;
+}
+
+.headerIconBtn:hover {
+ opacity: 0.8;
+}
+
+/* Page content wrapper */
+.pageScrollContent {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ position: relative;
+ background: #ffffff;
+ color: #333333;
+}
+
+.utScrollContainer {
+ flex: 1;
+ overflow-y: auto;
+ padding-bottom: 20px;
+ width: 100%;
+}
+
+/* Matrix Layout CSS */
+.matrixSection {
+ padding: 12px;
+}
+
+.matrixTitle {
+ text-align: center;
+ font-size: 0.85rem;
+ color: #666666;
+ margin: 6px 0 12px;
+ font-weight: 400;
+}
+
+.matrixWrapper {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+.matrixHeaderRow {
+ display: flex;
+ align-items: center;
+}
+
+.matrixColHeader {
+ flex: 1;
+ text-align: center;
+ font-size: 0.75rem;
+ font-weight: 800;
+ color: #1a1a1a;
+ letter-spacing: 0.05em;
+ padding: 2px 0;
+}
+
+.matrixBodyRow {
+ display: flex;
+ align-items: stretch;
+ gap: 8px;
+}
+
+.matrixRowHeader {
+ width: 24px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+}
+
+.matrixRowHeader span {
+ writing-mode: vertical-rl;
+ transform: rotate(180deg);
+ font-size: 0.72rem;
+ font-weight: 800;
+ color: #1a1a1a;
+ letter-spacing: 0.05em;
+ white-space: nowrap;
+}
+
+.matrixCard {
+ flex: 1;
+ border-radius: 8px;
+ padding: 16px 8px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ color: #ffffff;
+ min-height: 124px;
+ position: relative;
+ box-shadow: inset 0 -4px 0 rgba(0,0,0,0.15);
+}
+
+.matrixCardUrgentImportant {
+ background: #e53935; /* Red */
+}
+
+.matrixCardNoturgentImportant {
+ background: #1e88e5; /* Blue */
+}
+
+.matrixCardUrgentNotimportant {
+ background: #43a047; /* Green */
+}
+
+.matrixCardNoturgentNotimportant {
+ background: #757575; /* Grey */
+}
+
+.matrixCardIcon {
+ width: 28px;
+ height: 28px;
+ border-radius: 50%;
+ border: 1.5px solid #ffffff;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 0.95rem;
+ margin-bottom: 6px;
+}
+
+.matrixCardLabel {
+ font-size: 0.68rem;
+ font-weight: 600;
+ margin-bottom: 4px;
+ opacity: 0.9;
+}
+
+.matrixCardValue {
+ font-size: 1.7rem;
+ font-weight: 800;
+ line-height: 1.1;
+ letter-spacing: -0.02em;
+}
+
+/* Secondary Tab Bar */
+.tabBarActual {
+ display: flex;
+ background: #2d2d2d;
+ padding: 0;
+ border-top: 1px solid rgba(0,0,0,0.1);
+ border-bottom: 1px solid rgba(0,0,0,0.1);
+ flex-shrink: 0;
+}
+
+.tabBtnActual {
+ flex: 1;
+ background: #2d2d2d;
+ color: #c8bfa8;
+ border: none;
+ padding: 10px 0;
+ font-size: 0.8rem;
+ font-weight: 600;
+ cursor: pointer;
+ text-align: center;
+ transition: background 0.15s, color 0.15s;
+}
+
+.tabBtnActiveActual {
+ background: #ffffff !important;
+ color: #2b3a30 !important;
+}
+
+/* Donut Chart section */
+.chartHeading {
+ font-size: 0.82rem;
+ color: #666666;
+ text-align: center;
+ margin: 16px 0 10px;
+ font-weight: 600;
+}
+
+.pieChartContainer {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ padding-bottom: 24px;
+}
+
+.pieChartSvg {
+ width: 140px;
+ height: 140px;
+ transform: rotate(-90deg);
+}
+
+/* Circular Pie Slice classes */
+.pieSlice {
+ fill: none;
+ stroke-width: 28;
+}
+
+.pieSlice1 { stroke: #e53935; }
+.pieSlice2 { stroke: #1e88e5; }
+.pieSlice3 { stroke: #43a047; }
+.pieSlice4 { stroke: #ffb300; }
+.pieSlice5 { stroke: #00acc1; }
+.pieSlice6 { stroke: #8e24aa; }
+.pieSlice7 { stroke: #d81b60; }
+.pieSlice8 { stroke: #3949ab; }
+
+/* Floating Action Button (FAB) */
+.fabButtonActual {
+ position: absolute;
+ bottom: 16px;
+ right: 16px;
+ width: 48px;
+ height: 48px;
+ border-radius: 50%;
+ background: #00bcd4;
+ color: #ffffff;
+ border: none;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ box-shadow: 0 4px 10px rgba(0, 188, 212, 0.45);
+ font-size: 1.2rem;
+ z-index: 90;
+ transition: transform 0.2s cubic-bezier(0.16, 1, 0.3, 1), background 0.2s;
+}
+
+.fabButtonActual:hover {
+ transform: scale(1.05);
+ background: #00acc1;
+}
+
+.fabButtonActual:active {
+ transform: scale(0.95);
+}
+
+/* Slide-out Menu drawer */
+.menuPanelActual {
+ position: absolute;
+ top: 0;
+ left: 0;
+ height: 100%;
+ width: 240px;
+ background: #ffffff;
+ z-index: 110;
+ transform: translateX(-100%);
+ transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1);
+ box-shadow: 4px 0 15px rgba(0,0,0,0.15);
+ display: flex;
+ flex-direction: column;
+}
+
+.menuPanelOpen {
+ transform: translateX(0);
+}
+
+.menuHeaderActual {
+ height: 48px;
+ background: #e05a2b;
+ color: #ffffff;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 0 16px;
+ flex-shrink: 0;
+}
+
+.menuHeaderTitle {
+ font-size: 1rem;
+ font-weight: 700;
+ margin: 0;
+}
+
+.menuHeaderControls {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+}
+
+.menuListActual {
+ flex: 1;
+ overflow-y: auto;
+ padding: 6px 0;
+ list-style: none;
+ margin: 0;
+}
+
+.menuItemActual {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ padding: 12px 18px;
+ color: #555555;
+ font-size: 0.85rem;
+ font-weight: 500;
+ cursor: pointer;
+ border-left: 4px solid transparent;
+ transition: background 0.15s, border-color 0.15s;
+}
+
+.menuItemActual:hover {
+ background: #fdfaf2;
+ color: #e05a2b;
+}
+
+.menuItemActiveActual {
+ background: #faf2eb;
+ color: #e05a2b !important;
+ border-left-color: #e05a2b;
+ font-weight: 700;
+}
+
+.menuItemIcon {
+ font-size: 1.05rem;
+ width: 20px;
+ text-align: center;
+ opacity: 0.85;
+}
+
+.menuBackdrop {
+ position: absolute;
+ inset: 0;
+ background: rgba(0, 0, 0, 0.4);
+ z-index: 100;
+ opacity: 0;
+ pointer-events: none;
+ transition: opacity 0.3s ease;
+}
+
+.menuBackdropVisible {
+ opacity: 1;
+ pointer-events: auto;
+}
+
+/* Swipe boundary tip hotspot */
+.leftEdgeSwipeBoundary {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 14px;
+ height: 100%;
+ z-index: 95;
+ cursor: ew-resize;
+ background: linear-gradient(90deg, rgba(224, 90, 43, 0.1) 0%, transparent 100%);
+}
+
+.leftEdgeSwipeBoundary:hover {
+ background: linear-gradient(90deg, rgba(224, 90, 43, 0.2) 0%, transparent 100%);
+}
+
+/* ββ Converged Landscape 3-Column Grid ββ */
+.convergedGrid {
+ display: grid;
+ grid-template-columns: 200px 330px 1fr;
+ height: 100%;
+ width: 100%;
+ overflow: hidden;
+ background: #f5f5f5;
+}
+
+/* Sidebar Column */
+.convergedSidebar {
+ background: #ffffff;
+ border-right: 1px solid rgba(0, 0, 0, 0.08);
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+}
+
+.convergedSidebar .menuListActual {
+ padding-top: 10px;
+}
+
+/* Center Dashboard Column */
+.convergedCenter {
+ background: #ffffff;
+ border-right: 1px solid rgba(0, 0, 0, 0.08);
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ overflow-y: auto;
+ position: relative;
+}
+
+/* Right Charts Column */
+.convergedRight {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ background: #ffffff;
+}
+
+.rightHeader {
+ height: 48px;
+ background: #e05a2b;
+ color: #ffffff;
+ display: flex;
+ align-items: center;
+ padding: 0 16px;
+ font-size: 0.95rem;
+ font-weight: 600;
+ flex-shrink: 0;
+}
+
+.rightContent {
+ flex: 1;
+ overflow-y: auto;
+ padding: 16px;
+}
+
+/* Project wise horizontal bar chart */
+.barChartTitle {
+ font-size: 0.85rem;
+ font-weight: 600;
+ color: #333333;
+ text-align: center;
+ margin-bottom: 16px;
+}
+
+.barChartContainer {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ margin-bottom: 24px;
+}
+
+.barChartRow {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ font-size: 0.65rem;
+}
+
+.barChartLabel {
+ width: 110px;
+ text-align: right;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ color: #555555;
+ font-weight: 500;
+}
+
+.barChartValueWrapper {
+ flex: 1;
+ display: flex;
+ align-items: center;
+ gap: 6px;
+}
+
+.barChartBarBg {
+ flex: 1;
+ height: 8px;
+ background: #eeeeee;
+ border-radius: 4px;
+ overflow: hidden;
+}
+
+.barChartBarFill {
+ height: 100%;
+ border-radius: 4px;
+ transition: width 0.8s ease;
+}
+
+.barChartValText {
+ width: 45px;
+ font-weight: 700;
+ color: #333333;
+ text-align: left;
+}
+
+/* Show Next 10 button */
+.showNextBtn {
+ width: 100%;
+ background: #f5f5f5;
+ color: #666666;
+ border: 1px solid #e0e0e0;
+ padding: 6px;
+ font-size: 0.7rem;
+ font-weight: 600;
+ cursor: pointer;
+ text-align: center;
+ border-radius: 4px;
+ margin-bottom: 20px;
+ transition: background 0.15s;
+}
+
+.showNextBtn:hover {
+ background: #eeeeee;
+}
+
+/* Projects header with badge */
+.projectsSectionHeader {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ border-bottom: 1px solid #e0e0e0;
+ padding-bottom: 6px;
+ margin-bottom: 12px;
+}
+
+.projectsSectionTitle {
+ font-size: 0.85rem;
+ font-weight: 700;
+ color: #333333;
+ margin: 0;
+}
+
+.projectsTotalBadge {
+ background: #e05a2b;
+ color: #ffffff;
+ font-size: 0.65rem;
+ font-weight: 700;
+ padding: 2px 6px;
+ border-radius: 10px;
+}
+
+/* Search Box */
+.projectSearchBox {
+ width: 100%;
+ padding: 8px 10px;
+ border: 1px solid #cccccc;
+ border-radius: 4px;
+ font-size: 0.75rem;
+ margin-bottom: 12px;
+ outline: none;
+ font-family: inherit;
+}
+
+.projectSearchBox:focus {
+ border-color: #e05a2b;
+}
+
+/* Projects Filters */
+.projectFilterTabs {
+ display: flex;
+ background: #eeeeee;
+ padding: 2px;
+ border-radius: 4px;
+ margin-bottom: 14px;
+}
+
+.projectFilterBtn {
+ flex: 1;
+ background: transparent;
+ border: none;
+ padding: 5px 0;
+ font-size: 0.68rem;
+ font-weight: 600;
+ color: #666666;
+ cursor: pointer;
+ border-radius: 3px;
+ text-align: center;
+ transition: all 0.15s;
+}
+
+.projectFilterBtnActive {
+ background: #e05a2b;
+ color: #ffffff;
+}
+
+/* Project Cards list */
+.projectListLandscape {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+}
+
+.projectListItemCard {
+ border-left: 3px solid #e05a2b;
+ box-shadow: 0 1px 3px rgba(0,0,0,0.1);
+ padding: 10px 12px;
+ background: #ffffff;
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ position: relative;
+ cursor: pointer;
+}
+
+.projectListItemCard:hover {
+ background: #fafafa;
+}
+
+.projectListItemHeader {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-start;
+ gap: 8px;
+}
+
+.projectListItemName {
+ font-size: 0.78rem;
+ font-weight: 700;
+ color: #333333;
+ margin: 0;
+ line-height: 1.25;
+}
+
+.projectListItemTime {
+ font-size: 0.72rem;
+ font-weight: 700;
+ color: #e05a2b;
+ white-space: nowrap;
+}
+
+.projectListItemTasks {
+ font-size: 0.65rem;
+ color: #777777;
+}
+
+.projectProgressBg {
+ width: 100%;
+ height: 4px;
+ background: #eeeeee;
+ border-radius: 2px;
+ overflow: hidden;
+}
+
+.projectProgressBar {
+ height: 100%;
+ background: #e05a2b;
+ border-radius: 2px;
+}
+
+/* Home collapsed bar in bottom */
+.indicatorBarActual {
+ height: 10px;
+ background: #ffffff;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ cursor: pointer;
+ border-top: 1px solid rgba(0,0,0,0.04);
+ flex-shrink: 0;
+}
+
+.indicatorBarActual::after {
+ content: "";
+ width: 32px;
+ height: 4px;
+ background: #cccccc;
+ border-radius: 2px;
+ transition: background 0.2s;
+}
+
+.indicatorBarActual:hover::after {
+ background: #e05a2b;
+}
+
+/* Screen Themes */
+.themeLight {
+ background: #f5f5f5 !important;
+ color: #333333 !important;
+}
+
+.themeLight .appHeaderActual {
+ background: #e05a2b;
+ color: #ffffff;
+}
+
+.themeLight .indicatorBarActual {
+ background: #f5f5f5;
+}
+
+.themeDark {
+ background: #151515 !important;
+ color: #f0ebe0 !important;
+}
+
+.themeDark .appHeaderActual {
+ background: #e05a2b;
+ color: #ffffff;
+}
+
+.themeDark .indicatorBarActual {
+ background: #151515;
+}
+
+/* Timesheet Entry Form */
+.formContainerActual {
+ padding: 16px;
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+}
+
+.themeDark .formRowInput {
+ background: #222222;
+ border: 1px solid #333333;
+ color: #ffffff;
+}
+
+.themeLight .formRowInput {
+ background: #ffffff;
+ border: 1px solid #e0e0e0;
+ color: #333333;
+}
+
+.formRowInput {
+ display: flex;
+ flex-direction: column;
+ padding: 8px 12px;
+ border-radius: 6px;
+ cursor: pointer;
+ position: relative;
+}
+
+.formLabelSmall {
+ font-size: 0.65rem;
+ color: #888888;
+ margin-bottom: 2px;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+}
+
+.formValueMain {
+ font-size: 0.85rem;
+ font-weight: 700;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.formValueMain::after {
+ content: "βΌ";
+ font-size: 0.6rem;
+ color: #999;
+}
+
+/* Priority Option Grid */
+.prioritySectionTitle {
+ font-size: 0.85rem;
+ font-weight: 600;
+ margin-top: 14px;
+ margin-bottom: 8px;
+ display: flex;
+ align-items: center;
+ gap: 4px;
+}
+
+.priorityRadioGrid {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 8px;
+ margin-bottom: 12px;
+}
+
+.radioOption {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ font-size: 0.72rem;
+ cursor: pointer;
+}
+
+.radioCircle {
+ width: 14px;
+ height: 14px;
+ border-radius: 50%;
+ border: 1.5px solid #888;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.radioCircleActive {
+ border-color: #e05a2b;
+}
+
+.radioCircleActiveInner {
+ width: 7px;
+ height: 7px;
+ border-radius: 50%;
+ background: #e05a2b;
+}
+
+.themeDark .radioCircleActive {
+ border-color: #e07a24;
+}
+.themeDark .radioCircleActiveInner {
+ background: #e07a24;
+}
+
+/* Tracking Button */
+.trackingRowActual {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 16px;
+ margin-top: 10px;
+ margin-bottom: 14px;
+}
+
+.cyanDurationBtn {
+ background: #00cbd6;
+ color: #ffffff;
+ font-size: 0.95rem;
+ font-weight: 700;
+ padding: 8px 20px;
+ border: none;
+ border-radius: 4px;
+ cursor: pointer;
+ text-align: center;
+ min-width: 80px;
+}
+
+/* Date Pick */
+.dateRowActual {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ font-size: 0.82rem;
+ margin-bottom: 12px;
+}
+
+.dateSelectBox {
+ padding: 4px 10px;
+ border-radius: 4px;
+ font-size: 0.75rem;
+ font-weight: 600;
+ outline: none;
+}
+
+.themeDark .dateSelectBox {
+ background: #222222;
+ border: 1px solid #333;
+ color: #ffffff;
+}
+
+.themeLight .dateSelectBox {
+ background: #ffffff;
+ border: 1px solid #e0e0e0;
+ color: #333333;
+}
+
+/* Description Textarea */
+.descContainerActual {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ margin-bottom: 16px;
+}
+
+.descTextareaWrapper {
+ position: relative;
+ border-radius: 4px;
+ overflow: hidden;
+}
+
+.themeDark .descTextareaWrapper {
+ border: 1px solid #333333;
+}
+
+.themeLight .descTextareaWrapper {
+ border: 1px solid #cccccc;
+}
+
+.descTextareaActual {
+ width: 100%;
+ min-height: 80px;
+ padding: 10px;
+ font-size: 0.78rem;
+ outline: none;
+ font-family: inherit;
+ resize: none;
+ border: none;
+}
+
+.themeDark .descTextareaActual {
+ background: #1a1a1a;
+ color: #ffffff;
+}
+
+.themeLight .descTextareaActual {
+ background: #ffffff;
+ color: #333333;
+}
+
+.descTextareaButtons {
+ position: absolute;
+ bottom: 8px;
+ right: 8px;
+ display: flex;
+ gap: 6px;
+}
+
+.descMicroBtn {
+ width: 24px;
+ height: 24px;
+ border-radius: 3px;
+ border: none;
+ background: #e05a2b;
+ color: #ffffff;
+ font-size: 0.7rem;
+ cursor: pointer;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+/* Timesheets List */
+.timesheetListContainer {
+ display: flex;
+ flex-direction: column;
+}
+
+.themeLight .timesheetListContainer {
+ background: #ffffff;
+}
+
+.themeDark .timesheetListContainer {
+ background: #151515;
+}
+
+.timesheetListItem {
+ display: flex;
+ justify-content: space-between;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.08);
+ padding: 12px 14px;
+ position: relative;
+}
+
+.themeDark .timesheetListItem {
+ border-bottom-color: rgba(255, 255, 255, 0.08);
+}
+
+.timesheetLeftBorder {
+ position: absolute;
+ left: 0;
+ top: 0;
+ bottom: 0;
+ width: 4px;
+}
+
+.timesheetMainInfo {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ padding-left: 6px;
+}
+
+.timesheetTitleText {
+ font-size: 0.78rem;
+ font-weight: 600;
+ line-height: 1.25;
+ margin: 0;
+}
+
+.timesheetSubtext {
+ font-size: 0.68rem;
+ color: #777777;
+}
+
+.themeDark .timesheetSubtext {
+ color: #aaaaaa;
+}
+
+.timesheetRightInfo {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+ justify-content: space-between;
+ min-width: 80px;
+}
+
+.timesheetHours {
+ font-size: 0.78rem;
+ font-weight: 700;
+ color: #333333;
+}
+
+.themeDark .timesheetHours {
+ color: #f0ebe0;
+}
+
+.timesheetDate {
+ font-size: 0.65rem;
+ color: #777777;
+}
+
+.timesheetActionLink {
+ font-size: 0.68rem;
+ color: #00bcd4;
+ cursor: pointer;
+ font-weight: 600;
+}
+
+/* My Tasks List */
+.taskListContainer {
+ display: flex;
+ flex-direction: column;
+ padding: 10px;
+ gap: 10px;
+}
+
+.taskListItemCardActual {
+ box-shadow: 0 1px 3px rgba(0,0,0,0.1);
+ border-radius: 4px;
+ padding: 10px 12px;
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-start;
+ position: relative;
+ background: #ffffff;
+}
+
+.themeDark .taskListItemCardActual {
+ background: #222222;
+ box-shadow: 0 1px 3px rgba(0,0,0,0.3);
+}
+
+.taskItemLeftCol {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+}
+
+.taskItemRightCol {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+ gap: 6px;
+ font-size: 0.65rem;
+ color: #777777;
+ text-align: right;
+}
+
+.themeDark .taskItemRightCol {
+ color: #aaaaaa;
+}
+
+.taskOverdueBadgeActual {
+ color: #e53935;
+ font-weight: 600;
+}
+
+.taskCardStarRowActual {
+ display: flex;
+ gap: 2px;
+ font-size: 0.75rem;
+}
+
+.taskItemTitleActual {
+ font-size: 0.82rem;
+ font-weight: 700;
+ margin: 0;
+ color: #333333;
+ line-height: 1.25;
+}
+
+.themeDark .taskItemTitleActual {
+ color: #f0ebe0;
+}
+
+.taskItemSubProjectText {
+ font-size: 0.68rem;
+ color: #777777;
+}
+
+.themeDark .taskItemSubProjectText {
+ color: #aaaaaa;
+}
+
+.taskItemStageBadge {
+ align-self: flex-start;
+ font-size: 0.62rem;
+ padding: 2px 6px;
+ background: #f0f0f0;
+ border-radius: 10px;
+ font-weight: 600;
+ color: #555555;
+}
+
+.themeDark .taskItemStageBadge {
+ background: #333333;
+ color: #cccccc;
+}
+
+/* Settings View Styles */
+.settingsGroup {
+ margin: 16px 14px;
+ border-radius: 6px;
+ padding: 12px 14px;
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+}
+
+.themeDark .settingsGroup {
+ background: #222222;
+ border: 1px solid #333333;
+}
+
+.themeLight .settingsGroup {
+ background: #ffffff;
+ border: 1px solid #e0e0e0;
+}
+
+.settingsGroupTitle {
+ font-size: 0.72rem;
+ font-weight: 700;
+ color: #e05a2b;
+ text-transform: uppercase;
+ margin-bottom: 6px;
+ letter-spacing: 0.05em;
+}
+
+.settingsItem {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 8px 0;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.06);
+ font-size: 0.8rem;
+}
+
+.settingsItem:last-child {
+ border-bottom: none;
+}
+
+.themeDark .settingsItem {
+ border-bottom-color: rgba(255, 255, 255, 0.06);
+}
+
+.settingsItemValue {
+ font-weight: 600;
+ color: #777777;
+}
+
+.themeDark .settingsItemValue {
+ color: #aaaaaa;
+}
+
+.settingsSelect {
+ padding: 4px 8px;
+ border-radius: 4px;
+ font-size: 0.75rem;
+ font-weight: 600;
+ outline: none;
+}
+
+.themeDark .settingsSelect {
+ background: #151515;
+ border: 1px solid #444;
+ color: #fff;
+}
+
+.themeLight .settingsSelect {
+ background: #fff;
+ border: 1px solid #ccc;
+ color: #333;
+}
+
+.settingsButton {
+ background: #e53935;
+ color: #ffffff;
+ border: none;
+ padding: 8px 12px;
+ border-radius: 4px;
+ font-size: 0.78rem;
+ font-weight: 600;
+ cursor: pointer;
+ width: 100%;
+ margin-top: 6px;
+ transition: opacity 0.15s;
+}
+
+.settingsButton:hover {
+ opacity: 0.9;
+}
+
+/* About Screen Styles */
+.aboutContainer {
+ padding: 24px 16px;
+ display: flex;
+ flex-direction: column;
+ align-items: stretch;
+ gap: 16px;
+}
+
+.aboutLogo {
+ font-size: 3rem;
+ text-align: center;
+ margin-bottom: 4px;
+}
+
+.aboutAppName {
+ font-size: 1.2rem;
+ font-weight: 700;
+ text-align: center;
+ margin: 0;
+}
+
+.aboutAppVersion {
+ font-size: 0.72rem;
+ color: #888888;
+ text-align: center;
+}
+
+.aboutText {
+ font-size: 0.78rem;
+ line-height: 1.5;
+ margin: 0;
+}
+
+.aboutDivider {
+ border-top: 1px solid rgba(0, 0, 0, 0.08);
+ margin: 8px 0;
+}
+
+.themeDark .aboutDivider {
+ border-top-color: rgba(255, 255, 255, 0.08);
+}
+
+.aboutSectionTitle {
+ font-size: 0.8rem;
+ font-weight: 700;
+ margin-bottom: 6px;
+}
+
+.aboutContributorList {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ padding-left: 8px;
+}
+
+.aboutContributor {
+ font-size: 0.72rem;
+ color: #555555;
+}
+
+.themeDark .aboutContributor {
+ color: #aaaaaa;
+}
+
+/* Activity & Project Update Log Items */
+.logListContainer {
+ display: flex;
+ flex-direction: column;
+}
+
+.logItem {
+ display: flex;
+ gap: 10px;
+ padding: 12px 14px;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.08);
+ position: relative;
+}
+
+.themeDark .logItem {
+ border-bottom-color: rgba(255, 255, 255, 0.08);
+}
+
+.logDot {
+ width: 8px;
+ height: 8px;
+ border-radius: 50%;
+ background: #e05a2b;
+ margin-top: 5px;
+ flex-shrink: 0;
+}
+
+.logContent {
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+ flex: 1;
+}
+
+.logTitle {
+ font-size: 0.78rem;
+ font-weight: 600;
+ line-height: 1.3;
+ margin: 0;
+}
+
+.logTime {
+ font-size: 0.65rem;
+ color: #888888;
+}
+
+/* Dark Mode Overrides for Menu & Convergent Layout */
+.themeDark .menuPanelActual {
+ background: #222222;
+ box-shadow: 4px 0 15px rgba(0, 0, 0, 0.4);
+}
+
+.themeDark .menuItemActual {
+ color: #cccccc;
+}
+
+.themeDark .menuItemActual:hover {
+ background: #2b2b2b;
+ color: #e05a2b;
+}
+
+.themeDark .menuItemActiveActual {
+ background: #2b211a;
+ color: #e05a2b !important;
+ border-left-color: #e05a2b;
+}
+
+.themeDark .convergedSidebar {
+ background: #222222;
+ border-right: 1px solid #333333;
+}
+
+.themeDark .convergedCenter {
+ background: #151515;
+ border-right: 1px solid #333333;
+}
+
+.themeDark .convergedRight {
+ background: #1e1e1e;
+}
+
+/* Ubuntu Touch Style Settings */
+.utSettingsList {
+ display: flex;
+ flex-direction: column;
+ background: #ffffff;
+ min-height: 100%;
+}
+
+.themeDark .utSettingsList {
+ background: #151515;
+}
+
+.utSettingsRow {
+ display: flex;
+ align-items: center;
+ padding: 16px 20px;
+ cursor: pointer;
+ transition: background 0.2s;
+}
+
+.utSettingsRow:hover {
+ background: rgba(0, 0, 0, 0.02);
+}
+
+.themeDark .utSettingsRow:hover {
+ background: rgba(255, 255, 255, 0.02);
+}
+
+.utSettingsIconWrapper {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 28px;
+ height: 28px;
+ margin-right: 18px;
+ flex-shrink: 0;
+}
+
+.utSettingsLabel {
+ font-size: 0.95rem;
+ font-weight: 400;
+ color: #333333;
+ flex-grow: 1;
+}
+
+.themeDark .utSettingsLabel {
+ color: #dddddd;
+}
+
+.utSettingsChevron {
+ font-size: 1.2rem;
+ color: #cccccc;
+ font-weight: 300;
+ margin-left: auto;
+ user-select: none;
+}
+
+.utSettingsDivider {
+ height: 1px;
+ background: #eeeeee;
+ margin-left: 66px;
+}
+
+.themeDark .utSettingsDivider {
+ background: #2a2a2a;
+}
+
+/* Ubuntu Touch Style Activities */
+.utTabBar {
+ display: flex;
+ background: #eeeeee;
+ border-bottom: 1px solid #d8d8d8;
+ height: 40px;
+ align-items: stretch;
+ position: sticky;
+ top: 0;
+ z-index: 10;
+}
+
+.themeDark .utTabBar {
+ background: #202020;
+ border-bottom: 1px solid #333333;
+}
+
+.utTabBtn {
+ flex: 1;
+ background: transparent;
+ border: none;
+ border-right: 1px solid #dcdcdc;
+ font-size: 0.82rem;
+ color: #666666;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ outline: none;
+ position: relative;
+ font-weight: 500;
+}
+
+.utTabBtn:last-child {
+ border-right: none;
+}
+
+.themeDark .utTabBtn {
+ border-right: 1px solid #2d2d2d;
+ color: #aaaaaa;
+}
+
+.utTabBtnActive {
+ color: #e05a2b;
+ font-weight: 700;
+}
+
+.utTabIndicator {
+ position: absolute;
+ bottom: 0;
+ left: 25%;
+ right: 25%;
+ height: 3px;
+ background: #e05a2b;
+ border-radius: 2px;
+}
+
+.utActivityCard {
+ display: flex;
+ padding: 14px 16px;
+ background: #ffffff;
+ border-bottom: 1px solid #e5e5e5;
+ position: relative;
+ align-items: flex-start;
+ gap: 14px;
+}
+
+.themeDark .utActivityCard {
+ background: #151515;
+ border-bottom: 1px solid #282828;
+}
+
+.utActivityAccentStrip {
+ position: absolute;
+ left: 0;
+ top: 0;
+ bottom: 0;
+ width: 4px;
+ background: #8b3d88;
+}
+
+.utActivityIconCircle {
+ width: 36px;
+ height: 36px;
+ border-radius: 50%;
+ background: #f48152;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+}
+
+.utActivityMainContent {
+ display: flex;
+ flex-direction: column;
+ gap: 3px;
+ flex: 1;
+ min-width: 0;
+}
+
+.utActivityTitle {
+ font-size: 0.9rem;
+ font-weight: 600;
+ color: #333333;
+ margin: 0;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.themeDark .utActivityTitle {
+ color: #e0e0e0;
+}
+
+.utActivityNotes {
+ font-size: 0.8rem;
+ color: #555555;
+ margin: 0;
+}
+
+.themeDark .utActivityNotes {
+ color: #a0a0a0;
+}
+
+.utActivityAssigned {
+ font-size: 0.76rem;
+ color: #888888;
+ margin: 0;
+}
+
+.utActivityDraftBadge {
+ align-self: flex-start;
+ border: 1.2px solid #e05a2b;
+ border-radius: 10px;
+ padding: 0px 8px;
+ font-size: 0.6rem;
+ font-weight: 700;
+ color: #e05a2b;
+ text-transform: uppercase;
+ margin-top: 3px;
+ display: inline-block;
+ line-height: 1.4;
+}
+
+.utActivityRightCol {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+ gap: 5px;
+ min-width: 75px;
+ flex-shrink: 0;
+}
+
+.utActivityType {
+ font-size: 0.78rem;
+ color: #777777;
+}
+
+.themeDark .utActivityType {
+ color: #999999;
+}
+
+.utActivityDate {
+ font-size: 0.78rem;
+ font-weight: 600;
+ color: #555555;
+}
+
+.themeDark .utActivityDate {
+ color: #bbbbbb;
+}
+
+.utActivityStatusBadge {
+ font-size: 0.64rem;
+ font-weight: 700;
+ color: #ffffff;
+ padding: 1.5px 6px;
+ border-radius: 2px;
+ text-transform: uppercase;
+ letter-spacing: 0.02em;
+ min-width: 62px;
+ text-align: center;
+ line-height: 1.3;
+}
+
+/* Project Updates layout */
+.utUpdateCard {
+ display: flex;
+ padding: 14px 16px;
+ background: #ffffff;
+ border-bottom: 1px solid #e5e5e5;
+ position: relative;
+ align-items: flex-start;
+ gap: 16px;
+}
+
+.themeDark .utUpdateCard {
+ background: #151515;
+ border-bottom: 1px solid #282828;
+}
+
+.utUpdateMainContent {
+ display: flex;
+ flex-direction: column;
+ gap: 5px;
+ flex: 1;
+ min-width: 0;
+}
+
+.utUpdateTitle {
+ font-size: 0.95rem;
+ font-weight: 600;
+ color: #333333;
+ margin: 0;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.themeDark .utUpdateTitle {
+ color: #e0e0e0;
+}
+
+.utUpdateMeta {
+ font-size: 0.78rem;
+ color: #777777;
+ margin: 0;
+}
+
+.themeDark .utUpdateMeta {
+ color: #999999;
+}
+
+.utUpdateProject {
+ font-size: 0.8rem;
+ color: #555555;
+ margin: 0;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.themeDark .utUpdateProject {
+ color: #aaaaaa;
+}
+
+.utProgressBarTrack {
+ height: 4px;
+ background: #e5e5e5;
+ border-radius: 2px;
+ width: 100%;
+ margin-top: 4px;
+ overflow: hidden;
+}
+
+.themeDark .utProgressBarTrack {
+ background: #333333;
+}
+
+.utProgressBarFill {
+ height: 100%;
+ background: #254a8a;
+ border-radius: 2px;
+}
+
+.utUpdateRightCol {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+ gap: 8px;
+ min-width: 85px;
+ flex-shrink: 0;
+}
+
+.utUpdateStatusBadge {
+ font-size: 0.76rem;
+ font-weight: 500;
+ color: #ffffff;
+ padding: 3px 12px;
+ border-radius: 6px;
+ text-align: center;
+ min-width: 85px;
+ line-height: 1.3;
+}
+
+.utUpdateDetailsBtn {
+ font-size: 0.78rem;
+ font-weight: 600;
+ color: #e05a2b;
+ background: #fdf2ee;
+ border: none;
+ border-radius: 6px;
+ padding: 4px 16px;
+ min-width: 85px;
+ text-align: center;
+ cursor: pointer;
+ line-height: 1.3;
+}
+
+.themeDark .utUpdateDetailsBtn {
+ background: #2c1e19;
+ color: #f07f56;
+}
+
+/* About Screen Styles */
+.utAboutPage {
+ padding: 20px 24px;
+ background: #ffffff;
+ color: #333333;
+ line-height: 1.5;
+ text-align: left;
+}
+
+.themeDark .utAboutPage {
+ background: #151515;
+ color: #cccccc;
+}
+
+.utAboutHeaderBlue {
+ font-size: 1.15rem;
+ font-weight: 700;
+ color: #2e5b82;
+ margin-top: 5px;
+ margin-bottom: 15px;
+}
+
+.themeDark .utAboutHeaderBlue {
+ color: #72a8d6;
+}
+
+.utAboutVersionLarge {
+ font-size: 2.2rem;
+ font-weight: 700;
+ color: #3fa6f2;
+ text-align: center;
+ margin: 20px 0;
+}
+
+.utAboutSectionTitle {
+ font-size: 1.2rem;
+ font-weight: 700;
+ color: #2e5b82;
+ margin-top: 25px;
+ margin-bottom: 12px;
+}
+
+.themeDark .utAboutSectionTitle {
+ color: #72a8d6;
+}
+
+.utAboutText {
+ font-size: 0.92rem;
+ color: #444444;
+ margin-bottom: 16px;
+}
+
+.themeDark .utAboutText {
+ color: #bbbbbb;
+}
+
+.utAboutList {
+ list-style: none;
+ padding-left: 0;
+ margin: 12px 0;
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+}
+
+.utAboutListItem {
+ font-size: 0.9rem;
+ color: #333333;
+ position: relative;
+ padding-left: 14px;
+}
+
+.themeDark .utAboutListItem {
+ color: #cccccc;
+}
+
+.utAboutListItem::before {
+ content: "β’";
+ position: absolute;
+ left: 0;
+ color: #333333;
+ font-weight: bold;
+}
+
+.themeDark .utAboutListItem::before {
+ color: #cccccc;
+}
+
+.utAboutListItemBold {
+ font-weight: 700;
+}
+
+.utAboutServerBand {
+ background: #f2f5f8;
+ padding: 10px 24px;
+ margin-left: -24px;
+ margin-right: -24px;
+ margin-top: 25px;
+ margin-bottom: 12px;
+ font-size: 1.2rem;
+ font-weight: 700;
+ color: #2e5b82;
+}
+
+.themeDark .utAboutServerBand {
+ background: #202020;
+ color: #72a8d6;
+}
+
+.utAboutLink {
+ color: #3fa6f2;
+ text-decoration: none;
+ font-weight: 600;
+}
+
+.utAboutLink:hover {
+ text-decoration: underline;
+}
+
+
+
+
+
+
+
+
+