- Rename test-apps to base-apps with proper manifest.json for each app - Add is_system_app flag to app discovery and Lua API - Fix icon path resolution for /system/icons/ paths - Add layout.lua and layout.rcss for reusable UI components - Update home screen to dynamically load all apps from manifests - Update all app RML files to use layout components - Comprehensive testing framework documentation with JSON action format - Add tests/ directory structure for automated UI testing
271 lines
4.9 KiB
Plaintext
271 lines
4.9 KiB
Plaintext
/* ==============================================
|
|
Layout Components: Reusable App Layout Structure
|
|
System status bar, app bar, navigation bar
|
|
============================================== */
|
|
|
|
/* ============== System Status Bar ============== */
|
|
/* Top bar showing time, signal, wifi, battery */
|
|
|
|
.system-status-bar {
|
|
height: 36px;
|
|
padding: 0 16px;
|
|
background-color: transparent;
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
font-size: 16px;
|
|
color: #FFFFFF;
|
|
z-index: 1000;
|
|
}
|
|
|
|
.system-status-bar.bg-surface {
|
|
background-color: #1E1E1E;
|
|
}
|
|
|
|
.system-status-time {
|
|
font-weight: 500;
|
|
font-size: 16px;
|
|
}
|
|
|
|
.system-status-icons {
|
|
display: flex;
|
|
gap: 8px;
|
|
align-items: center;
|
|
}
|
|
|
|
.system-status-icons img {
|
|
width: 24px;
|
|
height: 24px;
|
|
pointer-events: none;
|
|
}
|
|
|
|
/* ============== App Bar ============== */
|
|
/* Title bar with back button and optional actions */
|
|
|
|
.app-bar {
|
|
height: 72px;
|
|
padding: 0 8px;
|
|
background-color: #1E1E1E;
|
|
display: flex;
|
|
align-items: center;
|
|
z-index: 900;
|
|
}
|
|
|
|
.app-bar.transparent {
|
|
background-color: transparent;
|
|
}
|
|
|
|
.app-bar.primary {
|
|
background-color: #121212;
|
|
}
|
|
|
|
.app-bar-back {
|
|
width: 56px;
|
|
height: 56px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
cursor: pointer;
|
|
border-radius: 28px;
|
|
}
|
|
|
|
.app-bar-back:hover {
|
|
background-color: rgba(255, 255, 255, 0.1);
|
|
}
|
|
|
|
.app-bar-back:active {
|
|
background-color: rgba(255, 255, 255, 0.2);
|
|
}
|
|
|
|
.app-bar-back img {
|
|
width: 32px;
|
|
height: 32px;
|
|
pointer-events: none;
|
|
}
|
|
|
|
.app-bar-title {
|
|
flex: 1;
|
|
font-size: 24px;
|
|
font-weight: 500;
|
|
color: #FFFFFF;
|
|
padding-left: 8px;
|
|
}
|
|
|
|
.app-bar-actions {
|
|
display: flex;
|
|
gap: 4px;
|
|
}
|
|
|
|
.app-bar-action {
|
|
width: 56px;
|
|
height: 56px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
cursor: pointer;
|
|
border-radius: 28px;
|
|
}
|
|
|
|
.app-bar-action:hover {
|
|
background-color: rgba(255, 255, 255, 0.1);
|
|
}
|
|
|
|
.app-bar-action:active {
|
|
background-color: rgba(255, 255, 255, 0.2);
|
|
}
|
|
|
|
.app-bar-action img {
|
|
width: 28px;
|
|
height: 28px;
|
|
pointer-events: none;
|
|
}
|
|
|
|
/* ============== System Navigation Bar ============== */
|
|
/* Bottom bar with back, home, and recent buttons */
|
|
|
|
.system-nav-bar {
|
|
height: 56px;
|
|
background-color: #0A0A0A;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-around;
|
|
z-index: 1000;
|
|
}
|
|
|
|
.system-nav-bar.transparent {
|
|
background-color: rgba(10, 10, 10, 0.9);
|
|
}
|
|
|
|
.system-nav-btn {
|
|
width: 72px;
|
|
height: 48px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
cursor: pointer;
|
|
border-radius: 24px;
|
|
}
|
|
|
|
.system-nav-btn:hover {
|
|
background-color: rgba(255, 255, 255, 0.1);
|
|
}
|
|
|
|
.system-nav-btn:active {
|
|
background-color: rgba(255, 255, 255, 0.2);
|
|
}
|
|
|
|
.system-nav-btn img {
|
|
width: 28px;
|
|
height: 28px;
|
|
pointer-events: none;
|
|
opacity: 0.8;
|
|
}
|
|
|
|
/* Home button - pill shape */
|
|
.system-nav-home {
|
|
width: 96px;
|
|
height: 8px;
|
|
background-color: #FFFFFF;
|
|
border-radius: 4px;
|
|
cursor: pointer;
|
|
opacity: 0.6;
|
|
}
|
|
|
|
.system-nav-home:hover {
|
|
opacity: 0.8;
|
|
}
|
|
|
|
.system-nav-home:active {
|
|
opacity: 1.0;
|
|
}
|
|
|
|
/* ============== Screen Layout ============== */
|
|
/* Standard app screen structure */
|
|
|
|
.app-screen {
|
|
width: 100%;
|
|
height: 100%;
|
|
background-color: #121212;
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
|
|
.app-content {
|
|
flex: 1;
|
|
overflow: auto;
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
|
|
/* Content padding for nav bar */
|
|
.app-content.with-nav {
|
|
padding-bottom: 56px;
|
|
}
|
|
|
|
/* Content padding for dock */
|
|
.app-content.with-dock {
|
|
padding-bottom: 100px;
|
|
}
|
|
|
|
/* ============== Combined Header ============== */
|
|
/* Status bar + App bar combined */
|
|
|
|
.app-header {
|
|
display: flex;
|
|
flex-direction: column;
|
|
background-color: #1E1E1E;
|
|
}
|
|
|
|
.app-header.transparent {
|
|
background-color: transparent;
|
|
}
|
|
|
|
.app-header .system-status-bar {
|
|
background-color: transparent;
|
|
}
|
|
|
|
/* ============== Notification Badge ============== */
|
|
|
|
.notification-badge {
|
|
position: absolute;
|
|
top: 8px;
|
|
right: 8px;
|
|
min-width: 20px;
|
|
height: 20px;
|
|
background-color: #CF6679;
|
|
border-radius: 10px;
|
|
font-size: 12px;
|
|
font-weight: 600;
|
|
color: #FFFFFF;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding: 0 6px;
|
|
}
|
|
|
|
/* ============== Recording Indicator ============== */
|
|
/* Shown when camera/mic is active */
|
|
|
|
.recording-indicator {
|
|
position: absolute;
|
|
top: 8px;
|
|
right: 8px;
|
|
width: 12px;
|
|
height: 12px;
|
|
background-color: #F44336;
|
|
border-radius: 6px;
|
|
animation: recording-pulse 1.5s ease-in-out infinite;
|
|
}
|
|
|
|
@keyframes recording-pulse {
|
|
0%, 100% { opacity: 1.0; }
|
|
50% { opacity: 0.4; }
|
|
}
|
|
|
|
/* ============== Divider ============== */
|
|
|
|
.header-divider {
|
|
height: 1px;
|
|
background-color: #333333;
|
|
}
|